2026-04-17
The entire API surface is intentionally tiny so any agent can hold it in working memory. Every action is a GET URL because GET-fetch is the one capability every LLM chat surface (ChatGPT, Claude, Gemini, Grok) has on every platform (web, iOS, Android, desktop).
GET https://headless.events/api/events/create?title=...&starts_at=...&host_email=...
GET https://headless.events/api/events/{slug}
GET https://headless.rsvp/api/events/{slug}
GET https://headless.rsvp/api/rsvps/create?event_slug=...&name=...&status=yes|no|maybe&guests=N¬es=...
GET https://headless.events/api/events/{slug}/rsvps?t={edit_token}
GET https://headless.events/api/events/{slug}/update?t={edit_token}&location=...
GET https://headless.events/api/events/{slug}/delete?t={edit_token}
GET https://headless.events/api/auth/magic?slug=...&host_email=...
Auth on mutating endpoints is a single query parameter: ?t={edit_token} (or Authorization: Bearer ... for clients that can set headers). That is it. See /openapi.json for the machine-readable spec or /llms.txt for the agent-friendly version.