{"openapi":"3.1.0","info":{"title":"Shoal API","version":"1.0.0","summary":"Read and update your Shoal events, agenda, attendees and more.","description":"Shoal's public API lets an organization read and update its events, attendees, agenda, audiences, sponsors, notifications and custom pages.\n\nCreate an API key on the Organization > API page of your dashboard and send it as `Authorization: Bearer <key>`. Each key can make 300 requests a minute; after that requests get a 429 until the minute is up. Answers are JSON.\n\nBatches take up to 500 items and are all or nothing. Things are matched by `id` when you send one, otherwise by name (capital letters don't matter). The API never sends email. Shoal can also post attendee events to your webhook URL (see `webhooks`).","contact":{"name":"Shoal support","url":"https://shoalevents.com"}},"servers":[{"url":"https://shoalevents.com/api/v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Events"},{"name":"Attendees"},{"name":"Speakers"},{"name":"Sessions"},{"name":"Tracks"},{"name":"Audiences"},{"name":"Sponsors"},{"name":"Notifications"},{"name":"Pages"},{"name":"Webhooks"}],"paths":{"/events":{"get":{"operationId":"listEvents","summary":"List events","description":"Your organization's events.","tags":["Events"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"createEvent","summary":"Create an event","description":"Creates an event as a draft (unless you send a status). Only name is required.","tags":["Events"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventInput"}}}},"responses":{"200":{"description":"The new event.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"getEvent","summary":"Get an event","description":"One event with its questions, tracks and ticket types.","tags":["Events"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"patch":{"operationId":"updateEvent","summary":"Update an event","description":"Changes only the fields you send. starts_at, ends_at and timezone can't change from 5 days before the event starts (400).","tags":["Events"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventInput"}}}},"responses":{"200":{"description":"The event after the change.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/attendees":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listAttendees","summary":"List attendees","description":"People on the event, one page at a time.","tags":["Attendees"],"parameters":[{"name":"status","in":"query","description":"Only people with this status. Leave out for everyone.","schema":{"type":"string","enum":["invited","pending","registered","waitlisted","cancelled"]}},{"name":"limit","in":"query","description":"How many to return.","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"offset","in":"query","description":"How many to skip.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["total","limit","offset","data"],"properties":{"total":{"type":"integer","description":"How many people match the status."},"limit":{"type":"integer","description":"The page size used."},"offset":{"type":"integer","description":"The number skipped."},"data":{"type":"array","items":{"$ref":"#/components/schemas/Attendee"}}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertAttendees","summary":"Add or update attendees","description":"Adds or updates up to 500 people, matched by email. New people are added (as invited unless you say otherwise), existing people are updated, and only the fields you send change. All or nothing. Nobody is emailed.","tags":["Attendees"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["attendees"],"additionalProperties":false,"properties":{"attendees":{"type":"array","items":{"$ref":"#/components/schemas/AttendeeInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","attendees"],"properties":{"created":{"type":"integer","description":"How many people were added."},"updated":{"type":"integer","description":"How many existing people were updated."},"attendees":{"type":"array","items":{"type":"object","required":["email","id"],"properties":{"email":{"type":"string","description":"The person's email, in lower case."},"id":{"type":"string","description":"The attendee's id.","format":"uuid"}}}}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"delete":{"operationId":"deleteAttendees","summary":"Delete attendees","description":"Removes people like the trash icon on the Attendees tab: their photo, picked sessions, game points and survey answers go too. A paid order is kept but not refunded, so refund first. A string with @ in it is an email, any other string is an id.","tags":["Attendees"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["attendees"],"additionalProperties":false,"properties":{"attendees":{"$ref":"#/components/schemas/DeleteRequest","description":"Items to delete. Each is an id (a string), or an object like {\"id\": ...}."}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/attendees/{itemId}":{"parameters":[{"$ref":"#/components/parameters/EventId"},{"$ref":"#/components/parameters/ItemId"}],"delete":{"operationId":"deleteAttendeeById","summary":"Delete one attendee","description":"Deletes the attendee with this id. Answers 404 when there is none in this event.","tags":["Attendees"],"responses":{"200":{"description":"Deleted.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/speakers":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listSpeakers","summary":"List speakers","description":"The event's speakers, in order.","tags":["Speakers"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertSpeakers","summary":"Add or update speakers","description":"Adds or updates up to 500 speakers at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that speaker. Without an id, a speaker with the same name is updated, otherwise a new one is added. Fields Shoal doesn't know are refused.","tags":["Speakers"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["speakers"],"additionalProperties":false,"properties":{"speakers":{"type":"array","items":{"$ref":"#/components/schemas/SpeakerInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","speakers"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"speakers":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/sessions":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listSessions","summary":"List sessions","description":"The event's sessions, by start time.","tags":["Sessions"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertSessions","summary":"Add or update sessions","description":"Adds or updates up to 500 sessions at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that session. Without an id, a session is always added as new. Add speakers and tracks before the sessions that use them. Fields Shoal doesn't know are refused.","tags":["Sessions"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sessions"],"additionalProperties":false,"properties":{"sessions":{"type":"array","items":{"$ref":"#/components/schemas/SessionInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","sessions"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"sessions":{"type":"array","items":{"$ref":"#/components/schemas/Session"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/audiences":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listAudiences","summary":"List audiences","description":"The event's audiences (groups of attendees).","tags":["Audiences"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Audience"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertAudiences","summary":"Add or update audiences","description":"Adds or updates up to 500 audiences at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that audience. Without an id, an audience with the same name is updated, otherwise a new one is added. Fields Shoal doesn't know are refused.","tags":["Audiences"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audiences"],"additionalProperties":false,"properties":{"audiences":{"type":"array","items":{"$ref":"#/components/schemas/AudienceInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","audiences"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"audiences":{"type":"array","items":{"$ref":"#/components/schemas/Audience"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/audience-members":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listAudienceMembers","summary":"List people on list audiences","description":"Who is on the event's list audiences (hand-picked groups, kind \"list\"). Add ?audience= with an audience's id or name for one audience; leave it out for all of them. Rule audiences work out their people live, so they have no list here.","tags":["Audiences"],"parameters":[{"name":"audience","in":"query","required":false,"description":"An audience's id or name. Leave out for every list audience.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AudienceMember"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"addAudienceMembers","summary":"Put people on list audiences","description":"Adds up to 500 people at a time to list audiences. All or nothing: if any row is wrong (a rule audience, an unknown audience, someone who isn't on the event's list), nothing is saved. People already on the audience are counted in already. The API never emails anyone.","tags":["Audiences"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["members"],"additionalProperties":false,"properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/AudienceMemberInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["added","already"],"properties":{"added":{"type":"integer","description":"How many people were put on an audience."},"already":{"type":"integer","description":"How many were on it already."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"delete":{"operationId":"removeAudienceMembers","summary":"Take people off list audiences","description":"Removes up to 500 people at a time from list audiences. Anyone who wasn't on the audience comes back in not_found; that never fails the call. The people stay registered for the event.","tags":["Audiences"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["members"],"additionalProperties":false,"properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/AudienceMemberInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["removed","not_found"],"properties":{"removed":{"type":"integer","description":"How many people were taken off."},"not_found":{"type":"array","items":{},"description":"The items you sent that weren't on the audience."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/pages":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listPages","summary":"List pages","description":"The custom pages in the event's attendee app.","tags":["Pages"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Page"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertPages","summary":"Add or update pages","description":"Adds or updates up to 500 pages at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that page. Without an id, a page with the same title is updated, otherwise a new one is added. Fields Shoal doesn't know are refused.","tags":["Pages"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pages"],"additionalProperties":false,"properties":{"pages":{"type":"array","items":{"$ref":"#/components/schemas/PageInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","pages"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"pages":{"type":"array","items":{"$ref":"#/components/schemas/Page"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/tracks":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listTracks","summary":"List tracks","description":"The event's tracks.","tags":["Tracks"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Track"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertTracks","summary":"Add or update tracks","description":"Adds or updates up to 500 tracks at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that track. Without an id, a track with the same name is updated, otherwise a new one is added at the end. Fields Shoal doesn't know are refused.","tags":["Tracks"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tracks"],"additionalProperties":false,"properties":{"tracks":{"type":"array","items":{"$ref":"#/components/schemas/TrackInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","tracks"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"tracks":{"type":"array","items":{"$ref":"#/components/schemas/Track"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"delete":{"operationId":"deleteTracks","summary":"Delete tracks","description":"Deletes tracks by id or name. Their sessions stay (they just leave the track) and the people in them end up with no track.","tags":["Tracks"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tracks"],"additionalProperties":false,"properties":{"tracks":{"$ref":"#/components/schemas/DeleteRequest","description":"Items to delete. Each is an id or a name (a string), or an object like {\"id\": ...} or {\"name\": ...}."}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/tracks/{itemId}":{"parameters":[{"$ref":"#/components/parameters/EventId"},{"$ref":"#/components/parameters/ItemId"}],"delete":{"operationId":"deleteTrackById","summary":"Delete one track","description":"Deletes the track with this id. Answers 404 when there is none in this event.","tags":["Tracks"],"responses":{"200":{"description":"Deleted.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/sponsor-tiers":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listSponsorTiers","summary":"List sponsor tiers","description":"The event's sponsor tiers.","tags":["Sponsors"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SponsorTier"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertSponsorTiers","summary":"Add or update sponsor tiers","description":"Adds or updates up to 500 sponsor tiers at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that tier. Without an id, a tier with the same name is updated, otherwise a new one is added. Fields Shoal doesn't know are refused.","tags":["Sponsors"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tiers"],"additionalProperties":false,"properties":{"tiers":{"type":"array","items":{"$ref":"#/components/schemas/SponsorTierInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","tiers"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"tiers":{"type":"array","items":{"$ref":"#/components/schemas/SponsorTier"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"delete":{"operationId":"deleteSponsorTiers","summary":"Delete sponsor tiers","description":"Deletes tiers by id or name. Their sponsors stay, without a tier.","tags":["Sponsors"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tiers"],"additionalProperties":false,"properties":{"tiers":{"$ref":"#/components/schemas/DeleteRequest","description":"Items to delete. Each is an id or a name (a string), or an object like {\"id\": ...} or {\"name\": ...}."}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/sponsor-tiers/{itemId}":{"parameters":[{"$ref":"#/components/parameters/EventId"},{"$ref":"#/components/parameters/ItemId"}],"delete":{"operationId":"deleteSponsorTierById","summary":"Delete one sponsor tier","description":"Deletes the sponsor tier with this id. Answers 404 when there is none in this event.","tags":["Sponsors"],"responses":{"200":{"description":"Deleted.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/sponsors":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listSponsors","summary":"List sponsors","description":"The event's sponsors, ordered by tier then position.","tags":["Sponsors"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Sponsor"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertSponsors","summary":"Add or update sponsors","description":"Adds or updates up to 500 sponsors at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that sponsor. Without an id, a sponsor with the same name is updated, otherwise a new one is added. Add tiers first. Logos can't be uploaded through the API. Fields Shoal doesn't know are refused.","tags":["Sponsors"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sponsors"],"additionalProperties":false,"properties":{"sponsors":{"type":"array","items":{"$ref":"#/components/schemas/SponsorInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","sponsors"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"sponsors":{"type":"array","items":{"$ref":"#/components/schemas/Sponsor"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"delete":{"operationId":"deleteSponsors","summary":"Delete sponsors","description":"Deletes sponsors by id or name. The sponsor also leaves any sessions it presented and the splash screen, and its logo file is deleted.","tags":["Sponsors"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sponsors"],"additionalProperties":false,"properties":{"sponsors":{"$ref":"#/components/schemas/DeleteRequest","description":"Items to delete. Each is an id or a name (a string), or an object like {\"id\": ...} or {\"name\": ...}."}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/sponsors/{itemId}":{"parameters":[{"$ref":"#/components/parameters/EventId"},{"$ref":"#/components/parameters/ItemId"}],"delete":{"operationId":"deleteSponsorById","summary":"Delete one sponsor","description":"Deletes the sponsor with this id. Answers 404 when there is none in this event. Its logo file is deleted too.","tags":["Sponsors"],"responses":{"200":{"description":"Deleted.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/notifications":{"parameters":[{"$ref":"#/components/parameters/EventId"}],"get":{"operationId":"listNotifications","summary":"List notifications","description":"The notifications attendees see in the app, newest first, scheduled ones included.","tags":["Notifications"],"parameters":[],"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"post":{"operationId":"upsertNotifications","summary":"Add or update notifications","description":"Adds or updates up to 500 notifications at a time. All or nothing: if any item is wrong, nothing is saved. A row with id updates that notification. Without an id it is always added as new and needs name and message. Notifications appear in the attendee app and go to phones that turned notifications on. Nothing is emailed. Fields Shoal doesn't know are refused.","tags":["Notifications"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["notifications"],"additionalProperties":false,"properties":{"notifications":{"type":"array","items":{"$ref":"#/components/schemas/NotificationInput"},"maxItems":500}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["created","updated","notifications"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."},"notifications":{"type":"array","items":{"$ref":"#/components/schemas/Notification"},"description":"Every item you sent, as saved."}}}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}},"delete":{"operationId":"deleteNotifications","summary":"Delete notifications","description":"Deletes notifications by id only, because names can repeat. A deleted notification that was already sent disappears from the app.","tags":["Notifications"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["notifications"],"additionalProperties":false,"properties":{"notifications":{"$ref":"#/components/schemas/DeleteRequest","description":"Items to delete. Each is an id (a string), or an object like {\"id\": ...}."}}}}}},"responses":{"200":{"description":"Success.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}},"/events/{id}/notifications/{itemId}":{"parameters":[{"$ref":"#/components/parameters/EventId"},{"$ref":"#/components/parameters/ItemId"}],"delete":{"operationId":"deleteNotificationById","summary":"Delete one notification","description":"Deletes the notification with this id. Answers 404 when there is none in this event.","tags":["Notifications"],"responses":{"200":{"description":"Deleted.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"400":{"description":"Something in the request needs fixing. In a batch the message names the row, like \"Speaker 3: ...\". Nothing was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"The API key is missing, wrong or deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"404":{"description":"There is no such event (or item) in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"description":"Too many requests. Wait for Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Something went wrong on Shoal's side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}}}}}},"webhooks":{"attendee.registered":{"post":{"operationId":"webhook_attendee_registered","summary":"attendee.registered","description":"Someone became registered for the event.\n\nShoal sends this to the webhook URL you set up. Answer with any 2xx status within 10 seconds. Otherwise Shoal tries again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours (7 tries in all). The same delivery can arrive more than once: use the `id` to skip repeats.\n\nTo check a delivery came from Shoal, compute the hex HMAC-SHA256 of `<t>.<raw body>` with your webhook's signing secret, where t is the number from the Shoal-Signature header, and compare it with v1.","tags":["Webhooks"],"parameters":[{"name":"Shoal-Event","in":"header","required":true,"description":"The event type.","schema":{"type":"string","const":"attendee.registered"}},{"name":"Shoal-Delivery","in":"header","required":true,"description":"The delivery id. Same as `id` in the body.","schema":{"type":"string","format":"uuid"}},{"name":"Shoal-Signature","in":"header","required":true,"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of `<t>.<raw body>` using the webhook's signing secret>.","schema":{"type":"string"},"example":"t=1767225600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd"},{"name":"User-Agent","in":"header","required":true,"description":"Always Shoal-Webhooks/1.0.","schema":{"type":"string","const":"Shoal-Webhooks/1.0"}},{"name":"Content-Type","in":"header","required":true,"description":"Always application/json.","schema":{"type":"string","const":"application/json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayload"}}}},"responses":{"2XX":{"description":"Received. Any 2xx status within 10 seconds counts as delivered. Anything else is retried."}}}},"attendee.waitlisted":{"post":{"operationId":"webhook_attendee_waitlisted","summary":"attendee.waitlisted","description":"Someone joined the waitlist.\n\nShoal sends this to the webhook URL you set up. Answer with any 2xx status within 10 seconds. Otherwise Shoal tries again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours (7 tries in all). The same delivery can arrive more than once: use the `id` to skip repeats.\n\nTo check a delivery came from Shoal, compute the hex HMAC-SHA256 of `<t>.<raw body>` with your webhook's signing secret, where t is the number from the Shoal-Signature header, and compare it with v1.","tags":["Webhooks"],"parameters":[{"name":"Shoal-Event","in":"header","required":true,"description":"The event type.","schema":{"type":"string","const":"attendee.waitlisted"}},{"name":"Shoal-Delivery","in":"header","required":true,"description":"The delivery id. Same as `id` in the body.","schema":{"type":"string","format":"uuid"}},{"name":"Shoal-Signature","in":"header","required":true,"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of `<t>.<raw body>` using the webhook's signing secret>.","schema":{"type":"string"},"example":"t=1767225600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd"},{"name":"User-Agent","in":"header","required":true,"description":"Always Shoal-Webhooks/1.0.","schema":{"type":"string","const":"Shoal-Webhooks/1.0"}},{"name":"Content-Type","in":"header","required":true,"description":"Always application/json.","schema":{"type":"string","const":"application/json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayload"}}}},"responses":{"2XX":{"description":"Received. Any 2xx status within 10 seconds counts as delivered. Anything else is retried."}}}},"attendee.cancelled":{"post":{"operationId":"webhook_attendee_cancelled","summary":"attendee.cancelled","description":"A registration or waitlist spot was cancelled.\n\nShoal sends this to the webhook URL you set up. Answer with any 2xx status within 10 seconds. Otherwise Shoal tries again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours (7 tries in all). The same delivery can arrive more than once: use the `id` to skip repeats.\n\nTo check a delivery came from Shoal, compute the hex HMAC-SHA256 of `<t>.<raw body>` with your webhook's signing secret, where t is the number from the Shoal-Signature header, and compare it with v1.","tags":["Webhooks"],"parameters":[{"name":"Shoal-Event","in":"header","required":true,"description":"The event type.","schema":{"type":"string","const":"attendee.cancelled"}},{"name":"Shoal-Delivery","in":"header","required":true,"description":"The delivery id. Same as `id` in the body.","schema":{"type":"string","format":"uuid"}},{"name":"Shoal-Signature","in":"header","required":true,"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of `<t>.<raw body>` using the webhook's signing secret>.","schema":{"type":"string"},"example":"t=1767225600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd"},{"name":"User-Agent","in":"header","required":true,"description":"Always Shoal-Webhooks/1.0.","schema":{"type":"string","const":"Shoal-Webhooks/1.0"}},{"name":"Content-Type","in":"header","required":true,"description":"Always application/json.","schema":{"type":"string","const":"application/json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayload"}}}},"responses":{"2XX":{"description":"Received. Any 2xx status within 10 seconds counts as delivered. Anything else is retried."}}}},"attendee.checked_in":{"post":{"operationId":"webhook_attendee_checked_in","summary":"attendee.checked_in","description":"Someone was checked in at the event.\n\nShoal sends this to the webhook URL you set up. Answer with any 2xx status within 10 seconds. Otherwise Shoal tries again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours (7 tries in all). The same delivery can arrive more than once: use the `id` to skip repeats.\n\nTo check a delivery came from Shoal, compute the hex HMAC-SHA256 of `<t>.<raw body>` with your webhook's signing secret, where t is the number from the Shoal-Signature header, and compare it with v1.","tags":["Webhooks"],"parameters":[{"name":"Shoal-Event","in":"header","required":true,"description":"The event type.","schema":{"type":"string","const":"attendee.checked_in"}},{"name":"Shoal-Delivery","in":"header","required":true,"description":"The delivery id. Same as `id` in the body.","schema":{"type":"string","format":"uuid"}},{"name":"Shoal-Signature","in":"header","required":true,"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of `<t>.<raw body>` using the webhook's signing secret>.","schema":{"type":"string"},"example":"t=1767225600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd"},{"name":"User-Agent","in":"header","required":true,"description":"Always Shoal-Webhooks/1.0.","schema":{"type":"string","const":"Shoal-Webhooks/1.0"}},{"name":"Content-Type","in":"header","required":true,"description":"Always application/json.","schema":{"type":"string","const":"application/json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayload"}}}},"responses":{"2XX":{"description":"Received. Any 2xx status within 10 seconds counts as delivered. Anything else is retried."}}}},"ping":{"post":{"operationId":"webhook_ping","summary":"ping","description":"A test sent from Send Test on the API page, with a sample event and attendee.\n\nShoal sends this to the webhook URL you set up. Answer with any 2xx status within 10 seconds. Otherwise Shoal tries again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours (7 tries in all). The same delivery can arrive more than once: use the `id` to skip repeats.\n\nTo check a delivery came from Shoal, compute the hex HMAC-SHA256 of `<t>.<raw body>` with your webhook's signing secret, where t is the number from the Shoal-Signature header, and compare it with v1.","tags":["Webhooks"],"parameters":[{"name":"Shoal-Event","in":"header","required":true,"description":"The event type.","schema":{"type":"string","const":"ping"}},{"name":"Shoal-Delivery","in":"header","required":true,"description":"The delivery id. Same as `id` in the body.","schema":{"type":"string","format":"uuid"}},{"name":"Shoal-Signature","in":"header","required":true,"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of `<t>.<raw body>` using the webhook's signing secret>.","schema":{"type":"string"},"example":"t=1767225600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd"},{"name":"User-Agent","in":"header","required":true,"description":"Always Shoal-Webhooks/1.0.","schema":{"type":"string","const":"Shoal-Webhooks/1.0"}},{"name":"Content-Type","in":"header","required":true,"description":"Always application/json.","schema":{"type":"string","const":"application/json"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayload"}}}},"responses":{"2XX":{"description":"Received. Any 2xx status within 10 seconds counts as delivered. Anything else is retried."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key from your organization's API page in the dashboard, sent as `Authorization: Bearer <key>`."}},"parameters":{"EventId":{"name":"id","in":"path","required":true,"description":"The event's id.","schema":{"type":"string","format":"uuid"}},"ItemId":{"name":"itemId","in":"path","required":true,"description":"The id of the item to delete.","schema":{"type":"string","format":"uuid"}}},"headers":{"X-RateLimit-Limit":{"description":"How many requests each key can make per minute.","schema":{"type":"integer","const":300}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the minute window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before trying again (sent with 429).","schema":{"type":"integer"}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"What went wrong, in plain English."}}},"UpsertResult":{"type":"object","description":"What every add-or-update answers with. The list is named after the thing, such as `tracks`.","required":["created","updated"],"properties":{"created":{"type":"integer","description":"How many were added."},"updated":{"type":"integer","description":"How many already existed and were updated."}},"additionalProperties":{"type":"array","items":{}}},"DeleteRequest":{"type":"array","items":{"oneOf":[{"type":"string","description":"An id, or a name (or an email for attendees)."},{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"The item's id.","format":"uuid"}}},{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"The item's name."}}},{"type":"object","required":["email"],"additionalProperties":false,"properties":{"email":{"type":"string","description":"An attendee's email."}}}]},"description":"The things to delete."},"DeleteResult":{"type":"object","required":["deleted","not_found"],"properties":{"deleted":{"type":"integer","description":"How many were deleted."},"not_found":{"type":"array","items":{},"description":"The items you sent that weren't there. A delete never fails just because something was already gone."}}},"EventSummary":{"type":"object","description":"An event as shown in the list.","required":["id","name","slug","status"],"properties":{"id":{"type":"string","description":"The event's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"The event's name.","maxLength":120},"slug":{"type":"string","description":"The web address of the event page. Made from the name when left out. Lower case letters, numbers and dashes, up to 60 characters.","maxLength":60},"status":{"type":"string","enum":["draft","published","archived"],"description":"New events are drafts unless you send a status."},"visibility":{"type":"string","enum":["private","unlisted","public"],"description":"Who can find the event page. New events are private. Only public events are listed and indexed."},"starts_at":{"type":["string","null"],"description":"When the event starts. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"ends_at":{"type":["string","null"],"description":"When the event ends. Needs starts_at, and must be after it. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"timezone":{"type":"string","description":"A time zone name like America/Chicago.","maxLength":64,"examples":["America/Chicago"]},"registration_type":{"type":"string","enum":["free","paid"],"description":"Free registration or paid tickets."},"capacity":{"type":["integer","null"],"description":"Most people who can register. Empty means no limit.","minimum":1,"maximum":1000000},"registered":{"type":"integer","description":"How many people are registered.","readOnly":true}}},"EventInput":{"type":"object","description":"Fields to create or change an event. Only name is required to create one.","additionalProperties":false,"properties":{"name":{"type":"string","description":"The event's name.","maxLength":120},"slug":{"type":"string","description":"The web address of the event page. Made from the name when left out. Lower case letters, numbers and dashes, up to 60 characters.","maxLength":60},"starts_at":{"type":["string","null"],"description":"When the event starts. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"ends_at":{"type":["string","null"],"description":"When the event ends. Needs starts_at, and must be after it. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"timezone":{"type":"string","description":"A time zone name like America/Chicago.","maxLength":64,"examples":["America/Chicago"]},"venue_name":{"type":["string","null"],"description":"Name of the venue.","maxLength":200},"venue_address":{"type":["string","null"],"description":"Street address. Changing it clears the saved map pin.","maxLength":300},"visibility":{"type":"string","enum":["private","unlisted","public"],"description":"Who can find the event page. New events are private. Only public events are listed and indexed."},"registration_type":{"type":"string","enum":["free","paid"],"description":"Free registration or paid tickets."},"session_mode":{"type":"string","enum":["pick","assigned"],"description":"pick: attendees choose their sessions. assigned: organizers put people in tracks."},"capacity":{"type":["integer","null"],"description":"Most people who can register. Empty means no limit.","minimum":1,"maximum":1000000},"waitlist_enabled":{"type":"boolean","description":"Whether people join a waitlist when the event is full."},"reminders_enabled":{"type":"boolean","description":"Whether automatic reminder emails are on."},"status":{"type":"string","enum":["draft","published","archived"],"description":"New events are drafts unless you send a status."}}},"Event":{"type":"object","description":"One event.","required":["id","name","slug","status"],"properties":{"id":{"type":"string","description":"The event's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"The event's name.","maxLength":120},"slug":{"type":"string","description":"The web address of the event page. Made from the name when left out. Lower case letters, numbers and dashes, up to 60 characters.","maxLength":60},"starts_at":{"type":["string","null"],"description":"When the event starts. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"ends_at":{"type":["string","null"],"description":"When the event ends. Needs starts_at, and must be after it. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"timezone":{"type":"string","description":"A time zone name like America/Chicago.","maxLength":64,"examples":["America/Chicago"]},"venue_name":{"type":["string","null"],"description":"Name of the venue.","maxLength":200},"venue_address":{"type":["string","null"],"description":"Street address. Changing it clears the saved map pin.","maxLength":300},"visibility":{"type":"string","enum":["private","unlisted","public"],"description":"Who can find the event page. New events are private. Only public events are listed and indexed."},"registration_type":{"type":"string","enum":["free","paid"],"description":"Free registration or paid tickets."},"session_mode":{"type":"string","enum":["pick","assigned"],"description":"pick: attendees choose their sessions. assigned: organizers put people in tracks."},"capacity":{"type":["integer","null"],"description":"Most people who can register. Empty means no limit.","minimum":1,"maximum":1000000},"waitlist_enabled":{"type":"boolean","description":"Whether people join a waitlist when the event is full."},"reminders_enabled":{"type":"boolean","description":"Whether automatic reminder emails are on."},"status":{"type":"string","enum":["draft","published","archived"],"description":"New events are drafts unless you send a status."},"questions":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"The question as attendees see it."},"kind":{"type":"string","enum":["text","long_text","choice","checkbox"]},"options":{"type":["array","null"],"items":{"type":"string","description":"A choice."},"description":"Choices, for choice questions."},"required":{"type":"boolean","description":"Whether an answer is required."},"team_only":{"type":"boolean","description":"Whether only the team sees it."}}},"readOnly":true,"description":"The registration questions, in order."},"tracks":{"type":"array","items":{"type":"string","description":"A track's name."},"readOnly":true},"ticket_types":{"type":"array","items":{"type":"string","description":"A ticket type's name."},"readOnly":true}}},"Attendee":{"type":"object","description":"A person on an event, as the API returns them.","required":["id","email","status"],"properties":{"id":{"type":"string","description":"The attendee's id.","format":"uuid","readOnly":true},"email":{"type":"string","description":"Email address, in lower case."},"first_name":{"type":["string","null"],"description":"First name.","maxLength":100},"last_name":{"type":["string","null"],"description":"Last name.","maxLength":100},"job_title":{"type":["string","null"],"description":"Job title.","maxLength":150},"company":{"type":["string","null"],"description":"Company.","maxLength":150},"status":{"type":"string","enum":["invited","pending","registered","waitlisted","cancelled"]},"registered_at":{"type":["string","null"],"description":"When they registered.","format":"date-time","readOnly":true},"checked_in_at":{"type":["string","null"],"description":"When they were checked in.","format":"date-time","readOnly":true},"table":{"type":["string","null"],"description":"Table label.","maxLength":50},"seat":{"type":["string","null"],"description":"Seat label.","maxLength":20},"track":{"type":["string","null"],"description":"The name of their track."},"ticket_type":{"type":["string","null"],"description":"The name of the ticket type they bought.","readOnly":true},"ticket_url":{"type":"string","description":"Link to their ticket and the attendee app.","format":"uri","readOnly":true},"answers":{"type":"object","description":"Registration answers, keyed by the question's label.","additionalProperties":{"type":"string"}},"created_at":{"type":"string","description":"When the person was added.","format":"date-time","readOnly":true}}},"AttendeeInput":{"type":"object","description":"A person to add or update, matched by email.","required":["email"],"additionalProperties":false,"properties":{"email":{"type":"string","description":"Email address. Used to match existing people."},"first_name":{"type":["string","null"],"description":"First name.","maxLength":100},"last_name":{"type":["string","null"],"description":"Last name.","maxLength":100},"job_title":{"type":["string","null"],"description":"Job title.","maxLength":150},"company":{"type":["string","null"],"description":"Company.","maxLength":150},"status":{"type":"string","enum":["invited","registered","cancelled"],"description":"New people are invited unless you say otherwise. Waitlisted can't be set here."},"table":{"type":["string","null"],"description":"Table label.","maxLength":50},"seat":{"type":["string","null"],"description":"Seat label.","maxLength":20},"track":{"type":["string","null"],"description":"A track's name. It must already exist."},"answers":{"type":"object","description":"Answers keyed by the question's label, like {\"Dietary Needs\": \"Vegetarian\"}. Tick boxes take Yes or No. An empty value clears an answer. Text and choice answers are up to 500 characters.","additionalProperties":{"type":"string"}}}},"Speaker":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"The speaker's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"Name.","maxLength":120},"headline":{"type":["string","null"],"description":"A short line under the name.","maxLength":160},"bio":{"type":["string","null"],"description":"Biography.","maxLength":2000},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000},"photo_url":{"type":["string","null"],"description":"Link to their photo.","readOnly":true}}},"SpeakerInput":{"type":"object","required":[],"additionalProperties":false,"description":"name is required for a new speaker.","properties":{"id":{"type":"string","description":"Include to update a specific speaker.","format":"uuid"},"name":{"type":"string","description":"Name.","maxLength":120},"headline":{"type":["string","null"],"description":"A short line under the name.","maxLength":160},"bio":{"type":["string","null"],"description":"Biography.","maxLength":2000},"position":{"type":"integer","description":"Order in lists. New speakers go to the end.","minimum":0,"maximum":100000}}},"Session":{"type":"object","required":["id","title","starts_at","ends_at"],"properties":{"id":{"type":"string","description":"The session's id.","format":"uuid","readOnly":true},"title":{"type":"string","description":"Title.","maxLength":200},"description":{"type":["string","null"],"description":"Description.","maxLength":4000},"room":{"type":["string","null"],"description":"The location's name.","maxLength":120},"starts_at":{"type":"string","description":"Start time (UTC).","format":"date-time"},"ends_at":{"type":"string","description":"End time (UTC).","format":"date-time"},"capacity":{"type":["integer","null"],"description":"Seats.","minimum":1,"maximum":100000},"tracks":{"type":"array","items":{"type":"string","description":"A track's name."}},"speakers":{"type":"array","items":{"type":"string","description":"A speaker's name."}},"taken":{"type":"integer","description":"How many seats are taken.","readOnly":true}}},"SessionInput":{"type":"object","additionalProperties":false,"description":"title, starts_at and ends_at are required for a new session.","properties":{"id":{"type":"string","description":"Include to update a specific session.","format":"uuid"},"title":{"type":"string","description":"Title.","maxLength":200},"description":{"type":["string","null"],"description":"Description.","maxLength":4000},"room":{"type":["string","null"],"description":"The location's name. A new name is added to the event's Locations.","maxLength":120},"starts_at":{"type":"string","description":"Start time. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time","examples":["2026-11-20T09:00"]},"ends_at":{"type":"string","description":"End time. Must be after the start. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"capacity":{"type":["integer","null"],"description":"Seats.","minimum":1,"maximum":100000},"tracks":{"type":"array","items":{"type":"string","description":"A track's name."},"description":"Replaces the session's tracks. Every name must already exist."},"speakers":{"type":"array","items":{"type":"string","description":"A speaker's name."},"description":"Replaces the session's speakers. Every name must already exist."}}},"AudienceRule":{"type":"object","required":["field","op","value"],"additionalProperties":false,"properties":{"field":{"type":"string","description":"What to look at: job_title, company, email, table, track, ticket_type, session, attended_session, checked_in, or question:<question label>. Name tracks, ticket types and sessions by name or title.","examples":["track","question:Dietary Needs"]},"op":{"type":"string","enum":["is","is_not","contains","is_empty","is_not_empty"],"description":"How to compare. track and ticket_type take is, is_not, is_empty and is_not_empty. session (picked it) and attended_session (checked in to it) take is or is_not. checked_in takes is with yes or no."},"value":{"type":"string","description":"What to compare with. Leave empty for is_empty and is_not_empty."}}},"Audience":{"type":"object","required":["id","name","kind","match","rules"],"properties":{"id":{"type":"string","description":"The audience's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"Name.","maxLength":80},"kind":{"type":"string","enum":["rules","list"],"description":"rules finds people by rules; list is a hand-picked list of people."},"description":{"type":"string","description":"A note about who it is for.","maxLength":300},"match":{"type":"string","enum":["all","any"],"description":"Whether a person must pass all rules or any rule."},"rules":{"type":"array","items":{"$ref":"#/components/schemas/AudienceRule"}},"members":{"type":"integer","description":"How many registered people are in it right now.","readOnly":true},"listed":{"type":"integer","description":"For a list audience, how many people are on the list, whatever their status.","readOnly":true}}},"AudienceMember":{"type":"object","properties":{"audience_id":{"type":"string","description":"The list audience's id.","format":"uuid"},"audience":{"type":"string","description":"The list audience's name."},"attendee_id":{"type":"string","description":"The attendee's id.","format":"uuid"},"email":{"type":"string","description":"The attendee's email."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"status":{"type":"string","description":"The attendee's status, like registered or invited."},"added_at":{"type":"string","description":"When they were put on the list.","format":"date-time"}}},"AudienceMemberInput":{"type":"object","additionalProperties":false,"description":"Name the audience with audience (name) or audience_id, and the person with email or attendee_id.","properties":{"audience":{"type":"string","description":"A list audience's name."},"audience_id":{"type":"string","description":"A list audience's id.","format":"uuid"},"email":{"type":"string","description":"An attendee's email. They must already be on the event's list."},"attendee_id":{"type":"string","description":"An attendee's id.","format":"uuid"}},"examples":[{"audience":"VIP Guests","email":"pat@example.com"}]},"AudienceInput":{"type":"object","additionalProperties":false,"description":"name is required for a new audience. A list audience (kind list) has no rules: add its people with /events/{id}/audience-members.","properties":{"id":{"type":"string","description":"Include to update a specific audience.","format":"uuid"},"name":{"type":"string","description":"Name.","maxLength":80},"kind":{"type":"string","enum":["rules","list"],"description":"New audiences use rules. Sending rules with kind list is refused."},"description":{"type":"string","description":"A note about who it is for.","maxLength":300},"match":{"type":"string","enum":["all","any"],"description":"New audiences use all."},"rules":{"type":"array","items":{"$ref":"#/components/schemas/AudienceRule"}}}},"Page":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"The page's id.","format":"uuid","readOnly":true},"title":{"type":"string","description":"Title.","maxLength":60},"body":{"type":"string","description":"The page text, in light Markdown.","maxLength":20000},"published":{"type":"boolean","description":"Whether attendees can see it."},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000},"icon":{"type":["string","null"],"description":"Icon name.","enum":["info","wifi","car","hotel","food","map","calendar","shirt","shield","phone","help","plane","star","heart"]},"audience":{"type":["string","null"],"description":"An audience's name, or null for everyone."},"show_from":{"type":["string","null"],"description":"Show from this time (UTC).","format":"date-time"},"show_until":{"type":["string","null"],"description":"Hide after this time (UTC).","format":"date-time"},"own_tab":{"type":"boolean","description":"Whether the page gets its own tab in the app."},"pin_home":{"type":"boolean","description":"Whether the page is pinned to the app's home."},"on_event_page":{"type":"boolean","description":"Whether the page shows on the public event page."},"image_path":{"type":["string","null"],"description":"The cover image. Set in the dashboard.","readOnly":true}}},"PageInput":{"type":"object","additionalProperties":false,"description":"title is required for a new page.","properties":{"id":{"type":"string","description":"Include to update a specific page.","format":"uuid"},"title":{"type":"string","description":"Title.","maxLength":60},"body":{"type":"string","description":"The page text, in light Markdown.","maxLength":20000},"published":{"type":"boolean","description":"Whether attendees can see it."},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000},"icon":{"type":["string","null"],"description":"Icon name.","enum":["info","wifi","car","hotel","food","map","calendar","shirt","shield","phone","help","plane","star","heart"]},"audience":{"type":["string","null"],"description":"An audience's name. Null or empty means everyone.","maxLength":120},"show_from":{"type":["string","null"],"description":"Show from this time. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"show_until":{"type":["string","null"],"description":"Hide after this time. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC.","format":"date-time"},"own_tab":{"type":"boolean","description":"Whether the page gets its own tab in the app."},"pin_home":{"type":"boolean","description":"Whether the page is pinned to the app's home."},"on_event_page":{"type":"boolean","description":"Whether the page shows on the public event page."}}},"Track":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"The track's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"Name.","maxLength":80},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000},"sessions":{"type":"array","items":{"type":"string","description":"A session's title."},"readOnly":true},"attendees":{"type":"integer","description":"People in the track who aren't cancelled.","readOnly":true}}},"TrackInput":{"type":"object","additionalProperties":false,"description":"name is required for a new track.","properties":{"id":{"type":"string","description":"Include to update a specific track.","format":"uuid"},"name":{"type":"string","description":"Name. Unique in the event.","maxLength":80},"position":{"type":"integer","description":"Order in lists. New tracks go to the end.","minimum":0,"maximum":100000}}},"SponsorTier":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"The tier's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"Name.","maxLength":40},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000},"logo_size":{"type":"string","enum":["large","medium","small"]},"placements":{"type":"array","items":{"$ref":"#/components/schemas/SponsorPlacement"}},"sponsors":{"type":"integer","description":"How many sponsors are in the tier.","readOnly":true}}},"SponsorPlacement":{"type":"string","enum":["event_page","app_home","app_sponsors","app_schedule"],"description":"Where a tier shows: event_page (the event page), app_home (\"Thanks to Our Sponsors\" on the app's Ticket tab), app_sponsors (the Sponsors tab) and app_schedule (\"Presented By\" above the Schedule)."},"SponsorTierInput":{"type":"object","additionalProperties":false,"description":"name is required for a new tier.","properties":{"id":{"type":"string","description":"Include to update a specific tier.","format":"uuid"},"name":{"type":"string","description":"Name. Unique in the event.","maxLength":40},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000},"logo_size":{"type":"string","enum":["large","medium","small"],"description":"Medium if left out."},"placements":{"type":"array","items":{"$ref":"#/components/schemas/SponsorPlacement"},"description":"Defaults to event_page and app_sponsors. An empty list hides the tier."}}},"Sponsor":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"The sponsor's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"Name.","maxLength":100},"tier":{"type":["string","null"],"description":"The tier's name, or null."},"description":{"type":["string","null"],"description":"Description.","maxLength":500},"website":{"type":["string","null"],"description":"Website (https).","maxLength":500},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000},"logo_url":{"type":["string","null"],"description":"Link to the logo. Upload logos in the dashboard.","readOnly":true}}},"SponsorInput":{"type":"object","additionalProperties":false,"description":"name is required for a new sponsor.","properties":{"id":{"type":"string","description":"Include to update a specific sponsor.","format":"uuid"},"name":{"type":"string","description":"Name.","maxLength":100},"tier":{"type":["string","null"],"description":"A tier's name. The tier must already exist. Null removes the tier.","maxLength":40},"description":{"type":["string","null"],"description":"Description.","maxLength":500},"website":{"type":["string","null"],"description":"Website. Only https; \"example.com\" becomes https://example.com.","maxLength":500},"position":{"type":"integer","description":"Order in lists.","minimum":0,"maximum":100000}}},"Notification":{"type":"object","required":["id","name","message","status"],"properties":{"id":{"type":"string","description":"The notification's id.","format":"uuid","readOnly":true},"name":{"type":"string","description":"Name.","maxLength":80},"message":{"type":"string","description":"The message attendees read.","maxLength":500},"status":{"type":"string","enum":["sent","scheduled"],"readOnly":true},"send_at":{"type":"string","description":"When it was or will be sent (UTC).","format":"date-time"},"audience":{"type":["string","null"],"description":"An audience's name, or null for everyone registered."},"link_tab":{"$ref":"#/components/schemas/NotificationTab","type":[null,"null"]},"link_page":{"type":["string","null"],"description":"The title of the page it links to."},"created_at":{"type":"string","description":"When it was created.","format":"date-time","readOnly":true}}},"NotificationTab":{"type":"string","enum":["ticket","schedule","discussions","game","info","venue","seating","sponsors","profile"],"description":"An app tab a notification can open."},"NotificationInput":{"type":"object","additionalProperties":false,"description":"name and message are required for a new notification.","properties":{"id":{"type":"string","description":"Include to update a specific notification.","format":"uuid"},"name":{"type":"string","description":"Name.","maxLength":80},"message":{"type":"string","description":"The message attendees read.","maxLength":500},"send_at":{"type":["string","null"],"description":"Left out, null or \"now\" sends right away. A date and time schedules it and must not be in the past. Once sent, it can't change. Without an offset, the time is the event's local time. Add an offset like -06:00, or Z, for an exact time. Answers are always in UTC."},"audience":{"type":["string","null"],"description":"An audience's name, or null for everyone registered.","maxLength":80},"link_tab":{"$ref":"#/components/schemas/NotificationTab","type":[null,"null"]},"link_page":{"type":["string","null"],"description":"A custom page's title or id. Send link_tab or link_page, not both.","maxLength":120}}},"WebhookPayload":{"type":"object","required":["id","type","created_at","event","attendee"],"properties":{"id":{"type":"string","description":"The delivery id. The same delivery can arrive more than once: use this to skip repeats.","format":"uuid"},"type":{"type":"string","enum":["attendee.registered","attendee.waitlisted","attendee.cancelled","attendee.checked_in","ping"]},"created_at":{"type":"string","description":"When the delivery was created.","format":"date-time"},"event":{"type":"object","required":["id","name","slug"],"properties":{"id":{"type":"string","description":"The event's id.","format":"uuid"},"name":{"type":"string","description":"The event's name."},"slug":{"type":"string","description":"The event's web address."}}},"attendee":{"$ref":"#/components/schemas/Attendee"}}}}}}