Limits by plan
| Plan | Requests / minute | Reads / month | Enrichment |
|---|---|---|---|
| Free | 60 req/min | 10,000 reads / mo | No enrich |
| Pro | 300 req/min | 250,000 reads / mo | 100 enrich runs / mo |
| Scale | 1,000 req/min | 2,000,000 reads / mo | 1,000 enrich runs / mo |
| Enterprise | Custom | Custom quota | Negotiated credits |
A read is one successful GET. Cache hits and enrichment status polls do not spend enrichment credits. Plan details and what each tier includes are on Access.
The headers to read
When the backend reports budget, the gateway passes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and Retry-After through untouched. The sandbox always sends the first two. Read Retry-After on a 429 and sleep that many seconds; do not hammer.
curl -i 'https://vinspeclookup.com/api/v1/parts?config_key=2019_honda_cr_v_ex_l15be' \ -H 'Authorization: Bearer otp_live_…'HTTP/1.1 429 Too Many RequestsRetry-After: 12X-RateLimit-Limit: 60X-RateLimit-Remaining: 0 { "error": "rate_limited", "message": "Limit is 60 requests/minute for this key." }The sandbox and the form
| Surface | Limit | Scope of the limit |
|---|---|---|
https://vinspeclookup.com/api/sample | 30 requests / minute | Per IP address. Read-only; writes return 403. |
| Request access form | 5 submissions / 10 minutes | Per IP address. A 429 there carries Retry-After: 600. |
POST /v0/enrich | 5 scheduled runs / day / key | The spec's quota_exceeded example. Monthly credits are per plan above. |
Designing around the limit
- Pull the whole vehicle once.
GET /v1/vehiclewithinclude=is one read for every group you name; five group calls are five reads. - Cache by config_key. Specs, intervals and fitment do not change for a config. Prices carry
as_of; refresh those on your own schedule. - Resolve identity once. Decode the VIN, keep the
config_key, and use it for every later call. Ambiguous lookups are cheaper to settle withGET /v1/configsthan to retry.
Backing off well
A 429 is a timing answer, not a failure. Read Retry-After, sleep that many seconds plus a little random jitter so a fleet of workers does not wake up together, then send the same request again. Cap the retries (three is plenty) and surface the last error code to your logs rather than looping.
On the keyless sandbox the limit is per IP address, so an office network or a CI runner shares one budget of 30 requests a minute. If your tests need more, run them against your own key, or replay the baked reference responses instead of calling out.
Bulk work belongs on the whole-vehicle call. Fetching five groups for a thousand vehicles is a thousand reads with include= and five thousand without it; the response shape is the same either way.