Skip to content

Tickets

List tickets, check attendees in, and manage ticket lifecycle.

Tickets are generated automatically when an order completes. Each ticket represents a single entry for one attendee.

Ticket Statuses

StatusMeaning
ACTIVEValid for entry
REDEEMEDChecked in (scanned at entry)
CANCELLEDVoided (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

ParameterTypeDescription
orderIdstringTickets belonging to a specific order
eventIdstringAll tickets for an event
customerIdstringAll tickets purchased by a customer
promoterIdstringAll tickets for a promoter’s events
statusstringFilter by status: ACTIVE, REDEEMED, or CANCELLED
querystringText search on attendee name, email, or phone
limitnumberResults per page (1–100, default 20)
cursorstringPagination 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

FieldTypeDescription
idstringUnique ticket ID
statusstringACTIVE, REDEEMED, or CANCELLED
orderIdstringParent order
eventIdstringAssociated event
admissionIdstringTicket tier (e.g. General, VIP)
attendeeobject{ firstName, lastName, email, phone? }
eventobjectSnapshot of event details (name, date, venue)
admissionobjectSnapshot of tier details (name, price)
sectionobjectSection details (if applicable)
scansarrayHistory of check-in / check-out scans
createdAtstringISO 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:

ScenarioResult
Scan CHECK_IN on ACTIVETicket → REDEEMED
Scan CHECK_IN on REDEEMEDError — already checked in
Scan CHECK_IN on CANCELLEDError — ticket cancelled
Scan CHECK_OUT on REDEEMEDTicket → ACTIVE
Scan CHECK_OUT on ACTIVEError — 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

FieldTypeDescription
statusstringSet to ACTIVE or CANCELLED
attendeeobjectUpdate attendee name, email, or phone
admissionIdstringMove 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.