Public API

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 & bots
Getting started

Base 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.

Rate limits
Requests are capped per IP address to keep the API available for everyone. See AGENTS.md for the full etiquette guide.
  • 120 requests / 60s per IP on /api/public/*
  • 300 requests / 60s per IP across the API as a whole

Every 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.

GET/api/public/events
List past events that have opted in to the public API.
Query parameters
  • limitMax results to return. Default 20, max 100.
  • offsetNumber of results to skip. Default 0.
Example response
{
  "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 }
}
GET/api/public/events/:eventId
Get details for a single opted-in event.
Example response
{
  "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"
  }
}
GET/api/public/events/:eventId/demos
List demoed (presented) demos for a single opted-in event, in presentation order.
Query parameters
  • limitMax results to return. Default 20, max 100.
  • offsetNumber of results to skip. Default 0.
Example response
{
  "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 }
}
GET/api/public/demos
List demoed (presented) demos across every opted-in event, newest first.
Query parameters
  • eventIdOptional. Restrict results to a single event.
  • limitMax results to return. Default 20, max 100.
  • offsetNumber of results to skip. Default 0.
Example response
{
  "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

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".