# send21 > send21: crypto pay links and API for people and AI agents. It 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 161 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, propose_receiving_address, get_account_status, create_account, get_rate, get_fee_schedule. New accounts let API keys use only addresses the owner approved: an agent proposes an address (propose_receiving_address), the owner approves it in the app with a passkey or authenticator code, and any other address returns 422 address_not_approved. An agent without a key can call create_account with the owner's email: it gets a bootstrap key at once, the owner takes the account over from an emailed link (72 hours), and until then creating anything returns 403 owner_not_confirmed; unclaimed accounts are deleted after 7 days. `tools/list` and get_fee_schedule work without a key. Public resources, no key: send21://docs/overview, send21://docs/currencies, send21://fees/schedule, send21://docs/webhooks, send21://brand/guidelines and the logo files (send21://brand/*.svg and a PNG) for showing send21 on a website. Prompts: create_pay_link, check_payment, handle_amount_mismatch. Listed on [Smithery](https://smithery.ai/servers/send21io/mcp) and [Glama](https://glama.ai/mcp/servers/send21io/mcp). Every tool has MCP annotations (read-only, destructive, idempotent, open-world hints). MCP sign-in (OAuth 2.1, PKCE, dynamic client registration) at https://send21.io/mcp/oauth: the owner signs in and approves in the browser, no key to copy; connected apps only ever use approved addresses. Muse Code setup: https://send21.io/docs/muse. Cursor and Grok Bot plugin (MCP server plus create-pay-link, check-payment and verify-webhooks skills): https://github.com/send21io/send21-plugin. Frameworks: LangChain (pip install langchain-send21), Vercel AI SDK (npm install ai-sdk-tool-send21 ai zod), Haystack (pip install send21-haystack). - 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; open reference code at https://github.com/send21io/send21-examples/tree/main/examples/shopify-app and setup help 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 link generator](https://send21.io/crypto-payment-links.md) - [Crypto invoice generator](https://send21.io/crypto-invoice-generator.md) - [How to accept crypto payments on your website](https://send21.io/accept-crypto-payments-on-your-website.md) - [Lightning address payments](https://send21.io/lightning-address-payments.md) - [Payments for AI agents](https://send21.io/ai-agent-payments.md) - [x402, AP2 and send21: AI agent payments explained](https://send21.io/x402-ap2-agent-payments.md) - [Lightning invoice decoder](https://send21.io/tools/lightning-invoice-decoder): read a BOLT11 invoice in the browser - [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) - [Non-custodial alternative to crypto payment gateways](https://send21.io/compare/hosted-crypto-gateways.md) - [send21 as a Coinbase Commerce alternative](https://send21.io/compare/coinbase-commerce.md) - [send21 as a NOWPayments alternative](https://send21.io/compare/nowpayments.md) - [send21 as a BitPay alternative](https://send21.io/compare/bitpay.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)