The basics
All requests go to one base URL, over HTTPS:
Request and response bodies are JSON, UTF-8 encoded.
Response envelopes
Every successful response wraps its payload indata. The shape of data tells you what you got:
A single resource
A list
nextCursor out of your data, and it lets responses gain new top-level fields without disturbing your parsing. Which leads to the standing rule: ignore fields you don’t recognize. New optional fields are the one kind of change that ships without a version bump.
Identifiers
Ids are strings with a short resource prefix. A user id starts withUS, and other resources follow the same scheme. The prefix makes logs and error messages easier to read.
Beyond reading the prefix, treat every id as opaque: don’t parse them, don’t assume a length, and don’t build anything that depends on their internal structure. They are stable identifiers, not data.
Timestamps
All timestamps are ISO 8601 strings in UTC:Pagination
Lists are cursor-paginated. Two query parameters in, one field out:
Walk pages until
nextCursor comes back null:
When something goes wrong
Failed requests return a structured error that names the field at fault and can include atrace id for support. That contract has its own page.