send21 creates clean, verifiable payment instructions for BTC, USDC, USDT, and EURC — across Bitcoin, Solana, Ethereum, and Base. Funds move directly from the sender's own wallet to the receiver. We never touch keys. We never touch coins.
Drafts: PSBT wallets (Bitcoin Core, Sparrow, Electrum) · Checkout pay links: any QR-scanning wallet
send21 has no hot wallets, stores no private keys, and contains no signing code. A full server compromise cannot move a single satoshi.
Multi-output drafts carry the send21 fee as a separate transparent output; single-output payments carry no fee at all — it accrues to the creator's account. Either way the receiver gets the exact billed amount and your wallet sets the network fee.
Bill in any of 165 world currencies — USD, EUR and SEK to NGN and VND — with a locked, recorded exchange rate. Or set an exact amount in BTC, USDC, or USDT. Full quote provenance on every payment.
send21 is agent-first: everything a human does in the UI, an agent does over REST. Scoped API keys mean an agent can create and track drafts but can never move funds — nobody can, that's the point.
drafts:write, drafts:read, webhooks:manage — grant only what the agent needs.
Retry-safe Idempotency-Key support and batch endpoints for up to 25 drafts per call.
Daily, weekly, or monthly drafts generated automatically — subscriptions without custody.
POST /payment-requests — fiat-priced, multi-currency (BTC / USDC / USDT / EURC) pay links with a hosted QR pay page.
HMAC-SHA256 signed status events (draft.seen, draft.confirmed, …) instead of polling.
Point any MCP client at https://send21.io/mcp with your API key — tools for drafts, pay links, rates, and fees. No wrapper needed.
curl -X POST https://send21.io/api/v1/drafts \
-H "Authorization: Bearer s21_yourkey" \
-H "Idempotency-Key: invoice-2026-001" \
-H "Content-Type: application/json" \
-d '{
"receiverAddress": "bc1q...",
"network": "Mainnet",
"paymentMethod": "MultiOutput",
"fiatCurrency": "USD",
"fiatAmount": 50.00,
"memo": "Invoice 2026-001"
}'agent → create draft → fetch tx template → fund & sign in own wallet → broadcast → webhook: draft.confirmed
Send a scoped API key as Authorization: Bearer s21_…. Grant only the scopes the agent needs (drafts:write, drafts:read, webhooks:manage). No scope can ever move funds.
POST /api/v1/drafts with the receiver address and either an exactamountSats or a fiat-pegged fiatCurrency + fiatAmount. Include an Idempotency-Key header — retries are safe and return the same draft.
The response contains the exact receiver amount (amountSats), the send21 fee as a separate transparent output (platformFeeSats, feeOutputs), and for fiat-pegged drafts a locked exchange rate (quote.rate, valid until quote.expiresAt — call POST /drafts/{id}/requote if it lapses).
GET /api/v1/drafts/{id}/tx-template returns the exact output list, a ready bitcoin-cli walletcreatefundedpsbt example, and a pay-to-many CSV. The agent funds and signs it with its own node, wallet, or HSM — private keys never touch send21, and send21 contains no signing code.
curl https://send21.io/api/v1/drafts/{id}/tx-template \
-H "Authorization: Bearer s21_yourkey"Broadcast the signed transaction yourself. There is nothing to report back — send21 watches the receiver address on-chain and matches the exact amount automatically.
Register a webhook (POST /api/v1/webhooks) and receive HMAC-SHA256-signed events instead of polling. For quick checks, GET /drafts/{id}/status returns status, txid, and confirmation count.
| Webhook event | When it fires |
|---|---|
draft.created | Draft is created |
draft.seen | Matching transaction seen in the mempool / on-chain |
draft.confirmed | Required confirmations reached — payment final |
draft.expired | Draft expired without payment |
draft.cancelled | Draft cancelled by its owner |
The agent always controls the keys; send21 only produces instructions and watches the chain.
Receiver amount + send21 fee are outputs of one transaction — no second payment step.
Retry-safe creation, structured errors, and explicit rate locks for fiat-priced payments.
Machine-readable overview at /llms.txt · full OpenAPI spec at /swagger · MCP endpoint at https://send21.io/mcp (Streamable HTTP, Authorization: Bearer s21_…)
The send21 fee is priced in USD when the payment is created (same price feed as fiat conversion) and shown in your selected fiat currency too. On multi-output drafts it rides as a separate transparent output you can see and verify in your wallet. On single-output payments (checkout pay links, QR drafts) nothing extra rides along — the fee accrues to the creator's account and is settled with one payment (BTC, USDC, USDT, or EURC) once the balance reaches the cap. Either way, the receiver always gets the exact billed amount.
Full details on the pricing page · machine-readable: /api/v1/fees/schedule

A human or agent creates a draft: receiver address, amount (exact or fiat-pegged), currency and network, memo.
The sender loads the multi-output template into their own PSBT wallet (Bitcoin Core, Sparrow, Electrum), reviews every output, and signs. Single-output payments are one QR scan from any wallet. send21 is never in the money path.
send21 watches the receiver address and fires signed webhooks + email as the payment is seen and confirmed.
| Currency | Bitcoin | Solana | Ethereum | Base |
|---|---|---|---|---|
| BTC bitcoin | native — on-chain (PSBT) & Lightning | wrapped BTC (SPL token) | WBTC (ERC-20) | — |
| USDC USD stablecoin | — | ✓ SPL token | ✓ ERC-20 | ✓ ERC-20 |
| USDT USD stablecoin | — | ✓ SPL token | ✓ ERC-20 | — |
| EURC EUR stablecoin | — | ✓ SPL token | ✓ ERC-20 | ✓ ERC-20 |
Every combination works for drafts, payment requests, and fee settlement. Prices can be set in any of 165 world currencies — the rate locks when the payer picks a currency. Lightning drafts use a receiver-supplied BOLT11 invoice.
There are two ways to pay through send21. Payment drafts (Bitcoin) are multi-output PSBT templates and need a PSBT-capable wallet — Bitcoin Core, Sparrow, Electrum — with hardware wallets signing through them. Checkout pay links are single transfers with a standard QR code (bitcoin: / solana: / ethereum: URI), so any wallet that can scan a QR and send an exact amount works — no fee output rides along; the send21 fee accrues to the account that created the payment and is settled separately.
| Top-5 wallet (2026) | BTC · Bitcoin | USDC · Solana | USDT · Ethereum |
|---|---|---|---|
| Ledger Stax | Drafts + checkout — sign PSBTs via Sparrow or Electrum | Checkout — Ledger Live, or Phantom with Ledger | Checkout — Ledger Live, or MetaMask with Ledger |
| Ledger Flex | Drafts + checkout — sign PSBTs via Sparrow or Electrum | Checkout — Ledger Live, or Phantom with Ledger | Checkout — Ledger Live, or MetaMask with Ledger |
| Trezor Safe 7 | Drafts + checkout — sign PSBTs via Electrum or Sparrow | Limited — native SOL only; no USDC (SPL) sends in Trezor Suite | Checkout — Trezor Suite, or MetaMask with Trezor |
| MetaMask | Not supported — no Bitcoin sends or PSBT | Checkout — Solana accounts supported | Checkout — scans the EIP-681 QR directly |
| Trust Wallet | Checkout only — scans the bitcoin: QR; no PSBT for drafts | Checkout — SPL tokens supported | Checkout — ERC-20 supported |
"Top 5" per 2026 wallet roundups (Ledger, Coincub, bitcoinfoundation.org). Compatibility reflects each wallet's published feature set as of August 2026 — always verify the address and amount in your own wallet before signing.
Price in your own currency — any of 165 world currencies — show one QR code, and your customer pays in the crypto of their choice — straight to your wallet, rate locked at checkout, accounting-ready webhooks with the exact conversion rate.