A read-only API for past events and the demos presented at them. It only ever returns information that's already public on an event's pages — the same as if you'd scraped the recap page yourself.
Download AGENTS.md — usage guide for AI agents & botsBase URL: https://demo.anything.cool/api/public
No API key is required — every request is anonymous and unauthenticated. Requests only return GET data; there is no way to create, edit, or delete anything through this API.
Events are opt-in. By default an event's demos and details are not available here. An event's admin has to turn on "Public API access" from that event's admin page before it shows up in any of these endpoints. If an event hasn't opted in, requests for it return 404.
Only demos that were actually presented (marked as demoed) and haven't been deleted are returned. Draft/unpresented demos, admin codes, edit codes, and any other internal fields are never exposed.
120 requests / 60s per IP on /api/public/*300 requests / 60s per IP across the API as a wholeEvery response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. Exceeding the limit returns 429 with a Retry-After header (seconds) — honor it instead of retrying immediately.
limit — Max results to return. Default 20, max 100.offset — Number of results to skip. Default 0.{
"data": [
{
"id": "a1b2c3d4",
"name": "Spring Demo Night",
"description": "Show off what you built this month.",
"organizer": "Atelier",
"organizer_url": "https://example.com",
"image_url": "https://example.com/cover.png",
"theme": "default",
"created_at": "2026-04-01 18:00:00",
"updated_at": "2026-04-01 21:00:00"
}
],
"pagination": { "limit": 20, "offset": 0, "count": 1 }
}{
"data": {
"id": "a1b2c3d4",
"name": "Spring Demo Night",
"description": "Show off what you built this month.",
"organizer": "Atelier",
"organizer_url": "https://example.com",
"image_url": "https://example.com/cover.png",
"theme": "default",
"created_at": "2026-04-01 18:00:00",
"updated_at": "2026-04-01 21:00:00"
}
}limit — Max results to return. Default 20, max 100.offset — Number of results to skip. Default 0.{
"data": [
{
"id": 42,
"event_id": "a1b2c3d4",
"title": "A cool project",
"description": "What it does and how it works.",
"presenter": "Ada",
"position": 1,
"created_at": "2026-04-01 18:05:00",
"updated_at": "2026-04-01 19:00:00"
}
],
"pagination": { "limit": 20, "offset": 0, "count": 1 }
}eventId — Optional. Restrict results to a single event.limit — Max results to return. Default 20, max 100.offset — Number of results to skip. Default 0.{
"data": [
{
"id": 42,
"event_id": "a1b2c3d4",
"title": "A cool project",
"description": "What it does and how it works.",
"presenter": "Ada",
"position": 1,
"created_at": "2026-04-01 18:05:00",
"updated_at": "2026-04-01 19:00:00"
}
],
"pagination": { "limit": 20, "offset": 0, "count": 1 }
}Errors are returned as JSON with a non-2xx status code:
{ "error": "Event not found or not available on the public API" }Rate-limited requests get a 429 with a Retry-After header (seconds):
{ "error": "Rate limit exceeded. Please slow down and retry later." }Manage your own event's API access from its admin page, under "Public API access".