Download OpenAPI specification:
The Relay API lets Pocket Customers manage recipients, move money to other Pocket Customers, submit Batches of transfers, and reconcile balances and activity.
cus_…) is the person or business represented by the API
key. V1 operates on that Customer's funds and activity.Pocket publishes the Relay API as an OpenAPI specification rather than client SDKs.
| Resource | Purpose |
|---|---|
| Balances | Read the authenticated Customer's current funds. |
| Recipients | Manage a business Customer's payout roster. |
| Transactions | Read inbound and outbound activity together. |
| Transfers | Create and reconcile Customer-to-Customer transfers. |
| Deposits | Reconcile money received by the Customer. |
| Batch transfers | Submit and reconcile asynchronous Customer-to-Customer payouts. |
This document is specification version 0.4.0, published under /v1.
Send the API key as a bearer token:
Authorization: Bearer eak_v1_...
Every request runs as the Customer attached to that key. A source
customer_id must match it. A resource owned by another Customer returns 404
as if it did not exist. Recipient and Batch operations require an authenticated
business Customer.
The key must also contain every scope named by the operation. The V1 scopes are
balances:read, recipients:read, recipients:write, transactions:read,
transfers:read, transfers:write, deposits:read, batches:read and
batches:write. Broad read and write scopes satisfy their corresponding
granular scopes.
An accepted internal transfer creates one txn_… ID. The source Customer sees
a Transfer and the destination Customer sees a Deposit. Each Customer can also
read its own Transaction view. Neither Customer gains access to the other's
balance or unrelated activity.
Accepted outbound money moves from available to reserved. At settlement it
leaves the source balance and is credited to the destination balance. A failed
or voided movement remains visible and the reservation is released.
Amounts are decimal strings in major currency units. USD accepts at most two decimal places. JSON numbers, commas, whitespace, scientific notation and negative values are rejected.
Recipient creation, Recipient replacement when a key is supplied, and Batch
creation provide idempotent replay for 24 hours. Reuse a key only for an
unchanged retry. A changed request during that period returns 409. At or
after 24 hours, the key is treated as new.
Other request types retain an idempotency_key field, but V1 does not yet
guarantee replay or duplicate suppression for those operations.
List operations use opaque cursors. Pass next_cursor back as cursor with
the same filters. Do not parse or construct cursors.
A payroll integration runs as one authenticated business Customer. That Customer owns the recipient roster, supplies the source balance and submits each Batch. Employees are destination Customers.
The normal flow is:
source.customer_id.Add each employee to the authenticated business Customer's recipient roster.
The Recipient has its own rcp_… ID. Once linked, its customer_id is the
destination to use in a Batch.
POST /v1/customers/cus_01j8ma3wv3mepwabfxxs0yc395/recipients
A pending Recipient has customer_id: null and cannot receive a Batch item.
Use capabilities.can_receive_transfers immediately before submission.
GET /v1/balances returns the authenticated Customer's USD balance:
{
"data": [
{
"customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395",
"currency": "USD",
"available": "2500.00",
"settled": "2500.00",
"reserved": "0.00",
"as_of": "2026-07-31T09:15:00Z"
}
],
"has_more": false,
"next_cursor": null
}
Use /v1/transactions for the combined activity feed, /v1/transfers for
outbound movements and /v1/deposits for inbound movements. Every returned
customer_id identifies the authenticated Customer's view.
Submit one asynchronous Batch from the authenticated business Customer to its employee Customers:
{
"idempotency_key": "a15e4ae4-52f3-460c-9c1c-5f6b7b90cc44",
"source": {
"customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
},
"recipient_policy": "recipients_only",
"items": [
{
"item_id": "line-001",
"destination": {
"customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
},
"amount": "100.00",
"currency": "USD",
"reference": "EMP-1042"
}
],
"reference": "northwind-payroll-2026-07"
}
Acceptance does not reserve the whole Batch amount. Each item checks the source
Customer's available balance when it runs. Use the item endpoint to reconcile
every submitted item_id, including failures that never created a Transfer.
Create an internal transfer from the authenticated Customer to another Pocket Customer:
{
"idempotency_key": "d9f80740-7f8e-4f16-b5cc-4fd5bf7d3b21",
"source": {
"customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
},
"destination": {
"customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
},
"amount": "100.00",
"currency": "USD",
"reference": "payrun-2026-07",
"memo": "July salary"
}
The source ID must match the Customer attached to the API key. The destination Customer's balance and private activity are never exposed to the sender.
Required scope: balances:read.
Return the balances held by the authenticated Customer. V1 returns the Customer's single
USD balance. The customer_id on each result is the Customer attached to the API key.
| currency | string (Currency) Value: "USD" Example: currency=USD Only balances in this currency. |
{- "has_more": true,
- "next_cursor": "string",
- "data": [
- {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395",
- "currency": "USD",
- "available": "2500.00",
- "settled": "2500.00",
- "reserved": "0.00",
- "as_of": "2026-07-31T09:15:00Z"
}
]
}Recipients are business-owned roster resources identified by rcp_…. A pending Recipient
has no matched Customer. A linked Recipient returns the Customer cus_… ID that Transfers
and Batch items use as their destination.
Recipient resources belong to the authenticated business Customer. An authenticated
individual Customer returns 403. Another Customer returns 404 when used as
business_customer_id.
id manages the roster resource; it is never a payment destination.customer_id is the Customer destination for Transfers and Batch
items. It is null while the Recipient is pending.Pocket normalizes identity inputs before matching:
customer_id: exact Pocket cus_… ID.paytag: surrounding whitespace and one optional leading @ removed, then normalized
with Pocket's paytag case rules.phone: E.164 international phone-number format.email: surrounding whitespace trimmed, then compared case-insensitively after Pocket's
email normalization.Supply at least one identifier. When several are supplied, every value must resolve
uniquely to the same Customer. A malformed identifier returns 400 with param
naming the field. Conflicting matches, ambiguity, blocks, and unavailable targets return the
same generic 404 recipient_not_found and create nothing.
Required scope: recipients:write.
Customer eligibility: authenticated business Customer only.
Create a Recipient (rcp_…) on this business's roster. Pocket first attempts to resolve
one or more exact identifiers to an existing Customer. A linked Recipient returns that
Customer's customer_id, which is the destination to use in internal Transfers and Batch
items. The Recipient id manages the roster resource and is never a payment destination.
business_customer_id must identify the authenticated business Customer. Another
Customer returns 404.
Lookup and assurance
Supply at least one of customer_id, exact paytag, email, or phone. You may supply several
identifiers to increase confidence in the match. Every supplied identifier must resolve
uniquely to the same Customer.
Government-ID and name lookup are not supported. Pocket matches email and phone only when Pocket has verified them.
When the identifiers do not resolve completely to one Customer, Pocket returns
404 recipient_not_found and creates nothing. This includes an unknown explicit
customer_id, conflicting matches, ambiguous identity data, blocked relationships, and
unavailable targets. The response does not identify which value failed.
Recipient data
label, reference, and metadata belong to this business's roster relationship. Pocket
does not compare label with or replace it from the Customer's profile.
Retries and re-adding
idempotency_key is required. A new linked Recipient returns 201 Created. A
request that identifies an existing non-removed Recipient returns 200 OK without
changing its business-owned fields; use PUT to replace their mutable state.
Re-adding a removed Recipient restores its current roster resource as a new relationship
epoch and returns 200 OK. The new request's label, reference, and metadata become
the current business-owned fields.
Privacy
The response returns the Recipient id and a nullable resolved customer_id, but no Pocket
profile name, email, phone, paytag, government identity, KYC state, onboarding state, or
private capability reason. Raw email and phone are sensitive inputs: Pocket does not return
them or include them in errors, ordinary logs, traces, metadata, events, or webhook
subjects.
Pocket applies additional rate limits and abuse controls to identity resolution.
| business_customer_id required | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: cus_01j8ma3wv3mepwabfxxs0yc395 The authenticated business Customer whose recipient roster the API manages. An individual Customer returns |
| idempotency_key required | string [ 1 .. 255 ] characters ^[^\x00]*\S[^\x00]*$ Binds this Recipient create request for 24 hours. During that period, an unchanged retry returns the existing result and a changed request returns |
| label required | string [ 1 .. 120 ] characters ^[^\x00]*\S[^\x00]*$ Business-supplied display label. |
| customer_id required | string (RecipientCustomerIdLookup) ^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Match by the customer's exact Pocket ID ( |
| paytag | string (RecipientPaytagLookup) [ 1 .. 32 ] characters .*\S.* Match by exact paytag after trimming surrounding whitespace, removing at most one leading |
string <email> (RecipientEmailLookup) <= 254 characters Match by verified email after trimming surrounding whitespace and applying Pocket's case-insensitive email normalization. This is a sensitive lookup input and is never returned on the Recipient resource. | |
| phone | string (RecipientPhoneLookup) ^\+[1-9][0-9]{1,14}$ Match by verified E.164 phone (for example, |
| reference | string or null <= 255 characters ^[^\x00]*$ Optional business-owned reconciliation reference. |
object (Metadata) <= 50 properties Up to 50 caller-defined string key/value pairs. An empty object is valid. Keys
OpenAPI 3.0 cannot express the key-length limit for arbitrary properties, so Pocket enforces
it at runtime. An invalid key returns Values
An overlong value returns Privacy The API shows metadata only in the Customer view where the caller set it. The API does not share metadata with money-movement counterparties. Use it for opaque business identifiers and non-sensitive labels only. Do not include:
Pocket may reject metadata that appears sensitive, but the caller remains responsible for the data it supplies. |
{- "idempotency_key": "add-supplier-88",
- "label": "Northwind Supplies",
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej",
- "reference": "SUP-88"
}{- "id": "rcp_01k2p7m4sd6t8v0x3y5z9a1bcf",
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej",
- "label": "Taylor Reed",
- "reference": "EMP-1042",
- "association_status": "linked",
- "status": "active",
- "capabilities": {
- "can_receive_transfers": true
}, - "metadata": {
- "department": "Operations"
}, - "created_at": "2026-07-31T09:05:00Z",
- "updated_at": "2026-07-31T09:05:00Z"
}Required scope: recipients:read.
Customer eligibility: authenticated business Customer only.
List this business's linked and pending Recipient resources. A linked Recipient returns its
destination customer_id; a pending Recipient returns customer_id: null. The API returns
business-owned relationship fields. It does not expose Customer profile, contact, KYC,
onboarding, balance, activity, or payment details.
status=removed to list removed recipients.customer_id.q searches only this business's Recipient ID, label, reference, metadata keys and
values, and linked customer_id; it never searches Pocket Customer identity data.GET /v1/customers/{business_customer_id}/recipients/{recipient_id}.Results are ordered by creation time and Recipient ID. Use order to return the oldest or
newest Recipients first. A cursor is bound to the owning business Customer, order, and
normalized status, association_status, can_receive_transfers, customer_id,
reference, and q filters.
| business_customer_id required | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: cus_01j8ma3wv3mepwabfxxs0yc395 The authenticated business Customer whose recipient roster the API manages. An individual Customer returns |
| status | string (RecipientStatus) Enum: "active" "inactive" "removed" Only recipients in this relationship state. Without this filter, the list excludes removed recipients. |
| association_status | string (RecipientAssociationStatus) Enum: "linked" "pending" "unavailable" Only recipients in this association state. |
| can_receive_transfers | boolean Only recipients with this current advisory capability. |
| customer_id | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Only the linked Recipient for this exact Customer ID. Pending Recipients never match. |
| reference | string <= 255 characters ^[^\x00]*$ Exact business-owned recipient reference. |
| q | string [ 1 .. 255 ] characters ^[^\x00]*\S[^\x00]*$ Case-insensitive search over this business's label, reference, and metadata keys and values, plus exact/prefix Recipient ID and linked Customer ID matching. It never searches Customer names, paytags, email, or phone. |
| order | string Default: "desc" Enum: "asc" "desc" Sort by creation time. |
| cursor | string <= 8192 characters Opaque cursor ( |
| limit | integer [ 1 .. 100 ] Default: 25 |
{- "data": [
- {
- "id": "rcp_01k2p7m4sd6t8v0x3y5z9a1bcf",
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej",
- "label": "Taylor Reed",
- "reference": "EMP-1042",
- "association_status": "linked",
- "status": "active",
- "capabilities": {
- "can_receive_transfers": true
}, - "metadata": {
- "department": "Operations"
}, - "created_at": "2026-07-31T09:05:00Z",
- "updated_at": "2026-07-31T09:05:00Z"
}
], - "has_more": true,
- "next_cursor": "string"
}Required scope: recipients:read.
Customer eligibility: authenticated business Customer only.
Retrieve this business's linked or pending Recipient by recipient_id. Soft-removed
Recipients are included. The response contains a nullable destination Customer ID and
business-owned relationship fields, not private Customer data or matching inputs.
| business_customer_id required | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: cus_01j8ma3wv3mepwabfxxs0yc395 The authenticated business Customer whose recipient roster the API manages. An individual Customer returns |
| recipient_id required | string^rcp_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: rcp_01k2p7m4sd6t8v0x3y5z9a1bcf The Recipient ( |
{- "id": "rcp_01k2p7m4sd6t8v0x3y5z9a1bcf",
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej",
- "label": "Taylor Reed",
- "reference": "EMP-1042",
- "association_status": "linked",
- "status": "active",
- "capabilities": {
- "can_receive_transfers": true
}, - "metadata": {
- "department": "Operations"
}, - "created_at": "2026-07-31T09:05:00Z",
- "updated_at": "2026-07-31T09:05:00Z"
}Required scope: recipients:write.
Customer eligibility: authenticated business Customer only.
Replace this business's mutable recipient state. Supply all of label, reference,
status, and metadata.
label is the business's display name for the recipient.reference is required but may be null to clear it.status may be active or inactive.metadata replaces the whole metadata object. Use {} to clear it.idempotency_key is optional.This changes only the Recipient resource. It does not change a linked Pocket Customer. A pending Recipient's lookup identifiers cannot be changed in V1.
active means the business considers the recipient active. It does not guarantee
that the customer can receive a transfer.
capabilities.can_receive_transfers as the sole current inclusion check for
payments restricted to registered recipients.active update cannot bypass private Customer state.409.| business_customer_id required | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: cus_01j8ma3wv3mepwabfxxs0yc395 The authenticated business Customer whose recipient roster the API manages. An individual Customer returns |
| recipient_id required | string^rcp_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: rcp_01k2p7m4sd6t8v0x3y5z9a1bcf The Recipient ( |
| idempotency_key | string [ 1 .. 255 ] characters ^[^\x00]*\S[^\x00]*$ Optional. When supplied, binds this Recipient replacement for 24 hours. During that period, an unchanged retry returns the existing result and a changed request returns |
| label required | string [ 1 .. 120 ] characters ^[^\x00]*\S[^\x00]*$ Business-supplied display label. |
| reference required | string or null <= 255 characters ^[^\x00]*$ Set to null to clear. |
| status required | string (RecipientWritableStatus) Enum: "active" "inactive" The recipient relationship states a business may request. Setting |
required | object <= 50 properties Whole-object replacement; use an empty object to clear. |
{- "label": "Taylor Reed",
- "reference": "EMP-1042",
- "status": "inactive",
- "metadata": {
- "department": "Operations"
}
}{- "id": "rcp_01k2p7m4sd6t8v0x3y5z9a1bcf",
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej",
- "label": "Taylor Reed",
- "reference": "EMP-1042",
- "association_status": "linked",
- "status": "active",
- "capabilities": {
- "can_receive_transfers": true
}, - "metadata": {
- "department": "Operations"
}, - "created_at": "2026-07-31T09:05:00Z",
- "updated_at": "2026-07-31T09:05:00Z"
}Required scope: recipients:write.
Customer eligibility: authenticated business Customer only.
Soft-remove a linked or pending Recipient from this business's roster by recipient_id.
removed and can_receive_transfers becomes false.GET .../recipients?status=removed.Removing a Recipient cancels future pending resolution and does not affect a linked Pocket Customer or payment history.
| business_customer_id required | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: cus_01j8ma3wv3mepwabfxxs0yc395 The authenticated business Customer whose recipient roster the API manages. An individual Customer returns |
| recipient_id required | string^rcp_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: rcp_01k2p7m4sd6t8v0x3y5z9a1bcf The Recipient ( |
{- "code": "invalid_argument",
- "message": "The request is invalid.",
- "details": {
- "code": "invalid_request",
- "param": "label",
- "request_id": "req_01jj0m9w2k3n5p7q9r1s3t5v7w"
}
}Money movement visible to the authenticated Customer. Each transaction is that
Customer's single view of one txn_… and is either outbound (transfer) or
inbound (deposit).
Required scope: transactions:read.
List money-movement activity for the authenticated Customer. Recipient Customers' private activity is never included.
Narrow results with customer_id, kind, method, status, amount, reference, created
date, or settled date.
When supplied, customer_id must identify the authenticated Customer.
Results are ordered by creation time and Transaction ID. Use order to return the oldest
or newest Transactions first.
Each item is a transaction (txn_…) seen by the authenticated Customer:
id appears at most once. The API removes duplicates before ordering and pagination.kind and id to fetch a transfer or deposit object when one exists.An accepted internal transfer creates the source and destination Customer views at once:
kind=transfer and starts pending.kind=deposit and starts pending.settled, failed, or voided together. Each Customer can read only its
own view.A rejected transfer request creates no activity entry.
details carries method-specific facts and may gain fields before settlement. Events are
references, not snapshots. Fetch the transaction for its current details.
If you sent money to a customer, your feed shows your transfer and its status, not the customer's resulting balance or unrelated activity. The feed excludes verification microdeposits, declined card authorizations, and Pocket-internal treasury operations.
The V1 feed does not model post-settlement returns or reversals. A future return will be a new balance-moving entry, not a change to an already settled status.
| customer_id | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: customer_id=cus_01j8ma3wv3mepwabfxxs0yc395 Select the authenticated Customer's view.
|
| kind | string (TransactionKind) Enum: "transfer" "deposit" Example: kind=deposit Only transfers (outbound) or only deposits (inbound). |
| method | Array of strings (Method) Items Enum: "internal" "ach" "wire" "onchain" "ibft" "swift" "faster_payments" "payment_link" "card" Example: method=ach&method=wire Filter transactions by method. Repeat the parameter to match more than one (e.g. |
| status | string (TransactionStatus) Enum: "pending" "settled" "failed" "voided"
|
| amount_min | string (MoneyAmount) <= 19 characters ^(?:0(?:\.[0-9]{1,2})?|[1-9][0-9]{0,15}(?:\.[... Example: amount_min=100.00 Minimum amount (inclusive), as a decimal string in major units, e.g. |
| amount_max | string (MoneyAmount) <= 19 characters ^(?:0(?:\.[0-9]{1,2})?|[1-9][0-9]{0,15}(?:\.[... Example: amount_max=100.00 Maximum amount (inclusive), as a decimal string in major units, e.g. |
| reference | string <= 255 characters Exact match on your opaque |
| created_after | string <date-time> Example: created_after=2026-07-31T09:00:00Z Only items created at/after this time (inclusive). |
| created_before | string <date-time> Example: created_before=2026-07-31T09:00:00Z Only items created at/before this time (inclusive). |
| settled_after | string <date-time> Example: settled_after=2026-07-31T09:00:00Z Only items settled at/after this time (inclusive). This filter excludes pending, failed, and voided items because they have no settlement time. |
| settled_before | string <date-time> Example: settled_before=2026-07-31T09:00:00Z Only items settled at/before this time (inclusive). This filter excludes pending, failed, and voided items because they have no settlement time. |
| order | string Default: "desc" Enum: "asc" "desc" Sort by creation time. |
| cursor | string <= 8192 characters Opaque cursor ( |
| limit | integer [ 1 .. 100 ] Default: 25 |
{- "has_more": true,
- "next_cursor": "string",
- "data": [
- {
- "id": "txn_01jjftqbz0n1vzey0pqrq3qmnn",
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395",
- "kind": "deposit",
- "method": "ach",
- "source": null,
- "destination": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "amount": "2500.00",
- "currency": "USD",
- "status": "settled",
- "details": {
- "ach": {
- "sender_name": "PAISMO INC",
- "trace_number": "021000021234567"
}
}, - "created_at": "2026-07-30T14:10:00Z",
- "settled_at": "2026-07-31T09:00:00Z"
}
]
}Required scope: transactions:read.
Fetch one transaction entry by ID, e.g. /v1/transactions/txn_….
The endpoint returns the authenticated Customer's view. A transaction that is not visible
to that Customer returns 404.
| transaction_id required | string^txn_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: txn_01jjftqbz0n1vzey0pqrq3qmnn |
{- "id": "txn_01jjftqbz0n1vzey0pqrq3qmnn",
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395",
- "kind": "deposit",
- "method": "ach",
- "source": null,
- "destination": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "amount": "2500.00",
- "currency": "USD",
- "status": "settled",
- "details": {
- "ach": {
- "sender_name": "PAISMO INC",
- "trace_number": "021000021234567"
}
}, - "created_at": "2026-07-30T14:10:00Z",
- "settled_at": "2026-07-31T09:00:00Z"
}Money leaving the authenticated Customer's balance. V1 creates internal Customer-to-Customer transfers. Transfer reads also expose supported outbound activity already processed by Pocket.
Required scope: transfers:read.
Outbound money movements from the authenticated Customer.
Narrow results with method, source_customer_id, destination_id, status, amount,
reference, created date, or settled date.
When supplied, source_customer_id must identify the authenticated Customer.
destination_id is a counterparty filter. It may identify a Pocket Customer or an external
instrument already visible on one of the authenticated Customer's transfers. Historical
activity without an instrument ID is not matched by this filter.
Results are ordered by creation time and Transfer ID. Use order to return the oldest or
newest Transfers first.
| method | Array of strings (TransferMethod) Items Enum: "internal" "ach" "wire" "onchain" "ibft" Example: method=ach&method=wire Filter transfers by method. Repeat the parameter to match more than one (e.g.
|
| source_customer_id | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Filter by the authenticated Customer. Another Customer returns privacy-preserving |
| destination_id | string^(?:cus_|epi_)[0-7][0-9abcdefghjkmnpqrstvwxyz... Filter by a Pocket Customer for an internal transfer, or an external instrument for an ACH, wire, IBFT, or onchain transfer. A Customer destination may be a counterparty outside the authenticated Customer's ownership boundary.
|
| status | string (TransferStatus) Enum: "pending" "settled" "failed" "voided"
|
| amount_min | string (MoneyAmount) <= 19 characters ^(?:0(?:\.[0-9]{1,2})?|[1-9][0-9]{0,15}(?:\.[... Example: amount_min=100.00 Minimum amount (inclusive), as a decimal string in major units, e.g. |
| amount_max | string (MoneyAmount) <= 19 characters ^(?:0(?:\.[0-9]{1,2})?|[1-9][0-9]{0,15}(?:\.[... Example: amount_max=100.00 Maximum amount (inclusive), as a decimal string in major units, e.g. |
| reference | string <= 255 characters Exact match on your opaque |
| created_after | string <date-time> Example: created_after=2026-07-31T09:00:00Z Only items created at/after this time (inclusive). |
| created_before | string <date-time> Example: created_before=2026-07-31T09:00:00Z Only items created at/before this time (inclusive). |
| settled_after | string <date-time> Example: settled_after=2026-07-31T09:00:00Z Only items settled at/after this time (inclusive). This filter excludes pending, failed, and voided items because they have no settlement time. |
| settled_before | string <date-time> Example: settled_before=2026-07-31T09:00:00Z Only items settled at/before this time (inclusive). This filter excludes pending, failed, and voided items because they have no settlement time. |
| order | string Default: "desc" Enum: "asc" "desc" Sort by creation time. |
| cursor | string <= 8192 characters Opaque cursor ( |
| limit | integer [ 1 .. 100 ] Default: 25 |
{- "has_more": true,
- "next_cursor": "string",
- "data": [
- {
- "id": "txn_01k0d2f6h8j4m7n9p3q5r1s0vw",
- "method": "internal",
- "reference": "payrun-2026-07",
- "memo": "July salary",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "destination": {
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
}, - "batch_id": null,
- "amount": "100.00",
- "currency": "USD",
- "status": "pending",
- "failure_code": null,
- "failure_message": null,
- "transitioned_at": {
- "pending": "2026-07-31T11:00:00Z",
- "settled": null,
- "failed": null,
- "voided": null
}, - "created_at": "2026-07-31T11:00:00Z",
- "updated_at": "2026-07-31T11:00:00Z"
}
]
}Required scope: transfers:write.
Move funds from the Customer in source.customer_id to the Pocket Customer in
destination.customer_id. The source must be the authenticated Customer. The destination
Customer's private balance and activity remain hidden.
At acceptance
kind is transfer, method is internal, and status is pending.kind is deposit, method is internal, and status is pending.available decreases and reserved increases.At settlement
Both views become settled. The source reservation posts out. Pocket credits the destination
settled and available amounts.
On failure or voiding
Both views remain visible with the terminal status. Pocket releases the source reservation and never credits the destination.
If the API rejects a request before it creates a txn_…, it produces no transfer, deposit,
or transaction resource.
A source Customer that cannot send returns 403 forbidden. A destination Customer that
cannot receive the transfer returns 403 recipient_not_payable. The response does not
reveal the private Customer-state reason.
| idempotency_key required | string [ 1 .. 255 ] characters .*\S.* Required non-blank value reserved for idempotency. V1 validates the field but does not yet guarantee replay or duplicate suppression for this operation. |
required | object (TransferSource) The Customer whose available balance funds the transfer. It must be the authenticated
Customer. The request's |
required | object (CustomerReference) A Pocket customer reference. A destination may be an |
| amount required | string (WriteAmount) <= 19 characters ^(?:0\.(?:0[1-9]|[1-9][0-9]?)|[1-9][0-9]{0,15... A positive amount to move, expressed as a JSON decimal string in major units. For example,
An invalid, non-positive or overflowing amount returns |
| currency required | string (Currency) Value: "USD" Public settlement currency debited from or credited to a Customer balance.
|
| reference | string <= 255 characters Your private external reference for this transfer (e.g. a pay-run or employee ID). Optional, not unique. Filter by it. Counterparties do not see it. |
| memo | string <= 100 characters Payment note carried on the movement and visible to the destination customer when the method supports a note. Internal transfer memos can be up to 100 characters. The API rejects longer values with |
{- "idempotency_key": "d9f80740-7f8e-4f16-b5cc-4fd5bf7d3b21",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "destination": {
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
}, - "amount": "100.00",
- "currency": "USD",
- "reference": "payrun-2026-07",
- "memo": "July salary"
}{- "id": "txn_01k0d2f6h8j4m7n9p3q5r1s0vw",
- "method": "internal",
- "reference": "payrun-2026-07",
- "memo": "July salary",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "destination": {
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
}, - "batch_id": null,
- "amount": "100.00",
- "currency": "USD",
- "status": "pending",
- "failure_code": null,
- "failure_message": null,
- "transitioned_at": {
- "pending": "2026-07-31T11:00:00Z",
- "settled": null,
- "failed": null,
- "voided": null
}, - "created_at": "2026-07-31T11:00:00Z",
- "updated_at": "2026-07-31T11:00:00Z"
}Required scope: transfers:read.
Fetch one transfer by ID, e.g. /v1/transfers/txn_….
This endpoint returns the outbound side when its source Customer is the authenticated
Customer. Otherwise it returns 404.
For an internal movement, the same txn_… may also be retrievable from
GET /v1/deposits/{deposit_id} by the destination Customer. The transfer is retrievable as
soon as its txn_… exists and remains
retrievable through its terminal status.
| transfer_id required | string^txn_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: txn_01k0d2f6h8j4m7n9p3q5r1s0vw |
{- "id": "txn_01k0d2f6h8j4m7n9p3q5r1s0vw",
- "method": "internal",
- "reference": "payrun-2026-07",
- "memo": "July salary",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "destination": {
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
}, - "batch_id": null,
- "amount": "100.00",
- "currency": "USD",
- "status": "pending",
- "failure_code": null,
- "failure_message": null,
- "transitioned_at": {
- "pending": "2026-07-31T11:00:00Z",
- "settled": null,
- "failed": null,
- "voided": null
}, - "created_at": "2026-07-31T11:00:00Z",
- "updated_at": "2026-07-31T11:00:00Z"
}Money arriving in the authenticated Customer's balance. Deposits are read-only: Pocket creates them from incoming payments and the destination side of an internal transfer.
Required scope: deposits:read.
Inbound money movements into the authenticated Customer's balance.
Narrow results with method, customer_id, status, amount, reference,
created date, or settled date.
A transfer appears in the destination Customer's results as soon as its txn_…
identifier exists.
For an internal movement:
pending.When supplied, customer_id must identify the authenticated Customer.
Results are ordered by creation time and Deposit ID. Use order to return the oldest or
newest Deposits first.
| method | Array of strings (DepositMethod) Items Enum: "internal" "ach" "wire" "onchain" "swift" "faster_payments" "payment_link" Example: method=ach&method=wire Filter deposits by method. Repeat the parameter to match more than one (e.g.
|
| customer_id | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: customer_id=cus_01j8ma3wv3mepwabfxxs0yc395 Select the authenticated Customer's view.
|
| status | string (TransactionStatus) Enum: "pending" "settled" "failed" "voided"
|
| amount_min | string (MoneyAmount) <= 19 characters ^(?:0(?:\.[0-9]{1,2})?|[1-9][0-9]{0,15}(?:\.[... Example: amount_min=100.00 Minimum amount (inclusive), as a decimal string in major units, e.g. |
| amount_max | string (MoneyAmount) <= 19 characters ^(?:0(?:\.[0-9]{1,2})?|[1-9][0-9]{0,15}(?:\.[... Example: amount_max=100.00 Maximum amount (inclusive), as a decimal string in major units, e.g. |
| reference | string <= 255 characters Exact match on your opaque |
| created_after | string <date-time> Example: created_after=2026-07-31T09:00:00Z Only items created at/after this time (inclusive). |
| created_before | string <date-time> Example: created_before=2026-07-31T09:00:00Z Only items created at/before this time (inclusive). |
| settled_after | string <date-time> Example: settled_after=2026-07-31T09:00:00Z Only items settled at/after this time (inclusive). This filter excludes pending, failed, and voided items because they have no settlement time. |
| settled_before | string <date-time> Example: settled_before=2026-07-31T09:00:00Z Only items settled at/before this time (inclusive). This filter excludes pending, failed, and voided items because they have no settlement time. |
| order | string Default: "desc" Enum: "asc" "desc" Sort by creation time. |
| cursor | string <= 8192 characters Opaque cursor ( |
| limit | integer [ 1 .. 100 ] Default: 25 |
{- "has_more": true,
- "next_cursor": "string",
- "data": [
- {
- "id": "txn_01jjftqbz0n1vzey0pqrq3qmnn",
- "method": "ach",
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395",
- "source": null,
- "destination": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "reference": null,
- "memo": null,
- "amount": "2500.00",
- "currency": "USD",
- "status": "settled",
- "details": {
- "ach": {
- "sender_name": "PAISMO INC",
- "trace_number": "021000021234567"
}
}, - "created_at": "2026-07-30T14:10:00Z",
- "settled_at": "2026-07-31T09:00:00Z",
- "updated_at": "2026-07-31T09:00:00Z"
}
]
}Required scope: deposits:read.
Fetch one deposit by ID, e.g. /v1/deposits/txn_….
This endpoint returns the inbound side when its destination Customer is the authenticated
Customer. Otherwise it returns 404.
For an internal movement:
txn_… may resolve at GET /v1/transfers/{transfer_id} for the source Customer.pending.failed or voided.| deposit_id required | string^txn_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: txn_01jjftqbz0n1vzey0pqrq3qmnn |
{- "id": "txn_01jjftqbz0n1vzey0pqrq3qmnn",
- "method": "ach",
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395",
- "source": null,
- "destination": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "reference": null,
- "memo": null,
- "amount": "2500.00",
- "currency": "USD",
- "status": "settled",
- "details": {
- "ach": {
- "sender_name": "PAISMO INC",
- "trace_number": "021000021234567"
}
}, - "created_at": "2026-07-30T14:10:00Z",
- "settled_at": "2026-07-31T09:00:00Z",
- "updated_at": "2026-07-31T09:00:00Z"
}An asynchronous group of internal transfers from one authenticated business Customer to destination Customers. Every item has its own status and may fail without changing the result of another item.
Required scopes: batches:write and transfers:write.
Customer eligibility: authenticated business Customer only.
Submit internal transfers from the Customer in source.customer_id asynchronously. The
source must be the authenticated business Customer. Acceptance does not move or reserve
money. An ineligible source returns 403, and the API creates no batch.
Every item's currency must equal the source Customer balance's currency. A mismatch returns
400 invalid_request with param=items[n].currency, where n is the zero-based item
index.
Recipient policy pre-check
recipient_policy defaults to any_customer. Set it to recipients_only to check the
complete batch against the authenticated Customer's recipient list before acceptance:
customer_id equals every
destination.customer_id.capabilities.can_receive_transfers set to
true.This check runs after ordinary validation, including duplicate item_id validation. If any
item fails, one 400 recipient_policy_failed response lists all failures in request order.
The request creates nothing and leaves the idempotency key unbound. Correct it and retry
with a new key.
The recipient check is not repeated during item processing. Ordinary transfer rules still apply.
Track every submitted line with GET /v1/batches/{batch_id}/items.
transfer_id: null.txn_… exists, transfer_id identifies it through settlement, failure or voiding.failure_code: insufficient_funds.item_id does not deduplicate across batches.
resubmitting a settled line can pay twice.Duplicate item ids
Every item_id must be unique within items.
reference and idempotency_key do not identify batch lines.Pocket reports the first repeated value. The request returns 400 invalid_request, with
param set to the second occurrence (items[n].item_id). The index is zero-based.
The request creates nothing and leaves the idempotency key unbound. Correct it and retry with a new key.
You cannot cancel a batch after acceptance.
| idempotency_key required | string [ 1 .. 255 ] characters .*\S.* Binds this Batch create request for 24 hours. During that period, an unchanged retry returns the existing Batch and a changed request returns |
required | object (TransferSource) The Customer whose available balance funds the transfer. It must be the authenticated
Customer. The request's |
| recipient_policy | string (BatchRecipientPolicy) Default: "any_customer" Enum: "any_customer" "recipients_only" One-time destination pre-check applied before Pocket accepts a batch.
The policy is not evaluated again after acceptance or as individual transfers execute.
Omitting the field and sending |
required | Array of objects (BatchTransferItem) [ 1 .. 4096 ] items Each |
| reference | string <= 255 characters Your external ID for this batch (e.g. a pay-run ID). Optional, filterable. |
object (Metadata) <= 50 properties Up to 50 caller-defined string key/value pairs. An empty object is valid. Keys
OpenAPI 3.0 cannot express the key-length limit for arbitrary properties, so Pocket enforces
it at runtime. An invalid key returns Values
An overlong value returns Privacy The API shows metadata only in the Customer view where the caller set it. The API does not share metadata with money-movement counterparties. Use it for opaque business identifiers and non-sensitive labels only. Do not include:
Pocket may reject metadata that appears sensitive, but the caller remains responsible for the data it supplies. |
{- "idempotency_key": "a15e4ae4-52f3-460c-9c1c-5f6b7b90cc44",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "recipient_policy": "recipients_only",
- "items": [
- {
- "item_id": "line-001",
- "destination": {
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
}, - "amount": "100.00",
- "currency": "USD",
- "reference": "EMP-1042"
}, - {
- "item_id": "line-002",
- "destination": {
- "customer_id": "cus_01j7qkfn0n4egp6wj30vajew7g"
}, - "amount": "120.00",
- "currency": "USD",
- "reference": "EMP-1089"
}
], - "reference": "northwind-payroll-2026-07",
- "metadata": {
- "pay_period": "2026-07"
}
}{- "id": "batch_01j5gr81vpavng9emxaepf2be3",
- "reference": "northwind-payroll-2026-07",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "recipient_policy": "recipients_only",
- "status": "pending",
- "item_counts": {
- "total": 2,
- "pending": 2,
- "settled": 0,
- "failed": 0,
- "voided": 0
}, - "amount_totals": [
- {
- "currency": "USD",
- "total": "220.00",
- "pending": "220.00",
- "settled": "0.00",
- "failed": "0.00",
- "voided": "0.00"
}
], - "metadata": {
- "pay_period": "2026-07"
}, - "created_at": "2026-07-31T10:00:00Z",
- "finalized_at": null
}Required scope: batches:read.
Customer eligibility: authenticated business Customer only.
List batches submitted by the authenticated Customer.
When supplied, source_customer_id must identify the authenticated Customer. Results
are ordered by creation time and Batch ID. Use order to return the oldest or newest
Batches first.
| source_customer_id | string^cus_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Filter by the authenticated Customer. Another Customer returns privacy-preserving |
| status | string (BatchStatus) Enum: "pending" "processing" "completed" "partially_completed" "failed" Summary status derived from the batch item counts:
The counts are the source of truth for reconciliation and always satisfy
|
| created_after | string <date-time> Example: created_after=2026-07-31T09:00:00Z Only items created at/after this time (inclusive). |
| created_before | string <date-time> Example: created_before=2026-07-31T09:00:00Z Only items created at/before this time (inclusive). |
| reference | string <= 255 characters Exact match on your opaque |
| order | string Default: "desc" Enum: "asc" "desc" Sort by creation time. |
| cursor | string <= 8192 characters Opaque cursor ( |
| limit | integer [ 1 .. 100 ] Default: 25 |
{- "has_more": true,
- "next_cursor": "string",
- "data": [
- {
- "id": "batch_01j5gr81vpavng9emxaepf2be3",
- "reference": "northwind-payroll-2026-07",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "recipient_policy": "recipients_only",
- "status": "pending",
- "item_counts": {
- "total": 2,
- "pending": 2,
- "settled": 0,
- "failed": 0,
- "voided": 0
}, - "amount_totals": [
- {
- "currency": "USD",
- "total": "220.00",
- "pending": "220.00",
- "settled": "0.00",
- "failed": "0.00",
- "voided": "0.00"
}
], - "metadata": {
- "pay_period": "2026-07"
}, - "created_at": "2026-07-31T10:00:00Z",
- "finalized_at": null
}
]
}Required scope: batches:read.
Customer eligibility: authenticated business Customer only.
Retrieve a batch by ID. Use its item counts and amount totals to track progress.
| batch_id required | string^batch_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ Example: batch_01j5gr81vpavng9emxaepf2be3 |
{- "id": "batch_01j5gr81vpavng9emxaepf2be3",
- "reference": "northwind-payroll-2026-07",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "recipient_policy": "recipients_only",
- "status": "pending",
- "item_counts": {
- "total": 2,
- "pending": 2,
- "settled": 0,
- "failed": 0,
- "voided": 0
}, - "amount_totals": [
- {
- "currency": "USD",
- "total": "220.00",
- "pending": "220.00",
- "settled": "0.00",
- "failed": "0.00",
- "voided": "0.00"
}
], - "metadata": {
- "pay_period": "2026-07"
}, - "created_at": "2026-07-31T10:00:00Z",
- "finalized_at": null
}Required scope: batches:read.
Customer eligibility: authenticated business Customer only.
List every submitted item in the batch, including items that failed before creating a transfer.
Use item_id to reconcile the response with the line you submitted. When an item creates
a transfer, transfer_id links to the resulting txn_…. Otherwise transfer_id is null
and failure_code explains the failure.
Narrow with item_id, status, or reference.
To retry failures, submit the failed lines in a new batch. A new batch creates new
transfers. item_id does not deduplicate across batches, so resubmitting a settled line
can pay the same customer twice.
The API orders results by (created_at ASC, item_id ASC).
| batch_id required | string^batch_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ |
| item_id | string [ 1 .. 255 ] characters .*\S.* Only the batch item with this caller-supplied ID. Unique within the batch. |
| status | string (BatchItemStatus) Enum: "pending" "settled" "failed" "voided" Lifecycle of one submitted batch item. When a transfer exists, this mirrors the transfer status. Pocket assigns |
| reference | string <= 255 characters Exact match on your opaque |
| cursor | string <= 8192 characters Opaque cursor ( |
| limit | integer [ 1 .. 100 ] Default: 25 |
{- "has_more": true,
- "next_cursor": "string",
- "data": [
- {
- "item_id": "line-001",
- "batch_id": "batch_01j5gr81vpavng9emxaepf2be3",
- "status": "pending",
- "transfer_id": "txn_01jhv705whdehqd34b4113r1q8",
- "destination": {
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
}, - "amount": "100.00",
- "currency": "USD",
- "reference": "string",
- "memo": "string",
- "failure_code": "string",
- "failure_message": "string",
- "metadata": {
- "property1": "string",
- "property2": "string"
}, - "created_at": "2026-07-31T09:00:00Z",
- "updated_at": "2026-07-31T09:00:00Z"
}
]
}Required scopes: batches:read and transfers:read.
Customer eligibility: authenticated business Customer only.
Only items that produced a transfer appear here. Every submitted item appears in
GET /v1/batches/{batch_id}/items. An item that fails before transfer creation, such as for
insufficient funds when it runs, has transfer_id: null. The API orders results by
(created_at ASC, id ASC).
| batch_id required | string^batch_[0-7][0-9abcdefghjkmnpqrstvwxyz]{25}$ |
| status | string (TransferStatus) Enum: "pending" "settled" "failed" "voided"
|
| cursor | string <= 8192 characters Opaque cursor ( |
| limit | integer [ 1 .. 100 ] Default: 25 |
{- "has_more": true,
- "next_cursor": "string",
- "data": [
- {
- "id": "txn_01k0d2f6h8j4m7n9p3q5r1s0vw",
- "method": "internal",
- "reference": "payrun-2026-07",
- "memo": "July salary",
- "source": {
- "customer_id": "cus_01j8ma3wv3mepwabfxxs0yc395"
}, - "destination": {
- "customer_id": "cus_01jm0defbbct46vh2ev5dkkhej"
}, - "batch_id": null,
- "amount": "100.00",
- "currency": "USD",
- "status": "pending",
- "failure_code": null,
- "failure_message": null,
- "transitioned_at": {
- "pending": "2026-07-31T11:00:00Z",
- "settled": null,
- "failed": null,
- "voided": null
}, - "created_at": "2026-07-31T11:00:00Z",
- "updated_at": "2026-07-31T11:00:00Z"
}
]
}rcp_…). Retrieve, replace and remove operations
now address the Recipient rather than its linked Customer.PATCH to PUT. The request supplies the
complete mutable state: label, reference, status and metadata.404 recipient_not_found and creates nothing.idempotency_key is supplied.
Other operations may accept an idempotency key, but V1 does not guarantee
replay or duplicate suppression for them.400, and the caller can restart from the first page.{ code, message, details } envelope. Recipient
operations document more specific error detail schemas and HTTP responses.
Retry-After is optional on rate-limit responses.413
responses.| 0.2.0 | 0.4.0 |
|---|---|
Account-scoped balances and activity using account_id |
Customer-scoped balance and activity using customer_id. Accounts are not included. |
| Internal, ACH, wire, onchain and IBFT Transfer creation | Internal Customer-to-Customer Transfer creation only. |
Recipients addressed through their linked Customer ID and updated with PATCH |
Stable rcp_… Recipient IDs and complete replacement with PUT. Responses no longer include contact or onboarding fields. |
| Instruments, funding rules, FX quotes, events and webhooks | These operations are not included. |
Flat { code, message, param, request_id } errors |
{ code, message, details } errors. |
| At least 24 hours of idempotent replay for every operation that accepted a key | 24 hours of replay for Recipient creation, Recipient replacement when a key is supplied, and Batch creation. Other operations do not guarantee replay or duplicate suppression. |
api.pocketmoney.host to
api.relay.pocketmoney.global.cus_…) with Customer-owned
Accounts (acc_…) as directly addressable funds containers. Removed the
public Customer hierarchy and subcustomer management operations.recipients_only Batch policy.epi_…) for bank accounts and
wallet addresses, including Customer-held and third-party bank holders.Regenerate typed clients from the 0.2.0 specification before switching endpoints. API keys remain associated with one Customer. Update integrations that used the 0.1.0 subcustomer model as follows:
| 0.1.0 integration | Required 0.2.0 change |
|---|---|
Create, list, retrieve or update subcustomers through /v1/customers |
Use /v1/accounts and /v1/accounts/{account_id}. Store the returned acc_… ID. Do not derive it from or substitute a previous cus_… ID. |
Address balances and money activity by customer_id |
Use account_id. This includes source.account_id, Account-relative balance, Transaction and Deposit fields, and the account_id or source_account_id list filters. A Customer destination for an internal Transfer still uses destination.customer_id. |
Read /v1/customers/{customer_id}/balances or filter balances by parent_customer_id |
For one Account, use /v1/accounts/{account_id}/balance. For a list, use /v1/accounts and /v1/balances. |
Manage funding rules below /v1/customers/{customer_id}/funding_rules with destination_customer_id |
Use /v1/accounts/{account_id}/funding_rules. Supply destination_account_id. Responses use source_account_id and destination_account_id. |
Use member endpoints, members:* scopes or recipient_policy=payable_members |
Use Recipient endpoints, recipients:* scopes and recipient_policy=recipients_only. |
Submit Batches with source.customer_id |
Submit the source Account as source.account_id. Batch-item Customer destinations remain destination.customer_id. |
Persist 0.1.0 list cursors or handle member event resource references |
Restart pagination without the saved cursor. Handle recipient and new Account-related resource references, and continue accepting unknown event types and resource identifiers. |
Grant customers:read or customers:write |
Grant accounts:read or accounts:write. Grant the new instruments:* scopes only when using instrument operations. |
Do not mechanically replace every customer_id. Customer destinations,
instrument ownership paths and the top-level Event.customer_id continue to
use cus_… identifiers.