Versioning
The REST API is versioned in the URL path. Everything on these pages lives under:/api/v1 is a stability boundary. Within it:
- Non-breaking changes ship without notice. New endpoints, new optional request fields, new response fields, new enum values, and new headers can appear at any time. Write your client so extra fields it doesn’t recognize are ignored, not errors.
- Breaking changes don’t ship to
/api/v1. Removing or renaming a field, changing a field’s type or meaning, tightening validation on existing requests, or removing an endpoint would land in a new version prefix (/api/v2), never silently in place.
info.version. If you
generate a client, generate it from there.
Deprecation
When an endpoint or field is scheduled for removal, you hear about it three ways, well before anything stops working:- In the spec and on these pages. The operation is marked deprecated in
the OpenAPI spec (
deprecated: true) and badged on its reference page, with a pointer to the replacement. - On the wire. Responses from a deprecated endpoint carry a
Deprecationheader, and once a removal date is set, aSunsetheader with that date (RFC 8594). Log these in your client and you will never be surprised. - With a real migration window. A deprecated endpoint keeps working for
at least 90 days after the
Sunsetheader first appears, and we contact organizations that are still calling it before it goes away.
Sunset header, no removal.
Rate limits
Every caller gets a per-minute request budget, keyed by API key (or by IP for unauthenticated requests). Each response tells you where you stand:
Past the budget, requests return
429 Too Many Requests with a Retry-After
header (seconds). Back off for that long and retry; the response body is the
standard error shape.
The default budget is generous for normal use, including fleet-scale work: one
runs call fans a workflow across many phones, so driving thousands of phones
does not mean thousands of API calls. If you’re hitting the limit with a
legitimate workload, contact us.
What to do as a client
- Ignore unknown response fields and headers instead of failing on them.
- Watch for
DeprecationandSunsetheaders in responses and surface them in your logs. - Honor
Retry-Afteron429s rather than retrying immediately. - Regenerate clients from the live spec, not from a saved copy.