Scoping output
Before building, agree on:- The legal entity that owns both ends, and its account: Your Business UPA, or one customer’s account
subjectType,individualorbusiness. It cannot be changed after creation- The motion: fund, withdraw, top up, settle, or several
- The pattern
- Market, currency and rail for any bank leg
- Chain and stablecoin for the wallet leg
- Who signs from the wallet. Stableyard never signs for a connected wallet
- What finance reconciles against: payment ids and
externalReference, deposits, or on-ramp funding transactions
Choose your pattern
Fund from your own bank
Withdraw to your own bank
Top up with stablecoin
Settle your own revenue
Acquirer or PSP, own merchant accounts
How the money moves
- Fund
- Withdraw
- Top up
- Settle
Pattern: Fund from your own bank
Use when: the account holder funds their account repeatedly by bank transfer from a bank they already use, and the money should arrive as stablecoin in their own wallet. Signals:- The holder saves the same bank details as a payee and reuses them
- No API call should fire per transfer
- The destination is a connected wallet on the same account
Create the account
POST /v2/accounts with subjectType and the holder’s wallet. See Universal Payment Account and Create account.Verify the holder
individual verifies their email, then their identity with POST /v2/accounts/{accountId}/kyc/session. A business completes hosted business verification, started by its first activation. See Onboarding overview.Activate bank_onramp
POST /v2/accounts/{accountId}/capability-activations with capability: "bank_onramp". Open nextAction.url for the holder, then wait for ready: true in GET /v2/accounts/{accountId}/capabilities. See Capability activation and Activate capability.Check what can be issued
GET /v2/accounts/{accountId}/onramp-bank-account-requirements. Continue only on available: true, and choose the wallet and asset from its destinations. See On-ramp accounts.Issue the on-ramp account
POST /v2/accounts/{accountId}/onramp-bank-accounts with an Idempotency-Key. The wallet and asset are fixed once issued. See Issue on-ramp account.Show the deposit instructions
GET /v2/accounts/{accountId}/onramp-bank-accounts/{onrampBankAccountId}/deposit-instructions is the only response with the full account number. Show it to the holder; never log, cache or store it. See Deposit instructions.Track each transfer
GET /v2/accounts/{accountId}/onramp-bank-accounts/{onrampBankAccountId}/transactions. bank_funding.completed and bank_funding.failed prompt you to read it. See Funding transactions.bank_onramp on that program. See Going live.
Pattern: Withdraw to your own bank
Use when: the account holder cashes out stablecoin to a bank account they already hold, and each withdrawal is started explicitly. Signals:- The bank is in the holder’s own name. Paying anyone else’s bank is a third-party flow
- Each withdrawal is one payment with its own id and result
- The holder’s wallet holds the stablecoin, and someone can sign from it
Create the account with a wallet
POST /v2/accounts with wallets. See Create account.Verify the holder
individual needs approved identity verification. A business starts hosted business verification by activating linked_bank with business.legalName, and can then link a US bank only. See Business bank access.Activate linked_bank
POST /v2/accounts/{accountId}/capability-activations with capability: "linked_bank", then wait for ready: true. See Capability activation.Link the bank
GET /v2/accounts/{accountId}/bank-account-requirements, render the country’s schema, then POST /v2/accounts/{accountId}/bank-accounts. Wait for the bank’s status to be active. See Bank accounts, Bank requirements and Link bank account.Set the payment source
PUT /v2/accounts/{accountId}/payment-source names the wallet that funds the withdrawal. See Set payment source.Create the withdrawal
POST /v2/payments with intent: "send", destination.type: "bank_account", collect_exact and a crypto amount, or deliver_exact and a fiat amount where the route offers a locked quote. Under collect_exact the final dollar figure is known only when the provider settles, so do not promise one. See Sending payments and Create payment.Fund it before the quote expires
nextAction.type is transaction with depositInstructions, the wallet sends exactly that amount to that address before funding.quoteExpiresAt. An expired quote is terminal. See Fund a fiat send before its quote expires.Read the payment
GET /v2/payments/{paymentId} until status is terminal, with operationalState and offrampStatus beside it. Never create a second payment for the same withdrawal. See Get payment.crypto_wallet and needs no verification. See Stablecoin transfers.
Stableyard enables: your organization’s KYB, the linked-bank route for each country, linked_bank on your banking program, and business verification for business accounts.
Pattern: Top up with stablecoin
Use when: the account holder sends stablecoin from a wallet they control into their account, in any amount, whenever they choose. Signals:- The holder saves one address per chain and reuses it
- No amount, expiry or order is attached to an arrival
- No verification is involved
Give the account a settlement destination
PUT /v2/accounts/{accountId}/settlement-profile. See Settlement destinations and Set preference.Check the network catalog
GET /v2/deposit-networks. Request only chains where live is true: one paused chain fails the whole batch. See List networks.Issue the addresses
POST /v2/accounts/{accountId}/deposit-addresses with chainIds. Each address is permanent for one account on one chain. See Create addresses.Show the address with its minimum
ignored. It is not credited and not returned. See Deposit minimums.Read each deposit
GET /v2/accounts/{accountId}/deposits. Each arrival is its own deposit; credit it on settled, not on detected. See Deposit addresses and List deposits.Pattern: Settle your own revenue
Use when: you collect payment for your own business, such as for your own goods or your revenue share, and want the net held in a wallet or Vault you control. Signals:- The receiving account is yours, typically Your Business UPA
- Your backend chooses where value lands; the payer chooses only how to pay
- Spending afterwards may need to be bound by on-chain rules
Use your own account
Provision a Vault, if you want one
POST /v2/accounts/{accountId}/vault, then wait for status: active before settling into it. Vaults run on Arbitrum only, with USDC and USDT. See Treasury settlement and Create Vault.Choose the destination
GET /v2/accounts/{accountId}/settlement-destinations. Offer only destinations where capabilities.settlementSupported is true, then set the profile with PUT /v2/accounts/{accountId}/settlement-profile. See List destinations.Collect
POST /v2/payments with intent: "receive" and your account as recipient, or issue a deposit address for open-ended top-ups. See Depositing funds.Confirm it landed
GET /v2/payments/{paymentId}. accepted means the payer’s funds were verified; succeeded means your destination was credited. See Settlement lifecycle.Pattern: Acquirer or PSP, own merchant accounts
Use when: you hold local-currency settlement balances in processing merchant accounts you own, and want them settled in stablecoin in your own name.Classify the flow
Agree the terms with Stableyard