429 rate_limited with a Retry-After header once you spend the minute’s or the day’s
requests. Every call counts, charged or not. The monthly credit allowance answers 403 quota_exceeded once you
spend it, until the billing period resets. On Growth and Scale, that answer comes once you reach the overage ceiling
instead.
Plans and limits has the numbers per plan and what a credit is.
Handle a 429
Retry-After seconds, then retry. Do not retry immediately, and do not spread the same work across more keys.
429 is the only status where a plain retry of the identical request is correct. For every other status, read
Errors first.
Every charged response carries
X-Credits-Charged, what it cost, and X-Credits-Remaining, the balance after it.
The balance is recent to within a minute. The console’s Keys and usage page shows the period’s usage. A client that
needs to pace its requests by the minute keeps its own count against the numbers on
Plans and limits.Stay under the limits
- Cache on
dataset_version. Every response carries it inmeta.coverage[], and it changes only when Investorlift rebuilds the tables. A cache keyed on it stays inside the cache window. Keep an entry for at most 30 days, and drop it within a business day of a version change. Check the current version at least once a business day withGET /v1/dataset, which the API does not meter, or with theX-Dataset-Versionheader. See Coverage and freshness. - Ask for one page of what you will show.
limit=20behind a drawer costs at most 20 credits, where 100 rows you do not use can cost 100. A deal, investor or parcel your account already holds costs nothing again while the plan has credit. See Plans and limits. - Use the summary instead of a count.
/v1/deals/summarygives the count in one call. A count that pages through every deal costs more. - Use cells for the map.
/v1/deals/cellsreturns counts per hexagon instead of thousands of deal rows, and it costs no credits. Every page of deals costs one credit per deal new to your account.
Under load
Two more statuses come from the service, not from your budget:503 pool_saturatedwithRetry-After: 1. The service is at capacity and did not run your query. Retry in one second.504 statement_timeout. Your query passed the 10-second limit. A retry will not help. Narrow the radius or add filters.503 ledger_unavailablewithRetry-After: 5. The service did not reach the credit ledger. It charged nothing and served nothing. Retry after that time.
The CSV export
The one export on this host, the CSV of a lender’s loans, has a budget of its own beside the plan’s limits. The budget is 12 exports a minute and one in flight at a time. The service counts each per developer: your account alone, never the plan or the host as a whole. So another developer’s export never holds yours. Past either limit, the answer is429 rate_limited with Retry-After, as above.
Partners and staff
Investorlift staff and contracted partners reach the internal host on the company network with agm_ key. That host
has no plan and no monthly allowance, and its limits are per minute and per bucket. More than one bucket can count a
request. The first bucket to reach zero returns 429 rate_limited with Retry-After and a retry_after field in the
body. Every response the limiter counted carries the x-ratelimit-limit, x-ratelimit-remaining and
x-ratelimit-reset headers, but the 503 pool_saturated that the in-flight cap answers before the count carries none.
Those three headers never appear on api.investorlift.com.
The key bucket is the one you will meet. The user bucket is higher than the key bucket. It exists so that one person
inside your product cannot use the whole key’s budget, not to cap your product. The CSV bucket is deliberately small,
because a CSV request can stream 50,000 rows. The internal host meters nothing per day or per month, and no budget
carries over. Each bucket refills continuously over its minute.