Skip to content
FX-Port/Docs
GuidesAPI referenceChangelog
Get API keys
  • Introduction
  • Quickstart
  • Security
  • Authentication
  • Environments and Postman
  • Sandbox
  • Conventions and naming
  • Legacy names and twins
  • Errors
  • Rate limits and fair use
  • Streaming search results
  • Use these docs with AI

API fundamentals

Rate limits and fair use

How many requests a key may send, what a 429 means, which requests are refused early and how to back off.

FX-Port limits how fast a key can call the API, so that one runaway loop or one abusive client cannot slow everybody else down. The limits are far above what an interactive application needs. This page says what they are, what you get when you reach one, which requests are refused before they cost anything, and how to stay comfortably below them.

Limits per key

Every API key has a counter per minute (the minute of the clock, not a sliding window) for each of three groups of endpoints. Sandbox keys have the same counters as live keys.

GroupLimit per minuteEndpoints
Search and pricing6,000Flight searches (get_flights, flexible_search), price_flight, hotel search, rates and hotel content (search_advanced, get_rates, get_hotel_info, hotels/search, hotels/details)
Booking1,200Everything that creates, pays or cancels: book_flight, pay_order, cancel_order, confirm_cancel, hotel pre_book, book_hotel, cancel_hotel, eSIM orders and topups
Everything else6,000Reading a booking (get_booking, get_ticket, ACD documents, GET /bookings/{id}, hotel vouchers), eSIM catalogue, usage, instructions and bookings, balances, history, suppliers, location and name lookups

The counter belongs to the key, not to the agency or the IP address: two keys of one agency count separately. A request that is refused for another reason (a malformed body, for example) still counts, so a client that loops on a bad request burns its own budget.

Heavy endpoints have a second, tighter protection

A search costs a supplier real work, so searches and hotel name searches are also limited by how many run at the same time and by short bursts. These ceilings sit well above what a user-driven application produces, and they protect the suppliers (and your other calls) from a loop that fires thousands of searches at once.

Kind of callPer minuteBurstAt the same time
Flight search (flexible_search counts twice)3006012
Hotel search and hotel content (search_advanced, hotels/search, hotels/details)180408
Hotel name search (a call counts three times)120203
Price, rates and hotel info (price_flight, get_rates, get_hotel_info)3,00045048
Booking calls60010020
Reading a booking, voucher or ticket1,20020016
ACD passport upload30103
  • Sandbox keys get a quarter of every number in this table.
  • All the keys of an agency together get three times the numbers of one key.
  • A key can keep 4 streams (stream=true) open at the same time.
  • A call that has to wait for a free slot waits up to two seconds inside the API before it is refused with concurrency_limit_exceeded.

At the release of 2026-11-01 these ceilings run in observation mode: they are counted but not enforced, so nothing is refused because of them yet. We announce in the changelog before they are enforced. Whatever the numbers, the ratelimit-* headers of every response show the limit that applies to your request: treat them as the authority, and build your client to back off on a 429.

When you reach a limit

The API answers 429 with an error code that says which limit, and tells you when to come back:

CodeMeaning
rate_limit_exceededYou used the per-minute budget of the group.
concurrency_limit_exceededToo many calls of this kind were running at the same time.
auth_rate_limitedToo many requests with a missing or invalid key came from your IP address. Calls with a valid key are never affected.

A 503 with service_overloaded or supplier_busy means the service or a supplier is shedding load for a moment: the answer is the same, wait and retry.

HTTP/1.1 429 Too Many Requests
Retry-After: 17
ratelimit-limit: 6000
ratelimit-remaining: 0
ratelimit-reset: Sun, 01 Nov 2026 15:20:00 GMT
ratelimit-policy: 6000;w=60
x-fx-limit-class: flight_search
{
  "environment": "live",
  "success": false,
  "errors": [
    {
      "code": "rate_limit_exceeded",
      "type": "rate_limit_error",
      "title": "Rate limit exceeded",
      "message": "Too many requests hit the API too quickly. Retry after the number of seconds in the Retry-After header.",
      "field": null,
      "details": { "retry_after": 17 },
      "documentation_url": "https://fx-port.com/docs/errors#rate_limit_exceeded"
    }
  ],
  "meta": { "request_id": "req_8f3a9c1d2e4b", "status": 429 },
  "request_id": "req_8f3a9c1d2e4b"
}
HeaderMeaning
Retry-AfterSeconds to wait before the next call.
ratelimit-limitThe limit of the group the request belongs to.
ratelimit-remainingCalls left in the current minute.
ratelimit-resetWhen the counter restarts, as an HTTP date.
ratelimit-policyThe policy that applies, as <limit>;w=<seconds> (for example 6000;w=60).
x-fx-limit-classThe kind of call the request was counted as: flight_search, hotel_search, hotel_name, price, booking, read, suggest ...

The ratelimit-* headers are on every response of a key, not only on a 429, so you can slow down before you are refused. Wait for Retry-After, then retry with exponential backoff and jitter (see Errors).

Refused before they cost anything

Some requests never reach a supplier, so they cost neither you nor us anything:

  • Malformed input. A wrong airport code, an impossible or out-of-range date, an absurd passenger count, an unknown enum value or a body that is not a JSON object is answered with 400 and a stable code (see Errors) before any supplier is called, and it does not count as a supplier failure.
  • Oversized bodies. A search or price request may be up to 64 KB, any other JSON request up to 256 KB, an ACD upload up to 26 MB (10 MiB per file). Larger bodies get 413 request_too_large before they are read.
  • A key that is not a key. A key that does not have the shape of an FX-Port key (fxp_live_ or fxp_test_ followed by 16 to 64 letters and digits, 80 characters at most) is refused at once with 401 invalid_api_key_format, without a lookup.
  • Repeated bad authentication. Requests with an unknown or malformed key are limited per IP address (30 a minute, a burst of 20). After repeated failures that address is blocked for a minute, then for longer if it continues, up to an hour. Requests with a valid key are never affected, even from the same address: an office behind one address is safe.

The typeaheads

The airport and destination lookups need no key, so they are limited per IP address instead (1,200 a minute, a burst of 300). They answer Cache-Control: public, max-age=60: let your browser or your CDN cache them, and debounce your input.

Stay comfortably below the limits

DoWhy
Cache what does not change: airports, suppliers, hotel content, eSIM packages (a few MB per country list: cache them for an hour)They are the biggest part of most integrations' traffic.
Reuse a search for a few seconds when several users ask for the same route and datesOffers do not change from one second to the next, and every search costs a supplier call. The API also merges identical searches that run at the same moment, but your own cache is faster.
Search in parallel with a small cap: five at a time is plenty; do not fan out one search per day of a monthParallel searches multiply supplier load. For a date range use flexible search.
Use streaming for a search pageThe first offers arrive in about two seconds instead of after the slowest supplier (Streaming).
Debounce typeahead (airports, hotel locations) at about 300 ms and cancel the previous requestThe lookups are limited per IP address too.
Poll a booking every 2 seconds at most, and stop when it is confirmedHotel bookings confirm in 4 to 14 seconds.
Ask for gzip (Accept-Encoding: gzip)Flight searches are 0.7 to 14 MB of JSON; compression makes them 5 to 10 times smaller.
Back off on every 429 and 5xxA client that retries immediately makes the situation worse for itself.
Use mini hotel data for listsA result list does not need the full hotel document: see Hotel data.

If you plan a load test or a bulk job, tell us at [email protected] first. Sandbox keys have a quarter of the heavy-endpoint ceilings, and the suppliers' test systems are small.

Related limits

LimitValue
Hotel stay1 to 30 nights, check-in from yesterday up to 400 days ahead
Flight datesFrom yesterday up to 365 days ahead
Passengers9 seated passengers in total, lap infants not more than adults, ages 0 to 17 for children
Hotel ids in one content request200
Hotel rooms in one search9
ACD upload10 MiB per file, 25 MiB per request

The limits of each endpoint are in its page and in the API reference.

PreviousErrorsNext Streaming search results

On this page

  • Limits per key
  • Heavy endpoints have a second, tighter protection
  • When you reach a limit
  • Refused before they cost anything
  • The typeaheads
  • Stay comfortably below the limits
  • Related limits

© 2026 FX-Port

TermsPrivacy[email protected]