{"info":{"version":"1.0.0","description":"Headless ticketing API for partners building their own event, seat-plan, and booking frontends against LINJERUM's backend. See https://linjerum.com/api-docs for full documentation.","title":"LINJERUM Partner API","contact":{"name":"LINJERUM","url":"https://linjerum.com/api-docs"}},"components":{"responses":{"Conflict":{"description":"Request conflicts with current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InvalidRequest":{"description":"Malformed or incomplete request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource missing or not in your organization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Too many requests for this API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing, invalid, or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"detail":{"type":"string"},"error":{"type":"string"}}}},"securitySchemes":{"bearerAuth":{"scheme":"bearer","type":"http","description":"Partner API key issued via Settings → API. Format: `tk_live_...`"}}},"paths":{"/api/v1/attractions":{"get":{"parameters":[{"in":"query","name":"limit","description":"Max entries, default 25, max 100","required":false,"schema":{"type":"integer"}}],"tags":["Attractions"],"summary":"List active attractions","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/attractions/{slug}":{"get":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"tags":["Attractions"],"summary":"Get an attraction with ticket types","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/attractions/{slug}/availability":{"get":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"in":"query","name":"date","description":"ISO-8601 YYYY-MM-DD to check remaining capacity for that day","required":false,"schema":{"type":"string"}}],"tags":["Attractions"],"summary":"Attraction availability, optionally per-date","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/discount-codes/validate":{"post":{"tags":["Discount codes"],"summary":"Validate a discount code for an event or attraction","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"]}}}}}},"/api/v1/embed/seat-plan-editor":{"post":{"tags":["Embeds"],"summary":"Mint a signed URL for the embeddable seat-plan-editor iframe","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/InvalidRequest"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["venue_id"]}}}}}},"/api/v1/embed/seat-planner":{"post":{"tags":["Embeds"],"summary":"Mint a signed URL for the embeddable seat-planner iframe","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/InvalidRequest"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["event_slug"]}}}}}},"/api/v1/events":{"get":{"parameters":[{"in":"query","name":"limit","description":"Max number of events, default 25, max 100","required":false,"schema":{"type":"integer"}}],"tags":["Events"],"summary":"List upcoming events for the caller's organization","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/events/{slug}":{"get":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"tags":["Events"],"summary":"Get an event with venue + ticket types + availability","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/events/{slug}/availability":{"get":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"tags":["Events"],"summary":"Ticket-type availability + sold seats for an event","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/events/{slug}/seats/auto-select":{"post":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"tags":["Seat plans"],"summary":"Auto-select N best available seats for a ticket type","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/InvalidRequest"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ticket_type_id","count"]}}}}}},"/api/v1/events/{slug}/seats/validate":{"post":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"tags":["Seat plans"],"summary":"Pre-validate a seat selection before POST /purchases","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/InvalidRequest"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["selected_seats"]}}}}}},"/api/v1/organization":{"get":{"tags":["Organization"],"summary":"Fetch the organization the API key is scoped to","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/pricing/preview":{"post":{"tags":["Pricing"],"summary":"Preview pricing for a proposed purchase — does not lock seats","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/InvalidRequest"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["quantities"]}}}}}},"/api/v1/purchases":{"post":{"parameters":[{"in":"header","name":"Idempotency-Key","description":"Optional — retry-safe dedup key, cached 24h per API key","required":false,"schema":{"type":"string"}}],"tags":["Purchases"],"summary":"Create a purchase — returns Stripe client_secret for the frontend","responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/InvalidRequest"},"502":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["quantities","buyer"]}}}}}},"/api/v1/purchases/{token}":{"get":{"parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"tags":["Purchases"],"summary":"Poll a purchase's status (paid_at, tickets)","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/purchases/{token}/cancel":{"post":{"parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"tags":["Purchases"],"summary":"Cancel an unpaid purchase — releases seats immediately","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}}}},"/api/v1/purchases/{token}/resend-email":{"post":{"parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"tags":["Purchases"],"summary":"Re-send the purchase confirmation email to the buyer","responses":{"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}}}},"/api/v1/purchases/{token}/tickets/pdf":{"get":{"parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"tags":["Purchases"],"summary":"Combined PDF of every ticket in the purchase","responses":{"200":{"description":"PDF binary","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/purchases/{token}/tickets/{id}/pdf":{"get":{"parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"tags":["Purchases"],"summary":"PDF for one ticket in the purchase","responses":{"200":{"description":"PDF binary","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tickets/{code}/scan":{"post":{"parameters":[{"in":"path","name":"code","required":true,"schema":{"type":"string"}}],"tags":["Tickets"],"summary":"Atomic verify + redeem — marks the ticket scanned","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/tickets/{code}/verify":{"get":{"parameters":[{"in":"path","name":"code","required":true,"schema":{"type":"string"}}],"tags":["Tickets"],"summary":"Read-only: is this ticket valid? (for partner gate scanners)","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/venues":{"get":{"tags":["Venues"],"summary":"List venues belonging to the API key's org","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/venues/{id}":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"tags":["Venues"],"summary":"Get a single venue","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/v1/venues/{id}/seat-plan":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"in":"query","name":"event_id","description":"Event scoping the sold-seat list (required)","required":true,"schema":{"type":"integer"}}],"tags":["Seat plans"],"summary":"Full seat plan for a venue + event, with sold seats","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}}},"tags":[{"name":"Organization"},{"name":"Events"},{"name":"Attractions"},{"name":"Venues"},{"name":"Seat plans"},{"name":"Pricing"},{"name":"Discount codes"},{"name":"Purchases"},{"name":"Tickets"},{"name":"Embeds"}],"openapi":"3.0.3","security":[{"bearerAuth":[]}],"servers":[{"description":"Production","url":"https://linjerum.com"}]}