Payments / Onramp·Multi-chain · EVM · Solana
BVNK
Enterprise stablecoin payments infrastructure: merchant payment links, embedded wallets, fiat-to-stablecoin conversion, and global stablecoin payouts with built-in compliance screening.
- 01B2B stablecoin payouts
- 02merchant payment links (USDC/USDT)
- 03fiat <> stablecoin conversion
- 04embedded wallets for platforms
- 05regulated cross-border settlement
- pnpm add @bvnk/javascript-sdk
| Variable | Scope | Description |
|---|---|---|
| BVNK_API_KEY | Server | BVNK API key id (Hawk auth). Pair with `BVNK_API_SECRET`. Use sandbox credentials with `https://api.sandbox.bvnk.com/`. |
| BVNK_API_SECRET | Server | BVNK API secret used to compute the per-request Hawk MAC. Never expose to the client. |
| BVNK_WEBHOOK_SECRET | Server | Shared secret used to verify the HMAC signature on incoming BVNK webhook events. |
Use BVNK for merchant stablecoin acceptance and payouts. Server-side, sign every request with Hawk auth (key id + secret) against `https://api.bvnk.com/` (or `https://api.sandbox.bvnk.com/`). To accept a payment, create a payment link via `POST /api/v1/pay/summary` with the merchant code, amount, and `paymentCurrency`; redirect the user to the returned `redirectUrl`. To pay out, call the estimate endpoint first (`POST /api/v1/quote/...`) for an indicative FX rate, then `POST /api/v1/pay/summary` with `twoStep: "true"` and the recipient address. Verify webhook signatures with `BVNK_WEBHOOK_SECRET` before crediting orders or marking payouts complete.
- ⚑Auth is Hawk (per-request HMAC), not bearer tokens — every request needs a fresh nonce/timestamp; clock skew >60s rejects requests with an opaque 401.
- ⚑Payouts and withdrawals require IP allowlisting in the BVNK dashboard — local dev from a residential IP will silently 403 until you whitelist.
- ⚑Sandbox (`api.sandbox.bvnk.com`) and production are entirely separate tenants with their own credentials, merchant codes, and webhook URLs; merchant code from one will not resolve in the other.
- ⚑Compliance screening (sanctions, PEP, travel rule) runs inline on payouts — a payout can sit in `PENDING_REVIEW` for hours; do not block UI threads waiting for terminal status.
- ⚑Network strings are strict: use `ETH` / `TRX` / `SOL` for the chain and `USDC` / `USDT` for the asset — mismatched pairs (e.g. USDC on TRX) fail validation rather than auto-routing.
- ⚑FX margin on fiat <> stablecoin conversion is not flat — always call the estimate endpoint immediately before creating the payout and pass the returned quote id to lock the rate.