redeemers[].products[].bookings[] carries a bookingDetailTypeName. Most bookings are "Manual" — a specific service on a specific date. Voucher-style products use "Open Dated" — a redeemable ticket with no service date.
Which shape does this fare use?
Only honour the Open-Dated shape when ALL of these hold on the fareprice you’re booking:product.apiProviderId === 0— no external booking provider in the loopfare.bookingSystemisnullor empty — not a live-bookable workflow (Respaxv2 / IBIS / CustomLinc / Fareharbor / Rezdy / etc.). See Booking system workflows for the fullbookingSystem→ workflow reference table.fare.allowOpenDated === true
allowOpenDated: true in the product feed. Those are NOT candidates for Open-Dated ordering — the flag reflects that the fare could be sold that way, not that it currently should be. Ignore allowOpenDated unless the compound gate above passes.
Manual (default)
Send bothbookingDetailTypeName and travelDate. This is the shape for anything with a specific service date.
Open Dated
SendbookingDetailTypeName: "Open Dated" and omit travelDate. Also omit timeId and pickupId — voucher-style products don’t have per-service schedules to lock.
Notes
/apiv1/bookingdetails/{productPricesDetailsId}returns HTTP 400 with"This fare price does not support live availability."for Open-Dated fares. Don’t call it; there’s nothing to configure./apiv1/checkavailabilityrange/{ppdid}/…will also 4xx for Open-Dated fares. The voucher isn’t tied to a date, so there’s no availability to probe.- The compound eligibility check is a write-time gate for our systems — store the effective flag, not the raw one, so downstream code has a single source of truth.