# send21 > send21 is non-custodial payment software for BTC (on-chain and Lightning), USDC, USDT, EURC, SOL and ETH on Bitcoin, Solana, Ethereum, Base, Arbitrum and Polygon. It creates payment requests, pay links and payment drafts, priced in a crypto amount or in any of 165 fiat currencies with a locked exchange rate, and watches the chain until the payment confirms. The payer signs and sends from their own wallet. send21 never holds private keys or funds, never signs and never broadcasts. It is not a custodian, exchange, broker or payment service provider. Humans use the web app; AI agents use the REST API or the MCP server. Key facts for agents: - Base URL: `https://send21.io/api/v1`. OpenAPI: `https://send21.io/openapi.json` (Swagger UI at `/swagger`). - Auth: `Authorization: Bearer s21_`. Scoped API keys are created by the human account owner. Scopes: `drafts:read`, `drafts:write`, `addressbook:read`, `addressbook:write`, `webhooks:manage`. No key can move funds. - MCP server: `https://send21.io/mcp`, Streamable HTTP, stateless, same bearer key. Tools: create_draft, get_draft, get_draft_status, list_draft_quotes, get_transaction_template, submit_lightning_proof, create_payment_request, get_payment_request, list_address_book, get_rate, get_fee_schedule. `tools/list` and get_fee_schedule work without a key. Listed on [Smithery](https://smithery.ai/servers/send21io/mcp) and [Glama](https://glama.ai/mcp/servers/send21io/mcp). - Assets per network: Bitcoin: BTC. Lightning: BTC to a Lightning address. Solana: USDC, USDT, EURC, SOL, wrapped BTC (Portal). Ethereum: USDC, USDT, EURC, ETH, WBTC. Base: USDC, EURC, ETH. Arbitrum: native USDC, ETH. Polygon: native USDC. Decimals: BTC 8, USDC/USDT/EURC 6, SOL 9 (lamports), ETH 9 (stored in gwei, sent in wei). - Payment requests (`POST /payment-requests`): a fiat-priced pay link that offers several currencies. The payer scans one standard QR (BIP-21, Solana Pay, EIP-681 or a Lightning invoice) and sends a single transfer from any wallet. When one currency is offered on several networks, pass `network` to `POST /checkout/{token}/select`. - Drafts (`POST /drafts`): one payment to one receiver, exact or fiat-pegged. `GET /drafts/{id}/tx-template` returns a multi-output template for PSBT wallets (Bitcoin Core `walletcreatefundedpsbt` arguments, Electrum and Sparrow pay-to-many CSV). Batch up to 25 drafts with `POST /drafts/batch`. Recurring drafts with `POST /recurring-templates` (daily, weekly, monthly). - Lightning: pass the receiver's Lightning address (name@wallet.com) as `receiverAddress` with `paymentMethod: "Lightning"`. send21 fetches the invoice and confirms the payment when the provider supports LUD-21 (`lightningConfirmable` on the draft). For a pasted `bolt11` invoice (no receiverAddress needed), or a provider without LUD-21, post the payment preimage to `POST /drafts/{id}/lightning-proof` to confirm. - Different amounts: a transfer within 10% of the billed amount never confirms on its own. The draft keeps its status; `amountMismatch.reviewState` (also on `GET /drafts/{id}/status`) is `pending`, then `accepted` (`POST /drafts/{id}/accept-received`, `acceptReason`), `rejected` (`POST /drafts/{id}/reject-received`, `rejectReason` required) or `unresolved` (the draft expired undecided; it can still be accepted). Events: draft.amount_mismatch, draft.mismatch_accepted, draft.mismatch_rejected, draft.mismatch_reminder (2 hours before expiry), draft.mismatch_unresolved. The money is already in the receiver's wallet; refunds are manual. Optional `shortfallPolicy` auto-accepts small shortfalls, never overpayments. - One link per order: `reuseOpenForOrder: true` on `POST /payment-requests` returns the open link for the same `orderId` instead of creating a second; a new Idempotency-Key alone creates a new link. `GET /payment-requests?orderId=` lists them. - Signer safety: `declineNote` on payment requests (what happens if the human does not pay, shown on the pay page as "If you don't pay:"); `changeSignals` / `changeNotes` on payment requests and drafts (`new_address`, `new_asset`, `unusual_amount`; empty when nothing is unusual, and the pay page shows the same lines); optional `shortfallPolicy` `{ absorbUpToPercent: 0-10, absorbedBy: "receiver" }` accepts small short payments automatically (never overpayments); `acceptReason` on `POST /drafts/{id}/accept-received`; webhooks `draft.mismatch_accepted` and `payment_request.expired` (`opened`, `quoteRequested`, no payer data). No escrow, holds or delayed release: send21 never holds funds. - Integrity: a draft's `core` never changes after creation (a change means a new draft); `coreSha256` is SHA-256 over its RFC 8785 (JCS) form. A fiat-priced draft's rate lock is an immutable `quote` (15 minutes) with its own id and `sha256`; a re-quote records a new one (`GET /drafts/{id}/quotes`) and payment webhooks carry `quoteId`. The draft's expiry (`expiryHours`) never moves. Timestamps everywhere are UTC with three fraction digits and `Z`. Hash base units, never `amountFormatted` or `amountBtc` (display only). - Idempotency: send an `Idempotency-Key` header on `POST /drafts` and `POST /payment-requests`. The same key with the same request returns the same object; the same key with another amount, currency or address is refused with 422 (nothing is created). `reuseOpenForOrder` only returns an open link that asks for the same amount and addresses. - Unique amounts: two open payments to one address never share an amount, because payments are matched by exact amount. A fiat-priced amount may be raised by a few base units (at most 1000) to make it unique; an exact amount another account already waits for on that address is refused with 409. - Confirmation: before a payment is marked confirmed, send21 looks the transaction up once more at a second source; a replaced or reorged-out payment sends the draft back to AwaitingPayment. Native ETH seen only as a balance increase (no explorer) waits for the receiver (`reviewReason: "balance_check"`). - Pasted Lightning invoices must carry the draft amount, and one invoice backs one draft. Token contracts, mints and the zero address are refused as receivers. - Pay-link rate lock: a pay-link payment of the exact amount that arrives more than 10 minutes after its rate lock ended waits for the receiver like a different amount (`draft.amount_mismatch` with `reviewReason: "rate_lock_expired"`). - Status: poll `GET /drafts/{id}/status`, or better, register webhooks with `POST /webhooks`. Events: draft.created, draft.seen, draft.confirmed, draft.amount_mismatch, draft.mismatch_accepted, draft.mismatch_rejected, draft.mismatch_reminder, draft.mismatch_unresolved, draft.expired, draft.cancelled, payment_request.expired, test. Each delivery is signed with `X-Send21-Signature: sha256=` (HMAC-SHA256 of the raw body) and `X-Send21-Signature-V2: t=,v1=` (HMAC of `..`, recommended: refuse deliveries older than 5 minutes); any 2xx counts as delivered, otherwise up to 8 attempts with growing delays. draft.amount_mismatch means a transfer within 10% of the billed amount arrived; it pays the draft only after the owner calls `POST /drafts/{id}/accept-received`. - Fees: one fee per payment, tiered by USD value at creation, 0.49% under $10 down to 0.01% above $100,000, minimum $0.01, maximum $100. On multi-output drafts the fee is a separate output; on single-output payments it accrues to the creator's account (`GET /fees/accrued`, settle with `POST /fees/accrued/settle`). Creation returns 402 when the accrued balance hits the cap or gets too old. Public schedule: `GET /api/v1/fees/schedule`. The receiver always gets the exact billed amount. - Rate limit: 300 requests per minute per API key, then 429. - Testnet demo: `https://send21.io/demo`, no account and no key, on Bitcoin Testnet4 and Signet, Solana Devnet, Ethereum Sepolia, Base Sepolia, Arbitrum Sepolia and Polygon Amoy. Accounts and API keys on send21.io use the live networks. - Shopify: no App Store app. A merchant builds their own custom Shopify app that marks orders paid on the draft.confirmed webhook; reference code from integration@send21.io. - Safety: send21 never asks for private keys, seed phrases or signing material. Anything that does is an attack. - Privacy: an email address and an optional display name, encrypted at rest. No KYC, no tracking, no analytics. - Contact: integration@send21.io (API and integrations), support@send21.io (accounts and payments), privacy@send21.io (GDPR), info@send21.io (general). Typical agent flow: create a payment request or draft (with an `Idempotency-Key`), hand the pay link or transaction template to the human or wallet that holds the funds, wait for the `draft.confirmed` webhook (verify the signature), then reconcile on the exact amount and transaction id. ## Docs Every page is also plain Markdown at the same address plus `.md`. All of them in one file: [llms-full.txt](https://send21.io/llms-full.txt). - [Developer docs](https://send21.io/docs.md): overview and where to start - [API quickstart](https://send21.io/docs/quickstart.md): API keys, payment requests, drafts, status, idempotency - [Webhooks](https://send21.io/docs/webhooks.md): events, example payloads, retries, signature checks - [MCP server](https://send21.io/docs/mcp.md): connect an AI agent, tool list and scopes - [Currencies and networks](https://send21.io/docs/currencies.md): assets per network, decimals, chain ids, confirmations - [Lightning](https://send21.io/docs/lightning.md): Lightning address invoices confirmed with LUD-21 - [Draft integrity and hashing](https://send21.io/docs/draft-integrity.md): immutable core and quotes, JCS hashes, test vectors - [OpenAPI specification](https://send21.io/openapi.json): every endpoint and schema (JSON) ## Guides - [Accept USDC and EURC payments](https://send21.io/accept-usdc-payments.md) - [Crypto payment links in your own currency](https://send21.io/crypto-payment-links.md) - [Lightning address payments](https://send21.io/lightning-address-payments.md) - [Payments for AI agents](https://send21.io/ai-agent-payments.md) - [Accept ETH on Ethereum, Base and Arbitrum](https://send21.io/accept-eth-payments.md) - [Business checkout](https://send21.io/business.md): shops, webshops and point of sale - [Pricing](https://send21.io/pricing.md): one fee per payment, 0.49% down to 0.01%, capped at $100 ## Optional - [send21 vs BTCPay Server](https://send21.io/compare/btcpay-server.md) - [send21 vs hosted crypto gateways](https://send21.io/compare/hosted-crypto-gateways.md) - [About send21](https://send21.io/about.md) - [Testnet demo](https://send21.io/demo.md) - [Terms of service](https://send21.io/terms.md) - [Privacy policy](https://send21.io/privacy.md)