Skip to content

Ordering Workflow

This guide covers the full ordering workflow where your application controls the entire checkout experience through Atom’s API — seat selection, payment, order management, and ticket delivery.

Ordering Workflow


This workflow assumes you’ve already identified a showtime using the Discovery flow (venue search + showtime lookup). You’ll need:

  • A valid showtimeId from the Showtimes API
  • Your x-api-key for all requests
  • Product and offer IDs from the Checkout Refresh response

Generate a unique clientRequestId (e.g., UUID) at the start of each checkout flow. Use the same value across these three calls:

  1. Lease Inventory (Step 4)
  2. Preview Order (Step 5)
  3. Create Order (Step 6)

Only rotate to a new clientRequestId after reaching a terminal state — order confirmed, order failed, or timeout. Reusing a clientRequestId from a previous flow will return a DUPLICATE_CLIENT_REQUEST_ID error.


Fetch available ticket types, pricing, promotions, and survey details for the selected showtime.

Endpoint: POST /ordering/v2/aggregation/checkout/refresh

FieldTypeDescription
showtimeIdStringShowtime to check out
promotionsList[String]Promotion codes to apply
includeAreaCategoryBooleanInclude seating area categories

Key response fields:

  • showtimesResponse.products[] — available ticket types with productId, offerId, and price
  • maxTicketQuantity — maximum tickets per transaction
  • surveyDetailResponse — age verification or other required surveys
  • agePolicyLink — age restriction policy URL

Use the productId and offerId values in subsequent steps.

Full reference: Ordering API — Checkout Refresh | Example


For reserved seating venues, retrieve the auditorium map so users can pick their seats.

Endpoint: GET /ordering/v1/discovery/auditoriums?showtimeId={showtimeId}&tickets={count}

ParameterDescription
showtimeIdFrom Step 1
ticketsNumber of tickets the user wants

Key response fields:

  • layoutArea.rows[] — row-by-row seat layout with seatId, status (available/occupied), and seatType
  • recommendedSeats — Atom’s suggested best-available seats
  • legend — seat type color coding (standard, premium, etc.)
  • numAvailable — total available seats

Full reference: Ordering API — Get Seat Layout | Example


Before reserving seats, you need an auth token. Choose one path:

Endpoint: POST /ordering/v1/customer/account/guest

FieldTypeDescription
emailStringGuest’s email
firstNameStringFirst name
lastNameStringLast name
attributionMapMap[String, String]Partner tracking info

Returns authToken and accountId. Set isGuestOrder: true in Steps 5 and 6.

Endpoint: POST /ordering/v1/customer/account/authenticate

FieldTypeDescription
identityValueStringUser’s email
passwordStringUser’s password

Returns token, accountId, atomToken, and privateKey for request signing.

From this point forward, all requests require these headers in addition to x-api-key:

HeaderDescription
X-Atom-TimestampCurrent time as ISO 8601 with UTC timezone
X-Atom-AuthTokenToken from authentication response
X-Atom-DeviceSignatureGenerated from device information
X-Atom-SignatureGenerated from request parts + auth info
X-Atom-DeviceIdDevice identifier (does not need to be unique)
X-Atom-AdIdAd serving identifier (does not need to be unique)

Full reference: Ordering API — Guest Account | Ordering API — Authenticate | Authentication Guide


Temporarily lock the selected seats while the user completes checkout. The lease holds seats for a limited time (typically 10 minutes).

Endpoint: POST /ordering/v1/inventory/lease

FieldTypeDescription
clientRequestIdStringUnique ID for this checkout flow (keep for Steps 5-6)
leaseItemsListArray of seat selections

Each leaseItem contains:

FieldTypeDescription
productIdStringFrom Checkout Refresh products
offerIdStringFrom Checkout Refresh offers
seatIdsSet[String]Selected seat IDs from layout

The response returns leaseDurationSeconds — your countdown timer. If the lease expires before the order is placed, the seats are released and you must start over.

Full reference: Ordering API — Lease Inventory | Example


Validate the full order with final pricing before committing. This step does not charge the user.

Endpoint: POST /ordering/v2/customer/orders/preview

The request body wraps an orderParameters object:

FieldTypeDescription
lineItemsListProducts and quantities
channelString"Partner"
clientVersionStringYour app version
clientRequestIdStringSame as Step 4
isGuestOrderBooleantrue if guest account (Step 3A)
paymentProcessorString"PartnerPay" if you handle payment
associateTagsMap[String, String]Partner identification (e.g., "affiliateName": "fever")

Key response fields:

  • receipt.subtotal — ticket prices before fees
  • receipt.serviceFee — Atom service fee
  • receipt.tax — applicable tax
  • receipt.totalAmountfinal amount to charge the user
  • autoAddedItems — any automatically added items (e.g., convenience fees)

Display the receipt breakdown to the user for confirmation before proceeding.

Full reference: Ordering API — Preview Order | Example


Commit the order. Payment is captured and tickets are issued.

Endpoint: POST /ordering/v1/customer/orders

The request body is identical to Step 5 — same orderParameters with the same clientRequestId.

Response:

FieldDescription
orderIdUnique order identifier
eventIdEvent tracking identifier

Save the orderId — you’ll need it for all subsequent calls.

Full reference: Ordering API — Create Order | Example


Poll the order status endpoint until the order is fulfilled by the vendor.

Endpoint: GET /ordering/v1/customer/orders/{orderId}/status

Recommended polling strategy:

  • Poll every 2 seconds
  • Timeout after 10 seconds
  • If timeout is reached, treat as a potential failure and show an appropriate message
StatusMeaningNext action
fulfilledTickets issued by vendorProceed to Step 8
failedOrder could not be completedShow error, check reason
(no change)Still processingContinue polling

Failure reason codes:

CodeMeaning
SEAT_UNAVAILABLESelected seats were taken
INVENTORY_UNAVAILABLENo inventory available
FRAUD_DETECTEDTransaction flagged as fraudulent
INVALID_CREDIT_CARD_NUMBERPayment card issue
PROCESSOR_DECLINEDPayment processor declined the transaction
GENERIC_ERRORUnspecified error

Full reference: Ordering API — Poll Order Status | Example


Once the status is fulfilled, retrieve the complete order details including ticket barcodes and QR codes.

Endpoint: GET /ordering/v2/customer/orders/{orderId}/summary

Key response fields:

  • tickets[] — array of individual tickets, each with:
    • seatLabel — seat number for display
    • ticketType — ticket category (Adult, Child, etc.)
    • vendorQrCodeDataprimary QR code data for theater entry
    • vendorBookingId — fallback identifier if QR data is unavailable
  • venueInfo — theater name and address
  • showtime — start time, auditorium, screen type
  • receipt — final pricing breakdown

Full reference: Ordering API — Get Order Summary | Example


Cancel a confirmed order if the showtime hasn’t passed yet.

Endpoint: DELETE /v1/customer/orders/{orderId}

No request body is needed — the orderId is in the URL path.

Response:

FieldDescription
cancellationStatus"cancelled" on success
refundAmountAmount refunded to the user
cancellationReasonReason description

Cancellation error codes:

CodeMeaning
ORDER_NOT_FOUNDInvalid order ID
ORDER_NOT_CANCELLABLEOrder state doesn’t allow cancellation
CANCELLATION_WINDOW_EXPIREDShowtime has passed
REFUND_PROCESSING_ERRORRefund could not be processed

Full reference: Ordering API — Cancel Order | Example


StepActionEndpointAuth requiredKey output
1Checkout RefreshPOST .../checkout/refreshAPI key onlyProducts, pricing
2Seat LayoutGET .../auditoriumsAPI key onlySeat map
3AuthenticatePOST .../account/guest or .../authenticateAPI key onlyAuth token
4Lease InventoryPOST .../inventory/leaseFull authSeat reservation
5Preview OrderPOST .../orders/previewFull authFinal receipt
6Create OrderPOST .../customer/ordersFull authorderId
7Poll StatusGET .../orders/{id}/statusFull authFulfillment status
8Order SummaryGET .../orders/{id}/summaryFull authTickets + QR codes
9Cancel (optional)DELETE /v1/customer/orders/{id}Full authRefund confirmation

Related pages: Ordering API Reference | Ordering Models | Ordering Examples