/dapi/v1 and to these guides, newest first. Breaking marks a change that makes an integration written against the earlier contract fail; each one says what to change.
Guides synced with the API
- The error reference now lists
verification_not_applicable(409),kyb_documents_processing(409, retry the completion in a few seconds) andtransfer_policy_denied(403, the holder’s own policy refuses the payout). It dropsrail_requirements_unmetandphone_required, which the API no longer answers. - Payins explain
singleUse, the two windows a payin lives through, and what happens when a payer sends the wrong amount, currency or chain. - The sandbox accepts any made-up company, people and documents that bring the KYB document to
ready: true. - The
slotenum on documents no longer includesdirectors_registryorlist_of_authorized_signatories. - A contact’s
addressis returned with all of its fields.
Fees from the client's plan
feeBpson a virtual account comes from the client’s plan, so two clients can read different values for the same product. Read it per client; never hardcode it (Fees).
Regulated companies
- The KYB document takes
company.regulatoryLicenseType,company.regulatorCountry,company.verifiesCustomerIdentityandcompany.hasTransactionMonitoring. Some partner banks need them whenisRegulatedistrue(KYB fields).
FDIC_EUR account
- A new account,
FDIC_EUR: euros a partner bank holds for the client, next toFDIC_USD. It appears inGET /dapi/v1/client/balance,sourceAccount,destinationAccountand swaps (Balances and transactions). A payin cannot settle into it. railCurrencycan readEUR.
Virtual accounts by product · identity verification
Breaking: virtual accounts are requested by product.
POST /dapi/v1/bankstakes{"product": "eu"}instead of{"rail": "…"}. A product is a region code —eu,us,uk,swift,uae,br,mx,co,au,ng— and HEVN picks the rail behind it (Rails).GET /dapi/v1/banks/{rail}andGET /dapi/v1/banks/{rail}/rateare nowGET /dapi/v1/banks/{product}andGET /dapi/v1/banks/{product}/rate.GET /dapi/v1/banks/{rail}/requirementsis removed. A request is never refused for something missing any more: the record is createdpreparingand lists what it waits for inblockers[]—kyb_required,verification_requiredorterms_required(Virtual accounts).- Every record carries
product.railstays on the record, but it is informational and can change while the record ispreparing; stop storing it and stop sending it. - A phone number on the account no longer blocks a virtual account.
product instead of rail, key your stored records by product, replace the requirements read with blockers[] on the record, and drop handling for 422 rail_requirements_unmet and 422 phone_required.Identity verification for linked individuals.POST /dapi/v1/connect/sessionstakesaction: "verify"with aclientId. The holder verifies their identity in the sign-in window; you get the result on the redirect and inverifiedAt(Sign in with HEVN).- The client record carries
verifiedAt: when a business passed KYB, or when an individual verified their identity (Clients). - In the sandbox,
POST /dapi/v1/sandbox/kyb/statuswithapprovedalso verifies an individual client.
Sign-in window
- Linking issues the code right after the holder signs in. There is no separate consent screen, and the
access_deniedcallback now means the holder cancelled. login_hinton the session URL signs the holder in with a one-time code sent to that email; without it the window offers Google and email sign-in.- The window’s title, logo, colours and theme are set by HEVN on request. The Sign-in window card keeps only Allowed sites.
Non-custodial clients and Sign in with HEVN
Breaking: clients are created and owned by your customers.
POST /dapi/v1/clientsis removed. A client comes from Sign in with HEVN:POST /dapi/v1/connect/sessionswithaction: "link", the HEVN-hosted window, thenPOST /dapi/v1/clients/linkwith the code it returns.- The client’s wallet is owned by the holder’s own key. Your developer key signs only for your own integrator account.
- A payout you book for a linked client answers
authorization: "client". The holder approves it in the window through asignsession; there is no approval for your key. - Developer key scopes are gone.
cl_… from POST /dapi/v1/clients/link server-side, and route each client payout through a sign session (Payouts).Payout quotes name their source
- A payout quote names the account it is paid from in
quote.sourceAccount. Read the account from it, not fromfromCurrency: aFDIC_USDpayout and aUSDCpayout a partner prices in USD both readfromCurrency: "USD"(Payouts). - A SEPA contact requires
bank.bankName.
Sandbox limits and KYB decisions
- Sandbox limits: 5 clients per integrator, at most
1per payout, escrow and payin credit, and a faucet that sends at most5, only to a wallet holding less than1. New refusalssandbox_client_limit_reached,sandbox_amount_limit_exceededandsandbox_faucet_balance_too_high(Limits). - In the sandbox a completed KYB submission waits for you: decide it with
POST /dapi/v1/sandbox/kyb/status—approved,rfiorrejected(Sandbox). - Chain errors —
bundler_*anduser_operation_*— answer503, never502.simulation_failed,bundler_unavailableanduser_operation_unavailablecarrydetails.reason. - Unreadable values in a KYB document arrive as an RFI comment and are answered with
PUT /dapi/v1/documents/{documentId}/content.document_fields_missingis removed; completion refuses only withkyb_incomplete. - A phone number is not unique: two clients may share one.
Swaps
- Swaps: move money between two accounts the same client owns, with
POST /dapi/v1/swaps/preview,POST /dapi/v1/swapsand a signed confirmation.
Whitelabel API
- First release of
/dapi/v1: developer keys, clients, KYB, virtual accounts, payins, payouts, contacts, the ledger, escrow and the sandbox.