API · Orders
Orders contain commercial product lines. Today a checkout can combine tickets from several events and gift vouchers; merchandise and other product types use the same line contract. Complimentary guest-list parties remain orders without a commercial checkout. Pending carts and abandoned checkouts are filtered out.
The detail response deliberately separates lines from items: lines are
what the buyer paid for, while items are individual ticket admissions with
check-in state. A group-ticket line can therefore have quantity 1 and several
admission items; a voucher line has no admission item.
The status field reflects current state: paid, refund_pending, refund_failed, refunded, partially_refunded, or booking_cancelled (a guest-list party that was later removed). origin is checkout for paid sales and guest_list for comps.
Guest-list parties have no customer_email. Use delivery_email for optional ticket delivery and staff_note for the door hint. To create or cancel comps, use the Guest list API — do not treat them as Stripe refunds.
Order URLs accept either identifier returned by the API: the stable public_id
(abcd1234efgh5678) or the human order code (7K3Q-9D2A). Formatting and
letter case in an order code are ignored. Store public_id as your durable
correlation key; use display_number when a person needs to type or read it.
Use shop_url to send the buyer directly to this order in the shop. It uses the
verified custom domain when configured, otherwise the account shop subdomain.
The link requires no login and grants access to the entire order, including its
tickets and available invoice. Share it only with the buyer. Cancelled, refunded,
or archived orders show their current state; the link does not sign the buyer
into their customer account.
GET /admin/orders
Returns paid orders in your account, with revenue stats for the period filter.
curl -H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/orders
Query parameters:
| Parameter | Description |
|---|---|
period |
One of today, week, month, year, all. Defaults to all (no time restriction). The period applies only to the current request. |
event_slug |
Filter to orders for a specific event. |
query |
Free-text search across order code, order public ID, ticket check-in code, ticket public ID, voucher-purchase ID, voucher public ID or code, customer name, customer email, delivery email, attendee name, and Stripe payment intent ID. Prefix an event slug with @. |
include_archived |
Set to 1 to include archived paid/refunded orders. Defaults to excluding archived orders. |
limit |
Orders per page, from 1 to 100. Defaults to 50. |
page |
Opaque cursor from the previous response’s pagination.next_page value. Do not parse or construct it. |
Response:
{
"orders": [
{
"public_id": "abcd1234efgh5678",
"shop_url": "https://example-shop.usetix.io/orders/abcd1234efgh5678",
"order_code": "7K3Q9D2A",
"display_number": "7K3Q-9D2A",
"status": "paid",
"origin": "checkout",
"customer_name": "Jane Doe",
"customer_email": "jane@example.com",
"delivery_email": null,
"staff_note": null,
"total": { "amount": "42.00", "currency": "EUR" },
"fees": { "buyer_platform_fee": "0.00", "custom": "0.00" },
"payment_provider": "stripe",
"archived": false,
"paid_at": "2026-04-22T12:34:50Z",
"created_at": "2026-04-22T12:34:00Z",
"item_count": 2,
"line_count": 2,
"product_quantity": 3,
"attribution": {
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring-launch"
}
}
],
"stats": {
"order_count": 137,
"revenue": { "amount": "5754.00", "currency": "EUR" }
},
"pagination": {
"total_count": 137,
"limit": 50,
"next_page": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wNC0yMlQxMjozNDowMC4wMDAwMDBaIiwicHVibGljX2lkIjoiYWJjZDEyMzRlZmdoNTY3OCJ9"
}
}
stats and pagination.total_count describe the full filtered result, not only
the current page. When another page exists, the same cursor is also exposed as
an RFC 8288 Link response header with rel="next"; X-Total-Count contains
the total number of matching orders. next_page is null on the final page.
CSV and Excel exports
The order CSV/XLSX export appends an Order link column containing shop_url.
Event attendee exports also append the order link after all existing columns,
including custom checkout answers. Every admission in the same order has the
same link, even when the order contains tickets for several events.
GET /admin/orders/:identifier
Returns a single order with its line items. identifier may be its public_id,
unformatted order_code, or formatted display_number.
curl -H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/orders/7K3Q-9D2A
Response:
{
"public_id": "abcd1234efgh5678",
"shop_url": "https://example-shop.usetix.io/orders/abcd1234efgh5678",
"order_code": "7K3Q9D2A",
"display_number": "7K3Q-9D2A",
"status": "paid",
"origin": "checkout",
"customer_name": "Jane Doe",
"customer_email": "jane@example.com",
"delivery_email": null,
"staff_note": null,
"total": { "amount": "42.00", "currency": "EUR" },
"fees": { "buyer_platform_fee": "0.00", "custom": "2.50" },
"payment_provider": "stripe",
"archived": false,
"paid_at": "2026-04-22T12:34:50Z",
"created_at": "2026-04-22T12:34:00Z",
"item_count": 2,
"line_count": 2,
"product_quantity": 2,
"attribution": {
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring-launch",
"utm_term": "concert tickets berlin",
"utm_content": "ad-variant-a",
"ref": "partner:radiox"
},
"lines": [
{
"public_id": "line_ticket_123",
"product_id": "product_ticket_123",
"product_type": "ticket",
"name": "General Admission",
"description": "Spring Showcase",
"quantity": 1,
"unit_price": { "amount": "17.00", "currency": "EUR" },
"subtotal": { "amount": "17.00", "currency": "EUR" },
"discount": { "amount": "0.00", "currency": "EUR" },
"tax": { "rate": "19.0", "amount": "2.71", "currency": "EUR" },
"total": { "amount": "17.00", "currency": "EUR" },
"fulfilled_at": "2026-04-22T12:34:50Z"
},
{
"public_id": "line_voucher_456",
"product_id": "product_voucher_456",
"product_type": "voucher",
"name": "Gift 25",
"description": "A gift for any Usetix Club event",
"quantity": 1,
"unit_price": { "amount": "25.00", "currency": "EUR" },
"subtotal": { "amount": "25.00", "currency": "EUR" },
"discount": { "amount": "0.00", "currency": "EUR" },
"tax": { "rate": "0.0", "amount": "0.00", "currency": "EUR" },
"total": { "amount": "25.00", "currency": "EUR" },
"fulfilled_at": "2026-04-22T12:34:50Z",
"voucher_purchase": {
"public_id": "voucher_purchase_456",
"status": "paid",
"voucher_amount": { "amount": "75.00", "currency": "EUR" },
"paid_amount": { "amount": "50.00", "currency": "EUR" },
"bonus_amount": { "amount": "25.00", "currency": "EUR" },
"recipient_name": "Alex Doe",
"recipient_email": "alex@example.com",
"delivery_mode": "email_scheduled",
"scheduled_for": "2026-04-30T08:00:00Z",
"delivered_at": null,
"voucher_id": "voucher_456"
}
}
],
"items": [
{
"public_id": "ord_item_xyz789",
"check_in_code": "9M5V2H8C",
"display_check_in_code": "9M5V-2H8C",
"ticket_title": "General Admission",
"attendee_name": "Jane Doe",
"place_label": null,
"event_id": 42,
"event_slug": "spring-showcase",
"redeemed": false,
"redeemed_at": null,
"admission_status": "active",
"admission_cancellation_status": null,
"blocked_reason": null
}
]
}
POST /admin/orders/:identifier/refund
Refunds a paid order. Requires a Read + Write token. Send amount for a partial refund; omit it for a full refund of the remaining amount.
curl -X POST \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"amount": "5.00"}' \
https://app.usetix.io/admin/orders/abcd1234efgh5678/refund
Response: 200 OK with the updated order object. The refund is processed asynchronously by the payment provider, so the order returns as refund_pending and settles to partially_refunded or refunded.
Validation failures return 422 Unprocessable Entity with an error map:
{ "errors": { "amount": ["Please enter a valid amount"] } }
A full-amount refund on an order that still qualifies for whole-booking cancellation is rejected with 422; use the cancellation endpoint below so inventory is released together with the payment. Arbitrary partial-amount refunds on mixed-tax orders are also rejected because the tax credit would be ambiguous; refund a specific admission or cancel the full order instead.
When the order sold a voucher, a successful full refund blocks that voucher and drains its remaining balance. Usetix refuses an organizer-initiated full refund after the voucher was used, reserved by another checkout, or manually adjusted. This prevents refunding the buyer after value has already left the voucher.
POST /admin/orders/:identifier/cancellation
Cancels the whole booking: releases the tickets back to inventory and refunds the full remaining amount. Requires a Read + Write token. Free and guest-list bookings are cancelled without a payment refund.
curl -X POST \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/orders/abcd1234efgh5678/cancellation
Response: 200 OK with the updated order — refund_pending for paid orders, booking_cancelled for free ones. Orders that cannot be cancelled (already redeemed tickets, unresolved refunds) return 422 with { "errors": { "base": ["…"] } }.
POST /admin/orders/:identifier/archival
Archives a settled checkout order and releases its inventory. Requires a Read + Write token. Archived orders disappear from the default list; include them with include_archived=1.
curl -X POST \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/orders/abcd1234efgh5678/archival
DELETE /admin/orders/:identifier/archival
Restores an archived order and reclaims its tickets.
Response: both archival calls return 200 OK with the updated order; the archived field reflects the new state. Orders with unresolved refunds or cancellations return 422 with { "errors": { "base": ["…"] } }.
Order fields
| Field | Type | Notes |
|---|---|---|
public_id |
string | Public order ID. Stable; safe to store as your correlation key. URL-safe random token. |
shop_url |
string | Customer link to the entire order, including tickets and the available invoice. No login required. |
order_code |
string | Human-readable order code. Safe to show in admin/customer-facing UI. |
display_number |
string | Formatted order code for display, typically grouped as XXXX-XXXX. |
status |
string | paid, refund_pending, refund_failed, refunded, partially_refunded, or booking_cancelled. |
origin |
string | checkout or guest_list. |
customer_name |
string | Buyer name, or the guest-list lead name. |
customer_email |
string | null | Buyer’s email. Always null on guest-list parties. |
delivery_email |
string | null | Guest-list ticket delivery address. null on checkout orders. |
staff_note |
string | null | Guest-list door hint. null on checkout orders. |
total.amount |
string | Order total as decimal string. |
total.currency |
string | ISO 4217 code. |
fees.buyer_platform_fee |
string | Snapshotted Usetix fee the buyer paid. "0.00" when the organizer absorbed it. Retained on organizer-initiated refunds, but returned when a captured sale cannot be fulfilled. |
fees.custom |
string | Snapshotted extra checkout fee. Organizer revenue; refundable with the rest of the order. |
payment_provider |
string | stripe or paypal. |
archived |
boolean | true once the order has been archived. Archived orders are excluded from the default index. |
paid_at |
string | null | ISO 8601 UTC. null if status is no longer paid. |
created_at |
string | ISO 8601 UTC. When the order was first opened. |
item_count |
integer | Number of ticket admissions in the order. Kept for compatibility; vouchers and future non-ticket products are not included. |
line_count |
integer | Number of commercial product lines. Guest-list and legacy orders may return 0. |
product_quantity |
integer | Sum of line quantities, falling back to item_count for legacy orders. A group-ticket bundle counts as one product even when it fulfills several admissions. |
attribution |
object | Marketing attribution captured at checkout. Always present; {} if the buyer arrived with no tracking parameters. See Attribution. |
lines[].public_id |
string | Stable public ID of the snapshotted commercial line. |
lines[].product_id |
string | null | Stable catalog product ID. null only for a historical line whose product was deleted before the catalog migration. |
lines[].product_type |
string | Domain kind such as ticket or voucher. New product kinds extend this field without changing the line contract. |
lines[].name |
string | Product name snapshotted at checkout. |
lines[].description |
string | null | Product context snapshotted at checkout, such as the event title. |
lines[].quantity |
integer | Purchased product units or bundles. |
lines[].unit_price, lines[].subtotal, lines[].discount, lines[].total |
money object | Snapshotted commercial amounts with decimal amount and ISO currency. total includes checkout fees allocated to the line and, for tax-exclusive shops, that line’s tax. |
lines[].tax |
object | Snapshotted rate, amount, and currency. Voucher stored value uses rate 0; tax is charged when the voucher buys the eventual goods or admission. |
lines[].fulfilled_at |
string | null | ISO 8601 UTC timestamp after admissions or voucher issuance completed. |
lines[].voucher_purchase |
object | omitted | Present on voucher lines. Contains purchase ID, state, voucher credit, paid amount, promotional bonus amount, recipient name/email, delivery_mode (self_managed, email_now, or email_scheduled), optional scheduled_for, delivered_at, and the issued voucher public ID. It never exposes the bearer voucher code. |
items[].public_id |
string | Public ID of the order item (one per ticket). Used in scanner URLs and as the canonical queued-sync identifier. |
items[].check_in_code |
string | Human-readable ticket check-in code. Safe to show to staff and customers. |
items[].display_check_in_code |
string | Formatted check-in code for UI, typically grouped as XXXX-XXXX. |
items[].ticket_title |
string | Title of the ticket type at time of purchase. |
items[].attendee_name |
string | null | Door display name. On guest list this is the lead or “Guest of …” companion name. |
items[].place_label |
string | null | Numbered or standing label when the admission holds a place. |
items[].place_snapshot |
object | Present only when a place snapshot exists. |
items[].event_id |
integer | Internal ID of the event this ticket belongs to. |
items[].event_slug |
string | Slug of the event. Useful for linking. |
items[].redeemed |
boolean | true once the QR code has been scanned at the door. |
items[].redeemed_at |
string | null | ISO 8601 UTC. null if not yet redeemed. |
items[].admission_status |
string | active, cancelled, refund_pending, or refund_failed_reactivated. |
items[].admission_cancellation_status |
string | null | Underlying cancellation record status, when present. |
items[].blocked_reason |
string | null | Why redemption is currently blocked. |
Attribution
The attribution object captures where the buyer came from. UTM parameters and ref are read from the checkout page’s URL, and as a fallback the previous page’s URL via the Referer header, at the moment the buyer submits the order. There is no client-side persistence: the data only travels with the form submission itself. Practically this means last-click attribution: the source that delivered the buyer to the checkout page is what’s recorded.
| Field | Type | Notes |
|---|---|---|
utm_source |
string | omitted | e.g. "google", "facebook", "newsletter". |
utm_medium |
string | omitted | e.g. "cpc", "email", "social". |
utm_campaign |
string | omitted | Campaign name as set in the URL. |
utm_term |
string | omitted | Paid keyword, when supplied. |
utm_content |
string | omitted | Ad / creative variant, when supplied. |
ref |
string | omitted | Free-form referral code. Usetix’s own shop footer links append ref=shop:<subdomain> when a buyer clicks through to the marketing site, so signups originating from a specific shop carry that source. |
Only fields that were actually captured are included. Buyers who arrive with no tracking parameters get "attribution": {}.