What each step needs
Eight steps
1
Read your configuration
The first call in every environment. It proves the credential and reports what this app can do.Before moving on:
compliance.partnerKyb.status is approved and the identity_kyc module reports available: true. If either is not, stop and ask Stableyard; nothing after step 2 works without them.2
Create a customer account
One account per customer, keyed by your own user id. Replace Keep
42161 with a chain from networks in your configuration; staging uses test networks.account.id and the wallet’s id. subjectType can never be changed later. See Universal Payment Account.3
Verify the customer's email
Stableyard emails a six-digit code. Your screen collects it and your backend confirms it.The response carries Before moving on:
challenge.id, challenge.expiresAt (ten minutes) and nextAction.type: "enter_email_verification_code". Then:contact.status is verified and nextAction.type is start_kyc_session. If your configuration reports emailVerification.mode: "partner_asserted", you assert the email instead; see Email verification.4
Start identity verification
No body. The account path fixes who is being verified.Open
verificationUrl for the customer. It is hosted by the verification provider and takes no return URL, so your screen waits: poll GET /v2/accounts/acct_123/kyc, or act on the kyc.updated webhook.Before moving on: current.eligibility.status is eligible. States and next actions are on Individual KYC.5
Activate the bank capabilities
Each regulated capability is activated per account. Start with If
bank_onramp.capability.nextAction.type is complete_compliance, open nextAction.url for the customer before expiresAt. It is a one-time Stableyard-hosted form. Then wait for capability.ready: true from GET /v2/accounts/acct_123/capabilities, or the compliance.approved webhook.Repeat with "capability": "linked_bank" and a new Idempotency-Key; step 8 needs it. It can return its own complete_compliance action. See Capability activation.6
Issue an on-ramp account and read its deposit instructions
Ask whether it can be issued, then issue it, then read the full bank details.Proceed only when Once The response carries
available is true, and take connectedWalletId and the asset from destinations.status is active:beneficiary.name, bank.name, bank.abaRoutingNumber and bank.accountNumber. Show them to the customer; never log or store them. See On-ramp accounts.7
Link the customer's bank account
Read the fields the country needs, then link it.The response carries
bankAccount.id and bankAccount.status. If provisioning.nextAction.type is complete_provider_onboarding, open its url for the customer.Before moving on: GET /v2/accounts/acct_123/bank-accounts/{bankAccountId} reports status: "active". See Bank accounts.8
Send a payout to the linked bank
Name the wallet that funds it, then create the payout.The response carries
funding (the quote) and nextAction. When nextAction.type is transaction with depositInstructions, the wallet sends exactly that amount to that address before funding.quoteExpiresAt. Then read GET /v2/payments/{paymentId} until status is terminal.US payouts to a linked bank are certified on staging. Whether a route takes collect_exact with a crypto amount or deliver_exact with a USD amount depends on the route; see Sending payments.What you proved
One account, verified in order, with bank details that convert to stablecoin and a payout that reached a bank. Production repeats every step with new credentials and new accounts: nothing carries over. See Going live.Next: Branding and your frontend
What your customers see at each of these steps, and what you can change.