FX-Port API

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

BehaviourDetail
No real balance debitAll financial operations are skipped. Sandbox bookings do not charge your balance.
Realistic but synthetic inventoryFlight offers are real data structures but use test fares. Not all routes are available.
Balance endpoints return emptyGET /api/v1/balances returns [] in sandbox. This is expected.
Webhooks are sentSandbox 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:

  1. Search — your search request structure is accepted and returns offers
  2. Price — re-pricing a cached offer works and pricing fields match your expectations
  3. Book (issue) — instant booking completes and returns a PNR and e-ticket
  4. Book (hold) — hold booking creates a reservation with status: awaiting_payment
  5. Paypay_order with the held reservation's order_id succeeds
  6. Get bookingget_booking returns the full booking including bucket_link (PDF) once generated
  7. Cancel a holdcancel_order releases an unpaid held PNR. Issued-ticket void, exchange, re-issue, and refund remain manual support operations.

On this page