{"openapi":"3.1.0","info":{"title":"Orriven Storefront API","version":"2026-08-22","description":"The headless backend for your own event frontend — no backend of yours required. Authenticate every request with `Authorization: Bearer <opk_…>` (a publishable key, safe in browser code; it fronts exactly one portal). Attendee sign-in is email OTP — the platform sends the code — and the resulting session token travels in the `Orriven-Attendee-Token` header. The catalog never exposes counts, drafts or hidden ticket types; anything outside the portal answers 404.\n\n**Versioning** — date versions, the developer API's exact model: the key pins the version current at its creation, `Orriven-Version: YYYY-MM-DD` overrides per request, and every response echoes the effective version."},"security":[{"publishableKey":[]}],"servers":[{"url":"https://openapi.orriven.com/storefront","description":"Production"},{"url":"http://localhost:3002/storefront","description":"Local development"}],"components":{"securitySchemes":{"publishableKey":{"type":"http","scheme":"bearer","description":"The publishable key (`opk_…`) — safe to embed in your frontend. Created per portal in the console, with the origins allowed to use it from a browser."},"attendeeToken":{"type":"apiKey","in":"header","name":"Orriven-Attendee-Token","description":"The signed-in attendee's session token (`oat_…`), from `POST /auth/otp/verify`. Required on the account routes; optional on checkout."}},"schemas":{"RpcStatus":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"integer","example":404},"status":{"type":"string","example":"NOT_FOUND"},"message":{"type":"string","example":"Event not found."},"details":{"type":"array","items":{}}},"required":["code","status","message"]}},"required":["error"]},"StorefrontAttendee":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":["string","null"]}},"required":["email","name"]},"AccountRegistration":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"type":{"type":["string","null"]},"createdAt":{"type":"string"},"checkinCode":{"type":["string","null"]},"event":{"type":"object","properties":{"publicId":{"type":"string"},"name":{"type":"string"},"startsAt":{"type":["string","null"]},"timezone":{"type":"string"}},"required":["publicId","name","startsAt","timezone"]},"exhibitor":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"booths":{"type":"array","items":{"type":"object","properties":{"number":{"type":"string"},"venue":{"type":["string","null"]}},"required":["number","venue"]}}},"required":["id","name","status","booths"]}},"required":["id","status","type","createdAt","checkinCode","event","exhibitor"]},"AccountOrder":{"type":"object","properties":{"orderNumber":{"type":"string"},"status":{"type":"string"},"totalAmount":{"type":"integer"},"currency":{"type":"string"},"createdAt":{"type":"string"},"event":{"type":"object","properties":{"publicId":{"type":"string"},"name":{"type":"string"}},"required":["publicId","name"]}},"required":["orderNumber","status","totalAmount","currency","createdAt","event"]},"StorefrontEvent":{"type":"object","properties":{"publicId":{"type":"string"},"name":{"type":"string"},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"timezone":{"type":"string"},"currency":{"type":"string"},"themeSource":{"type":"string"}},"required":["publicId","name","startsAt","endsAt","timezone","currency","themeSource"]},"StorefrontCatalog":{"type":"object","properties":{"event":{"$ref":"#/components/schemas/StorefrontEvent"},"speakers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"title":{"type":["string","null"]},"bio":{"type":["string","null"]}},"required":["id","name","title","bio"]}},"agenda":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"venue":{"type":["string","null"]},"startsAt":{"type":"string"},"endsAt":{"type":["string","null"]}},"required":["id","title","description","venue","startsAt","endsAt"]}},"ticketTypes":{"type":"array","items":{"$ref":"#/components/schemas/StorefrontTicketType"}},"upcomingTicketTypes":{"type":"array","items":{"$ref":"#/components/schemas/StorefrontUpcomingTicketType"}},"addons":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"priceAmount":{"type":"integer"},"perks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]}},"required":["name","description"]}}},"required":["id","name","description","priceAmount","perks"]}},"bundles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"priceAmount":{"type":"integer"},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"quantity":{"type":"integer"}},"required":["name","quantity"]}}},"required":["id","name","description","priceAmount","items"]}},"registrationClosed":{"type":"boolean"},"paymentsEnabled":{"type":"boolean"},"forms":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"questions":{}},"required":["id"]}}},"required":["event","speakers","agenda","ticketTypes","upcomingTicketTypes","addons","bundles","registrationClosed","paymentsEnabled","forms"]},"StorefrontTicketType":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"soldOut":{"type":"boolean"},"waitlistOpen":{"type":"boolean"},"opensAt":{"type":["string","null"]},"closesAt":{"type":["string","null"]},"priceAmount":{"type":"integer"},"perks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]}},"required":["name","description"]}},"formId":{"type":["string","null"]}},"required":["id","name","description","soldOut","waitlistOpen","opensAt","closesAt","priceAmount","perks","formId"]},"StorefrontUpcomingTicketType":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"priceAmount":{"type":"integer"},"opensAt":{"type":"string"},"closesAt":{"type":["string","null"]},"perks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]}},"required":["name","description"]}}},"required":["id","name","description","priceAmount","opensAt","closesAt","perks"]},"StorefrontRegistrationOutcome":{"type":"object","properties":{"status":{"type":"string"},"type":{"type":["string","null"]}},"required":["status","type"]},"StorefrontOrder":{"type":"object","properties":{"orderNumber":{"type":"string"},"status":{"type":"string"},"totalAmount":{"type":"integer"},"currency":{"type":"string"},"taxAmount":{"type":"integer"},"discountAmount":{"type":"integer"},"expiresAt":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"itemType":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"integer"},"unitAmount":{"type":"integer"}},"required":["itemType","name","quantity","unitAmount"]}}},"required":["orderNumber","status","totalAmount","currency","taxAmount","discountAmount","expiresAt","items"]}},"parameters":{}},"paths":{"/v1/auth/otp":{"post":{"tags":["Auth"],"summary":"Request a sign-in code","description":"Emails a six-digit code to the address — sent by the platform, no organizer backend involved. The answer is identical for known and unknown addresses. One code is live per address at a time; asking again within a minute answers 429.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","example":"ana@example.com"}},"required":["email"]}}}},"responses":{"200":{"description":"A code is on its way (or the address is new — indistinguishable on purpose).","content":{"application/json":{"schema":{"type":"object","properties":{"sent":{"type":"boolean","enum":[true]}},"required":["sent"]}}}},"400":{"description":"Invalid request body or parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/auth/otp/verify":{"post":{"tags":["Auth"],"summary":"Verify the code and sign in","description":"Exchanges the emailed code for a session token (`oat_…`). Send it on account requests in the `Orriven-Attendee-Token` header. Store it in memory or storage your frontend controls — it is the person's session, scoped to this portal. Wrong, expired, spent and over-guessed codes are all the same refusal.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","example":"ana@example.com"},"code":{"type":"string","pattern":"^\\d{6}$","example":"123456","description":"The six digits from the email."}},"required":["email","code"]}}}},"responses":{"200":{"description":"Signed in — the token and who it belongs to.","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"expiresAt":{"type":"string"},"attendee":{"$ref":"#/components/schemas/StorefrontAttendee"}},"required":["token","expiresAt","attendee"]}}}},"400":{"description":"Invalid request body or parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/auth/logout":{"post":{"tags":["Auth"],"summary":"Sign out","description":"Revokes the session server-side. Idempotent — a missing or already-dead token acknowledges the same way, and the frontend forgets its copy either way.","responses":{"200":{"description":"The session is revoked.","content":{"application/json":{"schema":{"type":"object","properties":{"signedOut":{"type":"boolean","enum":[true]}},"required":["signedOut"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/account/me":{"get":{"tags":["Account"],"summary":"Who am I","responses":{"200":{"description":"The signed-in person.","content":{"application/json":{"schema":{"type":"object","properties":{"attendee":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":["string","null"]}},"required":["email","name"]}},"required":["attendee"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/account/registrations":{"get":{"tags":["Account"],"summary":"My registrations","description":"Everything this person booked on this portal, newest first. `checkinCode` is their entry pass (render as a QR) — present only on a confirmed seat of an event with on-site check-in enabled. `exhibitor` names the company this admission staffs, with its booth allocations — null for ordinary attendees.","responses":{"200":{"description":"The person's registrations.","content":{"application/json":{"schema":{"type":"object","properties":{"registrations":{"type":"array","items":{"$ref":"#/components/schemas/AccountRegistration"}}},"required":["registrations"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/account/registrations/{registrationId}/perks":{"get":{"tags":["Account"],"summary":"My perks for one registration","description":"What this admission includes — the ticket's perks, the redemption code's, and any granted personally, as one union. Names and descriptions only.","parameters":[{"schema":{"type":"string"},"required":true,"name":"registrationId","in":"path"}],"responses":{"200":{"description":"The perks this registration holds.","content":{"application/json":{"schema":{"type":"object","properties":{"perks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]}},"required":["name","description"]}}},"required":["perks"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"404":{"description":"The resource does not exist in this key's business unit. A foreign id answers the same way.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/account/orders":{"get":{"tags":["Account"],"summary":"My orders","description":"The orders this signed-in address placed on this portal's events, newest first — checkout never requires an account, so the proven inbox is what makes the list theirs.","responses":{"200":{"description":"The person's orders.","content":{"application/json":{"schema":{"type":"object","properties":{"orders":{"type":"array","items":{"$ref":"#/components/schemas/AccountOrder"}}},"required":["orders"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/events":{"get":{"tags":["Catalog"],"summary":"List published events","responses":{"200":{"description":"The portal's published events.","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/StorefrontEvent"}}},"required":["events"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/events/{publicId}":{"get":{"tags":["Catalog"],"summary":"Get the event catalog","description":"Everything a buyer-facing page needs: ticket types (soldOut is a boolean, never a count), add-ons, bundles, the open agenda, speakers, and the published registration forms the types ask. A draft or foreign event answers 404 — indistinguishable from a nonexistent one.","parameters":[{"schema":{"type":"string"},"required":true,"name":"publicId","in":"path"}],"responses":{"200":{"description":"The event's public catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorefrontCatalog"}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"404":{"description":"The resource does not exist in this key's business unit. A foreign id answers the same way.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/events/{publicId}/redemption-codes/lookup":{"get":{"tags":["Catalog"],"summary":"Validate a redemption code","description":"What a valid code redeems: the ticket type it unlocks (the one road to a hidden type), the perks of that admission, the discounted price. Misspelt, disabled, expired, spent and pointing-at-a-closed-type are all the same 404.","parameters":[{"schema":{"type":"string"},"required":true,"name":"publicId","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"code","in":"query"}],"responses":{"200":{"description":"What the code redeems.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"ticketType":{"$ref":"#/components/schemas/StorefrontTicketType"},"form":{"type":["object","null"],"properties":{"id":{"type":"string"},"questions":{}},"required":["id"]},"discount":{"type":["object","null"],"properties":{"effectiveAmount":{"type":"integer"}},"required":["effectiveAmount"]}},"required":["code","ticketType","form","discount"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"404":{"description":"The resource does not exist in this key's business unit. A foreign id answers the same way.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/events/{publicId}/orders":{"post":{"tags":["Checkout"],"summary":"Place an order","description":"Tickets, add-ons and bundles in one order, with an optional redemption code. The order holds its places for 15 minutes until confirmed. Signed in, `email` may be omitted (the session's address is used); anonymously it is required. A buyer already registered is acknowledged (`alreadyRegistered: true`) — never sold a second seat.","parameters":[{"schema":{"type":"string"},"required":true,"name":"publicId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email"},"name":{"type":"string","maxLength":200},"items":{"type":"array","items":{"type":"object","properties":{"itemType":{"type":"string","enum":["registration_type","addon","bundle"]},"itemId":{"type":"string","minLength":1,"maxLength":100},"quantity":{"type":"integer","minimum":1,"maximum":100}},"required":["itemType","itemId","quantity"]},"maxItems":50},"ticketTypeId":{"type":"string","minLength":1,"maxLength":100},"redemptionCode":{"type":"string","minLength":1,"maxLength":64},"responses":{"type":"object","additionalProperties":{}},"client":{"type":"object","properties":{"timezone":{"type":"string","maxLength":64},"language":{"type":"string","maxLength":32},"screen":{"type":"string","maxLength":32},"platform":{"type":"string","maxLength":64},"fingerprint":{"type":"string","maxLength":64},"fingerprintEventId":{"type":"string","maxLength":64},"suspectScore":{"type":"number","minimum":0,"maximum":100}}}}}}}},"responses":{"200":{"description":"This email already holds a registration in the event.","content":{"application/json":{"schema":{"type":"object","properties":{"alreadyRegistered":{"type":"boolean","enum":[true]},"registration":{"$ref":"#/components/schemas/StorefrontRegistrationOutcome"}},"required":["alreadyRegistered","registration"]}}}},"201":{"description":"The pending order, holding its places.","content":{"application/json":{"schema":{"type":"object","properties":{"alreadyRegistered":{"type":"boolean","enum":[false]},"order":{"$ref":"#/components/schemas/StorefrontOrder"}},"required":["alreadyRegistered","order"]}}}},"400":{"description":"Invalid request body or parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"404":{"description":"The resource does not exist in this key's business unit. A foreign id answers the same way.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"412":{"description":"A business rule blocks the change (sold out, currency locked, …).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/orders/{orderNumber}":{"get":{"tags":["Checkout"],"summary":"Get an order by number","description":"The buyer's own order — the confirmation page's read, polled until `paid` for a paid order. The number is the credential; expiry reads lazily.","parameters":[{"schema":{"type":"string"},"required":true,"name":"orderNumber","in":"path"}],"responses":{"200":{"description":"The order and enough of its event to head the page.","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"allOf":[{"$ref":"#/components/schemas/StorefrontOrder"},{"type":"object","properties":{"email":{"type":"string"},"registrationStatus":{"type":["string","null"]}},"required":["email","registrationStatus"]}]},"event":{"type":"object","properties":{"publicId":{"type":"string"},"name":{"type":"string"},"startsAt":{"type":["string","null"]},"timezone":{"type":"string"}},"required":["publicId","name","startsAt","timezone"]}},"required":["order","event"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"404":{"description":"The resource does not exist in this key's business unit. A foreign id answers the same way.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/events/{publicId}/orders/{orderNumber}/confirm":{"post":{"tags":["Checkout"],"summary":"Confirm an order","description":"A free order settles right here and fulfils into its registration. A paid order is claimed (`status: \"awaiting_payment\"`, hold stretched to 35 minutes) and the answer carries the hosted Stripe page — `successUrl`/`cancelUrl` say where Stripe sends the buyer back on your site. Settlement arrives by the platform's webhook: poll the order until `paid`.","parameters":[{"schema":{"type":"string"},"required":true,"name":"publicId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"orderNumber","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"successUrl":{"type":"string","maxLength":2000},"cancelUrl":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"Settled (free), or claimed with the Stripe page to pay on.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","enum":["paid"]},"registration":{"$ref":"#/components/schemas/StorefrontRegistrationOutcome"},"created":{"type":"boolean"}},"required":["status","registration","created"]},{"type":"object","properties":{"status":{"type":"string","enum":["awaiting_payment"]},"paymentUrl":{"type":"string"}},"required":["status","paymentUrl"]}]}}}},"400":{"description":"Invalid request body or parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"404":{"description":"The resource does not exist in this key's business unit. A foreign id answers the same way.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"412":{"description":"A business rule blocks the change (sold out, currency locked, …).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}},"/v1/events/{publicId}/orders/{orderNumber}/cancel":{"post":{"tags":["Checkout"],"summary":"Cancel an order","description":"Releases the hold now rather than in 15 minutes.","parameters":[{"schema":{"type":"string"},"required":true,"name":"publicId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"orderNumber","in":"path"}],"responses":{"200":{"description":"The hold is released.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["cancelled"]}},"required":["status"]}}}},"401":{"description":"Missing, unknown, revoked or expired API key — all indistinguishable on purpose.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"404":{"description":"The resource does not exist in this key's business unit. A foreign id answers the same way.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"412":{"description":"A business rule blocks the change (sold out, currency locked, …).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}},"429":{"description":"Rate limit exceeded for this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcStatus"}}}}}}}},"webhooks":{}}