Booking lifecycle
pending_payment ─▶ ticketing ─▶ ticketed ─▶ cancelled ─▶ refunded
│ │
▼ ├─▶ failed
failed └─▶ ticketing_pending ─▶ ticketed / failed / cancelled
| Status | Meaning | Your money |
|---|---|---|
ticketing |
Seat reserved, ticket being issued | Held |
ticketed |
Ticket issued. ticket_numbers filled |
Paid to the airline |
failed |
Declined or not possible. failure.code says why |
Returned |
ticketing_pending |
The airline hasn't confirmed yet. We keep asking and never issue twice | Still held |
cancelled / refunded |
Cancelled; refund is what came back |
Refunded per fare rules |
Why ticketing_pending exists#
If the airline times out after you asked it to issue a ticket, the ticket may or may not exist. We ask the airline what happened before trying anything else. If it still can't tell us, the booking waits in ticketing_pending with your money held, and we keep checking until the airline's ticketing time limit. Then it either becomes ticketed or failed with the money released. You are never charged twice.
Learning the outcome#
Subscribe to webhooks (booking.ticketed, booking.failed, …) or poll GET /bookings/{id}.
Cancelling#
POST /bookings/{id}/cancel follows the fare rules. A cancellation on the day of issue is a void: the fare and our service fee come back. Later, the airline's refund comes back and the service fee is kept. Repeating the call is safe.