Read the response envelope

Success and failure share one JSON shape.

Every answer is JSON in the same envelope. Sample fields on a success (values here are examples, not a live balance):

FieldMeaning
oktrue on success. false on failure, with error instead of data.
credits_chargedWhat this call cost. 0 for a cache hit, a free call or a failure.
credits_remainingThe team balance after the charge.
cached, cached_atWhether this came from cache, and when it was first fetched.
request_idUnique for this call. Also the x-request-id header.
dataOne object, or a list.
cursor, has_moreSet on lists. null on a single object.
rawPresent 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.