Sell on your own site
Read the program and sell tickets from your website, with no key.
The public API is at /api/public/v1. No key, no session, open to any origin. It sees
published events only; a draft and an unknown address both answer 404. The full reference
with request samples is under API reference, and a markdown quickstart for
people and models is at /docs/quickstart.md.
Every response
{ "data": { }, "error": null, "pagination": null }data holds the answer, or null when error holds the message. pagination is
{ offset, limit, total, hasMore } when you asked for a page with offset or limit,
null otherwise. A list without them returns up to 1,000 items; limit is at most 100.
| Status | Meaning |
|---|---|
| 400 | The body or query did not validate. error names the first problem. |
| 401 | Prove the email first. |
| 404 | No such thing, or not published. |
| 409 | The request contradicts the current state. |
| 429 | Too many requests. Retry-After says how many seconds to wait. |
| 502 | Stripe or the email provider failed. |
| 500 | Something broke on our side. |
Reading
Your website renders its own event pages from these:
GET events published events
GET events/{slug} one event
GET events/{slug}/sessions the schedule, each session with its people and tags
GET events/{slug}/sessions/{id}
GET events/{slug}/contributors people on the program
GET events/{slug}/contributors/{id}
GET events/{slug}/organizations companies on the program
GET events/{slug}/organizations/{id}
GET events/{slug}/session-tags the three tag lists
GET events/{slug}/contributor-tags
GET events/{slug}/organization-tags
GET events/{slug}/ticket-types the badge labels
GET events/{slug}/products what is for sale, each with its price and onSale,
which is false once the event has ended
GET hosts/{hostSlug} the host and its published events
GET openapi.json the reference as OpenAPIHidden items never appear. A hidden product appears only when asked for by id with
?include=, so you can sell it from a private link.
Selling
The same flow the Convova checkout uses:
POST events/{slug}/orders/quotewith the cart returns the totals. A cart is a list of tickets, each a product id with its add-ons, plus an optional promo code.POST events/{slug}/coupons/validateanswers whether a code works for this cart and what it saves.- The buyer proves their email.
POST events/{slug}/checkout/startwith the email sends a six-digit code.POST events/{slug}/checkout/verifywith the email and the code returns abuyerTokenthat is good for a short while. A buyer who is signed in to Convova can skip this; the session proves them. POST events/{slug}/orderswith the cart and thebuyerTokencreates the order, holds its units, and returnsorderIdandcheckoutUrl. Send the buyer tocheckoutUrl; it is Stripe's page. A free order has nocheckoutUrland is paid at once.GET events/{slug}/orders/{orderId}returns the status:pending,paid,expired, orrefunded. Poll it after the buyer comes back. The id is the only key to it, and it carries no personal data.POST events/{slug}/orders/{orderId}/cancelreleases the hold when the buyer leaves Stripe's page. An order that is not paid in time expires on its own.
Payment is recorded by Stripe's webhook, never by the browser, and the tickets go to the buyer by email.
Limits
Quotes and coupon checks allow 30 calls a minute per address; asking for a code and
creating an order are braked per address too, and order creation has a global ceiling as
well. A code lasts ten minutes, allows three
tries, and can be sent again after a minute. One buyer can have only a few open holds in
an event at a time. Over a limit the answer is 429 with Retry-After.