How it works
From key to confirmation.
You control the wallets. We watch the chain and tell your application when the payment arrives.
Create your key.
Choose a donation amount and chain on the landing page. Your API key is returned immediately. Store it securely; it cannot be recovered.
Activate with a donation.
Send the exact donation shown to the EFF address in your response, before it expires. Your key activates automatically when the donation confirms on-chain.
Register your public addresses.
Generate wallet addresses offline, for example with
python -m cli generate-wallet 10. Register only the public addresses withPOST /addresses. Private keys and mnemonics never leave your machine.Create a payment. Get a webhook.
Use
POST /paymentsand ask the payer to send the exact returned amount. Receive a webhook when it confirms on-chain. Unpaid payments expire after 1 hour.
Supported chains
Ten chains. One integration.
Accept native-token payments on any of these networks. Use these chain identifiers when registering addresses and creating payments.
- bitcoin
- ethereum
- base
- arbitrum
- optimism
- polygon
- bnb
- avalanche
- linea
- zksync
Signup donations use Bitcoin, Ethereum or BNB, with the identifiers bitcoin, ethereum and binance respectively.
Plans
Start small. Keep building.
Starter
Free
Via an EFF donation, minimum $5.
100 events / month
Growth
$49 / month
For a growing payment flow.
10,000 events / month
Scale
$199 / month
For higher-volume integrations.
100,000 events / month
Growth and Scale are listed at these monthly prices. Subscription signup currently collects no payment; billing is not yet implemented.
Quickstart
Four requests to get going.
1. Create your API key
POST /signup returns api_key directly, along with the exact donation instructions. Save the key, then send the donation before expires_at to activate payments.
curl -X POST https://api.confirmations.info/signup \
-H "Content-Type: application/json" \
-d '{"method":"donation","chain":"ethereum","usd_amount":"5","plan":"starter"}'2. Register public addresses
Replace YOUR_KEY with your API key and 0xYOUR_ADDR with your own public Ethereum receive address. You can register addresses while your donation is pending.
curl -X POST https://api.confirmations.info/addresses \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{"chain":"ethereum","addresses":["0xYOUR_ADDR"]}'3. Create a payment
Once your donation confirms, create a payment with your reachable webhook URL. Ask the payer to send the exact amount_native to the address returned by the API.
curl -X POST https://api.confirmations.info/payments \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{"usd_amount":"25.00","chain":"ethereum","callback_url":"https://shop.example/callback"}'4. Check payment status
Replace PAYMENT_ID with the returned payment_id. Retrieve its current status at any time, or let your webhook handle the confirmation.
curl https://api.confirmations.info/payments/PAYMENT_ID \
-H "X-API-Key: YOUR_KEY"Webhook payload
The signal your app needs.
A confirmed payment sends this JSON shape to your callback URL.
{
"paymentId": "0f2ac20d-3189-44b6-9fcf-6fb736e0aacf",
"userId": "9a7d31d2-98f8-4d2e-a4d1-4f1849320d99",
"chain": "ethereum",
"address": "0xA11CE...",
"txHash": "0x5cf4...d41",
"blockNumber": 21000042,
"confirmations": 2,
"expectedAmountWei": "10483000000000000"
}Webhook field names are camelCase. Delivery is retried with exponential backoff on failure, up to several attempts. expectedAmountWei is the exact amount in the chain’s smallest unit: wei, satoshis or the equivalent native unit.
Built for agents
Readable by your next teammate.
Give your coding agent the guide, then integrate with the same API, CLI and schemas you use.
GET /llms.txtA concise, agent-oriented integration guide.GET /llms-full.txtThe guide plus the full endpoint reference.GET /openapi.jsonThe OpenAPI schema for operations and models.GET /healthA health check for the service.python -m cli --json ...Global machine-readable output for CLI commands; put--jsonbefore the subcommand. MCP uses its own stdio protocol instead.CONFIRMATIONS_API_KEYCONFIRMATIONS_API_URLEnvironment variables for authentication and the API base URL.python -m cli mcpMCP server over stdio. Install withpip install "confirmations[mcp]".- API errorsA uniform error envelope with a code, message and optional hint, returned with a 4xx or 5xx status.
X-Request-IdEvery API response carries this header.
{"error": {"code": "...", "message": "...", "hint": "..."}}The hint field may be null.