Money and volume
Search quota
Searching costs us money at the supplier, so your terms carry a free daily allowance and a price beyond it. The counter runs today and every authenticated response tells you where you stand; the invoice line does not exist yet. This page says exactly which calls are counted, because the rule has edges.
The allowance
What counts as a search
The intent is that a call is billable when it costs us a supplier call. The implementation is a fixed list of routes, and two edges differ from the intent — both are named below rather than left for you to discover on an invoice.
A PATCH counts when it changes one of checkIn, checkOut, destination, latitude, longitude, adults, children, childrenAges, rooms or currency. Everything else — sort, limit, board, starMin, amenities, budgetMaxPerNight — is free.
Two edges worth knowing
- A retried search is counted again. The counter sits outside the idempotency store, so a
POST …/searchesreplayed from a stored response is counted even though no supplier was contacted. Retrying after a timeout is still the right thing to do — just do not treat it as free. - Some refinements reach the supplier without being counted. A
PATCHalways issues an upstream request, butradiusKm,nearPoiandareaHintare not on the billable list, so changing only those is free. The list is an allow list on purpose: when in doubt, you are not charged.
Quota headers
Four headers, on every response of an authenticated route once the request is past the guards. They are not on public routes such as /v1/ping, and not on a 401, 403 or 429 raised before the request reached the quota layer — their absence there is normal, not a broken proxy.
X-Search-Quota-Limit: 1000
X-Search-Quota-Remaining: 412
X-Search-Quota-Reset: 2026-08-29T16:00:00.418Z
X-Search-Billable: trueNote the reset instant: it is the next Singapore midnight, which is 16:00Z on the previous UTC date. Code that assumes the reset always ends in 00:00:00Z, or that derives the quota day by truncating it in UTC, gets the wrong day for every account outside UTC.
You can also just ask — GET /v1/account/quota
The headers only appear on a call you were making anyway, which is awkward for a dashboard or an alert. GET /v1/account/quota is the same live counter as a normal response: day, timezone, limit, used, remaining, reset, hardCap and rejected — the last being how many searches your hard cap turned away today.
Reading it is free and does not count against the allowance, so it is safe to poll. It needs the account:read scope. It is also the most reliable way to find out which time zone your day is keyed to, because it returns that zone by name.
Reconcile against X-Search-Quota-Remaining or the remaining field, which is the counter itself, rather than by summing X-Search-Billable. If you use the TypeScript SDK, readQuota() surfaces the remaining free searches as freeSearchesRemaining; the other three headers are on the raw response.
Running out
Nothing switches off. Exhausting the allowance moves you onto the per-search price in your contract; it never turns a live search into an error, because a traveller mid-booking is a bad place to discover a budget.
- If you would rather be stopped than billed, ask your Vacabee contact to set a daily hard cap on your terms. It is not a self-service setting — the portal shows your terms read-only and has no field for it, and the message on the
429that says otherwise is wrong. Once your counter is past the cap, further billable searches are refused until the reset; because the check runs against the counter as it stood before the current call, one search still gets through at the boundary. - That rejection arrives as
429typedsearch_quota_exceeded, with a message naming your ceiling and aresetAtin the error details. Branch on thetype: the per-minute limiter is a429too, but typedrate_limit_exceeded. There is noRetry-Afteron the daily one, and there is nothing useful to wait for in seconds — honourresetAtinstead, or stop until the next boundary. Its message ends “You can change it in the partner portal” — as above, you cannot. - Watch it yourself — poll
GET /v1/account/quota, or read the headers on traffic you are sending anyway. There is no notification: thesearch_quota.thresholdwebhook is in the event catalog but nothing publishes it, and no page in the portal shows your consumption. See webhooks for the full list of events that are declared and silent. - Cache on your side. Reading a search back is free, and so is re-sorting, so a results page that re-reads an existing search costs nothing — a fresh query, a load-more and a rate lookup are what count.
Look-to-book

