Sandbox notice
How sandbox works, supplier sandbox limitations, and what to expect during testing.
Sandbox API keys (fxp_test_...) connect to the sandbox environments of our underlying
suppliers (Amadeus test, Duffel test, Airalo sandbox, etc.).
Supplier sandbox environments are not under FX-Port's control. They may experience brief outages for maintenance, and some flights or airlines may return errors during pricing or booking that would not occur on live. This is a known limitation of third-party sandbox environments — it often works correctly on live even when sandbox fails.
What sandbox does
| Behaviour | Detail |
|---|---|
| No real balance debit | All financial operations are skipped. Sandbox bookings do not charge your balance. |
| Realistic but synthetic inventory | Flight offers are real data structures but use test fares. Not all routes are available. |
| Balance endpoints return empty | GET /api/v1/balances returns [] in sandbox. This is expected. |
| Webhooks are sent | Sandbox webhooks fire to the sandbox webhook URL you configure. |
Common sandbox quirks
- Duffel sandbox: offer inventory is randomised and changes frequently. An offer available in search may expire by the time you price it. This is normal — retry with a fresh search.
- Amadeus test: some airline codes or routes may reject at the booking step even though they
appeared in search results. Try a different route (e.g.
ALG → ORN) if you hit repeated errors. - Outages: if a supplier's sandbox is down, FX-Port will still respond but the supplier's
entry in the response will have
success: false. Wait and retry.
Testing checklist
Before switching to live keys, verify in sandbox:
- Search — your search request structure is accepted and returns offers
- Price — re-pricing a cached offer works and pricing fields match your expectations
- Book (issue) — instant booking completes and returns a PNR and e-ticket
- Book (hold) — hold booking creates a reservation with
status: awaiting_payment - Pay —
pay_orderwith the held reservation'sorder_idsucceeds - Get booking —
get_bookingreturns the full booking includingbucket_link(PDF) once generated - Cancel a hold —
cancel_orderreleases an unpaid held PNR. Issued-ticket void, exchange, re-issue, and refund remain manual support operations.