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=yourCallbackFunctionparameter (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