Create a transfer
Moves money from an account you control to a counterparty you have already verified. A transfer is created immediately and settles asynchronously — the response tells you it was accepted, not that it arrived.
Parameters
Amount in the smallest currency unit. 1250 is $12.50 for USD, ¥1250 for JPY.
Three-letter ISO 4217 code, lowercase. Must match the source account.
ID of the account to debit, in the form acct_….
ID of a counterparty, in the form cp_….
Safely retry without creating a second transfer. Keys are held for 24 hours.
Up to 40 key-value pairs. Returned on every subsequent read of this transfer.
Always send an idempotency_key from a retrying client. Without one, a timeout that your code retries will create a second transfer, and we cannot tell the two apart.
Returns
The transfer object, with status set to pending. Poll the object or subscribe to the transfer.settled webhook — do not assume settlement from a 200.
Errors
A parameter was missing or malformed. The param field names the offender.
The source account balance is below amount. Nothing was moved.
The same key was reused with a different body.
Back off using the Retry-After header. Limits are per key, not per IP.
Retrieve a transfer
Reads a single transfer by ID. This is the endpoint you poll while a transfer settles, and the one you call after a transfer.settled webhook to confirm the payload you were sent.
Parameters
The transfer ID, in the form tr_…. Sent in the path, not the body.
Inline related objects instead of returning bare IDs. Accepts source, destination and events.
A transfer is immutable once created, so responses are safe to cache until status leaves pending. Every read returns the same id, even for transfers created under an earlier API version.
Returns
The transfer object. Once money has moved, status is settled and settled_at is populated; a rejected transfer carries status failed and a failure_code.
Errors
The key is missing, revoked, or belongs to another environment.
No transfer with that ID exists for this key. Live keys cannot read test objects.
Polling too fast. Prefer the transfer.settled webhook over a tight loop.
List accounts
Returns every account the key can see, newest first. The list is cursor paginated — read next_cursor and pass it back as starting_after rather than counting offsets.
Parameters
How many accounts to return, between 1 and 100. Defaults to 20.
A cursor from the previous page. Use next_cursor verbatim; it is not an account ID you can construct.
Filter by open, frozen or closed. Omit to return all three.
Restrict to one ISO 4217 code, lowercase.
Balances on a listed account are a snapshot taken when the page was built. For a figure you are about to move money against, read the account directly — the list is for display, not for authorisation.
Returns
A list object. data holds the accounts, has_more tells you whether another page exists, and next_cursor is null on the final page.
Errors
limit was outside 1–100, or status was not a known value.
The key is missing, revoked, or belongs to another environment.
Listing is cheaper than polling, but still limited. Back off on Retry-After.
Create a counterparty
Registers somebody you intend to pay. Verification runs synchronously, so the response already tells you whether the bank details are usable — a counterparty you cannot verify cannot receive a transfer.
Parameters
Legal name as held by the receiving bank. Nicknames fail verification more often than they fail validation.
Either individual or business. This decides which verification network we use.
Digits only, no spaces or dashes. Stored encrypted and never returned in full.
Nine-digit ABA number for USD, or the local equivalent for other currencies.
Used only for payment notifications. Never shown to the receiving bank.
Up to 40 key-value pairs, returned on every subsequent read.
Send an Idempotency-Key here too. Duplicate counterparties are the most common cause of a payment landing in the wrong account, because two records for one person drift apart over time.
Returns
The counterparty object with verification set to verified or pending_review. Only verified counterparties can be used as a transfer destination.
Errors
routing_number failed its checksum, or type was not recognised.
These bank details already exist. The existing field carries the ID you should reuse.
The name does not match the account holder on record. Nothing was created.
Verification is rate limited separately from reads. Back off on Retry-After.
Changelog
Every dated release below is a pinned API version. Your key stays on the version it was created with until you change it, so upgrading is something you do, not something that happens to you.
Releases
Transfers gained expand, and list endpoints moved to cursor pagination.
Counterparty verification became synchronous; status is returned on create.
Retires 2027-01-01. Amounts were decimal strings rather than minor units.
Pin explicitly in CI. A request without Strata-Version uses the account default, which means a colleague changing that default can change your test results.
Support
Reach a human who can read your logs. Include the request ID from any failing response — it is on every error body and every response header, and it turns a guess into a lookup.
Channels
Integration questions, unexpected 4xx responses, anything you can reproduce.
Account changes, key rotation, and anything with an attachment.
Money moved that should not have, or an endpoint failing for every key.
Never send us a live secret key, even in a screenshot. If one has been shared anywhere, rotate it first and talk to us second — a rotated key makes the transcript harmless.
Introduction
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Authentication
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Errors
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Versioning
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Balances
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Statements
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Event types
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Signature checks
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Replay & retries
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Node
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Python
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.
Go
This page is part of the reference outline but has no content in this template. Nothing here is hidden behind a login — it simply has not been authored.