API changelog
Changes a consumer can observe, newest first. Additive changes ship without notice; see versioning for what counts as breaking.
The MCP server now requires authorization2026-08-10
Breaking. The MCP endpoint is no longer open. Every request needs either an OAuth 2.1 access token or an EDMDb API key, and calls count against the same monthly quota as the REST API — per account, not per credential.
If you use an assistant or connector, add the server again and your client will do the rest: a 401 now carries a WWW-Authenticate header pointing at /.well-known/oauth-protected-resource/mcp, so it discovers EDMDb as the authorization server, registers itself and runs the flow. Nothing to configure by hand.
If you call it from a script, send your existing API key as Authorization: Bearer edm_live_... — the same key the REST API takes. One header carries either credential.
Tools are per plan now. search_events and artist_info are on every plan; artist_upcoming_events and venue_upcoming_events need Premium or Pro. Your tools/list describes what you can actually call, so a tool you do not have is not advertised rather than advertised and refused — see the tool matrix.
Clients on the 2025 protocol revision keep working and are gated identically. Over quota answers 429 with Retry-After and the same X-Quota-* headers the REST API sends.
MCP server rebuilt on the stateless 2026-07-28 protocol2026-08-09
The MCP server is rebuilt on MCP 2026-07-28. There is no initialize handshake and no Mcp-Session-Id: every request stands alone, carries Mcp-Method and Mcp-Name headers, and discovery moved to server/discover. The endpoint URL has not changed.
Clients on the old protocol keep working. The endpoint still serves 2025-era traffic, statelessly — the handshake succeeds and no session is issued. You do not need to change anything today; you will want to when your client adds 2026 support, because the newer path is one round trip instead of three.
Four tools behaved wrongly and now do not:
artist_infoanswered “not found” for any artist with no image on file.artist_upcoming_eventsandvenue_upcoming_eventsdropped every event with no venue on record, and ignoredlimitentirely.search_eventsreturned past events when no start date was given, and an end date silently discarded almost everything because it filtered on the event’s end time, which is usually unknown. It is upcoming-only by default now, and a date window bounds when an event starts — the same rule asGET /events.- Where a name matched several artists or venues, the answer could silently mix their calendars, and identical calls could return different ones. The answer now names the one it chose.
Breaking, if you read structuredContent: its fields are snake_case and consistent across tools now, matching the REST JSON — start_at, image_url, country as an ISO code, and a separate location line. Every tool also declares an outputSchema, so a client can validate what it gets. The prose in content is unchanged in spirit.
One more correctness note: an event whose timezone is unknown is now given as a date with no clock time, rather than a time that could be hours out.
Labels, genres, cities, podcasts, tracklists, tickets, stats and search2026-08-08
The read surface is complete. New this release:
/labels,/labels/{slug},/labels/{slug}/artists,/labels/{slug}/events/genres,/genres/{slug}— each genre carries its parent, and the detail adds children, so one call to the list is enough to rebuild the whole tree client-side/cities,/cities/{slug},/cities/{slug}/events— resolved through a real foreign key, so prefer this over/events?city=, which matches free text and misses alternate spellings/podcasts,/podcasts/{slug},/podcasts/{slug}/episodes,/episodes/{slug},/episodes/{slug}/tracklist/festivals/{slug}/editions/{edition}plus its/lineupand/tickets/events/{slug}/tickets/stats— catalogue counts/search?q=— typeahead across every collection. Relevance-ordered and not paginable: it takeslimitonly, because relevance is not a stable sort key to cursor against. Use the resource endpoints to walk the catalogue.
Two things that will not be arriving, so you can stop looking for them: there is no /countries — country is an ISO-3166 code on the resources that have one, not a resource itself — and there is no tracklist for events. Tracklists exist only for podcast episodes; an event’s detail is its lineup.
Monthly quotas are now enforced2026-08-08
Monthly request quotas are live: 10,000 on Free, 100,000 on Premium and 1,000,000 on Pro, counted per account rather than per key and resetting on the 1st at midnight UTC. Exceeding one returns 429 with quota_exceeded.
Usage had been measured but not enforced since earlier today, and the figures were previously listed as “to be announced”. They are now published on pricing and reported per request in X-Quota-Remaining. Any future reduction to these numbers will be announced here before it takes effect.
Rate-limit and quota headers2026-08-08
Every authenticated response now carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset for the per-key window, plus X-Quota-Limit, X-Quota-Remaining and X-Quota-Reset for your account's monthly allowance. Retry-After is sent on every 429.
Monthly usage is now being recorded, and a new quota_exceeded error type exists. Quotas are not yet enforced — see rate limits. Enforcement will be announced here before it is switched on.
Artists, venues and festivals2026-08-08
New read endpoints, all cursor-paginated and behind the same key as /events:
/artists,/artists/{slug},/artists/{slug}/events,/artists/{slug}/genres/venues,/venues/{slug},/venues/{slug}/events/festivals,/festivals/{slug},/festivals/{slug}/editions/events/{slug}and/events/{slug}/lineup
The reference is now generated from the API itself rather than maintained by hand, so it cannot describe an endpoint that does not exist.
No change to /events: same fields, same cursors, same behaviour.
MCP moved to developer.edmdb.net2026-08-07
The MCP server moved from edmdb.net/developer/mcp to developer.edmdb.net/mcp. No protocol or tool changes — that comes next.
API keys2026-08-07
Keys can be created and revoked from the account dashboard. See authentication.