Follow a stalled verification (new)
- Get a party’s KYC status —
GET /parties/{partyId}/kyc-status. Where the party’s KYC/KYB verification stands, read live: averificationState(AWAITING_CUSTOMER,IN_REVIEW,RESUBMISSION_REQUESTED,APPROVED,DECLINED), therequiredActionthe end customer still has to take, and the review outcome per step with reject labels. Reference - Issue a KYC completion link —
POST /parties/{partyId}/kyc-status/completion-link. Mints a fresh, short-lived link your end customer opens to finish a verification that is waiting on them.409 kyc-not-completablewhen it isn’t. Reference POST /accountsreturns a completion link up front. When a forwardedsumsubTokenstill needs the customer to act, the201carries an optionalverificationblock withrequiredAction,completionUrlandcompletionUrlExpiresAt. Returned on the create response only. Guide
Pay-outsWebhooksPay-insConventionsCompany
Released 1 October 2026 — pay-out route webhooks, tenant selection, request correlation, stricter pay-in session retries
- Pay-out route webhooks —
PAYOUT_ROUTE_ACTIVATED,PAYOUT_ROUTE_AWAITING_OWNERSHIP_PROOFandPAYOUT_ROUTE_REJECTED(with a fixedreason). Keyed per occurrence: deduplicate onpayoutRouteId+occurrenceId. You no longer need to poll routes. Guide - Get your company profile —
GET /company. Your KYB and lifecycle status, wallet type, supported chains and, once billing is set up, abillingUrlto your billing portal. Reference x-tenant-idheader. Required when your token grants more than one tenant; omit it otherwise. An invalid selection gets a generic403. ConventionsX-Correlation-Idon every response. Quote it to support. Send your own (orX-Request-Id) to tie our logs to yours. Conventions- Contact emails stay with you. A party’s
emailand a payout bank account’sbeneficiaryEmailare no longer sent to payment providers, which get a Venly-controlled address instead. Omitting either never blocks onboarding or registration.beneficiaryPhoneNumberis still forwarded and still needed for USD routes. - Paginated lists have a stable default order. Without
sortOn, lists now come back bycreatedAtdescending — newest first — where the order was previously unspecified, so a row could appear on two pages or none.sortOrderapplies only together withsortOn; on its own it is ignored. Conventions - Pay-in session retries must match the original. Reusing an
idempotencyKeywith a changed body, on another account, or after a failed attempt answers422 idempotency-conflict; a retry with an identical body still returns the original session. Reference - Pay-in session
successRedirectUrlandfailureRedirectUrlare capped at 2000 characters. - Invoice
sequenceUrlis clarified as an internal reference you can’t open — usebillingUrlon the company profile.
- Virtual bank accounts accept deposits from any payer. A transfer from a bank account other than the holder’s own was sent back; it is now accepted. No API changes. Guide
Pay-insPay-outsWebhooksCredentialsBilling
Released 11 September 2026 — pay-in ledger, self-service credentials, billing, webhook delivery history, SEPA pay-outs
A new account inherits its holder’s verification. Linking a
partyId that is already VERIFIED
now creates the account VERIFIED instead of VERIFICATION_PENDING, so a customer’s second account
needs no second verification. A rejected holder yields a REJECTED account. Code that assumed every
new account starts pending should read kycStatus from the create response instead. ReferencePay-in ledger (new)- List and get pay-ins —
GET /pay-ins,GET /pay-ins/{payInId}. One record per fiat credit that settled (or failed to settle) into an account wallet, with gross and net crypto amounts and the on-chain transaction. ThepayInIdmatches thePAY_IN_*webhooks. Guide - A pay-in session is now an initiation-only record. It ends at
PAYMENT_RECEIVED—PaymentSessionStatusno longer hasCONVERTING,MINTINGorCOMPLETED. Conversion and the crypto credit are tracked on the new pay-in and announced byPAY_IN_SETTLED. Guide - Read pay-in sessions back —
GET /accounts/{accountId}/fiat-to-crypto/payment-sessionsand…/{sessionId}. Sessions could not be read after creation before this release. Reference - Close a virtual bank account —
POST /accounts/{accountId}/virtual-bank-accounts/{id}/close. Decommissions the bank details at the provider; readproviderClosureStatusto know whether they are actually dead. Also how you resolve the newduplicate-eur-vba— one active EUR virtual bank account per account. Guide - Creating a hosted pay-in session gained preconditions on accounts that settle through a EUR virtual bank account: retryable
409 vba-not-ready, and422 vba-required/ambiguous-eur-vba/vba-asset-mismatch/unsupported-currency. A provider refusal now answers502rather than500.
- API credentials —
GET/POST /api-credentials,POST …/{clientId}/secret,PUT …/{clientId}/status. Create, rotate and disable your OAuth credential yourself. The secret is shown exactly once. Requires the dashboard-user scopemanage:credentials. Guide - Invoices —
GET /billing/invoices,…/{invoiceId},…/{invoiceId}/download(PDF). Cursor-paginated. Scopeview:billing. Guide
GET /webhooks/{webhookId}/deliveries,…/{deliveryId}, andPOST …/{deliveryId}/resend. See what was sent, what your endpoint answered, and replay aFAILUREorDISCARDEDdelivery with its original payload andnotificationId. New enumWebhookDeliveryStatus. Guide
- SEPA pay-outs —
PayoutRailgainsSEPA(requiresfiatCurrency: EUR;railDetailstakes anibanand optionalbic; reads exposeibanLast4). New validation codesinvalid-iban,invalid-bic. Guide failureReasonon a pay-out is now the documented enumPayoutOutcomeReason—REJECTED_BY_PROVIDER,ROUTE_UNAVAILABLE,SEND_FAILED,RETURNED_BY_BANK,UNKNOWN. Treat it as open. GuidebeneficiaryEmailandbeneficiaryPhoneNumberon a payout bank account are documented, including that a route fails terminally withbeneficiary-data-incompletewhen the destination requires them and they are missing.GET /accounts/{accountId}/payoutsis additionally sortable onrequestedAt.- Request partner onboarding —
POST /parties/{partyId}/partner-onboarding. Start onboarding a verified individual to our banking partner ahead of provisioning, instead of letting the first virtual-bank-account call trigger it and fail. Guide
- No public API changes.
OnboardingPartiesVirtual Bank AccountsBreaking
Released 1 September 2026 — partner-onboarding status, and its error codes renamed
Partner-onboarding status (new) —
GET /parties/{partyId}/partner-onboarding, and partnerOnboardingStatus on the party. The third onboarding gate, next to identity verification and partner-terms consent, is now readable: NOT_STARTED, PENDING, APPROVED or REJECTED. PENDING is exactly the state behind partner-onboarding-pending, so you can wait for APPROVED instead of retrying a failing provisioning call. Guide- Provisioning a virtual bank account no longer fails with
400 party-email-requiredwhen the account holder has noemail: a synthetic address is used so onboarding proceeds. Supplying a real address up front is still strongly recommended — see the note on party email. - The public spec’s description of the webhook delivery body was corrected to the two-field
{ eventType, result }shape the webhooks guide has always shown. The wire format did not change.
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.

