API reference

Cicero API

Read and search the public program of a Cicero event without credentials. Organizer integration writes use an event-scoped API key. Speaker proposal, profile, and task operations use that speaker's signed-in session as a cookie or Bearer secret. Every mutation is authenticated; public event, program, speaker, agenda, and CFP reads are not. Public reads are limited to 120 requests per caller per minute, speaker sessions to 300, and API keys to 600. A 429 response includes `Retry-After`. API keys have `read` or `write` scope; write keys include read access.

v1.0.022 endpointsBase URL https://cicero-three.vercel.app/api/v1

Authentication

Public
Published program reads need no credential. Unpublished sessions and unlisted speakers are never served here.
Event API key
Authorization: Bearer <key> A per-event API key. Read scope may inspect protected event data; write scope includes reads and may run organizer mutations. Public read endpoints do not require it.
Speaker session
Authorization: Bearer <token> or the cicero_session cookie. The signed-in speaker's opaque Cicero session token.

Errors

Each endpoint below lists the statuses it can return; the body is the same either way.

ErrorEvery non-2xx response has this shape

  • errorobjectrequired

    • codestringrequired

      one of "unauthorized", "forbidden", "not_found", "invalid", "conflict", "rate_limited", "unavailable", "internal"

    • messagestringrequired

    • detailsmap<string, string>optional

      Field-keyed messages when code is invalid

Events

Event metadata

GET/events/{slug}

Public

Fetch one event

Path parameters

  • slugstringrequired

    The event's URL slug

200The event

EventA conference or event

  • slugstringrequired

    URL-safe identifier for the event

  • namestringrequired

  • taglinestring | nullrequired

  • descriptionstring | nullrequired

    Markdown

  • eventTypestring | nullrequired

    Organizer-set, e.g. Conference

  • themestring | nullrequired

    The theme of this edition, long form

  • timezonestringrequired

    IANA timezone, e.g. America/Los_Angeles

  • startsOnstring | nullrequired

    ISO date, in the event timezone

  • endsOnstring | nullrequired

    ISO date, in the event timezone

  • startsAtstringrequired

    ISO 8601 instant the event starts

  • endsAtstringrequired

    ISO 8601 instant the event ends

  • speakerDeadlineAtstring | nullrequired

    ISO 8601 instant the speaker roster is meant to be settled. Advisory, so no write is refused after it passes. Null when the organizers do not track it

  • agendaDeadlineAtstring | nullrequired

    ISO 8601 instant the agenda is meant to be settled. Advisory, so no write is refused after it passes. Null when the organizers do not track it

  • websiteUrlstring | nullrequired

  • venueNamestring | nullrequired

  • venueAddressstring | nullrequired

Errorsevery one returns the Error body

  • 404No such event, form or resource
  • 429Rate limited

Example

curl "https://cicero-three.vercel.app/api/v1/events/roman-forum-2026"

200The event

{
  "slug": "roman-forum-2026",
  "name": "Roman Forum 2026",
  "tagline": "Two days on how programs actually get built",
  "description": "A working conference for people who **run** events, not just attend them.",
  "eventType": "Conference",
  "theme": "Foundations",
  "timezone": "America/Los_Angeles",
  "startsOn": "2026-09-14",
  "endsOn": "2026-09-15",
  "startsAt": "2026-09-14T16:00:00.000Z",
  "endsAt": "2026-09-16T01:00:00.000Z",
  "speakerDeadlineAt": "2026-07-15T07:00:00.000Z",
  "agendaDeadlineAt": "2026-08-14T07:00:00.000Z",
  "websiteUrl": "https://example.org/roman-forum-2026",
  "venueName": "Palazzo Conference Center",
  "venueAddress": "1100 Market Street, San Francisco, CA 94102"
}

GET/openapi.json

Public

This document

200The OpenAPI description

object

Program

Sessions, speakers and the agenda

GET/events/{slug}/sessions

Public

List sessions

Published sessions only. Full-text matching covers titles, descriptions, taxonomy, and speaker names; structured filters can be combined.

Path parameters

  • slugstringrequired

    The event's URL slug

Query parameters

  • statusstringoptional

    Defaults to published

    one of "draft", "published", "cancelled"

  • qstringoptional

    Search title, description, taxonomy, and speaker names

    min length 1 · max length 120

  • trackstringoptional

    Track name or id

    min length 1 · max length 120

  • roomstringoptional

    Room name or id

    min length 1 · max length 120

  • formatstringoptional

    Session format name

    min length 1 · max length 120

  • speakerstringoptional

    Speaker name or participant id

    min length 1 · max length 120

  • startsAfterstring (date-time)optional

    Keep sessions starting at or after this ISO 8601 instant

  • startsBeforestring (date-time)optional

    Keep sessions starting before this ISO 8601 instant

  • limitintegeroptional

    Defaults to 100; maximum 200

    min 1 · max 200

  • offsetintegeroptional

    Zero-based result offset; defaults to 0

    min 0 · max 10000

200Matching sessions

object

  • dataSession[]required

    • idstringrequired

      UUID

    • refstringrequired

      Human-readable reference, e.g. SESS-4

    • titlestringrequired

    • descriptionstring | nullrequired

      Markdown

    • statusstringrequired

      one of "draft", "published", "cancelled"

    • startsAtstring | nullrequired

      ISO 8601

    • endsAtstring | nullrequired

      ISO 8601

    • roomstring | nullrequired

    • trackstring | nullrequired

    • formatstring | nullrequired

    • ceuCreditsstring | nullrequired

    • speakersobject[]required

      • idstringrequired

      • namestringrequired

      • jobTitlestring | nullrequired

      • companystring | nullrequired

      • isPrimarybooleanrequired

  • totalintegerrequired

Errorsevery one returns the Error body

  • 404No such event, form or resource
  • 422The request failed validation
  • 429Rate limited

Example

curl "https://cicero-three.vercel.app/api/v1/events/roman-forum-2026/sessions?track=Operations&limit=2"

200Matching sessions

{
  "data": [
    {
      "id": "8f1c5a2e-6d4b-4d0a-9c3f-1b2a7e9d5c40",
      "ref": "SESS-14",
      "title": "Rebuilding the agenda mid-conference",
      "description": "What we changed after the first day, and what it cost.",
      "status": "published",
      "startsAt": "2026-09-14T17:30:00.000Z",
      "endsAt": "2026-09-14T18:15:00.000Z",
      "room": "Basilica Hall",
      "track": "Operations",
      "format": "Case study",
      "ceuCredits": null,
      "speakers": [
        {
          "id": "2d9b7c14-3f8a-4c62-b0d1-5e6f70a81b93",
          "name": "Livia Fontana",
          "jobTitle": "Head of Programming",
          "company": "Meridian Events",
          "isPrimary": true
        }
      ]
    }
  ],
  "total": 2
}

One of the two matching sessions is shown; the second has the same shape.

GET/events/{slug}/speakers

Public

List speakers

Everyone on an accepted submission. Emails are not included.

Path parameters

  • slugstringrequired

    The event's URL slug

Query parameters

  • qstringoptional

    Search name, biography, company, role, links, and sessions

    min length 1 · max length 120

  • companystringoptional

    Company name

    min length 1 · max length 120

  • sessionstringoptional

    Session title or id

    min length 1 · max length 120

  • limitintegeroptional

    Defaults to 100; maximum 200

    min 1 · max 200

  • offsetintegeroptional

    Zero-based result offset; defaults to 0

    min 0 · max 10000

200The speakers

object

  • dataSpeaker[]required

    • idstringrequired

      UUID

    • namestringrequired

    • pronounsstring | nullrequired

    • jobTitlestring | nullrequired

    • companystring | nullrequired

    • biostring | nullrequired

      Markdown

    • headshotUrlstring | nullrequired

      Absolute URL of the public headshot. Null when the speaker has not uploaded one or has not confirmed their profile yet, since nothing is served publicly until they do.

    • linksobject[]required

      • labelstringrequired

      • urlstringrequired

    • sessionsobject[]required

      • idstringrequired

      • titlestringrequired

  • totalintegerrequired

Errorsevery one returns the Error body

  • 404No such event, form or resource
  • 429Rate limited

GET/events/{slug}/agenda

Public

Fetch the agenda

Published sessions grouped by day in the event's timezone.

Path parameters

  • slugstringrequired

    The event's URL slug

200The agenda

AgendaThe published agenda, grouped by day

  • eventobjectrequired

    A conference or event

    • slugstringrequired

      URL-safe identifier for the event

    • namestringrequired

    • taglinestring | nullrequired

    • descriptionstring | nullrequired

      Markdown

    • eventTypestring | nullrequired

      Organizer-set, e.g. Conference

    • themestring | nullrequired

      The theme of this edition, long form

    • timezonestringrequired

      IANA timezone, e.g. America/Los_Angeles

    • startsOnstring | nullrequired

      ISO date, in the event timezone

    • endsOnstring | nullrequired

      ISO date, in the event timezone

    • startsAtstringrequired

      ISO 8601 instant the event starts

    • endsAtstringrequired

      ISO 8601 instant the event ends

    • speakerDeadlineAtstring | nullrequired

      ISO 8601 instant the speaker roster is meant to be settled. Advisory, so no write is refused after it passes. Null when the organizers do not track it

    • agendaDeadlineAtstring | nullrequired

      ISO 8601 instant the agenda is meant to be settled. Advisory, so no write is refused after it passes. Null when the organizers do not track it

    • websiteUrlstring | nullrequired

    • venueNamestring | nullrequired

    • venueAddressstring | nullrequired

  • daysobject[]required

    • datestringrequired

      ISO date in the event timezone

    • sessionsobject[]required

      • idstringrequired

        UUID

      • refstringrequired

        Human-readable reference, e.g. SESS-4

      • titlestringrequired

      • descriptionstring | nullrequired

        Markdown

      • statusstringrequired

        one of "draft", "published", "cancelled"

      • startsAtstring | nullrequired

        ISO 8601

      • endsAtstring | nullrequired

        ISO 8601

      • roomstring | nullrequired

      • trackstring | nullrequired

      • formatstring | nullrequired

      • ceuCreditsstring | nullrequired

      • speakersobject[]required

        Deeper fields are in the OpenAPI document.

  • unscheduledobject[]required

    • idstringrequired

      UUID

    • refstringrequired

      Human-readable reference, e.g. SESS-4

    • titlestringrequired

    • descriptionstring | nullrequired

      Markdown

    • statusstringrequired

      one of "draft", "published", "cancelled"

    • startsAtstring | nullrequired

      ISO 8601

    • endsAtstring | nullrequired

      ISO 8601

    • roomstring | nullrequired

    • trackstring | nullrequired

    • formatstring | nullrequired

    • ceuCreditsstring | nullrequired

    • speakersobject[]required

      • idstringrequired

      • namestringrequired

      • jobTitlestring | nullrequired

      • companystring | nullrequired

      • isPrimarybooleanrequired

Errorsevery one returns the Error body

  • 404No such event, form or resource
  • 429Rate limited

POST/events/{slug}/program/reconcile

Event API key

Preview or apply an Accelevents program collection

Requires an API key issued for this event. `apply: false` is a side-effect-free preview. `merge` upserts listed sessions and honors explicit `deleteExternalIds`. `replace` also reports source-managed sessions missing from the collection; applying those deletes requires `confirmDeleteMissing: "DELETE_MISSING_SESSIONS"`. Any per-record error prevents the entire request from being applied.

Path parameters

  • slugstringrequired

    The event's URL slug

Request bodyrequired · application/json

ProgramReconcileRequestAn Accelevents-shaped program snapshot or patch

  • source"accelevents"required

    always "accelevents"

  • modestringoptional

    merge upserts listed records; replace also deletes managed records that are absent

    one of "merge", "replace"

  • applybooleanoptional

    False previews the exact operations without writing

  • confirmDeleteMissing"DELETE_MISSING_SESSIONS"optional

    Required to apply replace mode when missing managed sessions would be deleted

    always "DELETE_MISSING_SESSIONS"

  • sessionsobject[]optional

    • externalIdstringrequired

      Stable Accelevents session id; unique within this event

      min length 1 · max length 200

    • titlestringrequired

      min length 1 · max length 300

    • descriptionstring | nullrequired

      Required Markdown field; null or blank clears the description

      max length 50000

    • statusstringrequired

      one of "draft", "published", "cancelled"

    • startsAtstring (date-time) | nullrequired

    • endsAtstring (date-time) | nullrequired

    • roomstring | nullrequired

      Event room id or exact name (case-insensitive)

      min length 1 · max length 200

    • trackstring | nullrequired

      Event track id or exact name (case-insensitive)

      min length 1 · max length 200

    • formatstring | nullrequired

      Event format id or exact name (case-insensitive)

      min length 1 · max length 200

    • ceuCreditsstring | nullrequired

      max length 50

  • deleteExternalIdsstring[]optional

    Explicit source-managed sessions to delete in merge mode

200The preview or apply report

object

  • dataProgramReconcileResultrequired

    • source"accelevents"required

      always "accelevents"

    • modestringrequired

      one of "merge", "replace"

    • appliedbooleanrequired

    • canApplybooleanrequired

    • requiresDeleteConfirmationbooleanrequired

    • summaryobjectrequired

      • createintegerrequired

      • updateintegerrequired

      • deleteintegerrequired

      • noopintegerrequired

      • errorintegerrequired

    • operationsobject[]required

      • externalIdstringrequired

      • actionstringrequired

        one of "create", "update", "delete", "noop", "error"

      • sessionIdstring | nullrequired

      • changesstring[]required

      • messagestring | nullrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 403The credential does not have the required scope
  • 422The request failed validation
  • 429Rate limited

POST/events/{slug}/integrations/accelevents/program

Event API key

Preview or apply the fixture Accelevents program sync

Bonus fixture capability for deterministic demos. It reconciles the published event, sessions and accepted speakers with create, update, delete and no-op results. Live Accelevents remains limited to the documented accepted-speaker push.

Path parameters

  • slugstringrequired

    The event's URL slug

Request bodyrequired · application/json

AcceleventsProgramSyncControls a one-way published-program sync to the fixture Accelevents adapter

  • modestringoptional

    one of "preview", "apply"

  • allowDeletesbooleanoptional

    Must be true with apply mode before remote-only fixture records are deleted

  • resetFixture"drifted"optional

    Fixture mode only: reset the remote collection to a repeatable drifted demo state

    always "drifted"

200The reconciliation plan or applied result

AcceleventsProgramSyncResult

  • modestringrequired

    one of "preview", "apply"

  • adapter"fake"required

    always "fake"

  • eventUrlstringrequired

  • allowDeletesbooleanrequired

  • fixtureResetbooleanrequired

  • countsobjectrequired

    • createintegerrequired

    • updateintegerrequired

    • deleteintegerrequired

    • noopintegerrequired

    • blockedDeletesintegerrequired

  • resultsobject[]required

    • resourceTypestringrequired

      one of "event", "session", "speaker"

    • sourceIdstringrequired

    • remoteIdstring | nullrequired

    • actionstringrequired

      one of "create", "update", "delete", "noop"

    • statusstringrequired

      one of "planned", "applied", "blocked", "unchanged"

    • messagestring | nullrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 403The credential does not have the required scope
  • 409Conflicts with an existing record
  • 422The request failed validation
  • 429Rate limited

Sponsors

Published sponsors and exhibitors

GET/events/{slug}/sponsors

Public

List sponsors and exhibitors

Published rows only. Draft sponsor details and logo URLs are never returned.

Path parameters

  • slugstringrequired

    The event's URL slug

Query parameters

  • kindstringoptional

    one of "sponsor", "exhibitor"

  • qstringoptional

    Search name, tier, description, booth, and website

    min length 1 · max length 120

  • tierstringoptional

    Tier name

    min length 1 · max length 120

  • limitintegeroptional

    Defaults to 100; maximum 200

    min 1 · max 200

  • offsetintegeroptional

    Zero-based result offset; defaults to 0

    min 0 · max 10000

200The published sponsors and exhibitors

object

  • dataSponsor[]required

    • idstringrequired

      UUID

    • kindstringrequired

      one of "sponsor", "exhibitor"

    • status"published"required

      Public reads never expose drafts

      always "published"

    • namestringrequired

    • tierstring | nullrequired

    • websiteUrlstring | nullrequired

    • descriptionstring | nullrequired

    • boothLocationstring | nullrequired

    • logoUrlstring | nullrequired

      Absolute URL of the logo for this published sponsor or exhibitor

  • totalintegerrequired

Errorsevery one returns the Error body

  • 404No such event, form or resource
  • 422The request failed validation
  • 429Rate limited

Example

curl "https://cicero-three.vercel.app/api/v1/events/roman-forum-2026/sponsors?kind=sponsor&limit=1"

200The published sponsors and exhibitors

{
  "data": [
    {
      "id": "c0a1f6d8-9b23-4e75-8a10-df3c4b5e6a71",
      "kind": "sponsor",
      "status": "published",
      "name": "Tessera Cloud",
      "tier": "Gold",
      "websiteUrl": "https://example.com/tessera",
      "description": "Infrastructure for event platforms.",
      "boothLocation": "B-14",
      "logoUrl": "https://cdn.example.com/tessera/logo.svg"
    }
  ],
  "total": 6
}

One of six published rows. Draft sponsors are never returned.

Submissions

The call for speakers

GET/events/{slug}/forms

Public

List open calls for speakers

Public discovery. Draft, closed, and out-of-window forms are omitted.

Path parameters

  • slugstringrequired

    The event's URL slug

200Open CFP forms

object

  • dataOpenCall[]required

    • slugstringrequired

    • namestringrequired

      The public title: externalTitle when the organizer set one, the internal name until then

    • externalTitlestringrequired

      `F-9`: what the submitter sees. Same fallback as `name`.

    • closesAtstring | nullrequired

      ISO 8601

  • totalintegerrequired

Errorsevery one returns the Error body

  • 404No such event, form or resource
  • 429Rate limited

GET/events/{slug}/forms/{formId}

Public

Read an open call for speakers

Public field, conditional-logic, and taxonomy contract for one open CFP.

Path parameters

  • slugstringrequired

    The event's URL slug

  • formIdstringrequired

    The open CFP form's id or slug

200The open CFP form

object

  • dataPublicFormrequired

    • idstringrequired

    • slugstringrequired

    • namestringrequired

      The public title: externalTitle when the organizer set one, the internal name until then

    • externalTitlestringrequired

      `F-9`: what the submitter sees. Same fallback as `name`.

    • pageHeadingstring | nullrequired

      `F-9`: the welcome screen heading, at most 15 characters

    • showWelcomebooleanrequired

      `F-9`: false hides the welcome copy without deleting it

    • introMarkdownstring | nullrequired

    • opensAtstring | nullrequired

      ISO 8601

    • closesAtstring | nullrequired

      ISO 8601

    • allowDraftsbooleanrequired

    • maxSubmissionsPerUserinteger | nullrequired

    • targetTypestringrequired

      `F-4`: a session-target form lands accepted and mints its session on submit

      one of "abstract", "session"

    • collectsParticipantsbooleanrequired

      `F-4`: true when a submission carries a cast, collected through participantFields

    • maxParticipantsinteger | nullrequired

      `F-7`: null means no overall cap

    • fieldsobject[]required

      The abstract questions, in running order

      • idstringrequired

      • keystringrequired

      • entitystringrequired

        Which entity this question is about. Defaults to abstract, as it always did.

        one of "abstract", "participant"

      • builtinKeystring | nullrequired

        Abstract built-ins only; always null when entity is participant

        one of "title", "description", "format", "track", "level", "tags"

      • participantKeystring | nullrequired

        Participant built-ins only; always null when entity is abstract

        one of "firstName", "lastName", "email", "phone", "biography"

      • typestringrequired

        one of "short_text", "long_text", "markdown", "select", "multi_select", "radio", "checkbox", "number", "email", "url", "date", "file", "section_break"

      • labelstringrequired

      • helpTextstring | nullrequired

      • placeholderstring | nullrequired

      • positionintegerrequired

      • stepintegerrequired

      • requiredbooleanrequired

      • optionsstring[] | nullrequired

      • optionLabelsmap<string, string> | nullrequired

      • showIfobject | nullrequired

        Deeper fields are in the OpenAPI document.

      • minLengthinteger | nullrequired

      • maxLengthinteger | nullrequired

      • charLimitGroupstring | nullrequired

    • participantFieldsobject[]required

      `F-6`: the questions asked about each person. Empty unless collectsParticipants.

      • idstringrequired

      • keystringrequired

      • entitystringrequired

        Which entity this question is about. Defaults to abstract, as it always did.

        one of "abstract", "participant"

      • builtinKeystring | nullrequired

        Abstract built-ins only; always null when entity is participant

        one of "title", "description", "format", "track", "level", "tags"

      • participantKeystring | nullrequired

        Participant built-ins only; always null when entity is abstract

        one of "firstName", "lastName", "email", "phone", "biography"

      • typestringrequired

        one of "short_text", "long_text", "markdown", "select", "multi_select", "radio", "checkbox", "number", "email", "url", "date", "file", "section_break"

      • labelstringrequired

      • helpTextstring | nullrequired

      • placeholderstring | nullrequired

      • positionintegerrequired

      • stepintegerrequired

      • requiredbooleanrequired

      • optionsstring[] | nullrequired

      • optionLabelsmap<string, string> | nullrequired

      • showIfobject | nullrequired

        Deeper fields are in the OpenAPI document.

      • minLengthinteger | nullrequired

      • maxLengthinteger | nullrequired

      • charLimitGroupstring | nullrequired

    • rolesobject[]required

      `F-7`: the roles this form offers

      • idstringrequired

      • kindstringrequired

        one of "speaker", "co_speaker", "moderator", "panelist"

      • labelstringrequired

        The organizer’s name for this role on this form

      • positionintegerrequired

      • minCountintegerrequired

        How many must hold it for a submission to be complete

      • maxCountinteger | nullrequired

        Null means no ceiling beyond maxParticipants

Errorsevery one returns the Error body

  • 404No such event, form or resource
  • 429Rate limited

GET/events/{slug}/submissions

Event API key

List submissions

Requires a read or write API key issued for this event.

Path parameters

  • slugstringrequired

    The event's URL slug

Query parameters

  • statusstringoptional

    one of "draft", "submitted", "under_review", "accepted", "declined", "waitlisted", "withdrawn"

  • limitintegeroptional

    Defaults to 100; maximum 200

    min 1 · max 200

200Matching submissions

object

  • dataSubmission[]required

    • idstringrequired

      UUID

    • refstringrequired

      Human-readable reference, e.g. ABS-12

    • titlestringrequired

    • descriptionstring | nullrequired

      Markdown

    • statusstringrequired

      one of "draft", "submitted", "under_review", "accepted", "declined", "waitlisted", "withdrawn"

    • trackstring | nullrequired

    • formatstring | nullrequired

    • levelstring | nullrequired

    • tagsstring[]required

    • submitterobjectrequired

      • namestring | nullrequired

      • emailstringrequired

    • answersmap<string, any>required

      Custom form answers, keyed by field key

    • submittedAtstring | nullrequired

      ISO 8601

    • decidedAtstring | nullrequired

      ISO 8601

  • totalintegerrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 422The request failed validation
  • 429Rate limited

POST/events/{slug}/forms/{formId}/submissions

Speaker session

Submit to a call for speakers

Requires the signed-in speaker's session. The public web CFP remains the cold account-creation flow; this agent-facing POST never creates or acts as another email address. Every request creates a new proposal or draft, so a retry may create another record when the form permits more than one.

Path parameters

  • slugstringrequired

    The event's URL slug

  • formIdstringrequired

    The open CFP form's id or slug

Request bodyrequired · application/json

NewSubmissionA submission to a published form

  • emailstring (email)optional

    Optional consistency check; when present it must match the signed-in speaker

  • namestringoptional

    Submitter display name

  • modestringoptional

    Save a private draft or file the proposal for review

    one of "draft", "submit"

  • answersmap<string, string | number | boolean | string[] | null>required

    Keyed by the form field key. Built-in keys are title, description, format, track, level, tags.

  • participantsobject[]optional

    Only accepted by a form with collectsParticipants. The first person is the submitter. Omit to file as the signed-in speaker alone.

    • firstNamestringrequired

      Given name

    • lastNamestringrequired

      Family name

    • emailstring (email)required

      The first person is the submitter, so their address must be the signed-in speaker's

    • phonestring | nulloptional

      Mobile number, normalized to E.164

      max length 40

    • biographystring | nulloptional

      Markdown

      max length 5000

    • rolestringoptional

      Must be a role this form offers; `F-7` counts are enforced against it

      one of "speaker", "co_speaker", "moderator", "panelist"

201The submission

NewSubmissionResult

  • idstringrequired

  • refstringrequired

  • statusstringrequired

    accepted only on a form whose targetType is session

    one of "draft", "submitted", "accepted"

  • titlestringrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 409Conflicts with an existing record
  • 422The request failed validation
  • 429Rate limited

Example

curl "https://cicero-three.vercel.app/api/v1/events/roman-forum-2026/forms/main-cfp/submissions" \
  -X POST \
  -H "Authorization: Bearer $CICERO_SPEAKER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "mode": "submit",
  "name": "Livia Fontana",
  "answers": {
    "title": "Rebuilding the agenda mid-conference",
    "description": "What we changed after the first day, and what it cost.",
    "format": "Case study",
    "track": "Operations",
    "level": "Intermediate",
    "tags": [
      "agenda",
      "operations"
    ]
  },
  "participants": [
    {
      "firstName": "Livia",
      "lastName": "Fontana",
      "email": "livia@example.org",
      "role": "speaker"
    }
  ]
}'

201The submission

{
  "id": "4b6e1f70-2c88-4a3d-9e51-77c0d9a2b3e4",
  "ref": "SUB-108",
  "status": "submitted",
  "title": "Rebuilding the agenda mid-conference"
}

Speaker

The signed-in speaker's own work

GET/events/{slug}/me/profile

Speaker session

Read my event-scoped speaker profile

Path parameters

  • slugstringrequired

    The event's URL slug

200The signed-in speaker profile

object

  • dataSpeakerProfilerequired

    • displayNamestring | nullrequired

      Event-scoped override of the account name

    • firstNamestring | nullrequired

      Given name on the account

    • lastNamestring | nullrequired

      Family name on the account

    • namestring | nullrequired

      Read-only join of firstName and lastName; edit the halves instead

    • salutationstring | nullrequired

      How a letter opens, e.g. Ada

    • honorificstring | nullrequired

      Title before the name on the programme, e.g. Dr

    • pronounsstring | nullrequired

    • genderstring | nullrequired

      Free text; organizers report on it

    • jobTitlestring | nullrequired

    • companystring | nullrequired

    • bioMarkdownstring | nullrequired

    • timezonestring | nullrequired

    • dietaryNotesstring | nullrequired

    • accessibilityNotesstring | nullrequired

    • linksobject[]required

      • labelstringrequired

        min length 1 · max length 60

      • urlstringrequired

        min length 1 · max length 2000

    • emailstring (email)required

    • phonestring | nullrequired

    • notifyEmailbooleanrequired

    • notifySmsbooleanrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 429Rate limited

PATCH/events/{slug}/me/profile

Speaker session

Update my event-scoped speaker profile

Path parameters

  • slugstringrequired

    The event's URL slug

Request bodyrequired · application/json

SpeakerProfileUpdate

  • displayNamestringoptional

    max length 200

  • firstNamestringoptional

    max length 200

  • lastNamestringoptional

    max length 200

  • salutationstringoptional

    max length 40

  • honorificstringoptional

    max length 40

  • pronounsstringoptional

    max length 40

  • genderstringoptional

    max length 60

  • jobTitlestringoptional

    max length 120

  • companystringoptional

    max length 120

  • bioMarkdownstringoptional

    max length 5000

  • timezonestringoptional

    max length 64

  • dietaryNotesstringoptional

    max length 1000

  • accessibilityNotesstringoptional

    max length 1000

  • linksobject[]optional

    • labelstringrequired

      min length 1 · max length 60

    • urlstringrequired

      min length 1 · max length 2000

  • phonestringoptional

    Mobile number; national input is stored as E.164

    max length 40

  • notifyEmailbooleanoptional

  • notifySmsbooleanoptional

200The updated speaker profile

object

  • dataSpeakerProfilerequired

    • displayNamestring | nullrequired

      Event-scoped override of the account name

    • firstNamestring | nullrequired

      Given name on the account

    • lastNamestring | nullrequired

      Family name on the account

    • namestring | nullrequired

      Read-only join of firstName and lastName; edit the halves instead

    • salutationstring | nullrequired

      How a letter opens, e.g. Ada

    • honorificstring | nullrequired

      Title before the name on the programme, e.g. Dr

    • pronounsstring | nullrequired

    • genderstring | nullrequired

      Free text; organizers report on it

    • jobTitlestring | nullrequired

    • companystring | nullrequired

    • bioMarkdownstring | nullrequired

    • timezonestring | nullrequired

    • dietaryNotesstring | nullrequired

    • accessibilityNotesstring | nullrequired

    • linksobject[]required

      • labelstringrequired

        min length 1 · max length 60

      • urlstringrequired

        min length 1 · max length 2000

    • emailstring (email)required

    • phonestring | nullrequired

    • notifyEmailbooleanrequired

    • notifySmsbooleanrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 422The request failed validation
  • 429Rate limited

GET/events/{slug}/me/submissions

Speaker session

List my proposals

Path parameters

  • slugstringrequired

    The event's URL slug

200The signed-in speaker proposals

object

  • dataSpeakerSubmission[]required

    • idstringrequired

    • refstringrequired

    • titlestringrequired

    • descriptionMarkdownstring | nullrequired

    • statusstringrequired

      one of "draft", "submitted", "under_review", "accepted", "declined", "waitlisted", "withdrawn"

    • levelstring | nullrequired

    • formatstring | nullrequired

    • trackstring | nullrequired

    • formIdstringrequired

    • formSlugstringrequired

    • formNamestringrequired

    • editablebooleanrequired

    • rolestringrequired

      one of "speaker", "co_speaker", "moderator", "panelist"

    • isPrimarybooleanrequired

    • answersmap<string, string | number | boolean | string[] | null>required

    • submittedAtstring | nullrequired

      ISO 8601

    • scheduledobject | nullrequired

      • refstringrequired

      • titlestringrequired

      • startsAtstring | nullrequired

        ISO 8601

      • endsAtstring | nullrequired

        ISO 8601

      • roomstring | nullrequired

      • publishedbooleanrequired

  • totalintegerrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 429Rate limited

Example

curl "https://cicero-three.vercel.app/api/v1/events/roman-forum-2026/me/submissions" \
  -H "Authorization: Bearer $CICERO_SPEAKER_TOKEN"

200The signed-in speaker proposals

{
  "data": [
    {
      "id": "4b6e1f70-2c88-4a3d-9e51-77c0d9a2b3e4",
      "ref": "SUB-108",
      "title": "Rebuilding the agenda mid-conference",
      "descriptionMarkdown": "What we changed after the first day, and what it cost.",
      "status": "accepted",
      "level": "Intermediate",
      "format": "Case study",
      "track": "Operations",
      "formId": "d7c2b9a4-5e18-4f36-90ab-6c1d2e3f4a5b",
      "formSlug": "main-cfp",
      "formName": "Call for speakers",
      "editable": false,
      "role": "speaker",
      "isPrimary": true,
      "answers": {
        "title": "Rebuilding the agenda mid-conference",
        "tags": [
          "agenda",
          "operations"
        ]
      },
      "submittedAt": "2026-05-02T19:04:11.000Z",
      "scheduled": {
        "ref": "SESS-14",
        "title": "Rebuilding the agenda mid-conference",
        "startsAt": "2026-09-14T17:30:00.000Z",
        "endsAt": "2026-09-14T18:15:00.000Z",
        "room": "Basilica Hall",
        "published": true
      }
    }
  ],
  "total": 1
}

Answers are keyed by form field key; only two are shown.

GET/events/{slug}/me/submissions/{submissionId}

Speaker session

Read one of my proposals

Path parameters

  • slugstringrequired

    The event's URL slug

  • submissionIdstringrequired

    One of the signed-in speaker's proposal ids

200The signed-in speaker proposal

object

  • dataSpeakerSubmissionrequired

    • idstringrequired

    • refstringrequired

    • titlestringrequired

    • descriptionMarkdownstring | nullrequired

    • statusstringrequired

      one of "draft", "submitted", "under_review", "accepted", "declined", "waitlisted", "withdrawn"

    • levelstring | nullrequired

    • formatstring | nullrequired

    • trackstring | nullrequired

    • formIdstringrequired

    • formSlugstringrequired

    • formNamestringrequired

    • editablebooleanrequired

    • rolestringrequired

      one of "speaker", "co_speaker", "moderator", "panelist"

    • isPrimarybooleanrequired

    • answersmap<string, string | number | boolean | string[] | null>required

    • submittedAtstring | nullrequired

      ISO 8601

    • scheduledobject | nullrequired

      • refstringrequired

      • titlestringrequired

      • startsAtstring | nullrequired

        ISO 8601

      • endsAtstring | nullrequired

        ISO 8601

      • roomstring | nullrequired

      • publishedbooleanrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 429Rate limited

PUT/events/{slug}/me/submissions/{submissionId}

Speaker session

Replace editable content on one of my proposals

Path parameters

  • slugstringrequired

    The event's URL slug

  • submissionIdstringrequired

    One of the signed-in speaker's proposal ids

Request bodyrequired · application/json

SpeakerSubmissionUpdate

  • titlestringrequired

    min length 3 · max length 255

  • descriptionMarkdownstringoptional

    max length 5000

  • levelstringoptional

    max length 60

  • answersmap<string, string | number | boolean | string[] | null>optional

200The updated proposal

object

  • dataSpeakerSubmissionrequired

    • idstringrequired

    • refstringrequired

    • titlestringrequired

    • descriptionMarkdownstring | nullrequired

    • statusstringrequired

      one of "draft", "submitted", "under_review", "accepted", "declined", "waitlisted", "withdrawn"

    • levelstring | nullrequired

    • formatstring | nullrequired

    • trackstring | nullrequired

    • formIdstringrequired

    • formSlugstringrequired

    • formNamestringrequired

    • editablebooleanrequired

    • rolestringrequired

      one of "speaker", "co_speaker", "moderator", "panelist"

    • isPrimarybooleanrequired

    • answersmap<string, string | number | boolean | string[] | null>required

    • submittedAtstring | nullrequired

      ISO 8601

    • scheduledobject | nullrequired

      • refstringrequired

      • titlestringrequired

      • startsAtstring | nullrequired

        ISO 8601

      • endsAtstring | nullrequired

        ISO 8601

      • roomstring | nullrequired

      • publishedbooleanrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 409Conflicts with an existing record
  • 422The request failed validation
  • 429Rate limited

POST/events/{slug}/me/submissions/{submissionId}/withdraw

Speaker session

Withdraw one of my proposals

Path parameters

  • slugstringrequired

    The event's URL slug

  • submissionIdstringrequired

    One of the signed-in speaker's proposal ids

200The withdrawn proposal

object

  • dataSpeakerSubmissionrequired

    • idstringrequired

    • refstringrequired

    • titlestringrequired

    • descriptionMarkdownstring | nullrequired

    • statusstringrequired

      one of "draft", "submitted", "under_review", "accepted", "declined", "waitlisted", "withdrawn"

    • levelstring | nullrequired

    • formatstring | nullrequired

    • trackstring | nullrequired

    • formIdstringrequired

    • formSlugstringrequired

    • formNamestringrequired

    • editablebooleanrequired

    • rolestringrequired

      one of "speaker", "co_speaker", "moderator", "panelist"

    • isPrimarybooleanrequired

    • answersmap<string, string | number | boolean | string[] | null>required

    • submittedAtstring | nullrequired

      ISO 8601

    • scheduledobject | nullrequired

      • refstringrequired

      • titlestringrequired

      • startsAtstring | nullrequired

        ISO 8601

      • endsAtstring | nullrequired

        ISO 8601

      • roomstring | nullrequired

      • publishedbooleanrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 409Conflicts with an existing record
  • 429Rate limited

GET/events/{slug}/me/tasks

Speaker session

List my speaker tasks

Path parameters

  • slugstringrequired

    The event's URL slug

200The signed-in speaker tasks

object

  • dataSpeakerTask[]required

    • assignmentIdstringrequired

    • taskIdstringrequired

      `S-16`: the task these rows answer. Group rows by it.

    • scopestringrequired

      contact is once per person, submission once per session, group once per session team

      one of "contact", "group", "submission"

    • sharedbooleanrequired

      True when the whole session team reads and completes this one row

    • namestringrequired

    • descriptionMarkdownstring | nullrequired

    • kindstringrequired

      one of "form", "file_upload", "acknowledge", "link"

    • statusstringrequired

      one of "not_started", "in_progress", "completed", "waived"

    • requiredbooleanrequired

    • dueAtstring | nullrequired

      ISO 8601

    • overduebooleanrequired

    • completedAtstring | nullrequired

      ISO 8601

    • linkUrlstring | nullrequired

    • submissionIdstring | nullrequired

    • submissionTitlestring | nullrequired

    • pinnedSubmissionIdstring | nullrequired

      `S-16`: the session the task itself is pinned to, which a contact-scoped task has without this row having one

    • answersmap<string, string | number | boolean | string[] | null> | nullrequired

    • formobject | nullrequired

      • idstringrequired

      • namestringrequired

      • fieldsobject[]required

        Deeper fields are in the OpenAPI document.

    • fileRequestobject | nullrequired

      • idstringrequired

      • labelstringrequired

      • helpTextstring | nullrequired

      • acceptedTypesstring[]required

      • maxSizeMbintegerrequired

      • allowMultiplebooleanrequired

    • filesobject[]required

      • idstringrequired

      • filenamestringrequired

      • contentTypestringrequired

      • sizeBytesintegerrequired

      • createdAtstringrequired

        ISO 8601

  • totalintegerrequired

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 429Rate limited

POST/events/{slug}/me/tasks/{assignmentId}/complete

Speaker session

Complete an acknowledgement or link task

Path parameters

  • slugstringrequired

    The event's URL slug

  • assignmentIdstringrequired

    One of the signed-in speaker's task assignment ids

200The changed task state

object

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 409Conflicts with an existing record
  • 422The request failed validation
  • 429Rate limited

POST/events/{slug}/me/tasks/{assignmentId}/reopen

Speaker session

Reopen one of my completed tasks

Path parameters

  • slugstringrequired

    The event's URL slug

  • assignmentIdstringrequired

    One of the signed-in speaker's task assignment ids

200The changed task state

object

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 409Conflicts with an existing record
  • 429Rate limited

PUT/events/{slug}/me/tasks/{assignmentId}/form

Speaker session

Save or submit one of my form tasks

Path parameters

  • slugstringrequired

    The event's URL slug

  • assignmentIdstringrequired

    One of the signed-in speaker's task assignment ids

Request bodyrequired · application/json

SpeakerTaskForm

  • answersmap<string, string | number | boolean | string[] | null>required

  • submitbooleanoptional

200The changed task state

object

Errorsevery one returns the Error body

  • 401Missing or invalid credential
  • 404No such event, form or resource
  • 409Conflicts with an existing record
  • 422The request failed validation
  • 429Rate limited

Every path is relative to the base URL above, and every field on this page is read from the OpenAPI document the API generates from its own validators. Questions or a gap worth closing? Start from the overview.