Tickets are generated automatically when an order completes. Each ticket represents a single entry for one attendee.
Ticket Statuses
| Status | Meaning |
|---|---|
ACTIVE | Valid for entry |
REDEEMED | Checked in (scanned at entry) |
CANCELLED | Voided (e.g. after a refund) |
ACTIVE → REDEEMED (check-in scan)
REDEEMED → ACTIVE (check-out scan)
ACTIVE or REDEEMED → CANCELLED (refund or manual cancellation)
Listing Tickets
Fetch tickets for an order, event, or customer. At least one filter is required.
const { tickets } = await client.ticket.list({
orderId: 'ord_01jps5cgsfgve5b5g2666kyryh',
});
curl "https://api.session.services/tickets?orderId=ord_01jps5cgsfgve5b5g2666kyryh" \
-H "x-tenant-id: tnt_01jqpj2t2kfvmstt6f6tzkbaf2" \
-H "Authorization: Bearer <token>"
Filters
| Parameter | Type | Description |
|---|---|---|
orderId | string | Tickets belonging to a specific order |
eventId | string | All tickets for an event |
customerId | string | All tickets purchased by a customer |
promoterId | string | All tickets for a promoter’s events |
status | string | Filter by status: ACTIVE, REDEEMED, or CANCELLED |
query | string | Text search on attendee name, email, or phone |
limit | number | Results per page (1–100, default 20) |
cursor | string | Pagination cursor from a previous response |
Public Access with Order Signature
Customers can view their own tickets without authentication by using the
orderSignature from the order:
const { tickets } = await client.ticket.list({
orderId: 'ord_01jps5cgsfgve5b5g2666kyryh',
orderSignature: 'abc123def456',
});
This is useful for building order confirmation pages where the customer isn’t logged in.
Fetching a Single Ticket
const { ticket } = await client.ticket.get({ id: 'tkt_01jps5cgsg0s32w2pr73vbccde' });
Ticket Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique ticket ID |
status | string | ACTIVE, REDEEMED, or CANCELLED |
orderId | string | Parent order |
eventId | string | Associated event |
admissionId | string | Ticket tier (e.g. General, VIP) |
attendee | object | { firstName, lastName, email, phone? } |
event | object | Snapshot of event details (name, date, venue) |
admission | object | Snapshot of tier details (name, price) |
section | object | Section details (if applicable) |
scans | array | History of check-in / check-out scans |
createdAt | string | ISO 8601 timestamp |
Scanning Tickets
Use the scan endpoint to check attendees in or out. Requires the SCANNING
permission.
Check In
const { ticket } = await client.ticket.scan({
id: 'tkt_01jps5cgsg0s32w2pr73vbccde',
kind: 'CHECK_IN',
deviceId: 'device_001', // optional — identifies the scanning device
});
// ticket.status is now "REDEEMED"
// ticket.scans includes the new scan record
Check Out
Reverses a check-in, returning the ticket to ACTIVE:
const { ticket } = await client.ticket.scan({
id: 'tkt_01jps5cgsg0s32w2pr73vbccde',
kind: 'CHECK_OUT',
});
Scan Record
Each scan is recorded in the ticket’s scans array:
{
"id": "scan_789",
"kind": "CHECK_IN",
"scannedAt": "2025-03-15T19:30:00Z",
"scannedById": "usr_01jps5cgsd4tzjghtnt45qnhn0",
"deviceId": "device_001"
}
Scan Validation
The API enforces these rules:
| Scenario | Result |
|---|---|
Scan CHECK_IN on ACTIVE | Ticket → REDEEMED |
Scan CHECK_IN on REDEEMED | Error — already checked in |
Scan CHECK_IN on CANCELLED | Error — ticket cancelled |
Scan CHECK_OUT on REDEEMED | Ticket → ACTIVE |
Scan CHECK_OUT on ACTIVE | Error — not checked in |
Updating a Ticket
Update the attendee details or change the admission tier:
const { ticket } = await client.ticket.update({
id: 'tkt_01jps5cgsg0s32w2pr73vbccde',
attendee: {
firstName: 'Jane',
lastName: 'Smith',
email: 'test@session.services',
},
});
Updatable Fields
| Field | Type | Description |
|---|---|---|
status | string | Set to ACTIVE or CANCELLED |
attendee | object | Update attendee name, email, or phone |
admissionId | string | Move ticket to a different admission tier |
Creating Tickets Manually
Tickets are normally created automatically when an order completes. For comped tickets or manual issuance, use the create endpoint:
const { ticket } = await client.ticket.create({
orderId: 'ord_01jps5cgsfgve5b5g2666kyryh',
customerId: 'cus_01jps5cgsf4pn2a32eamppnap1',
admissionId: 'adm_01jps5cgsee0xvapbk92e8eb4g',
status: 'ACTIVE',
attendee: {
firstName: 'Jane',
lastName: 'Doe',
email: 'test@session.services',
},
});
Requires the ORDER permission.