{
  "openapi": "3.1.0",
  "info": {
    "title": "Trackstage API",
    "version": "1.1.0",
    "summary": "Read and write your event's programme, speakers, submissions, custom fields and agenda — and get webhooks when any of it changes.",
    "description": "A complete REST API over an event: sessions and abstracts, speakers, custom fields, session files, the agenda, and signed outbound webhooks.\n\n### Authentication\n\nSend a personal API key from **Settings → API & MCP** as either header — both are first-class:\n\n```\nx-access-token: sb_live_…\nAuthorization: Bearer sb_live_…\n```\n\nA key resolves to a user, and every request re-runs the same workspace-membership authorization the app itself uses, so a key can never reach an event its owner cannot. Keys may optionally declare **scopes** (`read:events`, `read:sessions`, `read:contacts`, `write:sessions`, `write:contacts`, `write:fields`, `write:metadata`, `write:events`); a key without scopes is unrestricted within its owner's permissions, and declaring scopes can only narrow that.\n\nThe demo token `demo-api-token` is read-only and exists so the API can be explored without signing up. `schedule.ics` needs no credential at all — calendar clients cannot send headers.\n\n### Conventions\n\n- **Events are addressed by slug or id.** `/v1/event/ai-summit-2026/sessions` and `/v1/event/{id}/sessions` are the same endpoint.\n- **Paginated responses carry `data` and `results`** — the same array under both names — plus a `pagination` object with camelCase *and* snake_case keys. Default page size 25, maximum 100.\n- **Times** are ISO-8601 in responses. Requests accept ISO-8601 or epoch milliseconds. Legacy epoch-millisecond fields (`startTime`, `submittedAt`, …) are still returned alongside.\n- **Errors** are `{ error, code, message, status }`; `error` and `message` are the same human sentence.\n- **Optimistic concurrency**: send the `updated_at` you last read on `PUT /sessions/{id}` and a concurrent edit answers `409` instead of silently winning.\n- **Rate limits** are 100 requests / 15 minutes per key per category, reported on every rate-limited response via `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`.\n\n### Custom fields\n\nA custom field and a CFP form question are the same object. `GET /v1/event/{eventRef}/fields` returns the definitions (with `internal_name`, type, options and whether the field holds PII); every session carries its answers as `custom_fields[]` (labelled, with a lossless `value_raw`) and as a raw `answers` map; `PUT /v1/event/{eventRef}/sessions/{sessionId}/fields` writes them. Creating a field through `POST /fields/create` adds the question to the form builder and to the public submission form.\n\n### Webhooks\n\nRegister an endpoint with `POST /v1/webhooks`. Every delivery POSTs `{ data, metadata }` and carries:\n\n| Header | Meaning |\n| --- | --- |\n| `Trackstage-Signature` | `t=<unix-seconds>,v1=<hex>` — HMAC-SHA256 of `\"{t}.{body}\"` keyed with the endpoint's `whsec_…` secret. |\n| `Trackstage-Event` | The event type. |\n| `Trackstage-Delivery` | Unique delivery id, for idempotency. |\n\nVerify the signature before trusting a payload, and reject timestamps outside your tolerance to prevent replay. Failed deliveries retry five times with exponential backoff (1s, 5s, 25s, 125s) and the full attempt log is readable at `GET /v1/webhooks/{webhookId}/deliveries`.\n\n**Event types**\n\n| Event | Fires when |\n| --- | --- |\n| `submission.created` | A CFP submission arrived. |\n| `submission.updated` | A submission's details or status changed. |\n| `session.created` | A programme session was created. |\n| `session.updated` | A session's details changed. |\n| `session.deleted` | A session was soft-deleted. |\n| `session.restored` | A soft-deleted session was restored. |\n| `session.scheduled` | A session was given a room and a slot. |\n| `session.unscheduled` | A session was taken off the timetable. |\n| `decision.committed` | An accept or decline queue was committed and the emails went out. |\n| `agenda.published` | The public programme went live. |\n| `speaker.created` | Someone was added to the roster. |\n| `speaker.updated` | A speaker's profile or workflow status changed. |\n| `file.uploaded` | A file was attached to a session. |\n| `file.deleted` | A session file was removed. |\n| `webhook.test` | A test delivery you triggered yourself. |\n\nSubscribe to `[\"*\"]` for all of them.\n\n### MCP\n\nEverything here is also available to AI agents over MCP at `/mcp` — see [the MCP reference](/docs/mcp).",
    "license": {
      "name": "MIT",
      "identifier": "MIT"
    },
    "contact": {
      "name": "Trackstage",
      "url": "https://github.com/markokraemer/trackstage"
    }
  },
  "servers": [
    {
      "url": "https://neat-sparrow-926.eu-west-1.convex.site",
      "description": "Your deployment's Convex site URL."
    }
  ],
  "security": [
    {
      "ApiKeyHeader": []
    },
    {
      "BearerToken": []
    }
  ],
  "tags": [
    {
      "name": "Events",
      "description": "The events a credential can reach."
    },
    {
      "name": "Sessions",
      "description": "Read sessions, abstracts and submissions."
    },
    {
      "name": "Session Writes",
      "description": "Create, update, soft-delete, restore and bulk-edit sessions. Requires `write:sessions`."
    },
    {
      "name": "Session Files",
      "description": "Attachments on a session — slides, handouts, anything a speaker uploads. Requires `write:sessions` to change."
    },
    {
      "name": "Speakers",
      "description": "The event's people and their sessions."
    },
    {
      "name": "Event Settings",
      "description": "Field definitions and the value lists a session's metadata comes from: tracks, rooms, tags, formats, levels, languages, statuses."
    },
    {
      "name": "Field Writes",
      "description": "Define custom fields. In this product a custom field IS a CFP form question, so changes show up in the form builder and on the public form. Requires `write:fields`."
    },
    {
      "name": "Metadata Writes",
      "description": "Create, rename and delete tracks, rooms and value lists. Requires `write:metadata`."
    },
    {
      "name": "Agenda",
      "description": "The timetable, its conflicts, and the publish gate."
    },
    {
      "name": "Webhooks",
      "description": "Signed, retried HTTP callbacks so you never have to poll. Requires `write:events` to manage."
    },
    {
      "name": "Calendar",
      "description": "The public .ics subscription feed."
    }
  ],
  "paths": {
    "/v1/_echo": {
      "post": {
        "operationId": "echoWebhookDelivery",
        "tags": [
          "Webhooks"
        ],
        "summary": "Signature-verifying echo sink",
        "description": "Test target for webhook deliveries. Pass the endpoint's signing secret as `?secret=` and the sink recomputes the HMAC over the exact body: it answers 200 only when the signature verifies, and 401 otherwise. Point a webhook here to prove end-to-end delivery and signing without standing up a server.\n\n**No credential required.**",
        "parameters": [
          {
            "$ref": "#/components/parameters/secret"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EchoResult"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        },
        "security": []
      }
    },
    "/v1/event/{eventRef}/agenda": {
      "get": {
        "operationId": "getAgenda",
        "tags": [
          "Agenda"
        ],
        "summary": "Get the agenda",
        "description": "The whole timetable in one read: rooms, tracks, every placement, everything still unscheduled, and the live conflict list (double-booked rooms and speakers).\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgendaEnvelope"
                },
                "example": {
                  "data": {
                    "conflicts": [],
                    "event": {
                      "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                      "agenda_published_at": "2026-08-06T03:27:18.602Z",
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "description": "Two days for the people building AI systems that have to work on Monday morning. Practitioner talks on evaluation, agents, retrieval, inference infrastructure and the product decisions in between — no keynote fluff, no vendor pitches.",
                      "endsAt": 1791939600000,
                      "ends_at": "2026-10-14T01:00:00.000Z",
                      "features": {
                        "custom_fields": true,
                        "translated_fields": false,
                        "webhooks": true
                      },
                      "id": "j971emkyf6md23jphggczhghvd8c8qjq",
                      "logo_url": null,
                      "name": "AI Engineer Summit 2026",
                      "slug": "ai-summit-2026",
                      "startsAt": 1791820800000,
                      "starts_at": "2026-10-12T16:00:00.000Z",
                      "timezone": "America/Los_Angeles",
                      "type": "Conference",
                      "venue": "Moscone West, San Francisco",
                      "websiteUrl": "https://example.com/ai-summit-2026",
                      "website_url": "https://example.com/ai-summit-2026"
                    },
                    "published": true,
                    "published_at": "2026-08-06T03:27:18.602Z",
                    "rooms": [
                      {
                        "capacity": 300,
                        "id": "js7928f758c8d8qn6xqj705py58c9r3j",
                        "name": "Main Stage",
                        "order": 0
                      },
                      {
                        "capacity": 80,
                        "id": "js703wmx07yh80wngvzx2xnt9h8c811v",
                        "name": "Workshop Room",
                        "order": 1
                      }
                    ],
                    "scheduled": [
                      {
                        "duration_minutes": 45,
                        "ends_at": "2026-10-12T09:45:00.000Z",
                        "id": "k57cfvgs8hrs97xbvv82vcbd4d8c8y59",
                        "room_id": "js7928f758c8d8qn6xqj705py58c9r3j",
                        "starts_at": "2026-10-12T09:00:00.000Z",
                        "title": "Structured output without the sadness",
                        "track_id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn"
                      },
                      {
                        "duration_minutes": 45,
                        "ends_at": "2026-10-12T09:45:00.000Z",
                        "id": "k57818z4rbjk54p03n1kna0rw58c8t7d",
                        "room_id": "js703wmx07yh80wngvzx2xnt9h8c811v",
                        "starts_at": "2026-10-12T09:00:00.000Z",
                        "title": "Cost modelling for inference-heavy products",
                        "track_id": "kd71aqbkdmt4nevr61p5wdg64d8c8pb9"
                      }
                    ],
                    "totals": {
                      "conflicts": 0,
                      "scheduled": 10,
                      "unscheduled": 0
                    },
                    "tracks": [
                      {
                        "color": "#2F5CE0",
                        "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
                        "name": "AI Engineering",
                        "order": 0
                      },
                      {
                        "color": "#1E9E6B",
                        "id": "kd71aqbkdmt4nevr61p5wdg64d8c8pb9",
                        "name": "Product",
                        "order": 1
                      }
                    ],
                    "unscheduled": []
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/event/{eventRef}/agenda/publish": {
      "post": {
        "operationId": "publishAgenda",
        "tags": [
          "Agenda"
        ],
        "summary": "Publish the agenda",
        "description": "Opens the public programme. Until this is called the public pages render “Schedule coming soon” however much is scheduled internally. Requires the admin role.\n\n**Scope** `write:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `event_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/agenda/unpublish": {
      "post": {
        "operationId": "unpublishAgenda",
        "tags": [
          "Agenda"
        ],
        "summary": "Unpublish the agenda",
        "description": "Takes the public programme back down. Requires the admin role.\n\n**Scope** `write:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `event_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/fields": {
      "get": {
        "operationId": "listFields",
        "tags": [
          "Event Settings"
        ],
        "summary": "List fields",
        "description": "Every field definition on the event — the CFP form's questions plus its participant fields. These are the `internal_name`s you write through `PUT /sessions/{id}/fields`.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FieldsPage"
                },
                "example": {
                  "data": [
                    {
                      "contains_pii": false,
                      "createdAt": "2026-08-11T03:27:18.602Z",
                      "enabled": true,
                      "field_source": "standard",
                      "field_type": "short_text",
                      "form_id": "jd78d2k3nfftskesewr6qesn7d8c90d8",
                      "form_slug": "cfp",
                      "help": "Aim for something an attendee could choose from a schedule without extra context.",
                      "id": "title",
                      "internal_name": "title",
                      "options": null,
                      "public_name": "Session title",
                      "required": true,
                      "scope": "session",
                      "updatedAt": "2026-08-11T03:27:18.602Z"
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 3,
                    "page_size": 3,
                    "totalPages": 6,
                    "totalResults": 16,
                    "total_pages": 6,
                    "total_results": 16
                  },
                  "results": [
                    {
                      "contains_pii": false,
                      "createdAt": "2026-08-11T03:27:18.602Z",
                      "enabled": true,
                      "field_source": "standard",
                      "field_type": "short_text",
                      "form_id": "jd78d2k3nfftskesewr6qesn7d8c90d8",
                      "form_slug": "cfp",
                      "help": "Aim for something an attendee could choose from a schedule without extra context.",
                      "id": "title",
                      "internal_name": "title",
                      "options": null,
                      "public_name": "Session title",
                      "required": true,
                      "scope": "session",
                      "updatedAt": "2026-08-11T03:27:18.602Z"
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchFields",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search fields",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FieldsPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/fields/{fieldId}": {
      "delete": {
        "operationId": "deleteField",
        "tags": [
          "Field Writes"
        ],
        "summary": "Delete a custom field",
        "description": "Removes the question from every form on the event. Answers already collected are preserved on their sessions and keep coming back in `custom_fields`.\n\n**Scope** `write:fields` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `field_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/fieldId"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateField",
        "tags": [
          "Field Writes"
        ],
        "summary": "Update a custom field",
        "description": "Renames a field or changes its type, options, help text or required flag. System fields (Title, Description) refuse the edit with a 400.\n\n**Scope** `write:fields` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `field_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/fieldId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FieldWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FieldEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/fields/create": {
      "post": {
        "operationId": "createField",
        "tags": [
          "Field Writes"
        ],
        "summary": "Create a custom field",
        "description": "Appends a question to the event's CFP form. Custom fields and form questions are the same thing here, so a field created through the API shows up in the form builder and on the public submission form.\n\n**Scope** `write:fields` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `field_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FieldWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FieldEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/formats": {
      "get": {
        "operationId": "listFormats",
        "tags": [
          "Event Settings"
        ],
        "summary": "List formats",
        "description": "Every format configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "created_at": null,
                      "id": "Keynote",
                      "name": "Keynote",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 1,
                    "totalResults": 5,
                    "total_pages": 1,
                    "total_results": 5
                  },
                  "results": [
                    {
                      "created_at": null,
                      "id": "Keynote",
                      "name": "Keynote",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchFormats",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search formats",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/formats/{id}": {
      "delete": {
        "operationId": "deleteFormat",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Delete a format",
        "description": "Removes the format. Formats have no table of their own: they are the options on the CFP form's `format` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateFormat",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Update a format",
        "description": "Renames or reorders a format. Formats have no table of their own: they are the options on the CFP form's `format` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/formats/create": {
      "post": {
        "operationId": "createFormat",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Create a format",
        "description": "Adds a format to the event. Formats have no table of their own: they are the options on the CFP form's `format` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/languages": {
      "get": {
        "operationId": "listLanguages",
        "tags": [
          "Event Settings"
        ],
        "summary": "List languages",
        "description": "Every language configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "created_at": null,
                      "id": "English",
                      "name": "English",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 1,
                    "totalResults": 3,
                    "total_pages": 1,
                    "total_results": 3
                  },
                  "results": [
                    {
                      "created_at": null,
                      "id": "English",
                      "name": "English",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchLanguages",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search languages",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/languages/{id}": {
      "delete": {
        "operationId": "deleteLanguage",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Delete a language",
        "description": "Removes the language. Languages have no table of their own: they are the options on the CFP form's `language` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateLanguage",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Update a language",
        "description": "Renames or reorders a language. Languages have no table of their own: they are the options on the CFP form's `language` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/languages/create": {
      "post": {
        "operationId": "createLanguage",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Create a language",
        "description": "Adds a language to the event. Languages have no table of their own: they are the options on the CFP form's `language` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/levels": {
      "get": {
        "operationId": "listLevels",
        "tags": [
          "Event Settings"
        ],
        "summary": "List levels",
        "description": "Every level configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "created_at": null,
                      "id": "Advanced",
                      "name": "Advanced",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 1,
                    "totalResults": 4,
                    "total_pages": 1,
                    "total_results": 4
                  },
                  "results": [
                    {
                      "created_at": null,
                      "id": "Advanced",
                      "name": "Advanced",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchLevels",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search levels",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/levels/{id}": {
      "delete": {
        "operationId": "deleteLevel",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Delete a level",
        "description": "Removes the level. Levels have no table of their own: they are the options on the CFP form's `level` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateLevel",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Update a level",
        "description": "Renames or reorders a level. Levels have no table of their own: they are the options on the CFP form's `level` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/levels/create": {
      "post": {
        "operationId": "createLevel",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Create a level",
        "description": "Adds a level to the event. Levels have no table of their own: they are the options on the CFP form's `level` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/rooms": {
      "get": {
        "operationId": "listRooms",
        "tags": [
          "Event Settings"
        ],
        "summary": "List rooms",
        "description": "Every room configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "capacity": 300,
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "id": "js7928f758c8d8qn6xqj705py58c9r3j",
                      "name": "Main Stage",
                      "order": 0,
                      "updated_at": "2026-08-11T03:27:18.602Z"
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 1,
                    "totalResults": 2,
                    "total_pages": 1,
                    "total_results": 2
                  },
                  "results": [
                    {
                      "capacity": 300,
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "id": "js7928f758c8d8qn6xqj705py58c9r3j",
                      "name": "Main Stage",
                      "order": 0,
                      "updated_at": "2026-08-11T03:27:18.602Z"
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchRooms",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search rooms",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/rooms/{id}": {
      "delete": {
        "operationId": "deleteRoom",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Delete a room",
        "description": "Deletes the room and unschedules anything standing in it, so the agenda never points at a room that no longer exists.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateRoom",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Update a room",
        "description": "Renames or reorders a room.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/rooms/create": {
      "post": {
        "operationId": "createRoom",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Create a room",
        "description": "Adds a room to the event.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/schedule.ics": {
      "get": {
        "operationId": "getScheduleFeed",
        "tags": [
          "Calendar"
        ],
        "summary": "Subscribe to the event calendar",
        "description": "RFC 5545 calendar feed of the published programme. Deliberately open: calendar clients subscribe by URL and cannot send an auth header. Only accepted, scheduled sessions of a published agenda appear.\n\n**No credential required.**",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "text/calendar": {
                "schema": {
                  "type": "string"
                },
                "example": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Trackstage//Event Schedule//EN\r\nCALSCALE:GREGORIAN\r\nMETHOD:PUBLISH\r\nX-WR-CALNAME:AI Engineer Summit 2026\r\nBEGIN:VEVENT\r\nUID:k57818z4rbjk54p03n1kna0rw58c8t7d@ai-summit-2026.trackstage\r\nDTSTAMP:20260811T032838Z\r\nDTSTART:20261012T090000Z\r\nDTEND:20261012T094500Z\r\nSUMMARY:Cost modelling for inference-heavy products\r\n…"
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        },
        "security": []
      }
    },
    "/v1/event/{eventRef}/session-statuses": {
      "get": {
        "operationId": "listSessionStatuses",
        "tags": [
          "Event Settings"
        ],
        "summary": "List session statuses",
        "description": "Every session status configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "created_at": null,
                      "id": "draft",
                      "name": "draft",
                      "order": 0,
                      "system": true,
                      "updated_at": null
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 1,
                    "totalResults": 7,
                    "total_pages": 1,
                    "total_results": 7
                  },
                  "results": [
                    {
                      "created_at": null,
                      "id": "draft",
                      "name": "draft",
                      "order": 0,
                      "system": true,
                      "updated_at": null
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchSessionStatuses",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search session statuses",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions": {
      "get": {
        "operationId": "listSessions",
        "tags": [
          "Sessions"
        ],
        "summary": "List sessions",
        "description": "Paginated sessions. With no filters this returns the accepted programme — the behaviour this endpoint has always had — so existing consumers are unaffected. Passing any filter (`status`, `is_abstract`, `track_id`, `tag_id`, `search`) opts into the full pipeline, soft-deleted rows excluded.\n\n**Scope** `read:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/status"
          },
          {
            "$ref": "#/components/parameters/is_abstract"
          },
          {
            "$ref": "#/components/parameters/track_id"
          },
          {
            "$ref": "#/components/parameters/tag_id"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/expand"
          },
          {
            "$ref": "#/components/parameters/include_deleted"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionsPage"
                },
                "example": {
                  "data": [
                    {
                      "answers": {
                        "description": "<p>A talk created by the verify script.</p>",
                        "format": "Talk",
                        "language": "English",
                        "level": "Introductory",
                        "title": "Verification Talk",
                        "track": "AI Engineering"
                      },
                      "capacity": null,
                      "chairpersons": [],
                      "created_at": "2026-08-11T03:27:33.444Z",
                      "custom_fields": [
                        {
                          "created_at": "2026-08-11T03:27:33.444Z",
                          "id": "description",
                          "internal_name": "description",
                          "name": "Session description",
                          "type": "long_text",
                          "value": "<p>A talk created by the verify script.</p>",
                          "value_raw": "<p>A talk created by the verify script.</p>"
                        },
                        {
                          "created_at": "2026-08-11T03:27:33.444Z",
                          "id": "format",
                          "internal_name": "format",
                          "name": "Format",
                          "type": "dropdown",
                          "value": "Talk",
                          "value_raw": "Talk"
                        }
                      ],
                      "decidedAt": 1786418865308,
                      "decided_at": "2026-08-11T03:27:45.308Z",
                      "deleted_at": null,
                      "description": "<p>A talk created by the verify script.</p>",
                      "durationMinutes": null,
                      "duration_minutes": null,
                      "endTime": null,
                      "ends_at": null,
                      "format": {
                        "id": "Talk",
                        "name": "Talk"
                      },
                      "friendly_id": "SESS-64530",
                      "friendly_id_raw": 64530,
                      "id": "k57a8s50rhxh9xck6kznjnng2d8c88yq",
                      "is_abstract": true,
                      "is_public": true,
                      "kind": "abstract",
                      "language": {
                        "id": "English",
                        "name": "English"
                      },
                      "level": {
                        "id": "Introductory",
                        "name": "Introductory"
                      },
                      "location": null,
                      "moderators": [],
                      "notified_at": "2026-08-11T03:27:45.308Z",
                      "participants": [
                        {
                          "about": "An updated bio from the verify script.",
                          "bio": "An updated bio from the verify script.",
                          "company": null,
                          "company_name": null,
                          "created_at": "2026-08-11T03:27:31.360Z",
                          "email": "verify-e2e-mso3nrc2@example.com",
                          "firstName": "Vera",
                          "first_name": "Vera",
                          "friendly_id": "SPK-95912",
                          "friendly_id_raw": 95912,
                          "full_name": "Vera Efftest",
                          "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
                          "jobTitle": "QA Engineer",
                          "lastName": "Efftest",
                          "last_name": "Efftest",
                          "linkedin_url": null,
                          "name": "Vera Efftest",
                          "participant_role": {
                            "core_role": "speaker",
                            "name": "Speaker",
                            "name_plural": "Speakers",
                            "slug": "speaker"
                          },
                          "phone_mobile": null,
                          "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "pronouns": null,
                          "salutation": null,
                          "title": "QA Engineer",
                          "twitter_url": null,
                          "updated_at": "2026-08-11T03:27:31.360Z",
                          "website_url": null,
                          "workflow_status": null
                        }
                      ],
                      "room": null,
                      "speakers": [
                        {
                          "about": "An updated bio from the verify script.",
                          "bio": "An updated bio from the verify script.",
                          "company": null,
                          "company_name": null,
                          "created_at": "2026-08-11T03:27:31.360Z",
                          "email": "verify-e2e-mso3nrc2@example.com",
                          "firstName": "Vera",
                          "first_name": "Vera",
                          "friendly_id": "SPK-95912",
                          "friendly_id_raw": 95912,
                          "full_name": "Vera Efftest",
                          "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
                          "jobTitle": "QA Engineer",
                          "lastName": "Efftest",
                          "last_name": "Efftest",
                          "linkedin_url": null,
                          "name": "Vera Efftest",
                          "participant_role": {
                            "core_role": "speaker",
                            "name": "Speaker",
                            "name_plural": "Speakers",
                            "slug": "speaker"
                          },
                          "phone_mobile": null,
                          "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "pronouns": null,
                          "salutation": null,
                          "title": "QA Engineer",
                          "twitter_url": null,
                          "updated_at": "2026-08-11T03:27:31.360Z",
                          "website_url": null,
                          "workflow_status": null
                        }
                      ],
                      "startTime": null,
                      "starts_at": null,
                      "status": "accepted",
                      "submittedAt": 1786418853444.4263,
                      "submitter": {
                        "about": "An updated bio from the verify script.",
                        "bio": "An updated bio from the verify script.",
                        "company": null,
                        "company_name": null,
                        "created_at": "2026-08-11T03:27:31.360Z",
                        "email": "verify-e2e-mso3nrc2@example.com",
                        "firstName": "Vera",
                        "first_name": "Vera",
                        "friendly_id": "SPK-95912",
                        "friendly_id_raw": 95912,
                        "full_name": "Vera Efftest",
                        "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                        "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
                        "jobTitle": "QA Engineer",
                        "lastName": "Efftest",
                        "last_name": "Efftest",
                        "linkedin_url": null,
                        "name": "Vera Efftest",
                        "participant_role": null,
                        "phone_mobile": null,
                        "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                        "pronouns": null,
                        "salutation": null,
                        "title": "QA Engineer",
                        "twitter_url": null,
                        "updated_at": "2026-08-11T03:27:31.360Z",
                        "website_url": null,
                        "workflow_status": null
                      },
                      "subsessions": [],
                      "tags": [],
                      "title": "Verification Talk (edited)",
                      "track": {
                        "color": "#2F5CE0",
                        "created_at": "2026-08-11T03:27:18.602Z",
                        "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                        "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
                        "name": "AI Engineering",
                        "order": 0,
                        "updated_at": "2026-08-11T03:27:18.602Z"
                      },
                      "trackColor": "#2F5CE0",
                      "updated_at": "2026-08-11T03:27:33.444Z"
                    }
                  ],
                  "event": {
                    "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                    "agenda_published_at": "2026-08-06T03:27:18.602Z",
                    "created_at": "2026-08-11T03:27:18.602Z",
                    "description": "Two days for the people building AI systems that have to work on Monday morning. Practitioner talks on evaluation, agents, retrieval, inference infrastructure and the product decisions in between — no keynote fluff, no vendor pitches.",
                    "endsAt": 1791939600000,
                    "ends_at": "2026-10-14T01:00:00.000Z",
                    "features": {
                      "custom_fields": true,
                      "translated_fields": false,
                      "webhooks": true
                    },
                    "id": "j971emkyf6md23jphggczhghvd8c8qjq",
                    "logo_url": null,
                    "name": "AI Engineer Summit 2026",
                    "slug": "ai-summit-2026",
                    "startsAt": 1791820800000,
                    "starts_at": "2026-10-12T16:00:00.000Z",
                    "timezone": "America/Los_Angeles",
                    "type": "Conference",
                    "venue": "Moscone West, San Francisco",
                    "websiteUrl": "https://example.com/ai-summit-2026",
                    "website_url": "https://example.com/ai-summit-2026"
                  },
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 1,
                    "page_size": 1,
                    "totalPages": 9,
                    "totalResults": 9,
                    "total_pages": 9,
                    "total_results": 9
                  },
                  "results": [
                    {
                      "answers": {
                        "description": "<p>A talk created by the verify script.</p>",
                        "format": "Talk",
                        "language": "English",
                        "level": "Introductory",
                        "title": "Verification Talk",
                        "track": "AI Engineering"
                      },
                      "capacity": null,
                      "chairpersons": [],
                      "created_at": "2026-08-11T03:27:33.444Z",
                      "custom_fields": [
                        {
                          "created_at": "2026-08-11T03:27:33.444Z",
                          "id": "description",
                          "internal_name": "description",
                          "name": "Session description",
                          "type": "long_text",
                          "value": "<p>A talk created by the verify script.</p>",
                          "value_raw": "<p>A talk created by the verify script.</p>"
                        },
                        {
                          "created_at": "2026-08-11T03:27:33.444Z",
                          "id": "format",
                          "internal_name": "format",
                          "name": "Format",
                          "type": "dropdown",
                          "value": "Talk",
                          "value_raw": "Talk"
                        }
                      ],
                      "decidedAt": 1786418865308,
                      "decided_at": "2026-08-11T03:27:45.308Z",
                      "deleted_at": null,
                      "description": "<p>A talk created by the verify script.</p>",
                      "durationMinutes": null,
                      "duration_minutes": null,
                      "endTime": null,
                      "ends_at": null,
                      "format": {
                        "id": "Talk",
                        "name": "Talk"
                      },
                      "friendly_id": "SESS-64530",
                      "friendly_id_raw": 64530,
                      "id": "k57a8s50rhxh9xck6kznjnng2d8c88yq",
                      "is_abstract": true,
                      "is_public": true,
                      "kind": "abstract",
                      "language": {
                        "id": "English",
                        "name": "English"
                      },
                      "level": {
                        "id": "Introductory",
                        "name": "Introductory"
                      },
                      "location": null,
                      "moderators": [],
                      "notified_at": "2026-08-11T03:27:45.308Z",
                      "participants": [
                        {
                          "about": "An updated bio from the verify script.",
                          "bio": "An updated bio from the verify script.",
                          "company": null,
                          "company_name": null,
                          "created_at": "2026-08-11T03:27:31.360Z",
                          "email": "verify-e2e-mso3nrc2@example.com",
                          "firstName": "Vera",
                          "first_name": "Vera",
                          "friendly_id": "SPK-95912",
                          "friendly_id_raw": 95912,
                          "full_name": "Vera Efftest",
                          "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
                          "jobTitle": "QA Engineer",
                          "lastName": "Efftest",
                          "last_name": "Efftest",
                          "linkedin_url": null,
                          "name": "Vera Efftest",
                          "participant_role": {
                            "core_role": "speaker",
                            "name": "Speaker",
                            "name_plural": "Speakers",
                            "slug": "speaker"
                          },
                          "phone_mobile": null,
                          "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "pronouns": null,
                          "salutation": null,
                          "title": "QA Engineer",
                          "twitter_url": null,
                          "updated_at": "2026-08-11T03:27:31.360Z",
                          "website_url": null,
                          "workflow_status": null
                        }
                      ],
                      "room": null,
                      "speakers": [
                        {
                          "about": "An updated bio from the verify script.",
                          "bio": "An updated bio from the verify script.",
                          "company": null,
                          "company_name": null,
                          "created_at": "2026-08-11T03:27:31.360Z",
                          "email": "verify-e2e-mso3nrc2@example.com",
                          "firstName": "Vera",
                          "first_name": "Vera",
                          "friendly_id": "SPK-95912",
                          "friendly_id_raw": 95912,
                          "full_name": "Vera Efftest",
                          "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
                          "jobTitle": "QA Engineer",
                          "lastName": "Efftest",
                          "last_name": "Efftest",
                          "linkedin_url": null,
                          "name": "Vera Efftest",
                          "participant_role": {
                            "core_role": "speaker",
                            "name": "Speaker",
                            "name_plural": "Speakers",
                            "slug": "speaker"
                          },
                          "phone_mobile": null,
                          "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                          "pronouns": null,
                          "salutation": null,
                          "title": "QA Engineer",
                          "twitter_url": null,
                          "updated_at": "2026-08-11T03:27:31.360Z",
                          "website_url": null,
                          "workflow_status": null
                        }
                      ],
                      "startTime": null,
                      "starts_at": null,
                      "status": "accepted",
                      "submittedAt": 1786418853444.4263,
                      "submitter": {
                        "about": "An updated bio from the verify script.",
                        "bio": "An updated bio from the verify script.",
                        "company": null,
                        "company_name": null,
                        "created_at": "2026-08-11T03:27:31.360Z",
                        "email": "verify-e2e-mso3nrc2@example.com",
                        "firstName": "Vera",
                        "first_name": "Vera",
                        "friendly_id": "SPK-95912",
                        "friendly_id_raw": 95912,
                        "full_name": "Vera Efftest",
                        "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                        "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
                        "jobTitle": "QA Engineer",
                        "lastName": "Efftest",
                        "last_name": "Efftest",
                        "linkedin_url": null,
                        "name": "Vera Efftest",
                        "participant_role": null,
                        "phone_mobile": null,
                        "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
                        "pronouns": null,
                        "salutation": null,
                        "title": "QA Engineer",
                        "twitter_url": null,
                        "updated_at": "2026-08-11T03:27:31.360Z",
                        "website_url": null,
                        "workflow_status": null
                      },
                      "subsessions": [],
                      "tags": [],
                      "title": "Verification Talk (edited)",
                      "track": {
                        "color": "#2F5CE0",
                        "created_at": "2026-08-11T03:27:18.602Z",
                        "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                        "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
                        "name": "AI Engineering",
                        "order": 0,
                        "updated_at": "2026-08-11T03:27:18.602Z"
                      },
                      "trackColor": "#2F5CE0",
                      "updated_at": "2026-08-11T03:27:33.444Z"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      },
      "post": {
        "operationId": "searchSessions",
        "tags": [
          "Sessions"
        ],
        "summary": "Search sessions",
        "description": "Filter, sort and page through sessions and abstracts. Results carry the full session shape including `custom_fields`, `participants` and nested track/room metadata.\n\n**Scope** `read:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionsPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}": {
      "delete": {
        "operationId": "deleteSession",
        "tags": [
          "Session Writes"
        ],
        "summary": "Soft-delete a session",
        "description": "Marks the session deleted. It leaves every listing and reads as 404, and nothing is destroyed — `POST /restore` brings it back with its participants, answers and files intact. Requires the admin role.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "get": {
        "operationId": "getSession",
        "tags": [
          "Sessions"
        ],
        "summary": "Get a session",
        "description": "One session in full. Soft-deleted sessions read as 404 unless `expand=deleted` is passed. `expand=files` inlines the session's attachments.\n\n**Scope** `read:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionEnvelope"
                },
                "example": {
                  "data": {
                    "answers": {},
                    "capacity": 80,
                    "chairpersons": [],
                    "created_at": "2026-08-11T03:28:35.947Z",
                    "custom_fields": [],
                    "decidedAt": null,
                    "decided_at": null,
                    "deleted_at": null,
                    "description": "Created by the agenda e2e flow.",
                    "durationMinutes": 45,
                    "duration_minutes": 45,
                    "endTime": 1791801900000,
                    "ends_at": "2026-10-12T10:45:00.000Z",
                    "format": null,
                    "friendly_id": "SESS-71011",
                    "friendly_id_raw": 71011,
                    "id": "k5745eqp5fr8ecwwtk71tcq61n8c8ghd",
                    "is_abstract": false,
                    "is_public": true,
                    "kind": "session",
                    "language": null,
                    "level": null,
                    "location": "Workshop Room",
                    "moderators": [],
                    "notified_at": null,
                    "participants": [
                      {
                        "about": null,
                        "bio": null,
                        "company": null,
                        "company_name": null,
                        "created_at": "2026-08-11T03:28:35.947Z",
                        "email": "agenda-mso3p553-cyh23@example.com",
                        "firstName": "Aggie",
                        "first_name": "Aggie",
                        "friendly_id": "SPK-50369",
                        "friendly_id_raw": 50369,
                        "full_name": "Aggie Enda",
                        "headshotUrl": null,
                        "id": "m97az6mve2978qw0s37deftq0s8c8hnn",
                        "jobTitle": null,
                        "lastName": "Enda",
                        "last_name": "Enda",
                        "linkedin_url": null,
                        "name": "Aggie Enda",
                        "participant_role": {
                          "core_role": "speaker",
                          "name": "Speaker",
                          "name_plural": "Speakers",
                          "slug": "speaker"
                        },
                        "phone_mobile": null,
                        "photo_url": null,
                        "pronouns": null,
                        "salutation": null,
                        "title": null,
                        "twitter_url": null,
                        "updated_at": "2026-08-11T03:28:35.947Z",
                        "website_url": null,
                        "workflow_status": null
                      }
                    ],
                    "room": {
                      "capacity": 80,
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "id": "js703wmx07yh80wngvzx2xnt9h8c811v",
                      "name": "Workshop Room",
                      "order": 1,
                      "updated_at": "2026-08-11T03:27:18.602Z"
                    },
                    "speakers": [
                      {
                        "about": null,
                        "bio": null,
                        "company": null,
                        "company_name": null,
                        "created_at": "2026-08-11T03:28:35.947Z",
                        "email": "agenda-mso3p553-cyh23@example.com",
                        "firstName": "Aggie",
                        "first_name": "Aggie",
                        "friendly_id": "SPK-50369",
                        "friendly_id_raw": 50369,
                        "full_name": "Aggie Enda",
                        "headshotUrl": null,
                        "id": "m97az6mve2978qw0s37deftq0s8c8hnn",
                        "jobTitle": null,
                        "lastName": "Enda",
                        "last_name": "Enda",
                        "linkedin_url": null,
                        "name": "Aggie Enda",
                        "participant_role": {
                          "core_role": "speaker",
                          "name": "Speaker",
                          "name_plural": "Speakers",
                          "slug": "speaker"
                        },
                        "phone_mobile": null,
                        "photo_url": null,
                        "pronouns": null,
                        "salutation": null,
                        "title": null,
                        "twitter_url": null,
                        "updated_at": "2026-08-11T03:28:35.947Z",
                        "website_url": null,
                        "workflow_status": null
                      }
                    ],
                    "startTime": 1791799200000,
                    "starts_at": "2026-10-12T10:00:00.000Z",
                    "status": "accepted",
                    "submittedAt": 1786418915947.0808,
                    "submitter": {
                      "about": null,
                      "bio": null,
                      "company": null,
                      "company_name": null,
                      "created_at": "2026-08-11T03:28:35.947Z",
                      "email": "organizer@demo.sessionboard.dev",
                      "firstName": "Dana",
                      "first_name": "Dana",
                      "friendly_id": "SPK-57771",
                      "friendly_id_raw": 57771,
                      "full_name": "Dana Organizer",
                      "headshotUrl": null,
                      "id": "m978pq4hq0nnsase57ks3sct4d8c9nyx",
                      "jobTitle": null,
                      "lastName": "Organizer",
                      "last_name": "Organizer",
                      "linkedin_url": null,
                      "name": "Dana Organizer",
                      "participant_role": null,
                      "phone_mobile": null,
                      "photo_url": null,
                      "pronouns": null,
                      "salutation": null,
                      "title": null,
                      "twitter_url": null,
                      "updated_at": "2026-08-11T03:28:35.947Z",
                      "website_url": null,
                      "workflow_status": null
                    },
                    "subsessions": [],
                    "tags": [],
                    "title": "Dragged dg-mso3p553-rtglw",
                    "track": null,
                    "trackColor": null,
                    "updated_at": "2026-08-11T03:28:35.947Z"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateSession",
        "tags": [
          "Session Writes"
        ],
        "summary": "Update a session",
        "description": "Partial update. Send the `updated_at` you last read for optimistic concurrency — a mismatch answers 409 with the current value rather than silently clobbering someone else's edit.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "409": {
            "$ref": "#/components/responses/E409"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/fields": {
      "put": {
        "operationId": "updateSessionFields",
        "tags": [
          "Session Writes"
        ],
        "summary": "Update session custom fields",
        "description": "Writes custom-field values without touching anything else on the session. Keys are field `internal_name`s from `GET /fields`; unknown keys are stored and returned rather than dropped.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomFieldsBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/files": {
      "get": {
        "operationId": "listSessionFiles",
        "tags": [
          "Session Files"
        ],
        "summary": "List files attached to a session",
        "description": "Completed files only, latest version per file group. Incomplete two-phase uploads and soft-deleted files are omitted.\n\n**Scope** `read:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileListEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "initiateSessionFileUpload",
        "tags": [
          "Session Files"
        ],
        "summary": "Initiate a session file upload",
        "description": "Two-phase upload for large files. Returns an id and an `upload.url` on this same origin: PUT the bytes there, then POST `/complete`. Unlike a presigned S3 URL the upload leg is authenticated with your ordinary API key.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionFileCreateBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileUploadTicket"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/files/{fileId}": {
      "delete": {
        "operationId": "deleteSessionFile",
        "tags": [
          "Session Files"
        ],
        "summary": "Delete a session file",
        "description": "Soft-deletes the attachment; the bytes are swept later.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          },
          {
            "$ref": "#/components/parameters/fileId"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateSessionFile",
        "tags": [
          "Session Files"
        ],
        "summary": "Update session file metadata",
        "description": "Changes the display title and/or the participant the file is assigned to. Does not touch the bytes — use `/replace` for that.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          },
          {
            "$ref": "#/components/parameters/fileId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionFileUpdateBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/files/{fileId}/bytes": {
      "put": {
        "operationId": "putSessionFileBytes",
        "tags": [
          "Session Files"
        ],
        "summary": "Upload the bytes for an initiated file",
        "description": "The upload leg of the two-phase flow. Send the raw file as the request body. Re-PUTting replaces the pending bytes and discards the superseded blob.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          },
          {
            "$ref": "#/components/parameters/fileId"
          }
        ],
        "requestBody": {
          "required": true,
          "description": "The raw file bytes.",
          "content": {
            "application/octet-stream": {
              "schema": {
                "type": "string",
                "format": "binary"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileBytesReceipt"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/files/{fileId}/complete": {
      "post": {
        "operationId": "completeSessionFileUpload",
        "tags": [
          "Session Files"
        ],
        "summary": "Finalize a session file upload",
        "description": "Promotes an uploaded blob into a real attachment on the session. Fails with 400 if no bytes were received.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          },
          {
            "$ref": "#/components/parameters/fileId"
          }
        ],
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/files/{fileId}/replace": {
      "post": {
        "operationId": "replaceSessionFile",
        "tags": [
          "Session Files"
        ],
        "summary": "Replace session file bytes",
        "description": "Starts a two-phase upload that supersedes an existing file, bumping its version. The previous version is retired when the replacement completes.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          },
          {
            "$ref": "#/components/parameters/fileId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionFileCreateBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileUploadTicket"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/files/upload": {
      "post": {
        "operationId": "uploadSessionFile",
        "tags": [
          "Session Files"
        ],
        "summary": "Upload a session file (simple)",
        "description": "One multipart request, up to 50 MB. The field name must be `file`. Size and MIME type are read from the bytes. For anything larger use the two-phase flow.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SessionFileUploadForm"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "413": {
            "$ref": "#/components/responses/E413"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/{sessionId}/restore": {
      "post": {
        "operationId": "restoreSession",
        "tags": [
          "Session Writes"
        ],
        "summary": "Restore a deleted session",
        "description": "Undoes a soft delete. Requires the admin role.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/sessionId"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/bulk": {
      "post": {
        "operationId": "bulkSessions",
        "tags": [
          "Session Writes"
        ],
        "summary": "Bulk session operations",
        "description": "Up to 100 create/update/delete operations in one request. Each operation succeeds or fails independently and is reported by index, so a bad row never sinks the batch.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkOperations"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/create": {
      "post": {
        "operationId": "createSession",
        "tags": [
          "Session Writes"
        ],
        "summary": "Create a session",
        "description": "Creates a programme session, or an abstract when `is_abstract` is true. A submitter is resolved from `submitter_email` (created if new) and attached as the first speaker, so a session is never speakerless.\n\n**Scope** `write:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/sessions/status": {
      "post": {
        "operationId": "searchSessionsByStatus",
        "tags": [
          "Sessions"
        ],
        "summary": "Search sessions by status",
        "description": "Lightweight id + status projection with no joins — the cheap way to reconcile a mirror. Soft-deleted rows are included, carrying `deleted_at`.\n\n**Scope** `read:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionStatusesPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/event/{eventRef}/speakers": {
      "get": {
        "operationId": "listSpeakers",
        "tags": [
          "Speakers"
        ],
        "summary": "List speakers",
        "description": "Everyone on the event's roster with the sessions they are on, ordered by surname.\n\n**Scope** `read:contacts` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          },
          {
            "$ref": "#/components/parameters/workflow_status"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpeakersPage"
                },
                "example": {
                  "data": [
                    {
                      "about": null,
                      "bio": null,
                      "company": "Ridgeline",
                      "company_name": "Ridgeline",
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "email": "tom.beaumont@example.com",
                      "firstName": "Tom",
                      "first_name": "Tom",
                      "friendly_id": "SPK-45805",
                      "friendly_id_raw": 45805,
                      "full_name": "Tom Beaumont",
                      "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
                      "id": "m97ar7w0qz8xxwb6zsyr4nbgkh8c8whm",
                      "jobTitle": "Developer Advocate",
                      "lastName": "Beaumont",
                      "last_name": "Beaumont",
                      "linkedin_url": null,
                      "name": "Tom Beaumont",
                      "participant_role": null,
                      "phone_mobile": null,
                      "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
                      "pronouns": null,
                      "salutation": null,
                      "sessions": [
                        {
                          "id": "k576ypz0a1h0hsv1ysfq2egc1x8c9gnp",
                          "role": "speaker",
                          "startTime": 1791824400000,
                          "starts_at": "2026-10-12T17:00:00.000Z",
                          "status": "accepted",
                          "title": "Evaluation harnesses for production LLMs"
                        }
                      ],
                      "title": "Developer Advocate",
                      "twitter_url": null,
                      "updated_at": "2026-08-11T03:27:18.602Z",
                      "website_url": null,
                      "workflow_status": null
                    }
                  ],
                  "event": {
                    "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                    "agenda_published_at": "2026-08-06T03:27:18.602Z",
                    "created_at": "2026-08-11T03:27:18.602Z",
                    "description": "Two days for the people building AI systems that have to work on Monday morning. Practitioner talks on evaluation, agents, retrieval, inference infrastructure and the product decisions in between — no keynote fluff, no vendor pitches.",
                    "endsAt": 1791939600000,
                    "ends_at": "2026-10-14T01:00:00.000Z",
                    "features": {
                      "custom_fields": true,
                      "translated_fields": false,
                      "webhooks": true
                    },
                    "id": "j971emkyf6md23jphggczhghvd8c8qjq",
                    "logo_url": null,
                    "name": "AI Engineer Summit 2026",
                    "slug": "ai-summit-2026",
                    "startsAt": 1791820800000,
                    "starts_at": "2026-10-12T16:00:00.000Z",
                    "timezone": "America/Los_Angeles",
                    "type": "Conference",
                    "venue": "Moscone West, San Francisco",
                    "websiteUrl": "https://example.com/ai-summit-2026",
                    "website_url": "https://example.com/ai-summit-2026"
                  },
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 1,
                    "page_size": 1,
                    "totalPages": 16,
                    "totalResults": 16,
                    "total_pages": 16,
                    "total_results": 16
                  },
                  "results": [
                    {
                      "about": null,
                      "bio": null,
                      "company": "Ridgeline",
                      "company_name": "Ridgeline",
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "email": "tom.beaumont@example.com",
                      "firstName": "Tom",
                      "first_name": "Tom",
                      "friendly_id": "SPK-45805",
                      "friendly_id_raw": 45805,
                      "full_name": "Tom Beaumont",
                      "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
                      "id": "m97ar7w0qz8xxwb6zsyr4nbgkh8c8whm",
                      "jobTitle": "Developer Advocate",
                      "lastName": "Beaumont",
                      "last_name": "Beaumont",
                      "linkedin_url": null,
                      "name": "Tom Beaumont",
                      "participant_role": null,
                      "phone_mobile": null,
                      "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
                      "pronouns": null,
                      "salutation": null,
                      "sessions": [
                        {
                          "id": "k576ypz0a1h0hsv1ysfq2egc1x8c9gnp",
                          "role": "speaker",
                          "startTime": 1791824400000,
                          "starts_at": "2026-10-12T17:00:00.000Z",
                          "status": "accepted",
                          "title": "Evaluation harnesses for production LLMs"
                        }
                      ],
                      "title": "Developer Advocate",
                      "twitter_url": null,
                      "updated_at": "2026-08-11T03:27:18.602Z",
                      "website_url": null,
                      "workflow_status": null
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      },
      "post": {
        "operationId": "searchSpeakers",
        "tags": [
          "Speakers"
        ],
        "summary": "Search speakers",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:contacts` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpeakerSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpeakersPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/event/{eventRef}/speakers/{speakerId}": {
      "get": {
        "operationId": "getSpeaker",
        "tags": [
          "Speakers"
        ],
        "summary": "Get a speaker",
        "description": "One speaker with every session they participate in, in full session shape.\n\n**Scope** `read:contacts` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/speakerId"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpeakerEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateSpeaker",
        "tags": [
          "Speakers"
        ],
        "summary": "Update a speaker",
        "description": "Partial update of a speaker's profile and workflow status.\n\n**Scope** `write:contacts` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/speakerId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpeakerWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpeakerEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/speakers/create": {
      "post": {
        "operationId": "createSpeaker",
        "tags": [
          "Speakers"
        ],
        "summary": "Create a speaker",
        "description": "Adds someone to the roster. Idempotent on email within the event: creating a speaker who already exists updates their workflow status instead of duplicating them.\n\n**Scope** `write:contacts` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `session_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpeakerWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpeakerEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/statuses": {
      "get": {
        "operationId": "listStatuses",
        "tags": [
          "Event Settings"
        ],
        "summary": "List statuses",
        "description": "Every session status configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "created_at": null,
                      "id": "draft",
                      "name": "draft",
                      "order": 0,
                      "system": true,
                      "updated_at": null
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 1,
                    "totalResults": 7,
                    "total_pages": 1,
                    "total_results": 7
                  },
                  "results": [
                    {
                      "created_at": null,
                      "id": "draft",
                      "name": "draft",
                      "order": 0,
                      "system": true,
                      "updated_at": null
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchStatuses",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search statuses",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/statuses/{id}": {
      "delete": {
        "operationId": "deleteStatuse",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Delete a session status",
        "description": "Removes the session status. Session statuses are system-defined in this product, so this always answers 400 with an explanation — the pipeline (draft → pending → accept/decline queue → accepted/declined, plus withdrawn) is fixed.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateStatuse",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Update a session status",
        "description": "Renames or reorders a session status. Session statuses are system-defined in this product, so this always answers 400 with an explanation — the pipeline (draft → pending → accept/decline queue → accepted/declined, plus withdrawn) is fixed.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/statuses/create": {
      "post": {
        "operationId": "createStatuse",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Create a session status",
        "description": "Adds a session status to the event. Session statuses are system-defined in this product, so this always answers 400 with an explanation — the pipeline (draft → pending → accept/decline queue → accepted/declined, plus withdrawn) is fixed.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/submissions": {
      "get": {
        "operationId": "listSubmissions",
        "tags": [
          "Sessions"
        ],
        "summary": "List submissions",
        "description": "Every submission for the event with its participants, in the shape this endpoint has returned since before the parity work. `POST /sessions` with `filters.isAbstract` is the richer modern equivalent.\n\n**Scope** `read:sessions` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubmissionsPage"
                },
                "example": {
                  "data": [
                    {
                      "decidedAt": null,
                      "description": "<p>A talk created by the verify script.</p>",
                      "format": "Talk",
                      "id": "k57a7y1qvb8wvbfe7q2wj5928s8c8a4z",
                      "kind": "abstract",
                      "language": "English",
                      "level": "Introductory",
                      "speakers": [
                        {
                          "company": null,
                          "email": "verify-quiet-mso3nunn@example.com",
                          "id": "m97f7dwt7rmehcsqreq8sxjnzh8c9h3e",
                          "jobTitle": null,
                          "name": "Quinn Quiet",
                          "role": "speaker"
                        }
                      ],
                      "status": "pending",
                      "submittedAt": 1786418856941.303,
                      "tags": [],
                      "title": "Quiet Talk",
                      "track": "AI Engineering"
                    }
                  ],
                  "event": {
                    "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                    "endsAt": 1791939600000,
                    "name": "AI Engineer Summit 2026",
                    "slug": "ai-summit-2026",
                    "startsAt": 1791820800000,
                    "timezone": "America/Los_Angeles",
                    "venue": "Moscone West, San Francisco"
                  },
                  "pagination": {
                    "currentPage": 1,
                    "pageSize": 1,
                    "totalPages": 20,
                    "totalResults": 20
                  },
                  "results": [
                    {
                      "decidedAt": null,
                      "description": "<p>A talk created by the verify script.</p>",
                      "format": "Talk",
                      "id": "k57a7y1qvb8wvbfe7q2wj5928s8c8a4z",
                      "kind": "abstract",
                      "language": "English",
                      "level": "Introductory",
                      "speakers": [
                        {
                          "company": null,
                          "email": "verify-quiet-mso3nunn@example.com",
                          "id": "m97f7dwt7rmehcsqreq8sxjnzh8c9h3e",
                          "jobTitle": null,
                          "name": "Quinn Quiet",
                          "role": "speaker"
                        }
                      ],
                      "status": "pending",
                      "submittedAt": 1786418856941.303,
                      "tags": [],
                      "title": "Quiet Talk",
                      "track": "AI Engineering"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/event/{eventRef}/tags": {
      "get": {
        "operationId": "listTags",
        "tags": [
          "Event Settings"
        ],
        "summary": "List tags",
        "description": "Every tag configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "created_at": null,
                      "id": "adoption",
                      "name": "adoption",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 2,
                    "totalResults": 30,
                    "total_pages": 2,
                    "total_results": 30
                  },
                  "results": [
                    {
                      "created_at": null,
                      "id": "adoption",
                      "name": "adoption",
                      "order": 0,
                      "updated_at": null
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchTags",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search tags",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/tags/{id}": {
      "delete": {
        "operationId": "deleteTag",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Delete a tag",
        "description": "Removes the tag. Tags have no table of their own: they are the options on the CFP form's `tags` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateTag",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Update a tag",
        "description": "Renames or reorders a tag. Tags have no table of their own: they are the options on the CFP form's `tags` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/tags/create": {
      "post": {
        "operationId": "createTag",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Create a tag",
        "description": "Adds a tag to the event. Tags have no table of their own: they are the options on the CFP form's `tags` question, so this edits that question and the form builder shows the change immediately.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/tracks": {
      "get": {
        "operationId": "listTracks",
        "tags": [
          "Event Settings"
        ],
        "summary": "List tracks",
        "description": "Every track configured on the event.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          },
          {
            "$ref": "#/components/parameters/search"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                },
                "example": {
                  "data": [
                    {
                      "color": "#2F5CE0",
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                      "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
                      "name": "AI Engineering",
                      "order": 0,
                      "updated_at": "2026-08-11T03:27:18.602Z"
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 25,
                    "page_size": 25,
                    "totalPages": 1,
                    "totalResults": 3,
                    "total_pages": 1,
                    "total_results": 3
                  },
                  "results": [
                    {
                      "color": "#2F5CE0",
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
                      "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
                      "name": "AI Engineering",
                      "order": 0,
                      "updated_at": "2026-08-11T03:27:18.602Z"
                    }
                  ],
                  "unknownResource": false
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "post": {
        "operationId": "searchTracks",
        "tags": [
          "Event Settings"
        ],
        "summary": "Search tracks",
        "description": "Same data as the list form, with the search body Trackstage clients send.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `entity_reads` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/tracks/{id}": {
      "delete": {
        "operationId": "deleteTrack",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Delete a track",
        "description": "Deletes the track and clears it from every session that referenced it.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "put": {
        "operationId": "updateTrack",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Update a track",
        "description": "Renames or reorders a track.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          },
          {
            "$ref": "#/components/parameters/id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/event/{eventRef}/tracks/create": {
      "post": {
        "operationId": "createTrack",
        "tags": [
          "Metadata Writes"
        ],
        "summary": "Create a track",
        "description": "Adds a track to the event.\n\n**Scope** `write:metadata` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `metadata_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/eventRef"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/events": {
      "get": {
        "operationId": "listEvents",
        "tags": [
          "Events"
        ],
        "summary": "List events",
        "description": "Every event in every workspace the credential belongs to, newest first. The read-only demo token sees all demo events.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/pageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventsPage"
                },
                "example": {
                  "data": [
                    {
                      "_id": "j97c636dpqayasnhm4whc59cx98c8c8v",
                      "agenda_published_at": null,
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "description": "A single-track day for the people who maintain design systems, and everyone who has to live with them.",
                      "endsAt": 1793919600000,
                      "ends_at": "2026-11-05T23:00:00.000Z",
                      "features": {
                        "custom_fields": true,
                        "translated_fields": false,
                        "webhooks": true
                      },
                      "id": "j97c636dpqayasnhm4whc59cx98c8c8v",
                      "logo_url": null,
                      "name": "Design Systems Day",
                      "slug": "design-systems-day",
                      "startsAt": 1793887200000,
                      "starts_at": "2026-11-05T14:00:00.000Z",
                      "timezone": "America/New_York",
                      "type": "Meetup",
                      "venue": "Brooklyn Expo Center, New York",
                      "website_url": null
                    }
                  ],
                  "pagination": {
                    "currentPage": 1,
                    "current_page": 1,
                    "pageSize": 1,
                    "page_size": 1,
                    "totalPages": 8,
                    "totalResults": 8,
                    "total_pages": 8,
                    "total_results": 8
                  },
                  "results": [
                    {
                      "_id": "j97c636dpqayasnhm4whc59cx98c8c8v",
                      "agenda_published_at": null,
                      "created_at": "2026-08-11T03:27:18.602Z",
                      "description": "A single-track day for the people who maintain design systems, and everyone who has to live with them.",
                      "endsAt": 1793919600000,
                      "ends_at": "2026-11-05T23:00:00.000Z",
                      "features": {
                        "custom_fields": true,
                        "translated_fields": false,
                        "webhooks": true
                      },
                      "id": "j97c636dpqayasnhm4whc59cx98c8c8v",
                      "logo_url": null,
                      "name": "Design Systems Day",
                      "slug": "design-systems-day",
                      "startsAt": 1793887200000,
                      "starts_at": "2026-11-05T14:00:00.000Z",
                      "timezone": "America/New_York",
                      "type": "Meetup",
                      "venue": "Brooklyn Expo Center, New York",
                      "website_url": null
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/webhooks": {
      "get": {
        "operationId": "listWebhooks",
        "tags": [
          "Webhooks"
        ],
        "summary": "List webhook endpoints",
        "description": "Every endpoint in the workspaces you belong to. Signing secrets are masked here — the full value is shown once, when the endpoint is created or its secret rotated.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookListEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      },
      "post": {
        "operationId": "createWebhook",
        "tags": [
          "Webhooks"
        ],
        "summary": "Create a webhook endpoint",
        "description": "Subscribes an HTTPS endpoint to a set of event types (`[\"*\"]` for all). The response is the only time the signing secret is returned in full. Requires the admin role.\n\n**Scope** `write:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `event_writes` bucket.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookWriteBody"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/webhooks/{webhookId}": {
      "delete": {
        "operationId": "deleteWebhook",
        "tags": [
          "Webhooks"
        ],
        "summary": "Delete a webhook endpoint",
        "description": "Removes the endpoint and its delivery log. Requires the admin role.\n\n**Scope** `write:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `event_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/webhookId"
          }
        ],
        "responses": {
          "204": {
            "description": "No content.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      },
      "get": {
        "operationId": "getWebhook",
        "tags": [
          "Webhooks"
        ],
        "summary": "Get a webhook endpoint",
        "description": "The endpoint plus its 25 most recent delivery attempts.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/webhookId"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDetailEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      },
      "put": {
        "operationId": "updateWebhook",
        "tags": [
          "Webhooks"
        ],
        "summary": "Update a webhook endpoint",
        "description": "Change the URL, the subscribed event types, the description, or disable it. Requires the admin role.\n\n**Scope** `write:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `event_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/webhookId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookWriteBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEnvelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/webhooks/{webhookId}/deliveries": {
      "get": {
        "operationId": "listWebhookDeliveries",
        "tags": [
          "Webhooks"
        ],
        "summary": "List delivery attempts",
        "description": "The delivery log for one endpoint, newest first, including the exact signed payload, the response status and any error.\n\n**Scope** `read:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.",
        "parameters": [
          {
            "$ref": "#/components/parameters/webhookId"
          },
          {
            "$ref": "#/components/parameters/limit"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDeliveryListEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          }
        }
      }
    },
    "/v1/webhooks/{webhookId}/rotate": {
      "post": {
        "operationId": "rotateWebhookSecret",
        "tags": [
          "Webhooks"
        ],
        "summary": "Rotate the signing secret",
        "description": "Issues a new `whsec_…` secret and returns it in full, once. Deliveries in flight are signed with whichever secret was current when they were sent.\n\n**Scope** `write:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `event_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/webhookId"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    },
    "/v1/webhooks/{webhookId}/test": {
      "post": {
        "operationId": "testWebhook",
        "tags": [
          "Webhooks"
        ],
        "summary": "Send a test delivery",
        "description": "Queues a signed `webhook.test` delivery so you can verify your receiver without waiting for a real change.\n\n**Scope** `write:events` — enforced only when the presenting key declares a scope set; an unscoped key acts with its owner's workspace permissions.\n\n**Rate limit** 100 requests / 15 minutes in the `event_writes` bucket.",
        "parameters": [
          {
            "$ref": "#/components/parameters/webhookId"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookTestEnvelope"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "403": {
            "$ref": "#/components/responses/E403"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          }
        }
      }
    }
  },
  "webhooks": {
    "delivery": {
      "post": {
        "operationId": "webhookDelivery",
        "tags": [
          "Webhooks"
        ],
        "summary": "Webhook delivery (sent BY Trackstage to your endpoint)",
        "description": "The request your registered endpoint receives. Respond 2xx to acknowledge; anything else is retried with exponential backoff.",
        "parameters": [
          {
            "name": "Trackstage-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "`t=<unix-seconds>,v1=<hex>` — HMAC-SHA256 over `\"{t}.{body}\"`."
          },
          {
            "name": "Trackstage-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The event type, e.g. `session.updated`."
          },
          {
            "name": "Trackstage-Delivery",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Unique delivery id — use it for idempotency."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Acknowledged. Any 2xx works."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "x-access-token",
        "description": "Personal API key from Settings → API & MCP."
      },
      "BearerToken": {
        "type": "http",
        "scheme": "bearer",
        "description": "The same key, sent as `Authorization: Bearer sb_live_…`."
      }
    },
    "parameters": {
      "eventRef": {
        "name": "eventRef",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The event's slug (the one in its public URL) or its raw id. Both work everywhere.",
        "example": "ai-summit-2026"
      },
      "sessionId": {
        "name": "sessionId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The session id."
      },
      "speakerId": {
        "name": "speakerId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The speaker id."
      },
      "fileId": {
        "name": "fileId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The file id, or the upload id from an initiate/replace call."
      },
      "fieldId": {
        "name": "fieldId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The field's `internal_name`."
      },
      "webhookId": {
        "name": "webhookId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The webhook endpoint id."
      },
      "id": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The resource id. For form-backed value lists (tags, formats, levels, languages) this is the value itself, URL-encoded."
      },
      "page": {
        "name": "page",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "description": "1-based page number."
      },
      "pageSize": {
        "name": "pageSize",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 25
        },
        "description": "Rows per page, max 100. `page_size` is accepted as an alias."
      },
      "search": {
        "name": "search",
        "in": "query",
        "schema": {
          "type": "string"
        },
        "description": "Free-text filter."
      },
      "status": {
        "name": "status",
        "in": "query",
        "schema": {
          "type": "string"
        },
        "description": "Filter by status. Passing this opts out of the accepted-only default."
      },
      "is_abstract": {
        "name": "is_abstract",
        "in": "query",
        "schema": {
          "type": "boolean"
        },
        "description": "Restrict to abstracts (true) or programme sessions (false)."
      },
      "track_id": {
        "name": "track_id",
        "in": "query",
        "schema": {
          "type": "string"
        }
      },
      "tag_id": {
        "name": "tag_id",
        "in": "query",
        "schema": {
          "type": "string"
        }
      },
      "include_deleted": {
        "name": "include_deleted",
        "in": "query",
        "schema": {
          "type": "boolean"
        },
        "description": "Include soft-deleted sessions."
      },
      "expand": {
        "name": "expand",
        "in": "query",
        "schema": {
          "type": "string"
        },
        "description": "Comma-separated. `files` inlines attachments; `deleted` lets a soft-deleted session be read."
      },
      "workflow_status": {
        "name": "workflow_status",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "invited",
            "confirmed",
            "dropped"
          ]
        }
      },
      "event": {
        "name": "event",
        "in": "query",
        "schema": {
          "type": "string"
        },
        "description": "Restrict to endpoints scoped to this event (slug or id)."
      },
      "limit": {
        "name": "limit",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 25
        }
      },
      "secret": {
        "name": "secret",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "The endpoint's `whsec_…` signing secret, so the sink can verify the HMAC."
      }
    },
    "headers": {
      "RateLimit-Limit": {
        "schema": {
          "type": "integer"
        },
        "description": "Requests allowed in the current window."
      },
      "RateLimit-Remaining": {
        "schema": {
          "type": "integer"
        },
        "description": "Requests left in the current window."
      },
      "RateLimit-Reset": {
        "schema": {
          "type": "integer"
        },
        "description": "Unix seconds at which the window resets."
      },
      "Retry-After": {
        "schema": {
          "type": "integer"
        },
        "description": "Seconds to wait before retrying."
      }
    },
    "responses": {
      "E400": {
        "description": "Bad request — the body or parameters are invalid. The message says what.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "E401": {
        "description": "Missing or invalid API token.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "E403": {
        "description": "The credential is valid but lacks the scope, role or workspace access this needs.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "E404": {
        "description": "No such event, resource, or endpoint.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "E409": {
        "description": "Stale update — the resource changed since you fetched it. Re-read and retry.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "E413": {
        "description": "The file exceeds the 50 MB simple-upload ceiling. Use the two-phase flow.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "E429": {
        "description": "Rate limited. Wait for `Retry-After` seconds.",
        "headers": {
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimit-Limit"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimit-Remaining"
          },
          "RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimit-Reset"
          },
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every failure uses this shape. `error` and `message` are the same human sentence — `error` is where this API has always put it, `message` is where Trackstage clients look. `code` is the machine-readable name.",
        "required": [
          "error",
          "code",
          "message",
          "status"
        ],
        "properties": {
          "error": {
            "type": "string",
            "examples": [
              "Session not found."
            ]
          },
          "code": {
            "type": "string",
            "examples": [
              "NotFoundError"
            ]
          },
          "message": {
            "type": "string",
            "examples": [
              "Session not found."
            ]
          },
          "status": {
            "type": "integer",
            "examples": [
              404
            ]
          }
        }
      },
      "Pagination": {
        "type": "object",
        "description": "Carries both spellings: camelCase (what this API has always returned) and snake_case (what Trackstage's CRUD proxy returns). They always hold the same values.",
        "properties": {
          "currentPage": {
            "type": "integer",
            "examples": [
              1
            ]
          },
          "pageSize": {
            "type": "integer",
            "examples": [
              25
            ]
          },
          "totalPages": {
            "type": "integer",
            "examples": [
              4
            ]
          },
          "totalResults": {
            "type": "integer",
            "examples": [
              97
            ]
          },
          "current_page": {
            "type": "integer",
            "examples": [
              1
            ]
          },
          "page_size": {
            "type": "integer",
            "examples": [
              25
            ]
          },
          "total_pages": {
            "type": "integer",
            "examples": [
              4
            ]
          },
          "total_results": {
            "type": "integer",
            "examples": [
              97
            ]
          }
        }
      },
      "CustomFieldValue": {
        "type": "object",
        "description": "One answer to one CFP question. `value` is the flattened string Trackstage clients expect; `value_raw` is the untouched JSON, so multi-selects and structured answers are never lossy.",
        "properties": {
          "id": {
            "type": "string",
            "examples": [
              "parity_notes"
            ]
          },
          "internal_name": {
            "type": "string",
            "examples": [
              "parity_notes"
            ]
          },
          "name": {
            "type": "string",
            "examples": [
              "Parity Notes"
            ]
          },
          "type": {
            "type": "string",
            "examples": [
              "long_text"
            ]
          },
          "value": {
            "type": "string"
          },
          "value_raw": {
            "description": "Any JSON value."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "When the answer's submission was created."
          }
        }
      },
      "ParticipantRole": {
        "type": "object",
        "nullable": true,
        "properties": {
          "slug": {
            "type": "string",
            "examples": [
              "speaker"
            ]
          },
          "name": {
            "type": "string",
            "examples": [
              "Speaker"
            ]
          },
          "name_plural": {
            "type": "string",
            "examples": [
              "Speakers"
            ]
          },
          "core_role": {
            "type": "string",
            "enum": [
              "speaker",
              "chairperson",
              "moderator"
            ]
          }
        }
      },
      "Speaker": {
        "type": "object",
        "description": "A person on the event. Carries the snake_case contact profile plus the camelCase aliases this API returned before the parity work.",
        "properties": {
          "id": {
            "type": "string"
          },
          "friendly_id": {
            "type": "string",
            "examples": [
              "SPK-20431"
            ]
          },
          "friendly_id_raw": {
            "type": "integer",
            "examples": [
              20431
            ]
          },
          "full_name": {
            "type": "string"
          },
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "company_name": {
            "type": "string",
            "nullable": true
          },
          "about": {
            "type": "string",
            "nullable": true
          },
          "phone_mobile": {
            "type": "string",
            "nullable": true
          },
          "pronouns": {
            "type": "string",
            "nullable": true
          },
          "salutation": {
            "type": "string",
            "nullable": true
          },
          "photo_url": {
            "type": "string",
            "format": "uri",
            "nullable": true
          },
          "website_url": {
            "type": "string",
            "nullable": true
          },
          "linkedin_url": {
            "type": "string",
            "nullable": true
          },
          "twitter_url": {
            "type": "string",
            "nullable": true
          },
          "workflow_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "invited",
              "confirmed",
              "dropped",
              null
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Creation time."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Last write."
          },
          "participant_role": {
            "$ref": "#/components/schemas/ParticipantRole"
          },
          "name": {
            "type": "string",
            "description": "Legacy alias of `full_name`."
          },
          "firstName": {
            "type": "string",
            "description": "Legacy alias of `first_name`."
          },
          "lastName": {
            "type": "string",
            "description": "Legacy alias of `last_name`."
          },
          "jobTitle": {
            "type": "string",
            "nullable": true,
            "description": "Legacy alias of `title`."
          },
          "company": {
            "type": "string",
            "nullable": true,
            "description": "Legacy alias of `company_name`."
          },
          "bio": {
            "type": "string",
            "nullable": true,
            "description": "Legacy alias of `about`."
          },
          "headshotUrl": {
            "type": "string",
            "nullable": true,
            "description": "Legacy alias of `photo_url`."
          }
        }
      },
      "NamedMetadata": {
        "type": "object",
        "nullable": true,
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "color": {
            "type": "string",
            "examples": [
              "#0F6E70"
            ]
          },
          "order": {
            "type": "integer"
          },
          "capacity": {
            "type": "integer",
            "nullable": true
          },
          "event_id": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Creation time."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Last write."
          }
        }
      },
      "SessionFile": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "nullable": true
          },
          "title": {
            "type": "string"
          },
          "filename": {
            "type": "string"
          },
          "size": {
            "type": "integer",
            "nullable": true
          },
          "mimetype": {
            "type": "string",
            "nullable": true
          },
          "version": {
            "type": "integer"
          },
          "approval_status": {
            "type": "string",
            "enum": [
              "pending",
              "approved",
              "changes_requested"
            ]
          },
          "review_note": {
            "type": "string",
            "nullable": true
          },
          "session_id": {
            "type": "string",
            "nullable": true
          },
          "assigned_participant_id": {
            "type": "string",
            "nullable": true
          },
          "assigned_participant_email": {
            "type": "string",
            "nullable": true
          },
          "assigned_participant_name": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Upload time."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Last write."
          }
        }
      },
      "Session": {
        "type": "object",
        "description": "A session or abstract. The union of Trackstage's `Session` shape and every field this API returned before parity, so it is a strict superset of both.",
        "properties": {
          "id": {
            "type": "string"
          },
          "friendly_id": {
            "type": "string",
            "examples": [
              "SESS-73041"
            ]
          },
          "friendly_id_raw": {
            "type": "integer",
            "examples": [
              73041
            ]
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "pending",
              "accept_queue",
              "decline_queue",
              "accepted",
              "declined",
              "withdrawn"
            ]
          },
          "is_abstract": {
            "type": "boolean",
            "description": "True for CFP submissions, false for programme sessions."
          },
          "kind": {
            "type": "string",
            "enum": [
              "abstract",
              "session"
            ]
          },
          "is_public": {
            "type": "boolean"
          },
          "starts_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Scheduled start."
          },
          "ends_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Scheduled end, derived from duration."
          },
          "duration_minutes": {
            "type": "integer",
            "nullable": true
          },
          "capacity": {
            "type": "integer",
            "nullable": true,
            "description": "Assigned room's capacity."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Submission time."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Concurrency token — send this back on PUT."
          },
          "deleted_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Set when soft-deleted."
          },
          "decided_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "When the accept/decline decision was committed."
          },
          "notified_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "When the decision email went out."
          },
          "custom_fields": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomFieldValue"
            }
          },
          "answers": {
            "type": "object",
            "additionalProperties": true,
            "description": "The raw answer map keyed by field `internal_name`."
          },
          "speakers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Speaker"
            }
          },
          "chairpersons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Speaker"
            }
          },
          "moderators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Speaker"
            }
          },
          "participants": {
            "type": "array",
            "description": "Every participant in one flat list, each with `participant_role`.",
            "items": {
              "$ref": "#/components/schemas/Speaker"
            }
          },
          "submitter": {
            "$ref": "#/components/schemas/Speaker"
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NamedMetadata"
            }
          },
          "track": {
            "$ref": "#/components/schemas/NamedMetadata"
          },
          "room": {
            "$ref": "#/components/schemas/NamedMetadata"
          },
          "format": {
            "$ref": "#/components/schemas/NamedMetadata"
          },
          "level": {
            "$ref": "#/components/schemas/NamedMetadata"
          },
          "language": {
            "$ref": "#/components/schemas/NamedMetadata"
          },
          "subsessions": {
            "type": "array",
            "items": {},
            "description": "Always empty — this product has no parent/child sessions. Present so clients written against Trackstage can iterate it without a guard."
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionFile"
            },
            "description": "Only present when `expand=files` is requested."
          },
          "startTime": {
            "type": "integer",
            "nullable": true,
            "description": "Legacy: start in epoch ms."
          },
          "endTime": {
            "type": "integer",
            "nullable": true,
            "description": "Legacy: end in epoch ms."
          },
          "durationMinutes": {
            "type": "integer",
            "nullable": true,
            "description": "Legacy alias."
          },
          "location": {
            "type": "string",
            "nullable": true,
            "description": "Legacy: room name."
          },
          "trackColor": {
            "type": "string",
            "nullable": true,
            "description": "Legacy: track colour."
          },
          "submittedAt": {
            "type": "integer",
            "description": "Legacy: creation time in epoch ms."
          },
          "decidedAt": {
            "type": "integer",
            "nullable": true,
            "description": "Legacy alias in epoch ms."
          }
        }
      },
      "SessionStatusRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "friendly_id": {
            "type": "string"
          },
          "friendly_id_raw": {
            "type": "integer"
          },
          "status": {
            "type": "string"
          },
          "is_abstract": {
            "type": "boolean"
          },
          "deleted_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Set when soft-deleted."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Creation time."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Last write."
          },
          "subsessions": {
            "type": "array",
            "items": {}
          }
        }
      },
      "Event": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "venue": {
            "type": "string",
            "nullable": true
          },
          "website_url": {
            "type": "string",
            "nullable": true
          },
          "timezone": {
            "type": "string",
            "examples": [
              "America/Los_Angeles"
            ]
          },
          "starts_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Event start."
          },
          "ends_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Event end."
          },
          "logo_url": {
            "type": "string",
            "nullable": true
          },
          "agenda_published_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Set once the public programme is live."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Creation time."
          },
          "features": {
            "type": "object",
            "properties": {
              "translated_fields": {
                "type": "boolean"
              },
              "custom_fields": {
                "type": "boolean"
              },
              "webhooks": {
                "type": "boolean"
              }
            }
          },
          "_id": {
            "type": "string",
            "description": "Legacy alias of `id`."
          },
          "startsAt": {
            "type": "integer",
            "nullable": true,
            "description": "Legacy: epoch ms."
          },
          "endsAt": {
            "type": "integer",
            "nullable": true,
            "description": "Legacy: epoch ms."
          },
          "websiteUrl": {
            "type": "string",
            "nullable": true,
            "description": "Legacy alias."
          }
        }
      },
      "Field": {
        "type": "object",
        "description": "A field definition. These come from the CFP form's questions — custom fields and form questions are one and the same in this product.",
        "properties": {
          "id": {
            "type": "string",
            "examples": [
              "format"
            ]
          },
          "internal_name": {
            "type": "string",
            "examples": [
              "format"
            ]
          },
          "public_name": {
            "type": "string",
            "examples": [
              "Format"
            ]
          },
          "field_type": {
            "type": "string",
            "examples": [
              "dropdown"
            ],
            "description": "short_text | long_text | rich_text | dropdown | multi_select | email | url | phone | checkbox | file"
          },
          "field_source": {
            "type": "string",
            "enum": [
              "standard",
              "custom"
            ],
            "description": "`standard` for locked system fields, `custom` for organizer-added ones."
          },
          "contains_pii": {
            "type": "boolean"
          },
          "scope": {
            "type": "string",
            "enum": [
              "session",
              "contact"
            ]
          },
          "required": {
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean"
          },
          "options": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            }
          },
          "help": {
            "type": "string",
            "nullable": true
          },
          "form_id": {
            "type": "string"
          },
          "form_slug": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Owning form's creation time."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Owning form's last write."
          }
        }
      },
      "Submission": {
        "type": "object",
        "description": "The pre-parity submission shape, unchanged.",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "enum": [
              "abstract",
              "session"
            ]
          },
          "status": {
            "type": "string"
          },
          "track": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "type": "string",
            "nullable": true
          },
          "level": {
            "type": "string",
            "nullable": true
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "submittedAt": {
            "type": "integer"
          },
          "decidedAt": {
            "type": "integer",
            "nullable": true
          },
          "speakers": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "email": {
                  "type": "string"
                },
                "role": {
                  "type": "string"
                },
                "jobTitle": {
                  "type": "string",
                  "nullable": true
                },
                "company": {
                  "type": "string",
                  "nullable": true
                }
              }
            }
          }
        }
      },
      "Webhook": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Subscribed event types, or `[\"*\"]` for all of them."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "enabled": {
            "type": "boolean"
          },
          "event_id": {
            "type": "string",
            "nullable": true,
            "description": "Null for workspace-wide endpoints."
          },
          "org_id": {
            "type": "string"
          },
          "secret": {
            "type": "string",
            "description": "Full `whsec_…` value on create and rotate; masked (`whsec_1a2b3c4d…ef01`) everywhere else."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Creation time."
          },
          "last_delivery_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Most recent attempt."
          },
          "last_status": {
            "type": "integer",
            "nullable": true
          },
          "last_error": {
            "type": "string",
            "nullable": true
          },
          "consecutive_failures": {
            "type": "integer"
          }
        }
      },
      "WebhookDelivery": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "event_type": {
            "type": "string",
            "examples": [
              "session.updated"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "success",
              "failed"
            ]
          },
          "attempts": {
            "type": "integer"
          },
          "response_status": {
            "type": "integer",
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          },
          "payload": {
            "type": "string",
            "description": "The exact JSON body that was signed."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Queued at."
          },
          "delivered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Succeeded at."
          }
        }
      },
      "WebhookPayload": {
        "type": "object",
        "description": "The body POSTed to your endpoint. Signed with `Trackstage-Signature: t=<unix-seconds>,v1=<hex>`, an HMAC-SHA256 over `\"{t}.{body}\"` using the endpoint's secret. Verify it before trusting the payload, and reject timestamps outside your tolerance to prevent replay.",
        "required": [
          "data",
          "metadata"
        ],
        "properties": {
          "data": {
            "type": "object",
            "description": "The changed resource. Always carries `id` and `sourceOfChange`.",
            "additionalProperties": true,
            "properties": {
              "id": {
                "type": "string"
              },
              "sourceOfChange": {
                "type": "string",
                "enum": [
                  "user",
                  "agent"
                ]
              }
            }
          },
          "metadata": {
            "type": "object",
            "properties": {
              "action": {
                "type": "string",
                "examples": [
                  "session.updated"
                ]
              },
              "event_id": {
                "type": "string",
                "nullable": true
              },
              "org_id": {
                "type": "string"
              },
              "resource_url": {
                "type": "string",
                "nullable": true,
                "description": "Where to re-fetch the resource from this API."
              },
              "version": {
                "type": "integer",
                "examples": [
                  1
                ]
              },
              "datetime": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        }
      },
      "Agenda": {
        "type": "object",
        "properties": {
          "event": {
            "$ref": "#/components/schemas/Event"
          },
          "published": {
            "type": "boolean"
          },
          "published_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "When the programme went public."
          },
          "rooms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NamedMetadata"
            }
          },
          "tracks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NamedMetadata"
            }
          },
          "scheduled": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "starts_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Slot start."
                },
                "ends_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Slot end."
                },
                "duration_minutes": {
                  "type": "integer",
                  "nullable": true
                },
                "room_id": {
                  "type": "string",
                  "nullable": true
                },
                "track_id": {
                  "type": "string",
                  "nullable": true
                }
              }
            }
          },
          "unscheduled": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                }
              }
            }
          },
          "conflicts": {
            "type": "array",
            "items": {},
            "description": "Double-booked rooms and speakers, computed live."
          },
          "totals": {
            "type": "object",
            "properties": {
              "scheduled": {
                "type": "integer"
              },
              "unscheduled": {
                "type": "integer"
              },
              "conflicts": {
                "type": "integer"
              }
            }
          }
        }
      },
      "EchoResult": {
        "type": "object",
        "properties": {
          "received": {
            "type": "boolean"
          },
          "verified": {
            "type": "boolean",
            "nullable": true
          },
          "event": {
            "type": "string",
            "nullable": true
          },
          "delivery": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "FileBytesReceipt": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "size": {
                "type": "integer"
              },
              "received": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "DateRangeFilter": {
        "type": "object",
        "description": "ISO-8601 or epoch milliseconds are both accepted.",
        "properties": {
          "before": {
            "type": "string",
            "format": "date-time"
          },
          "after": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "SessionSearchBody": {
        "type": "object",
        "properties": {
          "filters": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "pending",
                  "accept_queue",
                  "decline_queue",
                  "accepted",
                  "declined",
                  "withdrawn"
                ]
              },
              "isAbstract": {
                "type": "boolean"
              },
              "trackId": {
                "type": "string"
              },
              "tagId": {
                "type": "string"
              },
              "search": {
                "type": "string",
                "description": "Matches title and description."
              },
              "includeDeleted": {
                "type": "boolean"
              },
              "createdAt": {
                "$ref": "#/components/schemas/DateRangeFilter"
              },
              "updatedAt": {
                "$ref": "#/components/schemas/DateRangeFilter"
              }
            }
          },
          "sort": {
            "type": "object",
            "properties": {
              "order": {
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt",
                  "startsAt",
                  "title"
                ]
              },
              "sort": {
                "type": "string",
                "enum": [
                  "asc",
                  "desc"
                ]
              }
            }
          },
          "expand": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "files",
                "deleted"
              ]
            }
          },
          "page": {
            "type": "integer",
            "minimum": 1
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "SpeakerSearchBody": {
        "type": "object",
        "properties": {
          "filters": {
            "type": "object",
            "properties": {
              "search": {
                "type": "string"
              },
              "workflowStatus": {
                "type": "string",
                "enum": [
                  "invited",
                  "confirmed",
                  "dropped"
                ]
              }
            }
          },
          "sort": {
            "type": "object",
            "properties": {
              "sort": {
                "type": "string",
                "enum": [
                  "asc",
                  "desc"
                ]
              }
            }
          },
          "page": {
            "type": "integer",
            "minimum": 1
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "MetadataSearchBody": {
        "type": "object",
        "properties": {
          "filters": {
            "type": "object",
            "properties": {
              "search": {
                "type": "string"
              }
            }
          },
          "page": {
            "type": "integer",
            "minimum": 1
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "SessionWriteBody": {
        "type": "object",
        "description": "Every field is optional on update; `title` is required on create. snake_case and camelCase keys are both accepted, and times take ISO-8601 or epoch milliseconds.",
        "properties": {
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "pending",
              "accept_queue",
              "decline_queue",
              "accepted",
              "declined",
              "withdrawn"
            ]
          },
          "is_abstract": {
            "type": "boolean",
            "description": "Create only — a session cannot change kind after creation."
          },
          "starts_at": {
            "type": "string",
            "format": "date-time"
          },
          "ends_at": {
            "type": "string",
            "format": "date-time",
            "description": "Converted to `duration_minutes` when that is not given."
          },
          "duration_minutes": {
            "type": "integer",
            "minimum": 5
          },
          "room_id": {
            "type": "string",
            "description": "Empty string clears the assignment."
          },
          "track_id": {
            "type": "string",
            "description": "Empty string clears the assignment."
          },
          "format": {
            "type": "string"
          },
          "level": {
            "type": "string"
          },
          "language": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "custom_fields": {
            "type": "object",
            "additionalProperties": true
          },
          "submitter_email": {
            "type": "string",
            "format": "email"
          },
          "submitter_first_name": {
            "type": "string"
          },
          "submitter_last_name": {
            "type": "string"
          },
          "speaker_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Optimistic concurrency token. A mismatch answers 409."
          }
        }
      },
      "CustomFieldsBody": {
        "type": "object",
        "required": [
          "custom_fields"
        ],
        "properties": {
          "custom_fields": {
            "type": "object",
            "additionalProperties": true,
            "description": "Values keyed by field `internal_name`."
          }
        }
      },
      "BulkOperations": {
        "type": "object",
        "required": [
          "operations"
        ],
        "properties": {
          "operations": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "object",
              "required": [
                "action"
              ],
              "properties": {
                "action": {
                  "type": "string",
                  "enum": [
                    "create",
                    "update",
                    "delete"
                  ]
                },
                "id": {
                  "type": "string",
                  "description": "Required for update and delete."
                },
                "data": {
                  "$ref": "#/components/schemas/SessionWriteBody"
                }
              }
            }
          }
        }
      },
      "BulkResponse": {
        "type": "object",
        "properties": {
          "batch_id": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "index": {
                  "type": "integer"
                },
                "action": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "success",
                    "error"
                  ]
                },
                "id": {
                  "type": "string"
                },
                "error": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "stats": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              },
              "succeeded": {
                "type": "integer"
              },
              "failed": {
                "type": "integer"
              }
            }
          }
        }
      },
      "SpeakerWriteBody": {
        "type": "object",
        "description": "`email` is required on create and ignored on update.",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "company_name": {
            "type": "string"
          },
          "about": {
            "type": "string"
          },
          "phone_mobile": {
            "type": "string"
          },
          "pronouns": {
            "type": "string"
          },
          "salutation": {
            "type": "string"
          },
          "website_url": {
            "type": "string"
          },
          "linkedin_url": {
            "type": "string"
          },
          "twitter_url": {
            "type": "string"
          },
          "workflow_status": {
            "type": "string",
            "enum": [
              "invited",
              "confirmed",
              "dropped"
            ]
          }
        }
      },
      "FieldWriteBody": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The label organizers and speakers see."
          },
          "label": {
            "type": "string",
            "description": "Alias of `name`."
          },
          "type": {
            "type": "string",
            "description": "short_text | long_text | rich_text | dropdown | multi_select | email | url | phone | checkbox | file"
          },
          "required": {
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean"
          },
          "help": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "form_id": {
            "type": "string",
            "description": "Which form to add it to; defaults to the first."
          }
        }
      },
      "MetadataWriteBody": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "color": {
            "type": "string",
            "description": "Tracks only.",
            "examples": [
              "#0F6E70"
            ]
          },
          "capacity": {
            "type": "integer",
            "description": "Rooms only."
          },
          "order": {
            "type": "integer"
          }
        }
      },
      "WebhookWriteBody": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Event types to subscribe to; `[\"*\"]` means all."
          },
          "description": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "event": {
            "type": "string",
            "description": "Event slug or id to scope the endpoint to. Omit for a workspace-wide endpoint."
          }
        }
      },
      "SessionFileCreateBody": {
        "type": "object",
        "required": [
          "filename"
        ],
        "properties": {
          "filename": {
            "type": "string",
            "examples": [
              "keynote-slides.pptx"
            ]
          },
          "size_bytes": {
            "type": "integer",
            "minimum": 1
          },
          "content_type": {
            "type": "string"
          },
          "mimetype": {
            "type": "string",
            "description": "Alias of `content_type`."
          },
          "title": {
            "type": "string"
          },
          "assigned_participant_id": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SessionFileUpdateBody": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "assigned_participant_id": {
            "type": "string",
            "nullable": true,
            "description": "Empty string clears the assignment."
          }
        }
      },
      "SessionFileUploadForm": {
        "type": "object",
        "required": [
          "file"
        ],
        "properties": {
          "file": {
            "type": "string",
            "format": "binary"
          },
          "title": {
            "type": "string"
          },
          "assigned_participant_id": {
            "type": "string"
          }
        }
      },
      "FileUploadTicket": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "filename": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "replaces": {
                "type": "string"
              },
              "upload": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "method": {
                    "type": "string",
                    "examples": [
                      "PUT"
                    ]
                  },
                  "headers": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "SessionEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Session"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "SpeakerEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Speaker"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "EventEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Event"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "FieldEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Field"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "MetadataEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/NamedMetadata"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "FileEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SessionFile"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "AgendaEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Agenda"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "WebhookEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Webhook"
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "WebhookDetailEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Webhook"
              },
              {
                "type": "object",
                "properties": {
                  "deliveries": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/WebhookDelivery"
                    }
                  }
                }
              }
            ]
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "WebhookTestEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "delivery_id": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "examples": [
                  "queued"
                ]
              }
            }
          }
        },
        "required": [
          "data"
        ],
        "description": "Single-resource envelope. The resource is under `data`."
      },
      "FileListEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionFile"
            }
          }
        }
      },
      "WebhookListEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Webhook"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Webhook"
            }
          }
        }
      },
      "WebhookDeliveryListEnvelope": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookDelivery"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookDelivery"
            }
          }
        }
      },
      "SessionsPage": {
        "type": "object",
        "description": "Paginated envelope. `data` and `results` are the same array — `data` is what this API has always returned, `results` is what Trackstage's search endpoints return.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Session"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Session"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/Pagination"
          },
          "event": {
            "$ref": "#/components/schemas/Event"
          }
        }
      },
      "SessionStatusesPage": {
        "type": "object",
        "description": "Paginated envelope. `data` and `results` are the same array — `data` is what this API has always returned, `results` is what Trackstage's search endpoints return.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionStatusRow"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionStatusRow"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/Pagination"
          }
        }
      },
      "SpeakersPage": {
        "type": "object",
        "description": "Paginated envelope. `data` and `results` are the same array — `data` is what this API has always returned, `results` is what Trackstage's search endpoints return.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Speaker"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Speaker"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/Pagination"
          },
          "event": {
            "$ref": "#/components/schemas/Event"
          }
        }
      },
      "SubmissionsPage": {
        "type": "object",
        "description": "Paginated envelope. `data` and `results` are the same array — `data` is what this API has always returned, `results` is what Trackstage's search endpoints return.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Submission"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Submission"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/Pagination"
          },
          "event": {
            "$ref": "#/components/schemas/Event"
          }
        }
      },
      "EventsPage": {
        "type": "object",
        "description": "Paginated envelope. `data` and `results` are the same array — `data` is what this API has always returned, `results` is what Trackstage's search endpoints return.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Event"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Event"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/Pagination"
          }
        }
      },
      "FieldsPage": {
        "type": "object",
        "description": "Paginated envelope. `data` and `results` are the same array — `data` is what this API has always returned, `results` is what Trackstage's search endpoints return.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Field"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Field"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/Pagination"
          }
        }
      },
      "MetadataPage": {
        "type": "object",
        "description": "Paginated envelope. `data` and `results` are the same array — `data` is what this API has always returned, `results` is what Trackstage's search endpoints return.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NamedMetadata"
            }
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NamedMetadata"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/Pagination"
          }
        }
      }
    }
  },
  "x-captured-examples": {
    "GET /v1/events 200": {
      "data": [
        {
          "_id": "j97c636dpqayasnhm4whc59cx98c8c8v",
          "agenda_published_at": null,
          "created_at": "2026-08-11T03:27:18.602Z",
          "description": "A single-track day for the people who maintain design systems, and everyone who has to live with them.",
          "endsAt": 1793919600000,
          "ends_at": "2026-11-05T23:00:00.000Z",
          "features": {
            "custom_fields": true,
            "translated_fields": false,
            "webhooks": true
          },
          "id": "j97c636dpqayasnhm4whc59cx98c8c8v",
          "logo_url": null,
          "name": "Design Systems Day",
          "slug": "design-systems-day",
          "startsAt": 1793887200000,
          "starts_at": "2026-11-05T14:00:00.000Z",
          "timezone": "America/New_York",
          "type": "Meetup",
          "venue": "Brooklyn Expo Center, New York",
          "website_url": null
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 1,
        "page_size": 1,
        "totalPages": 8,
        "totalResults": 8,
        "total_pages": 8,
        "total_results": 8
      },
      "results": [
        {
          "_id": "j97c636dpqayasnhm4whc59cx98c8c8v",
          "agenda_published_at": null,
          "created_at": "2026-08-11T03:27:18.602Z",
          "description": "A single-track day for the people who maintain design systems, and everyone who has to live with them.",
          "endsAt": 1793919600000,
          "ends_at": "2026-11-05T23:00:00.000Z",
          "features": {
            "custom_fields": true,
            "translated_fields": false,
            "webhooks": true
          },
          "id": "j97c636dpqayasnhm4whc59cx98c8c8v",
          "logo_url": null,
          "name": "Design Systems Day",
          "slug": "design-systems-day",
          "startsAt": 1793887200000,
          "starts_at": "2026-11-05T14:00:00.000Z",
          "timezone": "America/New_York",
          "type": "Meetup",
          "venue": "Brooklyn Expo Center, New York",
          "website_url": null
        }
      ]
    },
    "GET /v1/event/{eventRef}/sessions 200": {
      "data": [
        {
          "answers": {
            "description": "<p>A talk created by the verify script.</p>",
            "format": "Talk",
            "language": "English",
            "level": "Introductory",
            "title": "Verification Talk",
            "track": "AI Engineering"
          },
          "capacity": null,
          "chairpersons": [],
          "created_at": "2026-08-11T03:27:33.444Z",
          "custom_fields": [
            {
              "created_at": "2026-08-11T03:27:33.444Z",
              "id": "description",
              "internal_name": "description",
              "name": "Session description",
              "type": "long_text",
              "value": "<p>A talk created by the verify script.</p>",
              "value_raw": "<p>A talk created by the verify script.</p>"
            },
            {
              "created_at": "2026-08-11T03:27:33.444Z",
              "id": "format",
              "internal_name": "format",
              "name": "Format",
              "type": "dropdown",
              "value": "Talk",
              "value_raw": "Talk"
            }
          ],
          "decidedAt": 1786418865308,
          "decided_at": "2026-08-11T03:27:45.308Z",
          "deleted_at": null,
          "description": "<p>A talk created by the verify script.</p>",
          "durationMinutes": null,
          "duration_minutes": null,
          "endTime": null,
          "ends_at": null,
          "format": {
            "id": "Talk",
            "name": "Talk"
          },
          "friendly_id": "SESS-64530",
          "friendly_id_raw": 64530,
          "id": "k57a8s50rhxh9xck6kznjnng2d8c88yq",
          "is_abstract": true,
          "is_public": true,
          "kind": "abstract",
          "language": {
            "id": "English",
            "name": "English"
          },
          "level": {
            "id": "Introductory",
            "name": "Introductory"
          },
          "location": null,
          "moderators": [],
          "notified_at": "2026-08-11T03:27:45.308Z",
          "participants": [
            {
              "about": "An updated bio from the verify script.",
              "bio": "An updated bio from the verify script.",
              "company": null,
              "company_name": null,
              "created_at": "2026-08-11T03:27:31.360Z",
              "email": "verify-e2e-mso3nrc2@example.com",
              "firstName": "Vera",
              "first_name": "Vera",
              "friendly_id": "SPK-95912",
              "friendly_id_raw": 95912,
              "full_name": "Vera Efftest",
              "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
              "jobTitle": "QA Engineer",
              "lastName": "Efftest",
              "last_name": "Efftest",
              "linkedin_url": null,
              "name": "Vera Efftest",
              "participant_role": {
                "core_role": "speaker",
                "name": "Speaker",
                "name_plural": "Speakers",
                "slug": "speaker"
              },
              "phone_mobile": null,
              "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "pronouns": null,
              "salutation": null,
              "title": "QA Engineer",
              "twitter_url": null,
              "updated_at": "2026-08-11T03:27:31.360Z",
              "website_url": null,
              "workflow_status": null
            }
          ],
          "room": null,
          "speakers": [
            {
              "about": "An updated bio from the verify script.",
              "bio": "An updated bio from the verify script.",
              "company": null,
              "company_name": null,
              "created_at": "2026-08-11T03:27:31.360Z",
              "email": "verify-e2e-mso3nrc2@example.com",
              "firstName": "Vera",
              "first_name": "Vera",
              "friendly_id": "SPK-95912",
              "friendly_id_raw": 95912,
              "full_name": "Vera Efftest",
              "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
              "jobTitle": "QA Engineer",
              "lastName": "Efftest",
              "last_name": "Efftest",
              "linkedin_url": null,
              "name": "Vera Efftest",
              "participant_role": {
                "core_role": "speaker",
                "name": "Speaker",
                "name_plural": "Speakers",
                "slug": "speaker"
              },
              "phone_mobile": null,
              "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "pronouns": null,
              "salutation": null,
              "title": "QA Engineer",
              "twitter_url": null,
              "updated_at": "2026-08-11T03:27:31.360Z",
              "website_url": null,
              "workflow_status": null
            }
          ],
          "startTime": null,
          "starts_at": null,
          "status": "accepted",
          "submittedAt": 1786418853444.4263,
          "submitter": {
            "about": "An updated bio from the verify script.",
            "bio": "An updated bio from the verify script.",
            "company": null,
            "company_name": null,
            "created_at": "2026-08-11T03:27:31.360Z",
            "email": "verify-e2e-mso3nrc2@example.com",
            "firstName": "Vera",
            "first_name": "Vera",
            "friendly_id": "SPK-95912",
            "friendly_id_raw": 95912,
            "full_name": "Vera Efftest",
            "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
            "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
            "jobTitle": "QA Engineer",
            "lastName": "Efftest",
            "last_name": "Efftest",
            "linkedin_url": null,
            "name": "Vera Efftest",
            "participant_role": null,
            "phone_mobile": null,
            "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
            "pronouns": null,
            "salutation": null,
            "title": "QA Engineer",
            "twitter_url": null,
            "updated_at": "2026-08-11T03:27:31.360Z",
            "website_url": null,
            "workflow_status": null
          },
          "subsessions": [],
          "tags": [],
          "title": "Verification Talk (edited)",
          "track": {
            "color": "#2F5CE0",
            "created_at": "2026-08-11T03:27:18.602Z",
            "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
            "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
            "name": "AI Engineering",
            "order": 0,
            "updated_at": "2026-08-11T03:27:18.602Z"
          },
          "trackColor": "#2F5CE0",
          "updated_at": "2026-08-11T03:27:33.444Z"
        }
      ],
      "event": {
        "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
        "agenda_published_at": "2026-08-06T03:27:18.602Z",
        "created_at": "2026-08-11T03:27:18.602Z",
        "description": "Two days for the people building AI systems that have to work on Monday morning. Practitioner talks on evaluation, agents, retrieval, inference infrastructure and the product decisions in between — no keynote fluff, no vendor pitches.",
        "endsAt": 1791939600000,
        "ends_at": "2026-10-14T01:00:00.000Z",
        "features": {
          "custom_fields": true,
          "translated_fields": false,
          "webhooks": true
        },
        "id": "j971emkyf6md23jphggczhghvd8c8qjq",
        "logo_url": null,
        "name": "AI Engineer Summit 2026",
        "slug": "ai-summit-2026",
        "startsAt": 1791820800000,
        "starts_at": "2026-10-12T16:00:00.000Z",
        "timezone": "America/Los_Angeles",
        "type": "Conference",
        "venue": "Moscone West, San Francisco",
        "websiteUrl": "https://example.com/ai-summit-2026",
        "website_url": "https://example.com/ai-summit-2026"
      },
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 1,
        "page_size": 1,
        "totalPages": 9,
        "totalResults": 9,
        "total_pages": 9,
        "total_results": 9
      },
      "results": [
        {
          "answers": {
            "description": "<p>A talk created by the verify script.</p>",
            "format": "Talk",
            "language": "English",
            "level": "Introductory",
            "title": "Verification Talk",
            "track": "AI Engineering"
          },
          "capacity": null,
          "chairpersons": [],
          "created_at": "2026-08-11T03:27:33.444Z",
          "custom_fields": [
            {
              "created_at": "2026-08-11T03:27:33.444Z",
              "id": "description",
              "internal_name": "description",
              "name": "Session description",
              "type": "long_text",
              "value": "<p>A talk created by the verify script.</p>",
              "value_raw": "<p>A talk created by the verify script.</p>"
            },
            {
              "created_at": "2026-08-11T03:27:33.444Z",
              "id": "format",
              "internal_name": "format",
              "name": "Format",
              "type": "dropdown",
              "value": "Talk",
              "value_raw": "Talk"
            }
          ],
          "decidedAt": 1786418865308,
          "decided_at": "2026-08-11T03:27:45.308Z",
          "deleted_at": null,
          "description": "<p>A talk created by the verify script.</p>",
          "durationMinutes": null,
          "duration_minutes": null,
          "endTime": null,
          "ends_at": null,
          "format": {
            "id": "Talk",
            "name": "Talk"
          },
          "friendly_id": "SESS-64530",
          "friendly_id_raw": 64530,
          "id": "k57a8s50rhxh9xck6kznjnng2d8c88yq",
          "is_abstract": true,
          "is_public": true,
          "kind": "abstract",
          "language": {
            "id": "English",
            "name": "English"
          },
          "level": {
            "id": "Introductory",
            "name": "Introductory"
          },
          "location": null,
          "moderators": [],
          "notified_at": "2026-08-11T03:27:45.308Z",
          "participants": [
            {
              "about": "An updated bio from the verify script.",
              "bio": "An updated bio from the verify script.",
              "company": null,
              "company_name": null,
              "created_at": "2026-08-11T03:27:31.360Z",
              "email": "verify-e2e-mso3nrc2@example.com",
              "firstName": "Vera",
              "first_name": "Vera",
              "friendly_id": "SPK-95912",
              "friendly_id_raw": 95912,
              "full_name": "Vera Efftest",
              "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
              "jobTitle": "QA Engineer",
              "lastName": "Efftest",
              "last_name": "Efftest",
              "linkedin_url": null,
              "name": "Vera Efftest",
              "participant_role": {
                "core_role": "speaker",
                "name": "Speaker",
                "name_plural": "Speakers",
                "slug": "speaker"
              },
              "phone_mobile": null,
              "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "pronouns": null,
              "salutation": null,
              "title": "QA Engineer",
              "twitter_url": null,
              "updated_at": "2026-08-11T03:27:31.360Z",
              "website_url": null,
              "workflow_status": null
            }
          ],
          "room": null,
          "speakers": [
            {
              "about": "An updated bio from the verify script.",
              "bio": "An updated bio from the verify script.",
              "company": null,
              "company_name": null,
              "created_at": "2026-08-11T03:27:31.360Z",
              "email": "verify-e2e-mso3nrc2@example.com",
              "firstName": "Vera",
              "first_name": "Vera",
              "friendly_id": "SPK-95912",
              "friendly_id_raw": 95912,
              "full_name": "Vera Efftest",
              "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
              "jobTitle": "QA Engineer",
              "lastName": "Efftest",
              "last_name": "Efftest",
              "linkedin_url": null,
              "name": "Vera Efftest",
              "participant_role": {
                "core_role": "speaker",
                "name": "Speaker",
                "name_plural": "Speakers",
                "slug": "speaker"
              },
              "phone_mobile": null,
              "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
              "pronouns": null,
              "salutation": null,
              "title": "QA Engineer",
              "twitter_url": null,
              "updated_at": "2026-08-11T03:27:31.360Z",
              "website_url": null,
              "workflow_status": null
            }
          ],
          "startTime": null,
          "starts_at": null,
          "status": "accepted",
          "submittedAt": 1786418853444.4263,
          "submitter": {
            "about": "An updated bio from the verify script.",
            "bio": "An updated bio from the verify script.",
            "company": null,
            "company_name": null,
            "created_at": "2026-08-11T03:27:31.360Z",
            "email": "verify-e2e-mso3nrc2@example.com",
            "firstName": "Vera",
            "first_name": "Vera",
            "friendly_id": "SPK-95912",
            "friendly_id_raw": 95912,
            "full_name": "Vera Efftest",
            "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
            "id": "m97cd0d1qabm1r6784jzxc846s8c8wyy",
            "jobTitle": "QA Engineer",
            "lastName": "Efftest",
            "last_name": "Efftest",
            "linkedin_url": null,
            "name": "Vera Efftest",
            "participant_role": null,
            "phone_mobile": null,
            "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/40d6bda7-5627-4674-a9a0-5f1d6275277a",
            "pronouns": null,
            "salutation": null,
            "title": "QA Engineer",
            "twitter_url": null,
            "updated_at": "2026-08-11T03:27:31.360Z",
            "website_url": null,
            "workflow_status": null
          },
          "subsessions": [],
          "tags": [],
          "title": "Verification Talk (edited)",
          "track": {
            "color": "#2F5CE0",
            "created_at": "2026-08-11T03:27:18.602Z",
            "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
            "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
            "name": "AI Engineering",
            "order": 0,
            "updated_at": "2026-08-11T03:27:18.602Z"
          },
          "trackColor": "#2F5CE0",
          "updated_at": "2026-08-11T03:27:33.444Z"
        }
      ]
    },
    "GET /v1/event/{eventRef}/submissions 200": {
      "data": [
        {
          "decidedAt": null,
          "description": "<p>A talk created by the verify script.</p>",
          "format": "Talk",
          "id": "k57a7y1qvb8wvbfe7q2wj5928s8c8a4z",
          "kind": "abstract",
          "language": "English",
          "level": "Introductory",
          "speakers": [
            {
              "company": null,
              "email": "verify-quiet-mso3nunn@example.com",
              "id": "m97f7dwt7rmehcsqreq8sxjnzh8c9h3e",
              "jobTitle": null,
              "name": "Quinn Quiet",
              "role": "speaker"
            }
          ],
          "status": "pending",
          "submittedAt": 1786418856941.303,
          "tags": [],
          "title": "Quiet Talk",
          "track": "AI Engineering"
        }
      ],
      "event": {
        "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
        "endsAt": 1791939600000,
        "name": "AI Engineer Summit 2026",
        "slug": "ai-summit-2026",
        "startsAt": 1791820800000,
        "timezone": "America/Los_Angeles",
        "venue": "Moscone West, San Francisco"
      },
      "pagination": {
        "currentPage": 1,
        "pageSize": 1,
        "totalPages": 20,
        "totalResults": 20
      },
      "results": [
        {
          "decidedAt": null,
          "description": "<p>A talk created by the verify script.</p>",
          "format": "Talk",
          "id": "k57a7y1qvb8wvbfe7q2wj5928s8c8a4z",
          "kind": "abstract",
          "language": "English",
          "level": "Introductory",
          "speakers": [
            {
              "company": null,
              "email": "verify-quiet-mso3nunn@example.com",
              "id": "m97f7dwt7rmehcsqreq8sxjnzh8c9h3e",
              "jobTitle": null,
              "name": "Quinn Quiet",
              "role": "speaker"
            }
          ],
          "status": "pending",
          "submittedAt": 1786418856941.303,
          "tags": [],
          "title": "Quiet Talk",
          "track": "AI Engineering"
        }
      ]
    },
    "GET /v1/event/{eventRef}/speakers 200": {
      "data": [
        {
          "about": null,
          "bio": null,
          "company": "Ridgeline",
          "company_name": "Ridgeline",
          "created_at": "2026-08-11T03:27:18.602Z",
          "email": "tom.beaumont@example.com",
          "firstName": "Tom",
          "first_name": "Tom",
          "friendly_id": "SPK-45805",
          "friendly_id_raw": 45805,
          "full_name": "Tom Beaumont",
          "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
          "id": "m97ar7w0qz8xxwb6zsyr4nbgkh8c8whm",
          "jobTitle": "Developer Advocate",
          "lastName": "Beaumont",
          "last_name": "Beaumont",
          "linkedin_url": null,
          "name": "Tom Beaumont",
          "participant_role": null,
          "phone_mobile": null,
          "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
          "pronouns": null,
          "salutation": null,
          "sessions": [
            {
              "id": "k576ypz0a1h0hsv1ysfq2egc1x8c9gnp",
              "role": "speaker",
              "startTime": 1791824400000,
              "starts_at": "2026-10-12T17:00:00.000Z",
              "status": "accepted",
              "title": "Evaluation harnesses for production LLMs"
            }
          ],
          "title": "Developer Advocate",
          "twitter_url": null,
          "updated_at": "2026-08-11T03:27:18.602Z",
          "website_url": null,
          "workflow_status": null
        }
      ],
      "event": {
        "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
        "agenda_published_at": "2026-08-06T03:27:18.602Z",
        "created_at": "2026-08-11T03:27:18.602Z",
        "description": "Two days for the people building AI systems that have to work on Monday morning. Practitioner talks on evaluation, agents, retrieval, inference infrastructure and the product decisions in between — no keynote fluff, no vendor pitches.",
        "endsAt": 1791939600000,
        "ends_at": "2026-10-14T01:00:00.000Z",
        "features": {
          "custom_fields": true,
          "translated_fields": false,
          "webhooks": true
        },
        "id": "j971emkyf6md23jphggczhghvd8c8qjq",
        "logo_url": null,
        "name": "AI Engineer Summit 2026",
        "slug": "ai-summit-2026",
        "startsAt": 1791820800000,
        "starts_at": "2026-10-12T16:00:00.000Z",
        "timezone": "America/Los_Angeles",
        "type": "Conference",
        "venue": "Moscone West, San Francisco",
        "websiteUrl": "https://example.com/ai-summit-2026",
        "website_url": "https://example.com/ai-summit-2026"
      },
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 1,
        "page_size": 1,
        "totalPages": 16,
        "totalResults": 16,
        "total_pages": 16,
        "total_results": 16
      },
      "results": [
        {
          "about": null,
          "bio": null,
          "company": "Ridgeline",
          "company_name": "Ridgeline",
          "created_at": "2026-08-11T03:27:18.602Z",
          "email": "tom.beaumont@example.com",
          "firstName": "Tom",
          "first_name": "Tom",
          "friendly_id": "SPK-45805",
          "friendly_id_raw": 45805,
          "full_name": "Tom Beaumont",
          "headshotUrl": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
          "id": "m97ar7w0qz8xxwb6zsyr4nbgkh8c8whm",
          "jobTitle": "Developer Advocate",
          "lastName": "Beaumont",
          "last_name": "Beaumont",
          "linkedin_url": null,
          "name": "Tom Beaumont",
          "participant_role": null,
          "phone_mobile": null,
          "photo_url": "https://neat-sparrow-926.eu-west-1.convex.cloud/api/storage/a5589509-4703-4955-8e1c-26c9a32fff3e",
          "pronouns": null,
          "salutation": null,
          "sessions": [
            {
              "id": "k576ypz0a1h0hsv1ysfq2egc1x8c9gnp",
              "role": "speaker",
              "startTime": 1791824400000,
              "starts_at": "2026-10-12T17:00:00.000Z",
              "status": "accepted",
              "title": "Evaluation harnesses for production LLMs"
            }
          ],
          "title": "Developer Advocate",
          "twitter_url": null,
          "updated_at": "2026-08-11T03:27:18.602Z",
          "website_url": null,
          "workflow_status": null
        }
      ]
    },
    "GET /v1/event/{eventRef}/fields 200": {
      "data": [
        {
          "contains_pii": false,
          "createdAt": "2026-08-11T03:27:18.602Z",
          "enabled": true,
          "field_source": "standard",
          "field_type": "short_text",
          "form_id": "jd78d2k3nfftskesewr6qesn7d8c90d8",
          "form_slug": "cfp",
          "help": "Aim for something an attendee could choose from a schedule without extra context.",
          "id": "title",
          "internal_name": "title",
          "options": null,
          "public_name": "Session title",
          "required": true,
          "scope": "session",
          "updatedAt": "2026-08-11T03:27:18.602Z"
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 3,
        "page_size": 3,
        "totalPages": 6,
        "totalResults": 16,
        "total_pages": 6,
        "total_results": 16
      },
      "results": [
        {
          "contains_pii": false,
          "createdAt": "2026-08-11T03:27:18.602Z",
          "enabled": true,
          "field_source": "standard",
          "field_type": "short_text",
          "form_id": "jd78d2k3nfftskesewr6qesn7d8c90d8",
          "form_slug": "cfp",
          "help": "Aim for something an attendee could choose from a schedule without extra context.",
          "id": "title",
          "internal_name": "title",
          "options": null,
          "public_name": "Session title",
          "required": true,
          "scope": "session",
          "updatedAt": "2026-08-11T03:27:18.602Z"
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/tracks 200": {
      "data": [
        {
          "color": "#2F5CE0",
          "created_at": "2026-08-11T03:27:18.602Z",
          "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
          "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
          "name": "AI Engineering",
          "order": 0,
          "updated_at": "2026-08-11T03:27:18.602Z"
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 1,
        "totalResults": 3,
        "total_pages": 1,
        "total_results": 3
      },
      "results": [
        {
          "color": "#2F5CE0",
          "created_at": "2026-08-11T03:27:18.602Z",
          "event_id": "j971emkyf6md23jphggczhghvd8c8qjq",
          "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
          "name": "AI Engineering",
          "order": 0,
          "updated_at": "2026-08-11T03:27:18.602Z"
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/rooms 200": {
      "data": [
        {
          "capacity": 300,
          "created_at": "2026-08-11T03:27:18.602Z",
          "id": "js7928f758c8d8qn6xqj705py58c9r3j",
          "name": "Main Stage",
          "order": 0,
          "updated_at": "2026-08-11T03:27:18.602Z"
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 1,
        "totalResults": 2,
        "total_pages": 1,
        "total_results": 2
      },
      "results": [
        {
          "capacity": 300,
          "created_at": "2026-08-11T03:27:18.602Z",
          "id": "js7928f758c8d8qn6xqj705py58c9r3j",
          "name": "Main Stage",
          "order": 0,
          "updated_at": "2026-08-11T03:27:18.602Z"
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/statuses 200": {
      "data": [
        {
          "created_at": null,
          "id": "draft",
          "name": "draft",
          "order": 0,
          "system": true,
          "updated_at": null
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 1,
        "totalResults": 7,
        "total_pages": 1,
        "total_results": 7
      },
      "results": [
        {
          "created_at": null,
          "id": "draft",
          "name": "draft",
          "order": 0,
          "system": true,
          "updated_at": null
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/formats 200": {
      "data": [
        {
          "created_at": null,
          "id": "Keynote",
          "name": "Keynote",
          "order": 0,
          "updated_at": null
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 1,
        "totalResults": 5,
        "total_pages": 1,
        "total_results": 5
      },
      "results": [
        {
          "created_at": null,
          "id": "Keynote",
          "name": "Keynote",
          "order": 0,
          "updated_at": null
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/levels 200": {
      "data": [
        {
          "created_at": null,
          "id": "Advanced",
          "name": "Advanced",
          "order": 0,
          "updated_at": null
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 1,
        "totalResults": 4,
        "total_pages": 1,
        "total_results": 4
      },
      "results": [
        {
          "created_at": null,
          "id": "Advanced",
          "name": "Advanced",
          "order": 0,
          "updated_at": null
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/languages 200": {
      "data": [
        {
          "created_at": null,
          "id": "English",
          "name": "English",
          "order": 0,
          "updated_at": null
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 1,
        "totalResults": 3,
        "total_pages": 1,
        "total_results": 3
      },
      "results": [
        {
          "created_at": null,
          "id": "English",
          "name": "English",
          "order": 0,
          "updated_at": null
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/tags 200": {
      "data": [
        {
          "created_at": null,
          "id": "adoption",
          "name": "adoption",
          "order": 0,
          "updated_at": null
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 2,
        "totalResults": 30,
        "total_pages": 2,
        "total_results": 30
      },
      "results": [
        {
          "created_at": null,
          "id": "adoption",
          "name": "adoption",
          "order": 0,
          "updated_at": null
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/session-statuses 200": {
      "data": [
        {
          "created_at": null,
          "id": "draft",
          "name": "draft",
          "order": 0,
          "system": true,
          "updated_at": null
        }
      ],
      "pagination": {
        "currentPage": 1,
        "current_page": 1,
        "pageSize": 25,
        "page_size": 25,
        "totalPages": 1,
        "totalResults": 7,
        "total_pages": 1,
        "total_results": 7
      },
      "results": [
        {
          "created_at": null,
          "id": "draft",
          "name": "draft",
          "order": 0,
          "system": true,
          "updated_at": null
        }
      ],
      "unknownResource": false
    },
    "GET /v1/event/{eventRef}/agenda 200": {
      "data": {
        "conflicts": [],
        "event": {
          "_id": "j971emkyf6md23jphggczhghvd8c8qjq",
          "agenda_published_at": "2026-08-06T03:27:18.602Z",
          "created_at": "2026-08-11T03:27:18.602Z",
          "description": "Two days for the people building AI systems that have to work on Monday morning. Practitioner talks on evaluation, agents, retrieval, inference infrastructure and the product decisions in between — no keynote fluff, no vendor pitches.",
          "endsAt": 1791939600000,
          "ends_at": "2026-10-14T01:00:00.000Z",
          "features": {
            "custom_fields": true,
            "translated_fields": false,
            "webhooks": true
          },
          "id": "j971emkyf6md23jphggczhghvd8c8qjq",
          "logo_url": null,
          "name": "AI Engineer Summit 2026",
          "slug": "ai-summit-2026",
          "startsAt": 1791820800000,
          "starts_at": "2026-10-12T16:00:00.000Z",
          "timezone": "America/Los_Angeles",
          "type": "Conference",
          "venue": "Moscone West, San Francisco",
          "websiteUrl": "https://example.com/ai-summit-2026",
          "website_url": "https://example.com/ai-summit-2026"
        },
        "published": true,
        "published_at": "2026-08-06T03:27:18.602Z",
        "rooms": [
          {
            "capacity": 300,
            "id": "js7928f758c8d8qn6xqj705py58c9r3j",
            "name": "Main Stage",
            "order": 0
          },
          {
            "capacity": 80,
            "id": "js703wmx07yh80wngvzx2xnt9h8c811v",
            "name": "Workshop Room",
            "order": 1
          }
        ],
        "scheduled": [
          {
            "duration_minutes": 45,
            "ends_at": "2026-10-12T09:45:00.000Z",
            "id": "k57cfvgs8hrs97xbvv82vcbd4d8c8y59",
            "room_id": "js7928f758c8d8qn6xqj705py58c9r3j",
            "starts_at": "2026-10-12T09:00:00.000Z",
            "title": "Structured output without the sadness",
            "track_id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn"
          },
          {
            "duration_minutes": 45,
            "ends_at": "2026-10-12T09:45:00.000Z",
            "id": "k57818z4rbjk54p03n1kna0rw58c8t7d",
            "room_id": "js703wmx07yh80wngvzx2xnt9h8c811v",
            "starts_at": "2026-10-12T09:00:00.000Z",
            "title": "Cost modelling for inference-heavy products",
            "track_id": "kd71aqbkdmt4nevr61p5wdg64d8c8pb9"
          }
        ],
        "totals": {
          "conflicts": 0,
          "scheduled": 10,
          "unscheduled": 0
        },
        "tracks": [
          {
            "color": "#2F5CE0",
            "id": "kd7805tv3jwftr3zw2w5bq0sms8c89wn",
            "name": "AI Engineering",
            "order": 0
          },
          {
            "color": "#1E9E6B",
            "id": "kd71aqbkdmt4nevr61p5wdg64d8c8pb9",
            "name": "Product",
            "order": 1
          }
        ],
        "unscheduled": []
      }
    },
    "GET /v1/event/{eventRef}/schedule.ics 200": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Trackstage//Event Schedule//EN\r\nCALSCALE:GREGORIAN\r\nMETHOD:PUBLISH\r\nX-WR-CALNAME:AI Engineer Summit 2026\r\nBEGIN:VEVENT\r\nUID:k57818z4rbjk54p03n1kna0rw58c8t7d@ai-summit-2026.trackstage\r\nDTSTAMP:20260811T032838Z\r\nDTSTART:20261012T090000Z\r\nDTEND:20261012T094500Z\r\nSUMMARY:Cost modelling for inference-heavy products\r\n…",
    "GET /v1/event/{eventRef}/sessions/{sessionId} 200": {
      "data": {
        "answers": {},
        "capacity": 80,
        "chairpersons": [],
        "created_at": "2026-08-11T03:28:35.947Z",
        "custom_fields": [],
        "decidedAt": null,
        "decided_at": null,
        "deleted_at": null,
        "description": "Created by the agenda e2e flow.",
        "durationMinutes": 45,
        "duration_minutes": 45,
        "endTime": 1791801900000,
        "ends_at": "2026-10-12T10:45:00.000Z",
        "format": null,
        "friendly_id": "SESS-71011",
        "friendly_id_raw": 71011,
        "id": "k5745eqp5fr8ecwwtk71tcq61n8c8ghd",
        "is_abstract": false,
        "is_public": true,
        "kind": "session",
        "language": null,
        "level": null,
        "location": "Workshop Room",
        "moderators": [],
        "notified_at": null,
        "participants": [
          {
            "about": null,
            "bio": null,
            "company": null,
            "company_name": null,
            "created_at": "2026-08-11T03:28:35.947Z",
            "email": "agenda-mso3p553-cyh23@example.com",
            "firstName": "Aggie",
            "first_name": "Aggie",
            "friendly_id": "SPK-50369",
            "friendly_id_raw": 50369,
            "full_name": "Aggie Enda",
            "headshotUrl": null,
            "id": "m97az6mve2978qw0s37deftq0s8c8hnn",
            "jobTitle": null,
            "lastName": "Enda",
            "last_name": "Enda",
            "linkedin_url": null,
            "name": "Aggie Enda",
            "participant_role": {
              "core_role": "speaker",
              "name": "Speaker",
              "name_plural": "Speakers",
              "slug": "speaker"
            },
            "phone_mobile": null,
            "photo_url": null,
            "pronouns": null,
            "salutation": null,
            "title": null,
            "twitter_url": null,
            "updated_at": "2026-08-11T03:28:35.947Z",
            "website_url": null,
            "workflow_status": null
          }
        ],
        "room": {
          "capacity": 80,
          "created_at": "2026-08-11T03:27:18.602Z",
          "id": "js703wmx07yh80wngvzx2xnt9h8c811v",
          "name": "Workshop Room",
          "order": 1,
          "updated_at": "2026-08-11T03:27:18.602Z"
        },
        "speakers": [
          {
            "about": null,
            "bio": null,
            "company": null,
            "company_name": null,
            "created_at": "2026-08-11T03:28:35.947Z",
            "email": "agenda-mso3p553-cyh23@example.com",
            "firstName": "Aggie",
            "first_name": "Aggie",
            "friendly_id": "SPK-50369",
            "friendly_id_raw": 50369,
            "full_name": "Aggie Enda",
            "headshotUrl": null,
            "id": "m97az6mve2978qw0s37deftq0s8c8hnn",
            "jobTitle": null,
            "lastName": "Enda",
            "last_name": "Enda",
            "linkedin_url": null,
            "name": "Aggie Enda",
            "participant_role": {
              "core_role": "speaker",
              "name": "Speaker",
              "name_plural": "Speakers",
              "slug": "speaker"
            },
            "phone_mobile": null,
            "photo_url": null,
            "pronouns": null,
            "salutation": null,
            "title": null,
            "twitter_url": null,
            "updated_at": "2026-08-11T03:28:35.947Z",
            "website_url": null,
            "workflow_status": null
          }
        ],
        "startTime": 1791799200000,
        "starts_at": "2026-10-12T10:00:00.000Z",
        "status": "accepted",
        "submittedAt": 1786418915947.0808,
        "submitter": {
          "about": null,
          "bio": null,
          "company": null,
          "company_name": null,
          "created_at": "2026-08-11T03:28:35.947Z",
          "email": "organizer@demo.sessionboard.dev",
          "firstName": "Dana",
          "first_name": "Dana",
          "friendly_id": "SPK-57771",
          "friendly_id_raw": 57771,
          "full_name": "Dana Organizer",
          "headshotUrl": null,
          "id": "m978pq4hq0nnsase57ks3sct4d8c9nyx",
          "jobTitle": null,
          "lastName": "Organizer",
          "last_name": "Organizer",
          "linkedin_url": null,
          "name": "Dana Organizer",
          "participant_role": null,
          "phone_mobile": null,
          "photo_url": null,
          "pronouns": null,
          "salutation": null,
          "title": null,
          "twitter_url": null,
          "updated_at": "2026-08-11T03:28:35.947Z",
          "website_url": null,
          "workflow_status": null
        },
        "subsessions": [],
        "tags": [],
        "title": "Dragged dg-mso3p553-rtglw",
        "track": null,
        "trackColor": null,
        "updated_at": "2026-08-11T03:28:35.947Z"
      }
    }
  }
}
