Reference

Limits, errors and versioning

The numbers and shapes you build retry logic around.

Rate limits

SurfaceLimitKeyed by
Any API key (Inbound API and Installer API v1)60 requests / minuteEach key
Any API key300 requests / minuteKey owner: the company or installer company, all its keys together
Inbound API network guard (/inbound)600 requests / minuteSource IP address
Health and version endpoints3,000 requests / minuteSource IP address

Exceeding a limit returns 429 with a retry-after header in seconds; the network guards also send the standard RateLimit headers. Back off for at least that long, with jitter. Sustained 429s from one key are visible to us and we will reach out before disabling anything. Higher limits for the Installer API are available for companies that batch through cursor pagination rather than polling individual jobs.

Polling guidance

Error shape

HTTP/1.1 409 Conflict
content-type: application/json
x-request-id: 7f3c…

{ "error": "Job changed; current version is 8" }
StatusMeaningWhat to do
400Validation failed; message names the fieldFix the request; do not retry unchanged
401Missing, malformed, revoked or wrong-surface keyCheck the header and key kind; rotate if unsure
403Key lacks a scope, or the resource is outside your boundaryRequest the right key kind; never work around by another route
404Resource not visible to this keyTreat like 403; existence is not confirmed either way
409Idempotency-Key reused with a different body, or expectedVersion is staleRe-read the resource and resubmit with the current version and a new key
422Semantically invalid (e.g. status transition not allowed)Read the message; adjust state machine
429Rate limitedHonour retry-after
5xxOur faultRetry with backoff and the same Idempotency-Key

Always log x-request-id; it is the fastest way for us to find your request in our traces.

Idempotency

Time

All timestamps are ISO-8601 in UTC with a Z suffix. Installer status events accept occurredAt up to 5 minutes in the future and 30 days in the past. Schedules include an IANA time zone name so the crew's local day is unambiguous.

Versioning and deprecation

Payload limits

ItemLimit
Request body1 MB
Inbound lead fieldsfullName 120, email 254, phone 40, address 500 characters
Appointment notes500 characters
Contractor job status note2,000 characters
List page sizeInstaller API 1 to 100 (default 50); inbound jobs 1 to 200 (default 50)
Webhook response wait10 seconds