Skip to main content
A linked client’s money is held on its Base smart wallet, and the holder signs each payout from it. Book a payout with POST /dapi/v1/payouts and the client’s id in X-Hevn-Account, then open a sign session for the holder. Send the client’s cl_… id in X-Hevn-Account on the routes below (Acting as a client).

What differs

Verification comes first for bank rails. A virtual account lists kyb_required or verification_required in blockers[] until the client is verified (Integration steps).

Book the payout

Save a contact with POST /dapi/v1/contacts (Payouts), then call POST /dapi/v1/payouts with the contact and one amount. Do not send publicKey.
Response 201, Location: /dapi/v1/payouts/po_4c8a…
Show the holder quote and contact in your product before you open the window. Fields are on Create an outgoing transfer.
Reuse the Idempotency-Key when you retry. A new key books a second payout (Idempotency-Key).

Approve the payout

Call POST /dapi/v1/connect/sessions with action: "sign" and the payout id, without X-Hevn-Account. Open the returned url in the popup (Approve a payout).
Response 201
The session lasts 10 minutes. Field rules are on Create a sign-in window session.

Track the payout

Do not act on the redirect. Poll GET /dapi/v1/payouts/{payoutId} with the client in X-Hevn-Account until status leaves awaitingSignature and submitted. The window returns submitted once the holder’s wallet has sent the debit, before the on-chain receipt. The statuses and failure.code are in Payouts, and the polling interval in Status codes.

Refusals

Your developer key signs for your integrator account and its sub accounts. These calls, made with a linked client in X-Hevn-Account or named in the body, are refused. account_not_controlled returns the client’s id in details.clientId. The other payout refusals are in Errors.

Sandbox

Next: Balances and transactions