{"openapi":"3.1.0","info":{"title":"One Ticket public API","version":"1.0.0","summary":"Read-only access to public events, series and the published booking fee.","description":"One Ticket is an event ticketing and membership platform. This API returns what is already on public pages - no key and no sign-in. Drafts, private, password-protected and unlisted events are never returned. Booking and payment happen on the website: each event answer carries its page link. The same data is available to AI assistants through the Model Context Protocol server at https://oneticket.com.au/mcp. Requests that read events, series or stats are limited per network; answers are cached, so there is no need to poll.","contact":{"name":"One Ticket support","url":"https://oneticket.com.au/support"},"termsOfService":"https://oneticket.com.au/legal"},"externalDocs":{"description":"Technical guide for developers and AI assistants","url":"https://oneticket.com.au/llms-full.txt"},"servers":[{"url":"https://oneticket.com.au/api/v1"}],"tags":[{"name":"Events","description":"Public event pages (https://oneticket.com.au/e/{slug})."},{"name":"Series","description":"Recurring series and their sessions (https://oneticket.com.au/s/{slug})."},{"name":"Pricing","description":"The published booking fee."},{"name":"Platform","description":"This API, and platform figures."}],"paths":{"/":{"get":{"tags":["Platform"],"operationId":"getIndex","summary":"What this API is, and where it is described","responses":{"200":{"description":"The index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Index"}}}}}}},"/events":{"get":{"tags":["Events"],"operationId":"searchEvents","summary":"Search upcoming public events","description":"Public, live events still to come, soonest first (never a draft, private, unlisted or password-protected one). Filter by words, place, dates, online and free. At most 20 a page; pass nextCursor back as cursor for the next. Each item carries its page link, where people book. The same search is the MCP tool search_events.","parameters":[{"name":"q","in":"query","required":false,"description":"Words to find in the title, summary or place (every word must match, any case), e.g. \"yoga darwin\".","schema":{"type":"string","maxLength":100}},{"name":"city","in":"query","required":false,"description":"A town, suburb or city to find in the place name or address (any case), e.g. \"Darwin\".","schema":{"type":"string","maxLength":100}},{"name":"from","in":"query","required":false,"description":"Only events with a day on or after this date (YYYY-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Only events with a day on or before this date (YYYY-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"online","in":"query","required":false,"description":"true: only online events. false: only in-person events.","schema":{"type":"boolean"}},{"name":"free","in":"query","required":false,"description":"true: only events with a free ticket type. false: only events without one.","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"How many events to return, 1 to 20.","schema":{"type":"integer","minimum":1,"maximum":20,"default":10}},{"name":"cursor","in":"query","required":false,"description":"The nextCursor of the previous answer, for the next page. Opaque: pass it back as it came.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"A page of events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSearchResult"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/events/{slug}":{"get":{"tags":["Events"],"operationId":"getEvent","summary":"Get a public event","description":"Dates, times, timezone, location (or Online), organiser (when the page shows it), refund policy and ticket types with prices and availability. An old slug answers with the event it moved to.","parameters":[{"$ref":"#/components/parameters/Slug"}],"responses":{"200":{"description":"The event.","content":{"application/json":{"schema":{"type":"object","properties":{"event":{"$ref":"#/components/schemas/Event"}},"required":["event"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/series/{slug}":{"get":{"tags":["Series"],"operationId":"getSeries","summary":"Get a public series and its upcoming sessions","description":"Up to 50 public sessions still to come, soonest first.","parameters":[{"$ref":"#/components/parameters/Slug"}],"responses":{"200":{"description":"The series.","content":{"application/json":{"schema":{"type":"object","properties":{"series":{"$ref":"#/components/schemas/Series"}},"required":["series"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/fees":{"get":{"tags":["Pricing"],"operationId":"quoteFee","summary":"Quote the booking fee for a ticket price","description":"What the attendee pays and what the organiser receives, from the same code the checkout charges with. Organisers pay no platform fee; on a paid ticket the attendee pays a booking fee on top. Free tickets cost nothing.","parameters":[{"name":"price","in":"query","required":true,"description":"Ticket price in whole currency units, e.g. 25 or 12.50.","schema":{"type":"number","minimum":0,"maximum":100000}},{"name":"currency","in":"query","required":false,"description":"Currency of the price.","schema":{"type":"string","enum":["aud","usd","gbp"],"default":"aud"}}],"responses":{"200":{"description":"The quote.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeQuote"}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/stats":{"get":{"tags":["Platform"],"operationId":"getStats","summary":"Platform figures","responses":{"200":{"description":"Figures.","content":{"application/json":{"schema":{"type":"object","properties":{"ticketsIssued":{"type":"integer"}},"required":["ticketsIssued"]}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"502":{"description":"The figures could not be read just now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"parameters":{"Slug":{"name":"slug","in":"path","required":true,"description":"The part of the page address after /e/ or /s/.","schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,159}$"}}},"responses":{"BadRequest":{"description":"The request was not usable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"No public page has that address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"Too many requests from this network in a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"Index":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"openapi":{"type":"string","format":"uri"},"mcp":{"type":"string","format":"uri"},"docs":{"type":"string","format":"uri"},"events":{"type":"string","format":"uri"}},"required":["name","version","openapi","mcp","docs"]},"EventSummary":{"type":"object","description":"An event in a search: enough to choose one. Get the rest with /events/{slug}.","properties":{"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"bookUrl":{"type":"string","format":"uri","description":"Where a person books: the event page itself."},"summary":{"type":"string"},"start":{"type":["string","null"],"description":"The first day and start time with the event's own UTC offset, e.g. 2026-10-25T18:30:00+11:00 (the day alone when there is no start time)."},"end":{"type":["string","null"],"description":"The last day and end time, when the event has one."},"timezone":{"type":"string"},"online":{"type":"boolean"},"venue":{"type":"string","description":"The place name, or Online."},"location":{"type":"string","description":"The place and its address in one line, or Online."},"organiser":{"type":["object","null"],"description":"By name, when the event page shows it.","properties":{"name":{"type":"string"}}},"currency":{"type":"string","enum":["AUD","GBP","USD"]},"priceFrom":{"type":["number","null"],"description":"The lowest ticket price shown, before the booking fee. Null when the event sells no tickets."},"free":{"type":"boolean","description":"A free ticket type is on offer."}},"required":["slug","title","url","bookUrl","timezone","online","free"]},"EventSearchResult":{"type":"object","properties":{"events":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/EventSummary"}},"total":{"type":"integer","description":"Events matching in all, across every page."},"nextCursor":{"type":["string","null"],"description":"Pass as cursor for the next page; null on the last."}},"required":["events","total","nextCursor"]},"Ticket":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number","description":"Face value of one ticket now, before the booking fee. A ticket that admits several people is one price for all of them. For a pay what you want ticket, the least a buyer may pay."},"currency":{"type":"string","enum":["AUD","GBP","USD"]},"free":{"type":"boolean"},"payWhatYouWant":{"type":"boolean","description":"The buyer chooses what to pay for each ticket, at least price (which may be 0). Absent when the price is fixed."},"admits":{"type":"integer","minimum":1,"maximum":8,"description":"People one ticket admits: 1, or more for a couple, a family or a table. Each gets their own ticket."},"description":{"type":"string"},"remaining":{"type":"integer","description":"Places left (people, not tickets), when the organiser shows it."},"soldOut":{"type":"boolean"},"onSale":{"type":"boolean"}},"required":["name","price","currency","free","admits","soldOut","onSale"]},"Event":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"bookUrl":{"type":"string","format":"uri","description":"Where a person books: the event page itself."},"summary":{"type":"string"},"description":{"type":"string","description":"Plain text."},"dates":{"type":"array","items":{"type":"string","format":"date"}},"startTime":{"type":["string","null"],"description":"HH:MM in the event's timezone."},"endTime":{"type":["string","null"]},"timezone":{"type":"string","description":"IANA timezone, e.g. Australia/Darwin."},"online":{"type":"boolean"},"location":{"type":"string"},"image":{"type":["string","null"],"format":"uri"},"organiser":{"type":["object","null"],"description":"By name, when the event page shows it.","properties":{"name":{"type":"string"}}},"series":{"type":["object","null"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"}}},"refundPolicy":{"type":["string","null"],"description":"Who may refund, in the event page's words. Null for an event that sells nothing."},"refundPolicyDetails":{"type":["string","null"],"description":"The organiser's own written refund policy, shown under refundPolicy, as on the event page: plain text with line breaks. refundPolicy alone decides refunds. Null when there is none."},"tickets":{"type":"array","items":{"$ref":"#/components/schemas/Ticket"}}},"required":["slug","title","url","bookUrl","dates","online","tickets"]},"Session":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"date":{"type":["string","null"],"format":"date"},"startTime":{"type":["string","null"]},"endTime":{"type":["string","null"]},"timezone":{"type":"string"},"online":{"type":"boolean"},"location":{"type":"string"},"image":{"type":["string","null"],"format":"uri"},"soldOut":{"type":"boolean"},"remaining":{"type":"integer","description":"Places left, when the organiser shows it."}},"required":["slug","title","url","online","soldOut"]},"Series":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"summary":{"type":"string"},"image":{"type":["string","null"],"format":"uri"},"upcomingSessions":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/Session"}}},"required":["slug","title","url","upcomingSessions"]},"FeeQuote":{"type":"object","properties":{"currency":{"type":"string","enum":["AUD","GBP","USD"]},"ticketPrice":{"type":"number"},"bookingFee":{"type":"number","description":"Paid by the attendee on top of the price."},"attendeePays":{"type":"number"},"organiserReceives":{"type":"number","description":"Always the full ticket price."},"organiserPlatformFee":{"type":"number","const":0},"oneTicketKeeps":{"type":"number","description":"One Ticket's share of the booking fee after card processing."},"note":{"type":"string"}},"required":["currency","ticketPrice","bookingFee","attendeePays","organiserReceives","organiserPlatformFee","oneTicketKeeps"]}}}}