Discover the jurisdiction's Open311 endpoint and api_key by querying the city's developer portal (e.g., Chicago: https://311api.cityofchicago.org/open311/v2, San Francisco: https://mobile311.sfgov.org/open311/v2)
List available service types: GET {endpoint}/services.json?jurisdiction_id={id} to retrieve service codes, group, and keywords
Create a service request: POST {endpoint}/requests.json with params: api_key, service_code, lat, long (or address_string), description, and optional attribute[] fields for service-specific questions
Parse the response for service_request_id and token (some jurisdictions return a token before the ID is assigned)
Poll for status: GET {endpoint}/requests/{service_request_id}.json?jurisdiction_id={id} — check status field ('open', 'closed') and updated_datetime
For bulk monitoring, use GET {endpoint}/requests.json?jurisdiction_id={id}&updated_after={ISO8601} to retrieve all requests updated since a given timestamp
Known gotchas
The Open311 standard is implemented inconsistently across cities: some require jurisdiction_id in every request, others do not; some use api_key as a URL param, others as a POST body field — always test against the specific city's endpoint
Not all cities expose a public Open311 API; many use Accela, SeeClickFix, or Salesforce 311 backends that offer Open311 compatibility only for registered partners, not anonymous public access
Service request IDs may not be available immediately after POST — some implementations return a token that must be resolved to an ID via a separate GET /tokens/{token}.json call before status polling is possible
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp