Base URL (staging):
https://api-staging.venlyfinance.com/v1
Auth: OAuth2 Bearer token in the Authorization header. Tokens expire after 5 minutes — see the Authentication guide.What you’ll build
- Onboard a party (your customer) — created
ACTIVEimmediately - Open an account for them (its custodial wallet is provisioned automatically)
- Get the account verified by a Venly admin
- Issue a EUR IBAN so they can fund via SEPA
- Send an outbound transfer
The big gate to design around: an account is created unverified (
kycStatus: VERIFICATION_PENDING) and a Venly admin must verify it before it can move money. A party, by contrast, is ACTIVE right away. See Account verification.Prerequisites
Staging credentials
A
client_id and client_secret from your Venly contact. Staging calls don’t move real money.Step 1 — Authenticate
Exchange your client credentials for a Bearer token. Every subsequent call needs it in theAuthorization header.
Response
Step 2 — Create a party
A party is the person or organisation behind an account —INDIVIDUAL (natural person) or ORGANISATION (company). It’s created ACTIVE immediately; there’s no verification step for a party.
Response (201)
Step 3 — Open an account
An account holds the wallet, IBANs, and transfer history. Link the party from Step 2 withpartyId (it becomes the ACCOUNT_HOLDER). The custodial wallet is provisioned automatically — there’s no separate “create wallet” call.
The only difference between company types is the wallet address:
- Venly-managed — Venly creates and holds the wallet. Omit
address. - Self-custody — the customer controls the wallet. Send their
address(required).
Response (201)
Add a second account holder (optional)
Step 4 — Get the account verified
The account is created withkycStatus: VERIFICATION_PENDING. A Venly admin reviews and verifies it — there’s no API call to trigger this. Once approved, kycStatus becomes VERIFIED.
Poll the account until it flips:
Response (200)
code and HTTP status vary by operation (e.g. 400 kyc-not-verified for IBANs, 422 kyc-required for pay-in sessions). See Account verification for the full list of what’s gated.
Step 5 — View the wallet
The wallet was created with the account. Read it (and its balances) any time:Response (200)
type is VENLY_MANAGED or SELF_CUSTODY depending on your company.
Self-custody only: before this wallet can send funds, the customer signs a one-time permit so Venly can move their tokens. Do this once after the account is set up — see Approving transfers without gas.
Step 6 — Issue a virtual bank account (IBAN)
Once the account isVERIFIED, attach an IBAN so it can be funded via SEPA. Incoming euros are auto-converted to the targetCryptocurrency (USDC, EURC, or USDT) and credited to the wallet.
Response (201)
Step 7 — Fund the account
Option A — SEPA transfer to the IBAN
The customer sends EUR from their bank to the IBAN from Step 6, including thereferenceCode in the payment reference. On receipt, Venly converts EUR → the target crypto and credits the wallet.
Option B — Hosted fiat-to-crypto pay-in
Create a pay-in session and redirect the customer to the returnedpaymentUrl.
paymentUrl. When the customer completes payment, the wallet is credited and your callbackUrl is invoked.
Step 8 — Send a transfer
Transfers move funds between two Venly accounts — identify the receiver byreceiverAccountId or by your own receiverExternalId. Both the sender and the receiver accounts must be VERIFIED; sending to an unverified receiver fails with 422 receiver-kyc-not-verified.
Crypto transfer
Response (201)
Fiat transfer
A fiat-denominated transfer settles in the underlying stablecoin and returns afiatOrigin block with the original currency and exchange rate.
Self-custody senders also need a
CONFIRMED permit and a granted allowance before a transfer succeeds — see Approving transfers without gas. Venly-managed accounts don’t.Step 9 — Track the transfer
Crypto and fiat transfers usually complete synchronously, but you can always fetch the latest state:status | Meaning |
|---|---|
PENDING | Accepted, settlement in progress |
COMPLETED | Final — funds delivered (transactionHash populated) |
FAILED | Final — see errorMessage |
GET /accounts/{accountId}/transfers plus pagination parameters. Retrying a create with the same idempotencyKey returns the original transfer — no double-spend.
Common pitfalls
KYC errors (kyc-not-verified or kyc-required) on transfers, IBANs, or payments
KYC errors (kyc-not-verified or kyc-required) on transfers, IBANs, or payments
The account is still
VERIFICATION_PENDING. A Venly admin must verify it first — poll GET /accounts/{id} until kycStatus is VERIFIED. (The party being ACTIVE is not enough.)Self-custody transfer fails even when verified
Self-custody transfer fails even when verified
The customer hasn’t signed the token permit yet, so Venly has no allowance to move funds. Run the permit flow once, then retry.
Address is required for SELF_CUSTODY wallet type
Address is required for SELF_CUSTODY wallet type
Self-custody accounts must include the customer’s wallet
address on creation. Venly-managed accounts must not.account-not-found on a transfer
account-not-found on a transfer
The
receiverAccountId / receiverExternalId doesn’t resolve to an account in your company. Transfers are account-to-account — both sides must be Venly accounts you own.Token expired mid-flow
Token expired mid-flow
Tokens last 5 minutes. Catch
401, refresh, and retry the original call. Don’t pre-authenticate every request — cache the token.Next steps
Getting started
The condensed party → account → verify → IBAN flow.
Browse the API reference
Every endpoint, field, and error code.
Permits & allowances
Gasless token approvals for self-custody accounts.
Contact support
Stuck? Get in touch with your
accountId and the failing request.
