The rates behind them are commercial and set per integrator. Ask HEVN for yours — the API will
then quote them back to you on every payment.
Two kinds of number
Every price in this API is one of two things, and they are never interchangeable.
Show declared numbers in your UI. Reconcile against quoted ones. Never store a declared rate and
bill from it later.
The fields that carry a fee
On a rail
A rail record fromGET /dapi/v1/banks carries feeBps — HEVN’s deposit fee for that rail in basis
points, a whole number, taken out of the converted amount. 100 is one per cent, so 25 is 0.25%.
It carries minimumDeposit too: the smallest amount the partner will accept over that rail, in the
rail’s own currency. Anything under it is returned by the bank, not refused by us.
GET /dapi/v1/banks/{rail}/rate is the indicative price of a deposit over one rail:
currency comes back.
On a contact
GET /dapi/v1/contacts/{contactId}/capabilities?amount=500.00 is the closest thing to a price list
this API has, because it is scoped to one real destination. It answers one options row per payable
account, each carrying method, currency, minAmount, maxAmount, feeBps, fixedFee, whether
a purpose, a memo or documents are required — and blockers[], which is everything that would
refuse a payout to that contact right now.
POST /dapi/v1/payouts/preview takes {"rail", "amount"} and prices a rail with no contact and no
side effects.
Neither is a gate. POST /dapi/v1/payouts re-checks the same conditions on its own, and its numbers
are the ones you are held to.
On a payin
Thequote on POST /dapi/v1/payins states both ends and the cost between them:
On a payout
A payout’squote has three shapes, and which one you get is decided by the contact — not by a flag
you set.
A bank payout converts, so it carries everything:
rate, feeAmount and expiresAt are
absent rather than filled with 1 and 0, and the two amounts are the same money:
feeAmount is the
route’s cost, rate stays absent, and the quote expires.
Which side absorbs the fee
You decide, by choosing which side of the payment to pin. Send exactly one:
Sending both is refused. Deriving the other side yourself and sending it as the pinned side is worse:
it will be right until a rate moves between your calculation and the booking, and then it will be
quietly wrong. See Conventions.
What is not a fee
- Gas. A client’s Base smart wallet transacts through an ERC-4337 paymaster, so there is no network fee line on any quote and no ETH for anyone to hold.
GET /dapi/v1/rates. It converts one currency or token into another at the current market rate and says so withindicative: true. It is a display rate; no payment ever settles at it.- The escrow
feeBps. Oncaptureandchargethat field is your own take rate, deducted from the captured amount before the seller is paid, up to the ceiling fixed when the deal was created. It is revenue for you, not a cost from HEVN. See Escrow actions.
Reading the cost back after the fact
The quote is what you were charged; the ledger is what happened. A transaction row carries its amounts as two sides —from is what left the source, to is what arrived — so the difference
between them is the whole cost of that movement, whatever it was made of.
GET /dapi/v1/transactions/summary totals the same filters, and
GET /dapi/v1/transactions/export renders a statement your customer’s accountant can read. See
Balances and transactions.
Next: Rails and payment methods
What each method needs, which currencies the deposit rails carry, and how a rail id is put together.