Every answer is JSON in the same envelope. Sample fields on a success (values here are examples, not a live balance):
| Field | Meaning |
|---|---|
ok | true on success. false on failure, with error instead of data. |
credits_charged | What this call cost. 0 for a cache hit, a free call or a failure. |
credits_remaining | The team balance after the charge. |
cached, cached_at | Whether this came from cache, and when it was first fetched. |
request_id | Unique for this call. Also the x-request-id header. |
data | One object, or a list. |
cursor, has_more | Set on lists. null on a single object. |
raw | Present only when you sent raw=true. |
A field the platform does not provide is null. Counts are integers. Times are ISO 8601 with a time zone. The shared models (Profile, Post, Comment, Transcript and the others) are in data models.
Every endpoint also accepts trim, raw and max_age_days. trim=true drops null fields and extra. Unknown query parameters are ignored, and their names come back in x-ignored-params.
Paths start with /v1. Adding a field is not a breaking change. A breaking change to one endpoint ships a new version, and the old path keeps running until the changelog retires it.
Full detail: Responses.