Virtual Bank AccountsErrorsBreaking
Released 1 September 2026 — partner-onboarding error codes renamed
The remaining changes in 1.6.0 through 1.8.0 are being documented separately.
OnboardingPartiesConsent
Released 23 August 2026 — your end customer accepts partner terms themselves
Our partners require the real end customer to read and accept their terms on a screen themselves; nobody may accept on their behalf. This release surfaces that requirement through the API, and gives you a way to collect the acceptance before any customer data reaches a partner.Partner-terms consent (new)Consent is the final gate after KYC. A verified party whose customer has not accepted cannot get a virtual bank account or receive a pay-out. See Partner-terms consent.
- Get the consent state —
GET /parties/{partyId}/partner-terms. Onestatusand, while outstanding, oneconsentUrlcovering every partner the party is onboarding to. Always current as of the call. Reference - Issue a link up front —
POST /parties/{partyId}/partner-terms/link. Mints a link so your customer can accept every enabled partner’s latest terms before onboarding begins, rather than hitting the gate later. Reference - New enum
PartnerTermsStatus(NOT_REQUIRED,REQUIRED,ACCEPTED), and a cachedpartnerTermsStatuson the party for consumers that would rather poll the plain party read.
- Both endpoints fail closed:
503 identity-verification-unavailableis retryable and never means “nothing outstanding”, and aREQUIREDis never returned without aconsentUrl.
emailon a party — optional, and accepted on create and update. Supply a real address up front for an individual on a self-custody account: when an account holder is onboarded to a partner the email is forwarded with the case, and if the party has none a synthetic address is used instead. Because the partner stores it write-once, adding a real address later does not replace the synthetic one.
AssetsWalletsPay-outsTransfers
Released 21 August 2026 — Asset discovery, explicit asset selection, contract-wallet activation, and pay-out ownership proofs
This release makes asset selection explicit. A tenant can now hold the same stablecoin on more than one chain, which means a fiat currency no longer always identifies a single asset — so there are new endpoints to discover what you can use, and new fields to say which one you mean.Discover what you can settle in (new)Stop hard-coding asset lists. See Chains and assets.
- List supported assets —
GET /supported-assets. Every chain/asset pair enabled for your tenant, withdecimalsandcontractAddress. Reference - List account supported assets —
GET /accounts/{accountId}/supported-assets. The same list annotated with a per-accountpermitStatus, so you can tell whether this account can move an asset yet. New enumAssetPermitStatus(READY,ACTIVATING,ACTION_REQUIRED,PENDING,FAILED,NO_WALLET). Derived per request and never stored — don’t cache it. Reference
chainandassetare now accepted on create fiat transfer. Send them together.- Optional while a currency maps to one asset for your tenant; required once it maps to more than one. New codes:
ambiguous-asset,chain-and-asset-required-together,asset-currency-mismatch.
- Verify wallet allowances —
POST /accounts/{accountId}/wallets/{walletId}/allowance-verification. A second activation path for self-custody wallets that can’t sign a permit — a Safe, for example. Grant a plainapprove()on-chain, then call this; the allowance itself is the consent, so there’s no request body and no proof. Reference WalletStatusgainsVERIFYING_ALLOWANCE. It is not a usable state — every check treats it exactly likePENDING. If the verification window closes with assets still uncovered, the wallet reverts toPENDING. See Permits and allowances.
- Prepare and submit a route ownership proof —
POST /accounts/{accountId}/payout-routes/{routeId}/ownership-proof/prepareand.../complete. Where a destination requires a Travel-Rule proof that you control the source wallet and that wallet is self-custody, registration pauses until its owner signs. Reference PayoutRouteStatusgainsAWAITING_OWNERSHIP_PROOF— the only route status that needs an action from you. EIP-191 externally-owned accounts only; ERC-1271 contract signatures are not supported. See Pay-outs.
beneficiaryEmailandbeneficiaryPhoneNumberon register a payout bank account. Some destinations are refused without both. A bank account cannot be edited after registration, so a route built on incomplete beneficiary data fails terminally withbeneficiary-data-incompleteand the beneficiary has to be registered again — supply both up front.
Pay-outsVerificationWebhooksPay-in
Released 31 July 2026 — Bank pay-outs, identity verification, webhooks, and USD pay-in rails
This release opens up the crypto-to-fiat direction, puts identity verification under your control through the API, and adds webhooks so you no longer have to poll for asynchronous outcomes.Bank pay-outs (new)Send crypto from an account wallet and have a bank beneficiary receive fiat. Three new resources, created once and reused: a payout bank account (whose bank account), a payout route (which bank account pairs with which crypto asset), and a payout (how much, when). See Pay-outs.
- Register a payout bank account —
POST /parties/{partyId}/payout-bank-accounts. The only endpoint that accepts raw rail credentials; the account number is encrypted at rest and only ever returned asaccountNumberLast4. Initial rail isUS_ACH. Reference - List and get payout bank accounts —
GET /parties/{partyId}/payout-bank-accountsand.../{payoutBankAccountId}. - Create a payout route —
POST /accounts/{accountId}/payout-routes. Pairs an allow-listed bank account with a crypto deposit asset; the provider is resolved internally and never exposed. Reference - List payout routes —
GET /accounts/{accountId}/payout-routes. ExposesdepositAddressfor anACTIVEroute on a self-custody account. Reference - Request a payout —
POST /accounts/{accountId}/payouts. Creates a PULL pay-out funded from the account wallet via its permit. Reference - List and get payouts —
GET /accounts/{accountId}/payoutsand.../{payoutId}. - New enums:
PayoutStatus(REQUESTED,SENDING,PROVIDER_PROCESSING,COMPLETED,REJECTED,FAILED,RETURNED),FundingMode(PULL,PUSH),PayoutRouteStatus,PayoutRail,PayoutBankAccountStatus. PartyRoleTypegainsPAYOUT_RECIPIENT. A party needs this role,ACTIVEand with cleared KYC/KYB, before a route can be created for its bank account. It may be held alongsideACCOUNT_HOLDERfor self-payouts.
- Create a hosted verification link —
POST /parties/{partyId}/verification. Mints a hosted KYC (individual) or KYB (organisation) link. Links do not expire: re-POSTing returns the same URL with200, or mints a fresh one with201if the old was revoked. Reference - Get verification linkage —
GET /parties/{partyId}/iv-verification. Returns the linkagestatusand the durableivCaseReferenceto quote to support. Reference - Forward an existing Sumsub verification —
party.sumsubTokenonPOST /accountsforwards a Sumsub share token instead of re-verifying the user. Individuals on self-custody tenants only. Write-only, never returned. If the forward fails, the entire account-creation transaction rolls back — retry with a fresh token. KycStatusgainsNOT_REQUIREDfor accounts, letting tenants with tenant-managed KYC declare that they verify end-users themselves. Requires a Venly admin to enable the flag on the company tenant — without it the call fails withkyc-not-required-not-allowed. Granted for testing rather than production use; production integrations verify via a hosted link or Sumsub token sharing.
POST /webhooks,GET /webhooks,GET /webhooks/{webhookId},PUT /webhooks/{webhookId},DELETE /webhooks/{webhookId}.- Ping a webhook —
POST /webhooks/{webhookId}/pingqueues a syntheticPINGevent so you can validate your endpoint end-to-end. Reference - Authentication is
API_KEY(injected into a header you name) orBASIC_AUTHENTICATION. Secrets are write-only and never returned, so an update is a full replacement.
- USD → ACH lane added alongside EUR → SEPA.
bankAccountTypegainsUSD_ACH, and the response now carriesaccountNumberandroutingNumber. Requires your tenant to be onboarded for the USD lane with an approved KYB recording. depositRailsis a new array carrying the complete instruction set per rail — including the bank and beneficiary postal addresses that wire and SWIFT senders require. USD accounts typically exposeACH,WIRE,RTPandSWIFT; EUR accounts expose a singleSEPArail. Build payment instructions from this rather than the single-rail summary fields.VirtualBankAccountStatusgainsPENDING— an EUR account can be returned before the provider has populated its deposit rails. Don’t show payment instructions until it isACTIVE.- Prepare a wallet-ownership proof —
POST /accounts/{accountId}/virtual-bank-accounts/prepare. Where a self-custody wallet must prove ownership before a virtual bank account can be created, returns the exact message the customer must sign; submit it back in the newownershipProofblock on create. Reference
- Ethereum (
ETHEREUM) and Solana (SOLANA) are now accepted values. Availability for your company still depends on its configuredsupportedChains. See Supported chains & assets.
AmlStatuswas documented asPENDING/APPROVED/REJECTED. The actual values arePENDING,APPROVED,FLAGGED,BLOCKED— treat anything other thanAPPROVEDas not-ready. See Account verification.- The pay-in session endpoint now documents its
manage:pay-in-sessionsrole and its full error set (no-suitable-provider,company-not-active,account-not-active,idempotency-key-conflict,kyc-required,unsupported-asset, plus502/503provider states). vatNumberwas listed on the party list item. It is only returned by a single-party fetch, and has been removed from the list schema.
Version 1.1.0 adds Polygon as a supported chain and lets self-custody tenants register an end-customer’s own wallet.New supported chain
- Polygon (
POLYGON) is now available for accounts, wallets, and balances. See Supported chains & assets.
- Self-custody tenants can register an end-customer’s own wallet by passing
addresswhen creating an account. See Managed vs. self-custody.
- Retrying an operation with the same idempotency key and body returns the original result. See Idempotency.
- Account-to-account crypto transfers are now supported for Venly-managed accounts.

