How it works

From key to confirmation.

You control the wallets. We watch the chain and tell your application when the payment arrives.

  1. 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.

  2. 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.

  3. Register your public addresses.

    Generate wallet addresses offline, for example with python -m cli generate-wallet 10. Register only the public addresses with POST /addresses. Private keys and mnemonics never leave your machine.

  4. Create a payment. Get a webhook.

    Use POST /payments and 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 --json before the subcommand. MCP uses its own stdio protocol instead.
  • CONFIRMATIONS_API_KEY
    CONFIRMATIONS_API_URL
    Environment variables for authentication and the API base URL.
  • python -m cli mcpMCP server over stdio. Install with pip 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.