The BMLT (Basic Meeting List Tool) Semantic API provides a comprehensive interface for retrieving meeting data from BMLT root servers. This API uses a switcher=
parameter to specify different operations and returns data in JSON or CSV format.
All API calls follow this pattern:
{rootServerURL}client_interface/{format}/?switcher={operation}{parameters}
Where:
{rootServerURL}
: The base URL of the BMLT root server (e.g.,https://bmlt.wszf.org/main_server/
){format}
: Data format -json
,jsonp
,tsml
, orcsv
(see format restrictions below){operation}
: The operation to perform (see endpoints below){parameters}
: Optional parameters specific to each operation
Standard JSON response format. Available for all endpoints except GetNAWSDump.
JSON with Padding - wraps JSON response in a callback function. Available for all endpoints except GetNAWSDump.
- Add
&callback=yourCallbackFunction
parameter (defaults to 'callback' if not specified)
TSML (The Semantic Meeting List) format. Only available for GetSearchResults endpoint.
Comma-separated values format. Only available for GetNAWSDump endpoint.
Purpose: Search for meetings based on various criteria Format: JSON, JSONP, TSML Parameters: Extensive filtering options (see detailed parameters below)
Purpose: Retrieve available meeting formats Format: JSON, JSONP Parameters:
lang_enum
(optional): Language code (e.g., 'en', 'de', 'fr')show_all
(optional): Set to '1' to show all formatsformat_ids
(optional): Array of format IDs to include/exclude (positive to include, negative to exclude)key_strings
(optional): Array of format key strings to filter by
Purpose: Get list of service bodies Format: JSON, JSONP Parameters:
services
(optional): Array of service body IDs to include/exclude (positive to include, negative to exclude)recursive
(optional): Set to '1' to include child service bodiesparents
(optional): Set to '1' to include parent service bodies
Purpose: Retrieve meeting changes within a date range Format: JSON, JSONP Parameters:
start_date
(optional): Start date in YYYY-MM-DD formatend_date
(optional): End date in YYYY-MM-DD formatmeeting_id
(optional): Specific meeting IDservice_body_id
(optional): Service body ID
Purpose: Get list of available field keys Format: JSON, JSONP Parameters: None
Purpose: Get specific field values for a given field key Format: JSON, JSONP Parameters:
meeting_key
(required): The field key to get values forspecific_formats
(optional): Comma-separated list of format IDs to limit field values toall_formats
(optional): Boolean to include all formats (not just specific ones)
Purpose: Export meeting data in NAWS format Format: CSV Parameters:
sb_id
(required): Service body ID
Purpose: Get server information Format: JSON, JSONP Parameters: None
Purpose: Get geographic coverage area information Format: JSON, JSONP Parameters: None
The GetSearchResults endpoint supports extensive filtering options:
meeting_ids={id}
: Include specific meeting IDs (positive values)meeting_ids[]={id}
: Multiple meeting IDs (array format)meeting_ids=-{id}
: Exclude specific meeting IDs (negative values)meeting_ids[]=-{id}
: Exclude multiple meeting IDs (array format)
get_used_formats=1
: Include formats used in search resultsget_formats_only=1
: Return only formats (requires get_used_formats=1)
weekdays={day}
: Include meetings on specific days (1=Sunday, 2=Monday, ..., 7=Saturday)weekdays[]={day}
: Multiple days (array format)weekdays=-{day}
: Exclude meetings on specific daysweekdays[]=-{day}
: Exclude multiple days (array format)
venue_types={type}
: Include meetings with specific venue types (1=In-person, 2=Virtual, 3=Hybrid)venue_types[]={type}
: Multiple venue types (array format)venue_types=-{type}
: Exclude meetings with specific venue typesvenue_types[]=-{type}
: Exclude multiple venue types (array format)
formats={format_id}
: Include meetings with specific formatsformats[]={format_id}
: Multiple formats (array format)formats=-{format_id}
: Exclude meetings with specific formatsformats[]=-{format_id}
: Exclude multiple formats (array format)formats_comparison_operator=OR
: Use OR logic for format matching (default is AND)
services={service_body_id}
: Include meetings from specific service bodiesservices[]={service_body_id}
: Multiple service bodies (array format)services=-{service_body_id}
: Exclude meetings from specific service bodiesservices[]=-{service_body_id}
: Exclude multiple service bodies (array format)recursive=1
: Include child service bodies when filtering by services
SearchString={text}
: Search for specific textStringSearchIsAnAddress=1
: Treat search string as an addressSearchStringRadius={radius}
: Search radius for address searches (miles/km, negative for auto-radius)
StartsAfterH={hour}
: Meetings starting after hour (0-23)StartsAfterM={minute}
: Meetings starting after minute (0-59)StartsBeforeH={hour}
: Meetings starting before hour (0-23)StartsBeforeM={minute}
: Meetings starting before minute (0-59)EndsBeforeH={hour}
: Meetings ending before hour (0-23)EndsBeforeM={minute}
: Meetings ending before minute (0-59)
MinDurationH={hours}
: Minimum duration in hoursMinDurationM={minutes}
: Minimum duration in minutesMaxDurationH={hours}
: Maximum duration in hoursMaxDurationM={minutes}
: Maximum duration in minutes
lat_val={latitude}
: Latitude for geographic searchlong_val={longitude}
: Longitude for geographic searchgeo_width={radius}
: Search radius in milesgeo_width_km={radius}
: Search radius in kilometerssort_results_by_distance=1
: Sort results by distance when using geographic search
meeting_key={field_key}
: Search for specific field valuemeeting_key_value={value}
: The value to search for
data_field_key={field1,field2}
: Return only specific fields (comma-separated)sort_keys={field1,field2}
: Sort results by specific fields (comma-separated)sort_key={alias}
: Use predefined sort aliases ('weekday', 'time', 'town', 'state', 'weekday_state')
page_size={number}
: Number of results per pagepage_num={number}
: Page number (defaults to 1)
advanced_published=1
: Show only published meetingsadvanced_published=0
: Show only unpublished meetingsadvanced_published={other}
: Show all meetings (default behavior)
lang_enum={language_code}
: Language for format names (e.g., 'en', 'de', 'fr')
When the BMLT server is running in aggregator mode (combining data from multiple root servers), additional parameters are available:
root_server_ids={id}
: Include specific root server IDs (positive values)root_server_ids[]={id}
: Multiple root server IDs (array format)root_server_ids=-{id}
: Exclude specific root server IDs (negative values)root_server_ids[]=-{id}
: Exclude multiple root server IDs (array format)
When in aggregator mode, some endpoints require at least one filter parameter to prevent overwhelming responses:
- GetSearchResults requires at least one of: meeting_ids, services, formats, root_server_ids, meeting_key, geographic coordinates, or pagination
- Different validation rules and response structures may apply
- Geographic search radius may be limited by server configuration
- 1: Sunday
- 2: Monday
- 3: Tuesday
- 4: Wednesday
- 5: Thursday
- 6: Friday
- 7: Saturday
- 1: In-person
- 2: Virtual
- 3: Hybrid
- Hours: 0-23 (24-hour format)
- Minutes: 0-59
- Time strings: HH:MM format (e.g., "14:30" for 2:30 PM)
- Positive values: Distance in miles or kilometers
- Negative values: Integer for auto-radius (number of meetings to find)
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetSearchResults
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetSearchResults&venue_types=2&weekdays[]=2&weekdays[]=3&weekdays[]=4&weekdays[]=5&weekdays[]=6
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetSearchResults&lat_val=47.6062&long_val=-122.3321&geo_width_km=10
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetFormats&lang_enum=de
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetChanges&start_date=2024-01-01&end_date=2024-01-31
https://bmlt.wszf.org/main_server/client_interface/csv/?switcher=GetNAWSDump&sb_id=123
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetSearchResults&meeting_ids=123,456,-789
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetSearchResults&page_size=10&page_num=2
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetSearchResults&services=5&recursive=1
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetFormats&format_ids=1,2,-3&lang_enum=de
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetServiceBodies&services=5&recursive=1&parents=1
https://bmlt.wszf.org/main_server/client_interface/jsonp/?switcher=GetSearchResults&callback=myCallback
https://bmlt.wszf.org/main_server/client_interface/tsml/?switcher=GetSearchResults&venue_types=2
https://bmlt.wszf.org/main_server/client_interface/json/?switcher=GetSearchResults&root_server_ids=1,2&services=5
All endpoints except GetNAWSDump return JSON data with the following structure:
- Array of objects containing the requested data
- Each object represents a meeting, format, service body, etc.
- Field names correspond to the database schema
JSONP responses wrap the JSON data in a callback function:
callbackFunction([{"id": 1, "name": "Meeting Name"}, ...]);
- Default callback name is 'callback' if not specified
- Useful for cross-origin requests from web browsers
TSML (The Semantic Meeting List) format returns structured XML-like data optimized for meeting list applications:
- Only available for GetSearchResults endpoint
- Provides semantic markup for meeting data
- Includes format information and metadata
GetNAWSDump returns CSV data suitable for import into NAWS (Narcotics Anonymous World Services) systems:
- Fixed column structure with specific field mappings
- Includes deleted meetings marked with 'D' in Delete column
- Optimized for NAWS database import requirements
- 422 Unprocessable Entity: "GetNAWSDump is only valid for csv format."
- 422 Unprocessable Entity: "Invalid data format or endpoint name. Valid endpoint names for the json and jsonp data formats are: [list]. Valid endpoint names for the csv format are: GetNAWSDump. Valid endpoint names for the tsml format are: GetSearchResults."
- 400 Bad Request: Missing required parameters for GetFieldValues (meeting_key)
- 400 Bad Request: Missing required parameters for GetNAWSDump (sb_id)
- 400 Bad Request: "A google api key must be configured to use StringSearchIsAnAddress."
- 500 Internal Server Error: Geocoding failures when using StringSearchIsAnAddress
- 500 Internal Server Error: "There was a problem geocoding the SearchString."
- 500 Internal Server Error: "There was a problem parsing the geocoding response."
- Empty Response: When in aggregator mode, GetSearchResults requires at least one filter parameter
- Empty Response: When geographic search parameters are incomplete (missing lat/long or radius)
- JSON endpoints return error messages in the response body
- HTTP status codes indicate the type of error
- Invalid parameters typically result in empty arrays
[]
rather than error messages
- URL Encoding: Always URL-encode parameter values, especially for text searches
- Parameter Validation: Validate numeric parameters (IDs, coordinates, times) before making requests
- Rate Limiting: Be respectful of server resources when making multiple requests
- Caching: Consider caching responses for frequently accessed data like formats and service bodies
- Error Handling: Implement proper error handling for network issues and invalid responses
The API supports multiple languages:
- English (en)
- German (de)
- Danish (dk)
- Spanish (es)
- Persian/Farsi (fa)
- French (fr)
- Italian (it)
- Polish (pl)
- Portuguese (pt)
- Swedish (sv)
Language-specific format names and descriptions are available through the GetFormats endpoint with the lang_enum
parameter.
- The API is designed for programmatic access and can be integrated into web applications, mobile apps, and other systems
- Responses are typically small and suitable for real-time applications
- The semantic workshop application (https://semantic.bmlt.app) provides an interactive interface for building and testing API calls
- All endpoints support CORS for web-based applications