Download OpenAPI specification:Download
Accept on-chain Bitcoin payments with confirmation tracking, network-scoped API keys, and signed webhooks.
Creates a payment and returns a Bitcoin address.
| Idempotency-Key | string Idempotency key for safe retries |
| amount_sats required | integer >= 1 Amount in satoshis |
| underpayment_tolerance_ppm | integer [ 0 .. 10000 ] Default: 0 Optional downward payment tolerance in parts per million. 1000 ppm allows a 0.1% underpayment. |
| webhook_url | string <uri> Optional webhook endpoint URL. Production rejects localhost, private, link-local, and carrier-grade NAT addresses. The endpoint must accept server-to-server HTTP requests; bypass Cloudflare/WAF/bot challenges for the webhook path and verify requests with the X-Signature HMAC header. |
| destination_address | string Optional custom destination address. If omitted, the API derives an address from the API key's receive descriptor. If provided, the API key must allow customer-provided addresses, the address must match the key network, and the same address cannot already have another active payment. |
| required_confirmations | integer [ 1 .. 6 ] Default: 3 Number of block confirmations required before the payment is confirmed. Defaults to 3. |
| expires_in | integer [ 300 .. 86400 ] Default: 3600 Payment expiry in seconds. Only pending payments expire. Defaults to 3600 (1 hour). |
| reference | string Optional external reference ID for reconciliation (e.g. order ID) |
{- "amount_sats": 10000,
- "underpayment_tolerance_ppm": 0,
- "destination_address": "string",
- "required_confirmations": 1,
- "expires_in": 900,
- "reference": "order-123"
}{- "id": "string",
- "address": "string",
- "txid": "string",
- "amount_sats": 1,
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "network": "testnet",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "reference": "string"
}| from required | integer Examples: from=1744675200 Start of time range |
| to required | integer Examples: to=1744675900 End of time range |
| filter | string Default: "all" Enum: "all" "verified" "unverified" Filter by confirmation status.
|
| limit | integer [ 1 .. 100 ] Default: 50 Maximum number of payments to return |
| offset | integer >= 0 Default: 0 Number of payments to skip |
curl -X GET "https://api.manatee-api.io/v1/btc/payments?from=1744675200&to=1744675900&filter=all&limit=50&offset=0" \ -H "Authorization: Bearer YOUR_API_KEY"
{- "data": [
- {
- "id": "string",
- "address": "string",
- "txid": "string",
- "amount_sats": 1,
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "network": "testnet",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "reference": "string"
}
], - "pagination": {
- "total": 0,
- "limit": 0,
- "offset": 0,
- "has_more": true
}
}curl -X GET "https://api.manatee-api.io/v1/btc/payments/abc123" \ -H "Authorization: Bearer YOUR_API_KEY"
{- "id": "string",
- "address": "string",
- "txid": "string",
- "amount_sats": 1,
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "network": "testnet",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "reference": "string"
}curl -X POST "https://api.manatee-api.io/v1/btc/payments/abc123/cancel" \ -H "Authorization: Bearer YOUR_API_KEY"
{- "id": "string",
- "address": "string",
- "txid": "string",
- "amount_sats": 1,
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "network": "testnet",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "reference": "string"
}Sent to the webhook_url specified during payment creation once an incoming
transaction is detected in the mempool.
Signature verification
Every request includes an HMAC-SHA256 signature in the X-Signature header.
Verify it by computing HMAC-SHA256(secret, body) using your webhook signing secret and
comparing the result to the sha256=<hex> value in the header.
| X-Event-ID required | string Unique identifier for this event delivery |
| X-Event-Type required | string Examples: payment.detected Event type |
| X-Signature required | string Examples: sha256=a3f1... HMAC-SHA256 signature of the raw request body using your webhook signing secret |
| version required | string Webhook payload schema version |
| type required | string Enum: "payment.detected" "payment.confirmed" Event type |
required | object (PaymentWebhookData) |
{- "version": "1",
- "type": "payment.detected",
- "data": {
- "payment_id": "string",
- "txid": "string",
- "address": "string",
- "amount_sats": 1,
- "received_sats": 0,
- "confirmations": 0,
}
}Sent to the webhook_url specified during payment creation once the payment
reaches the required number of confirmations.
Signature verification
Every request includes an HMAC-SHA256 signature in the X-Signature header.
Verify it by computing HMAC-SHA256(secret, body) using your webhook signing secret and
comparing the result to the sha256=<hex> value in the header.
| X-Event-ID required | string Unique identifier for this event delivery |
| X-Event-Type required | string Examples: payment.confirmed Event type |
| X-Signature required | string Examples: sha256=a3f1... HMAC-SHA256 signature of the raw request body using your webhook signing secret |
| version required | string Webhook payload schema version |
| type required | string Enum: "payment.detected" "payment.confirmed" Event type |
required | object (PaymentWebhookData) |
{- "version": "1",
- "type": "payment.detected",
- "data": {
- "payment_id": "string",
- "txid": "string",
- "address": "string",
- "amount_sats": 1,
- "received_sats": 0,
- "confirmations": 0,
}
}Returns stored webhook delivery attempts for a payment that belongs to the authenticated API key.
| id required | string |
[- {
- "id": "string",
- "payment_id": "string",
- "event_type": "payment.detected",
- "status": "pending",
- "attempt": 0,
- "last_error": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "delivered_at": "2019-08-24T14:15:22Z"
}
]Sends a synthetic payment.confirmed webhook event to the provided webhook_url.
Use this endpoint to verify endpoint reachability, request headers, payload parsing, and signature validation without creating a Bitcoin transaction. The test event is delivered immediately and is not stored as a payment or webhook event.
If the webhook URL is protected by Cloudflare, a WAF, bot protection, captchas,
browser challenges, or login redirects, bypass those protections for the webhook
path and verify authenticity with the X-Signature HMAC header instead.
| webhook_url required | string <uri> Public webhook endpoint URL that should receive the synthetic test event. The endpoint must accept server-to-server HTTP requests and must not require browser challenges, captchas, or login redirects. |
{
}{- "event_id": "string",
- "event_type": "payment.confirmed",
- "status": 200,
- "delivered": true
}