curl. You need a key (generate one) and your API host:
1
1 — Create an event
id.2
2 — Create a ticket type
priceAmount is minor units of the event’s currency — 12000 is ¥120.00 for a CNY event. 0 (or omitting it) makes the ticket free. Keep the returned id.3
3 — Open the ticket for sale
Ticket types are born draft too. Opening is a status change:
4
4 — Watch remaining seats
held counts seats inside live order holds from the public checkout. The numbers are advisory — the binding check still happens at registration time, so you can never oversell by reading a stale value.5
5 — Register an attendee
201 with "created": true — and note the registration’s checkinCode, the badge credential. Registering the same email again answers 200 with "created": false and the existing registration: repeats are acknowledged, never duplicated.6
6 — Approve, if the ticket requires it
On a ticket with approval mode, API registrations land
pending — the API records the application, it does not make the admission decision. Decide it explicitly:7
7 — Check them in
201 records the arrival; scanning the same badge again answers 200 with "alreadyCheckedIn": true — acknowledged, not an error.What you just exercised
- Draft-first lifecycles — events and ticket types are invisible until you open them, same as the console.
- The capacity gate — when
confirmedreachescapacity, the next registration answers412(or landswaitlistedif the ticket allows a waitlist). - Idempotent repeats — duplicate registrations and duplicate scans acknowledge instead of erroring, so retries in your integration are safe.
- Automations — if this Business Unit has an “attendee added” or check-in automation, your API calls just triggered it.
Related
Endpoint reference
Everything else: codes, add-ons, bundles, orders, errors, limits.
Ticket types
Capacity, waitlists, approval mode and visibility, explained.