{"openapi":"3.1.0","info":{"title":"Turnout Agent API","version":"v1","summary":"Read-only event discovery, public organizer profiles and organization analytics.","description":"Turnout exposes its public event catalogue and its first-party analytics through one\nREST interface intended for AI agents. Public operations need no credential; every\norganization operation requires a credential whose tenant is fixed at issuance, so an\nagent can never widen its own access by changing a URL.\n\nData licence: Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0.\n\nStage distinction is part of the contract: a catalogue result is not an impression, an\nimpression is not a click, a click is not a registration, and a registration is not a\nverified attendance."},"servers":[{"url":"https://turnout.teraai.cc"}],"security":[],"tags":[{"name":"events","description":"Public events: organizers' own published events on Turnout, plus the imported openly licensed catalogue."},{"name":"organizers","description":"Public organizer profiles derived from the catalogue."},{"name":"organizations","description":"Authorized, tenant-scoped organization analytics."}],"paths":{"/api/agent/v1/events":{"get":{"operationId":"search_events","tags":["events"],"summary":"Search public events (Turnout's own published events first, then the imported catalogue)","description":"Returns events from two sources in one list, each tagged with `origin`. Own events (origin `turnout`) come first. Draft, cancelled, private and fixture events are never returned. `category`, `neighbourhood` and `free` are catalogue fields: they cannot be applied to own events, and the response says so in `meta.notices` instead of silently returning an inconsistent page.","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":120}},{"name":"city","in":"query","schema":{"type":"string"},"description":"A city name (catalogue), or `unknown`."},{"name":"category","in":"query","schema":{"type":"string"},"description":"Catalogue only."},{"name":"neighbourhood","in":"query","schema":{"type":"string"},"description":"Catalogue only."},{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date"}},{"name":"mode","in":"query","schema":{"type":"string","enum":["in_person","online"]}},{"name":"free","in":"query","schema":{"type":"boolean"},"description":"Catalogue only."},{"name":"sort","in":"query","schema":{"type":"string","enum":["soonest","latest"]}},{"name":"source","in":"query","schema":{"type":"string","enum":["both","turnout","catalogue"],"default":"both"},"description":"Which source to search. `turnout` = only events organizers published on Turnout; `catalogue` = only the imported catalogue."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Matching events, own events first","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","slug","title","venue","schedule","links","provenance"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"category":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["turnout","discover"],"description":"\"turnout\" = an event an organizer published on Turnout (primary source, searched first, live from Turnout’s own database). \"discover\" = a row imported from the third-party catalogue."},"venue":{"type":"object","properties":{"name":{"type":["string","null"]},"address":{"type":["string","null"]},"neighbourhood":{"type":["string","null"]},"city":{"type":["string","null"],"description":"null means not established, never a default."},"region":{"type":["string","null"]},"country":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"citySource":{"type":"string","enum":["source","coordinates","none"]}}},"mode":{"type":"string","enum":["in_person","online","hybrid","unknown"]},"price":{"type":"object","properties":{"known":{"type":"boolean"},"kind":{"type":"string","enum":["FREE","PAID","VARIABLE","UNKNOWN"]},"currency":{"type":["string","null"]},"minMinorUnits":{"type":["integer","null"],"description":"Exact price in cents. $28.88 is 2888."},"maxMinorUnits":{"type":["integer","null"]}}},"schedule":{"type":"object","required":["occurrenceId","timezone","startTimeKnown","status"],"properties":{"occurrenceId":{"type":"string","format":"uuid"},"startAtUtc":{"type":["string","null"],"format":"date-time"},"endAtUtc":{"type":["string","null"],"format":"date-time"},"timezone":{"type":"string","description":"IANA zone of the occurrence."},"localDate":{"type":["string","null"]},"startTimeKnown":{"type":"boolean"},"status":{"type":"string","enum":["UPCOMING","ONGOING","COMPLETED","CANCELLED","POSTPONED","SOLD_OUT","UNVERIFIED","STALE"]},"freshnessStatus":{"type":"string"},"lastVerifiedAt":{"type":"string","format":"date-time"}}},"links":{"type":"object","properties":{"primary":{"type":"object","properties":{"url":{"type":["string","null"]},"kind":{"type":"string"}}},"all":{"type":"array","items":{"type":"object","required":["kind","url","status"],"properties":{"kind":{"type":"string","enum":["ticket","registration","organizer","source"]},"url":{"type":"string","format":"uri"},"status":{"type":"string","description":"unverified | reachable | broken | blocked | skipped"}}}}}},"provenance":{"type":"object","properties":{"sourceId":{"type":"string"},"sourceName":{"type":["string","null"]},"licenseId":{"type":["string","null"]},"attribution":{"type":["string","null"]},"sponsored":{"type":"boolean","const":false,"description":"Catalogue rows are never sponsored."}}}}}},"meta":{"type":"object","properties":{"apiVersion":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"},"attribution":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"license":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"notices":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Rate limited","headers":{"retry-after":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}}}}},"/api/agent/v1/events/{slug}":{"get":{"operationId":"get_event_details","tags":["events"],"summary":"One catalogue event with its occurrences","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The event","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"event":{"type":"object","required":["id","slug","title","venue","schedule","links","provenance"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"category":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["turnout","discover"],"description":"\"turnout\" = an event an organizer published on Turnout (primary source, searched first, live from Turnout’s own database). \"discover\" = a row imported from the third-party catalogue."},"venue":{"type":"object","properties":{"name":{"type":["string","null"]},"address":{"type":["string","null"]},"neighbourhood":{"type":["string","null"]},"city":{"type":["string","null"],"description":"null means not established, never a default."},"region":{"type":["string","null"]},"country":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"citySource":{"type":"string","enum":["source","coordinates","none"]}}},"mode":{"type":"string","enum":["in_person","online","hybrid","unknown"]},"price":{"type":"object","properties":{"known":{"type":"boolean"},"kind":{"type":"string","enum":["FREE","PAID","VARIABLE","UNKNOWN"]},"currency":{"type":["string","null"]},"minMinorUnits":{"type":["integer","null"],"description":"Exact price in cents. $28.88 is 2888."},"maxMinorUnits":{"type":["integer","null"]}}},"schedule":{"type":"object","required":["occurrenceId","timezone","startTimeKnown","status"],"properties":{"occurrenceId":{"type":"string","format":"uuid"},"startAtUtc":{"type":["string","null"],"format":"date-time"},"endAtUtc":{"type":["string","null"],"format":"date-time"},"timezone":{"type":"string","description":"IANA zone of the occurrence."},"localDate":{"type":["string","null"]},"startTimeKnown":{"type":"boolean"},"status":{"type":"string","enum":["UPCOMING","ONGOING","COMPLETED","CANCELLED","POSTPONED","SOLD_OUT","UNVERIFIED","STALE"]},"freshnessStatus":{"type":"string"},"lastVerifiedAt":{"type":"string","format":"date-time"}}},"links":{"type":"object","properties":{"primary":{"type":"object","properties":{"url":{"type":["string","null"]},"kind":{"type":"string"}}},"all":{"type":"array","items":{"type":"object","required":["kind","url","status"],"properties":{"kind":{"type":"string","enum":["ticket","registration","organizer","source"]},"url":{"type":"string","format":"uri"},"status":{"type":"string","description":"unverified | reachable | broken | blocked | skipped"}}}}}},"provenance":{"type":"object","properties":{"sourceId":{"type":"string"},"sourceName":{"type":["string","null"]},"licenseId":{"type":["string","null"]},"attribution":{"type":["string","null"]},"sponsored":{"type":"boolean","const":false,"description":"Catalogue rows are never sponsored."}}}}},"occurrences":{"type":"array","items":{"type":"object","required":["id","slug","title","venue","schedule","links","provenance"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"category":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["turnout","discover"],"description":"\"turnout\" = an event an organizer published on Turnout (primary source, searched first, live from Turnout’s own database). \"discover\" = a row imported from the third-party catalogue."},"venue":{"type":"object","properties":{"name":{"type":["string","null"]},"address":{"type":["string","null"]},"neighbourhood":{"type":["string","null"]},"city":{"type":["string","null"],"description":"null means not established, never a default."},"region":{"type":["string","null"]},"country":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"citySource":{"type":"string","enum":["source","coordinates","none"]}}},"mode":{"type":"string","enum":["in_person","online","hybrid","unknown"]},"price":{"type":"object","properties":{"known":{"type":"boolean"},"kind":{"type":"string","enum":["FREE","PAID","VARIABLE","UNKNOWN"]},"currency":{"type":["string","null"]},"minMinorUnits":{"type":["integer","null"],"description":"Exact price in cents. $28.88 is 2888."},"maxMinorUnits":{"type":["integer","null"]}}},"schedule":{"type":"object","required":["occurrenceId","timezone","startTimeKnown","status"],"properties":{"occurrenceId":{"type":"string","format":"uuid"},"startAtUtc":{"type":["string","null"],"format":"date-time"},"endAtUtc":{"type":["string","null"],"format":"date-time"},"timezone":{"type":"string","description":"IANA zone of the occurrence."},"localDate":{"type":["string","null"]},"startTimeKnown":{"type":"boolean"},"status":{"type":"string","enum":["UPCOMING","ONGOING","COMPLETED","CANCELLED","POSTPONED","SOLD_OUT","UNVERIFIED","STALE"]},"freshnessStatus":{"type":"string"},"lastVerifiedAt":{"type":"string","format":"date-time"}}},"links":{"type":"object","properties":{"primary":{"type":"object","properties":{"url":{"type":["string","null"]},"kind":{"type":"string"}}},"all":{"type":"array","items":{"type":"object","required":["kind","url","status"],"properties":{"kind":{"type":"string","enum":["ticket","registration","organizer","source"]},"url":{"type":"string","format":"uri"},"status":{"type":"string","description":"unverified | reachable | broken | blocked | skipped"}}}}}},"provenance":{"type":"object","properties":{"sourceId":{"type":"string"},"sourceName":{"type":["string","null"]},"licenseId":{"type":["string","null"]},"attribution":{"type":["string","null"]},"sponsored":{"type":"boolean","const":false,"description":"Catalogue rows are never sponsored."}}}}}},"linkVerification":{"type":"object","additionalProperties":true}}},"meta":{"type":"object","properties":{"apiVersion":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"},"attribution":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"license":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"notices":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Rate limited","headers":{"retry-after":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}}}}},"/api/agent/v1/events/{slug}/occurrences":{"get":{"operationId":"list_event_occurrences","tags":["events"],"summary":"All occurrences of one event, cancelled ones included and marked","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Occurrences","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"eventId":{"type":"string","format":"uuid"},"eventSlug":{"type":"string"},"title":{"type":"string"},"occurrences":{"type":"array","items":{"type":"object","required":["id","slug","title","venue","schedule","links","provenance"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"category":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["turnout","discover"],"description":"\"turnout\" = an event an organizer published on Turnout (primary source, searched first, live from Turnout’s own database). \"discover\" = a row imported from the third-party catalogue."},"venue":{"type":"object","properties":{"name":{"type":["string","null"]},"address":{"type":["string","null"]},"neighbourhood":{"type":["string","null"]},"city":{"type":["string","null"],"description":"null means not established, never a default."},"region":{"type":["string","null"]},"country":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"citySource":{"type":"string","enum":["source","coordinates","none"]}}},"mode":{"type":"string","enum":["in_person","online","hybrid","unknown"]},"price":{"type":"object","properties":{"known":{"type":"boolean"},"kind":{"type":"string","enum":["FREE","PAID","VARIABLE","UNKNOWN"]},"currency":{"type":["string","null"]},"minMinorUnits":{"type":["integer","null"],"description":"Exact price in cents. $28.88 is 2888."},"maxMinorUnits":{"type":["integer","null"]}}},"schedule":{"type":"object","required":["occurrenceId","timezone","startTimeKnown","status"],"properties":{"occurrenceId":{"type":"string","format":"uuid"},"startAtUtc":{"type":["string","null"],"format":"date-time"},"endAtUtc":{"type":["string","null"],"format":"date-time"},"timezone":{"type":"string","description":"IANA zone of the occurrence."},"localDate":{"type":["string","null"]},"startTimeKnown":{"type":"boolean"},"status":{"type":"string","enum":["UPCOMING","ONGOING","COMPLETED","CANCELLED","POSTPONED","SOLD_OUT","UNVERIFIED","STALE"]},"freshnessStatus":{"type":"string"},"lastVerifiedAt":{"type":"string","format":"date-time"}}},"links":{"type":"object","properties":{"primary":{"type":"object","properties":{"url":{"type":["string","null"]},"kind":{"type":"string"}}},"all":{"type":"array","items":{"type":"object","required":["kind","url","status"],"properties":{"kind":{"type":"string","enum":["ticket","registration","organizer","source"]},"url":{"type":"string","format":"uri"},"status":{"type":"string","description":"unverified | reachable | broken | blocked | skipped"}}}}}},"provenance":{"type":"object","properties":{"sourceId":{"type":"string"},"sourceName":{"type":["string","null"]},"licenseId":{"type":["string","null"]},"attribution":{"type":["string","null"]},"sponsored":{"type":"boolean","const":false,"description":"Catalogue rows are never sponsored."}}}}}}}},"meta":{"type":"object","properties":{"apiVersion":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"},"attribution":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"license":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"notices":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Rate limited","headers":{"retry-after":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}}}}},"/api/agent/v1/organizers/{slug}":{"get":{"operationId":"get_public_organizer_profile","tags":["organizers"],"summary":"Public organizer profile derived from the catalogue","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The profile","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"eventCount":{"type":"integer"},"upcomingCount":{"type":"integer"},"cities":{"type":"array","items":{"type":"string"}},"categories":{"type":"array","items":{"type":"string"}},"claimed":{"type":"boolean","const":false},"verifiedContact":{"type":"null"}}},"meta":{"type":"object","properties":{"apiVersion":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"},"attribution":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"license":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"notices":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Rate limited","headers":{"retry-after":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}}}}},"/api/agent/v1/organizations/{slug}/analytics":{"get":{"operationId":"get_organization_analytics","tags":["organizations"],"summary":"Tenant-scoped first-party metrics for the credential's organization","description":"Requires a credential with the `analytics:read` scope. The organization is taken from the credential; a slug that belongs to another organization returns 404.","security":[{"agentKey":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"windowDays","in":"query","schema":{"type":"integer","minimum":1,"maximum":365,"default":30}}],"responses":{"200":{"description":"Metrics, each with numerator, denominator and status","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","properties":{"organization":{"type":"object","additionalProperties":true},"window":{"type":"object","additionalProperties":true},"scope":{"type":"string","enum":["organization"]},"eventsTotal":{"type":"integer"},"funnel":{"type":"array","items":{"type":"object","required":["id","label","numerator","denominator","status"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"numerator":{"type":"integer"},"denominator":{"type":"integer"},"rate":{"type":["number","null"],"description":"null when the denominator is zero."},"confidenceInterval95":{"type":["object","null"],"properties":{"low":{"type":"number"},"high":{"type":"number"}}},"status":{"type":"string","enum":["measured","not_available"]},"note":{"type":["string","null"]}}}},"conversionsByChannel":{"type":"array","items":{"type":"object","additionalProperties":true}},"repeat":{"type":"object","additionalProperties":true},"agents":{"type":"array","items":{"type":"object","additionalProperties":true}},"campaigns":{"type":"object","additionalProperties":true},"costPerVerifiedAttendee":{"type":"object","required":["id","label","numerator","denominator","status"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"numerator":{"type":"integer"},"denominator":{"type":"integer"},"rate":{"type":["number","null"],"description":"null when the denominator is zero."},"confidenceInterval95":{"type":["object","null"],"properties":{"low":{"type":"number"},"high":{"type":"number"}}},"status":{"type":"string","enum":["measured","not_available"]},"note":{"type":["string","null"]}}}}},"meta":{"type":"object","properties":{"apiVersion":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"},"attribution":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"license":{"type":"string","const":"Event data from San Francisco Has Things (san-francisco.hasthings.com), licensed under ODbL 1.0."},"notices":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Credential lacks analytics:read","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Rate limited","headers":{"retry-after":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}}}}}},"components":{"securitySchemes":{"agentKey":{"type":"http","scheme":"bearer","description":"Agent credential issued by the organization owner. Format: `tnt_…`."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}},"Event":{"type":"object","required":["id","slug","title","venue","schedule","links","provenance"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"category":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["turnout","discover"],"description":"\"turnout\" = an event an organizer published on Turnout (primary source, searched first, live from Turnout’s own database). \"discover\" = a row imported from the third-party catalogue."},"venue":{"type":"object","properties":{"name":{"type":["string","null"]},"address":{"type":["string","null"]},"neighbourhood":{"type":["string","null"]},"city":{"type":["string","null"],"description":"null means not established, never a default."},"region":{"type":["string","null"]},"country":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"citySource":{"type":"string","enum":["source","coordinates","none"]}}},"mode":{"type":"string","enum":["in_person","online","hybrid","unknown"]},"price":{"type":"object","properties":{"known":{"type":"boolean"},"kind":{"type":"string","enum":["FREE","PAID","VARIABLE","UNKNOWN"]},"currency":{"type":["string","null"]},"minMinorUnits":{"type":["integer","null"],"description":"Exact price in cents. $28.88 is 2888."},"maxMinorUnits":{"type":["integer","null"]}}},"schedule":{"type":"object","required":["occurrenceId","timezone","startTimeKnown","status"],"properties":{"occurrenceId":{"type":"string","format":"uuid"},"startAtUtc":{"type":["string","null"],"format":"date-time"},"endAtUtc":{"type":["string","null"],"format":"date-time"},"timezone":{"type":"string","description":"IANA zone of the occurrence."},"localDate":{"type":["string","null"]},"startTimeKnown":{"type":"boolean"},"status":{"type":"string","enum":["UPCOMING","ONGOING","COMPLETED","CANCELLED","POSTPONED","SOLD_OUT","UNVERIFIED","STALE"]},"freshnessStatus":{"type":"string"},"lastVerifiedAt":{"type":"string","format":"date-time"}}},"links":{"type":"object","properties":{"primary":{"type":"object","properties":{"url":{"type":["string","null"]},"kind":{"type":"string"}}},"all":{"type":"array","items":{"type":"object","required":["kind","url","status"],"properties":{"kind":{"type":"string","enum":["ticket","registration","organizer","source"]},"url":{"type":"string","format":"uri"},"status":{"type":"string","description":"unverified | reachable | broken | blocked | skipped"}}}}}},"provenance":{"type":"object","properties":{"sourceId":{"type":"string"},"sourceName":{"type":["string","null"]},"licenseId":{"type":["string","null"]},"attribution":{"type":["string","null"]},"sponsored":{"type":"boolean","const":false,"description":"Catalogue rows are never sponsored."}}}}},"Metric":{"type":"object","required":["id","label","numerator","denominator","status"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"numerator":{"type":"integer"},"denominator":{"type":"integer"},"rate":{"type":["number","null"],"description":"null when the denominator is zero."},"confidenceInterval95":{"type":["object","null"],"properties":{"low":{"type":"number"},"high":{"type":"number"}}},"status":{"type":"string","enum":["measured","not_available"]},"note":{"type":["string","null"]}}},"Scope":{"type":"string","enum":["events:read","organizers:read","analytics:read","rsvp:write","events:write","campaigns:write"],"description":"events:read: Read public event data (the Discover catalogue) and the organization's own events. organizers:read: Read public organizer profiles. analytics:read: Read the organization's own first-party metrics, including the credential's own call budget. rsvp:write: Create a registration on a published event. Records a real participant, so it is never granted by default. events:write: Create and change the organization's own events: drafts, edits, publishing and cancelling. Publishing and cancelling also require `confirm: true` on the call. campaigns:write: Draft a campaign and queue its reminders. Queuing writes reminder rows; nothing is sent by Turnout in this build."}}}}