GET /{resource}/{id} response and every webhook payload uses this envelope. The attributes object varies by process — see the per-resource pages for full field tables.
Shape
Fields
Internal process machinery — the component, its raw state, and the template name — is deliberately not part of this contract and never appears in a response. Drive your integration from
status and substatus.Reading the envelope correctly
The four label objects are always present. When a state has no registered label,status, substatus, message, and error_message come back as {"en": "", "pt": "", "es": ""} — present with empty strings, not omitted. Treat an empty string as “no information”; do not expect the key to be missing.
attributes is always an object. When a process has no published attribute schema you get {}, not a missing field or null.
An attribute with an empty value is omitted from attributes. A missing key means “not filled in yet” — that is how you distinguish “hasn’t happened” from “happened with a zero value”. Check for key presence, not for a falsy value.
version is a label, not an API version
The field carries a literal per route, and the ramp routes still emit "v1":
All of these are
/v2/ routes on the same contract. The value is an inherited label — do not branch on it.
List responses
All list endpoints (GET /v2/crossramp_checkouts, GET /v2/onramps, etc.) return the same transaction objects inside a results array, wrapped in a pagination envelope:
total is the match count without pagination applied, so you can use it to page through the full set. results is never null — an empty page is []. Items inside results carry every field above except version.
Lists are always ordered by creation time, newest first. The ordering is not configurable.
Webhooks
Webhooks deliver the same JSON object as the correspondingGET /{resource}/{id} endpoint. Configure the webhook URL per-transaction at creation time or per-template in the dashboard.
