Pagination
Platform lists have seven contracts. All operations in this table areGET requests.
For cursor lists, reuse
meta.next_cursor with the same filters and stop at null. Treat it as opaque. Do not assume every list returns previous_cursor, total_count, or page_number.
For investigations, increase offset by the number of returned items. Stop at an empty page or when the next offset reaches total.
Transaction identity and amounts
On persisted transaction reads,id and transaction_id identify the stored transaction row. provider_transaction_id is the provider’s event identifier; a public hash is a separate, optional field. On live adapter responses, id carries the provider-native identifier instead. See Workspace data model before joining records.
Read kind before interpreting the event payload: TRANSFER uses transfers, while TRADE uses trade. A transfer can have no parsed legs, so an empty transfers array does not establish that no event occurred.
Keep decimal quantities as strings until you use decimal arithmetic. Transfer-leg amount and usd_amount are unsigned magnitudes; transfers[].direction supplies the account-relative direction (IN, OUT, or SELF). Custom-ingestion movement quantity is also unsigned, with in or out in its separate direction; snapshot quantities may be signed.
The event’s top-level direction is workspace-relative (in, out, or internal), based on the first transfer leg and all saved workspace accounts. A group filter does not redefine the workspace boundary. It is null for trades or transfers without parsed legs. Do not substitute it for the account-relative direction on each leg.
Missing, hidden, and stale data
- A balance’s
usd: nullmeans no USD price is available. It is distinct from the decimal string"0". hidden_countcounts holdings excluded by workspace token visibility settings. An empty visiblebalancesarray can coexist with hidden holdings;hidden_usdis only their aggregate known USD value.balances_updated_attracks a successful balance read.last_balance_refresh_attracks the latest attempt, including failure. Read it withlast_balance_refresh_statusandlast_balance_refresh_reason.- Transaction freshness is separate:
last_synced_atis the last successful transaction sync,transactions_history_frommarks its history coverage floor, andsync_statusdescribes the latest sync run. A failed sync does not advancelast_synced_at.
Reconciliation outcomes
GET /v2/reconciliation/roll-forward separates account eligibility from quantity tie-out:
An
ok account with no lines can be tied. Check the expected account, asset, and nonempty quantities before treating a result as evidence of a reconciliation. A tie-out compares observed quantities; it does not prove complete transaction ingestion. An incomplete sibling scan can leave account status: ok while the account rollup is not_evaluated, so inspect unreconcilable_reason as well.
Workflow execution, sync, and delivery
Workflow runs expose four status fields:
Execution success alone does not establish delivery success. Read these fields on
GET /v2/workflows/runs; use the API reference for run details and output contracts.
Case status and resolution
Casestatus is open, in_review, or resolved. resolution is separate and nullable, with dismissed, escalated, paid, and explained as its non-null values. available_actions describes actions for the case’s source and current state; write permissions still apply.
Follow Triage a manual case for the transition sequence. A manual-case example does not establish the same actions for screening or redemption cases.