StrataDocs
ChangelogSupportDashboard
See what changed
Core resources Transfers

Create a transfer

POST/v1/transfers

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

amountintegerrequired

Amount in the smallest currency unit. 1250 is $12.50 for USD, ¥1250 for JPY.

currencystringrequired

Three-letter ISO 4217 code, lowercase. Must match the source account.

sourcestringrequired

ID of the account to debit, in the form acct_….

destinationstringrequired

ID of a counterparty, in the form cp_….

idempotency_keystringoptional

Safely retry without creating a second transfer. Keys are held for 24 hours.

metadataobjectoptional

Up to 40 key-value pairs. Returned on every subsequent read of this transfer.

Note

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

StatusCodeWhen it happens
400invalid_request

A parameter was missing or malformed. The param field names the offender.

402insufficient_funds

The source account balance is below amount. Nothing was moved.

409idempotency_conflict

The same key was reused with a different body.

429rate_limited

Back off using the Retry-After header. Limits are per key, not per IP.

Core resources Transfers

Retrieve a transfer

GET/v1/transfers/:id

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

idstringrequired

The transfer ID, in the form tr_…. Sent in the path, not the body.

expandarrayoptional

Inline related objects instead of returning bare IDs. Accepts source, destination and events.

Note

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

StatusCodeWhen it happens
401unauthorized

The key is missing, revoked, or belongs to another environment.

404not_found

No transfer with that ID exists for this key. Live keys cannot read test objects.

429rate_limited

Polling too fast. Prefer the transfer.settled webhook over a tight loop.

Core resources Accounts

List accounts

GET/v1/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

limitintegeroptional

How many accounts to return, between 1 and 100. Defaults to 20.

starting_afterstringoptional

A cursor from the previous page. Use next_cursor verbatim; it is not an account ID you can construct.

statusstringoptional

Filter by open, frozen or closed. Omit to return all three.

currencystringoptional

Restrict to one ISO 4217 code, lowercase.

Note

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

StatusCodeWhen it happens
400invalid_request

limit was outside 1–100, or status was not a known value.

401unauthorized

The key is missing, revoked, or belongs to another environment.

429rate_limited

Listing is cheaper than polling, but still limited. Back off on Retry-After.

Core resources Counterparties

Create a counterparty

POST/v1/counterparties

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

namestringrequired

Legal name as held by the receiving bank. Nicknames fail verification more often than they fail validation.

typestringrequired

Either individual or business. This decides which verification network we use.

account_numberstringrequired

Digits only, no spaces or dashes. Stored encrypted and never returned in full.

routing_numberstringrequired

Nine-digit ABA number for USD, or the local equivalent for other currencies.

emailstringoptional

Used only for payment notifications. Never shown to the receiving bank.

metadataobjectoptional

Up to 40 key-value pairs, returned on every subsequent read.

Note

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

StatusCodeWhen it happens
400invalid_request

routing_number failed its checksum, or type was not recognised.

409duplicate_counterparty

These bank details already exist. The existing field carries the ID you should reuse.

422verification_failed

The name does not match the account holder on record. Nothing was created.

429rate_limited

Verification is rate limited separately from reads. Back off on Retry-After.

Reference Changelog

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

v32026-04-11current

Transfers gained expand, and list endpoints moved to cursor pagination.

v22025-11-02supported

Counterparty verification became synchronous; status is returned on create.

v12024-08-19deprecated

Retires 2027-01-01. Amounts were decimal strings rather than minor units.

Pin it

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.

Reference Support

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

ChannelFirst replyWhat to send
Developer chatunder 1 hour

Integration questions, unexpected 4xx responses, anything you can reproduce.

Emailsame working day

Account changes, key rotation, and anything with an attachment.

Incident lineimmediate

Money moved that should not have, or an endpoint failing for every key.

Keys

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.

Getting started Introduction

Introduction

Not written yet

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.

Getting started Authentication

Authentication

Not written yet

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.

Getting started Errors

Errors

Not written yet

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.

Getting started Versioning

Versioning

Not written yet

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.

Core resources Balances

Balances

Not written yet

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.

Core resources Statements

Statements

Not written yet

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.

Webhooks Event types

Event types

Not written yet

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.

Webhooks Signature checks

Signature checks

Not written yet

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.

Webhooks Replay & retries

Replay & retries

Not written yet

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.

SDKs Node

Node

Not written yet

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.

SDKs Python

Python

Not written yet

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.

SDKs Go

Go

Not written yet

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.

curl https://api.strata.dev/v1/transfers \
  -u "sk_live_9f2a…:" \
  -d amount=1250 \
  -d currency=usd \
  -d source=acct_1QhT4b \
  -d destination=cp_8Kd02n \
  -H "Idempotency-Key: 4f9c-8821"
import Strata from 'strata';

const strata = new Strata(process.env.STRATA_KEY);

const transfer = await strata.transfers.create({
  amount: 1250,
  currency: 'usd',
  source: 'acct_1QhT4b',
  destination: 'cp_8Kd02n',
}, { idempotencyKey: '4f9c-8821' });
import strata

client = strata.Client(api_key=os.environ["STRATA_KEY"])

transfer = client.transfers.create(
    amount=1250,
    currency="usd",
    source="acct_1QhT4b",
    destination="cp_8Kd02n",
    idempotency_key="4f9c-8821",
)
Response200 OK
{
  "id": "tr_3PmW9x",
  "object": "transfer",
  "amount": 1250,
  "currency": "usd",
  "status": "pending",   // settles T+1
  "source": "acct_1QhT4b",
  "destination": "cp_8Kd02n",
  "created": 1785312094
}