Download OpenAPI specification:Download
Accept non-custodial BTC and BCH payments with confirmation tracking, network-scoped API keys, and signed webhooks.
Creates a payment and returns a Bitcoin address. Provide exactly one amount mode: amount_sats, or fiat_amount with fiat_currency. Fiat-created payments return the converted amount_sats and quote metadata.
| Idempotency-Key | string Idempotency key for safe retries |
| amount_sats required | integer >= 1 Amount in satoshis. Provide either |
| fiat_amount | string^[0-9]+(\.[0-9]+)?$ Fiat amount to convert into a fixed satoshi amount for this payment. Must be provided together with |
| fiat_currency | string Fiat currency code used for |
| 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. By default, localhost, private, link-local, and carrier-grade NAT addresses are rejected. Local development and integration-test environments can explicitly allow them with ALLOW_LOCAL_WEBHOOK_URLS=true. The endpoint must accept server-to-server HTTP requests; bypass Cloudflare/WAF/bot challenges for the webhook path and verify requests with the X-Manatee-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,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "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,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "exchange_rate": "60000",
- "exchange_rate_timestamp": "2019-08-24T14:15:22Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "asset": "btc",
- "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,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "exchange_rate": "60000",
- "exchange_rate_timestamp": "2019-08-24T14:15:22Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "asset": "btc",
- "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,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "exchange_rate": "60000",
- "exchange_rate_timestamp": "2019-08-24T14:15:22Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "asset": "btc",
- "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,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "exchange_rate": "60000",
- "exchange_rate_timestamp": "2019-08-24T14:15:22Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "asset": "btc",
- "network": "testnet",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "reference": "string"
}Creates a BCH payment and returns a canonical, network-specific CashAddr.
Provide exactly one amount mode: amount_sats, or fiat_amount with
fiat_currency. Fiat-created payments return the converted amount_sats
and quote metadata. If destination_address is omitted, a BCH receive xpub
must be configured for the API key.
| Idempotency-Key | string Idempotency key for safe retries. Idempotency is scoped to the API key, HTTP method, and BCH route. |
| amount_sats required | integer >= 1 Amount in BCH satoshis. Provide either |
| fiat_amount | string^[0-9]+(\.[0-9]+)?$ Fiat amount to convert into a fixed BCH satoshi amount. Must be provided together with |
| fiat_currency | string Fiat currency code used for |
| 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 that receives signed payment.detected and payment.confirmed events. |
| destination_address | string Optional BCH destination address. Prefixed, prefixless, and supported legacy addresses are normalized to canonical CashAddr. The API key must allow customer-provided addresses. |
| required_confirmations | integer [ 1 .. 6 ] Default: 3 Number of confirmations required before the payment is confirmed. Defaults to the configured BCH confirmation target. |
| expires_in | integer [ 300 .. 86400 ] Default: 3600 Payment expiry in seconds. Only pending payments expire. |
| reference | string Optional external reference ID for reconciliation. |
{- "amount_sats": 10000,
- "reference": "order-bch-123",
- "required_confirmations": 2
}{- "id": "payment_bch_123",
- "address": "bchreg:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y3w7lzdc7",
- "amount_sats": 10000000,
- "fiat_amount": "45.00",
- "fiat_currency": "EUR",
- "exchange_rate": "450",
- "exchange_rate_timestamp": "2026-08-05T12:00:00Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 2,
- "asset": "bch",
- "network": "regtest",
- "reference": "order-bch-123",
- "created_at": "2026-08-05T12:00:00Z",
- "expires_at": "2026-08-05T13:00:00Z"
}| from required | integer Examples: from=1744675200 Start of time range as a Unix timestamp |
| to required | integer Examples: to=1744675900 End of time range as a Unix timestamp |
| filter | string Default: "all" Enum: "all" "verified" "unverified" Filter BCH payments 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/bch/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,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "exchange_rate": "60000",
- "exchange_rate_timestamp": "2019-08-24T14:15:22Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "asset": "btc",
- "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
}
}| id required | string BCH payment ID |
curl -X GET "https://api.manatee-api.io/v1/bch/payments/payment_bch_123" \ -H "Authorization: Bearer YOUR_API_KEY"
{- "id": "string",
- "address": "string",
- "txid": "string",
- "amount_sats": 1,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "exchange_rate": "60000",
- "exchange_rate_timestamp": "2019-08-24T14:15:22Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "asset": "btc",
- "network": "testnet",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "reference": "string"
}| id required | string BCH payment ID |
curl -X POST "https://api.manatee-api.io/v1/bch/payments/payment_bch_123/cancel" \ -H "Authorization: Bearer YOUR_API_KEY"
{- "id": "string",
- "address": "string",
- "txid": "string",
- "amount_sats": 1,
- "fiat_amount": "51.00",
- "fiat_currency": "EUR",
- "exchange_rate": "60000",
- "exchange_rate_timestamp": "2019-08-24T14:15:22Z",
- "pricing_source": "coinbase",
- "underpayment_tolerance_ppm": 10000,
- "received_sats": 0,
- "status": "pending",
- "confirmations": 0,
- "required_confirmations": 1,
- "asset": "btc",
- "network": "testnet",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "reference": "string"
}Returns current monthly usage, plan-counted mainnet usage, plan limits, and counters grouped by network and asset for the account associated with the authenticated API key.
curl -X GET "https://api.manatee-api.io/v1/usage" \ -H "Authorization: Bearer YOUR_API_KEY"
{- "period": {
- "start": "2026-06-01",
- "end": "2026-07-01"
}, - "plan": "beta",
- "usage": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}, - "plan_usage": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}, - "limits": {
- "payments_confirmed_monthly": 0,
- "max_active_webhooks": -1,
- "requests_per_second": 0
}, - "networks": {
- "property1": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}, - "property2": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}
}, - "scopes": {
- "property1": {
- "property1": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}, - "property2": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}
}, - "property2": {
- "property1": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}, - "property2": {
- "payments_created": 0,
- "payments_confirmed": 0,
- "webhooks_delivered": 0,
- "webhooks_failed": 0
}
}
}, - "active_payments_with_webhook": {
- "property1": 0,
- "property2": 0
}, - "active_payments_by_scope": {
- "property1": {
- "property1": 0,
- "property2": 0
}, - "property2": {
- "property1": 0,
- "property2": 0
}
}
}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-Manatee-Signature header.
Verify it by computing HMAC-SHA256(secret, X-Manatee-Timestamp + "." + raw_body)
using your webhook signing secret and comparing the result to the sha256=<hex>
value in the header. Reject requests whose X-Manatee-Timestamp is outside your
allowed clock-skew window; five minutes is a good default.
| X-Manatee-Event-Id required | string Unique identifier for this event delivery |
| X-Manatee-Event-Type required | string Examples: payment.detected Event type |
| X-Manatee-Timestamp required | string Examples: 1710000000 Unix timestamp in seconds used in signature verification |
| X-Manatee-Signature required | string Examples: sha256=a3f1... HMAC-SHA256 signature of |
| X-Event-ID | string Deprecated Legacy event ID header sent temporarily for backwards compatibility |
| X-Event-Type | string Deprecated Examples: payment.detected Legacy event type header sent temporarily for backwards compatibility |
| X-Signature | string Deprecated Examples: sha256=a3f1... Legacy body-only HMAC signature sent temporarily for backwards compatibility |
| 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",
- "asset": "btc",
- "network": "mainnet",
- "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-Manatee-Signature header.
Verify it by computing HMAC-SHA256(secret, X-Manatee-Timestamp + "." + raw_body)
using your webhook signing secret and comparing the result to the sha256=<hex>
value in the header. Reject requests whose X-Manatee-Timestamp is outside your
allowed clock-skew window; five minutes is a good default.
| X-Manatee-Event-Id required | string Unique identifier for this event delivery |
| X-Manatee-Event-Type required | string Examples: payment.confirmed Event type |
| X-Manatee-Timestamp required | string Examples: 1710000000 Unix timestamp in seconds used in signature verification |
| X-Manatee-Signature required | string Examples: sha256=a3f1... HMAC-SHA256 signature of |
| X-Event-ID | string Deprecated Legacy event ID header sent temporarily for backwards compatibility |
| X-Event-Type | string Deprecated Examples: payment.confirmed Legacy event type header sent temporarily for backwards compatibility |
| X-Signature | string Deprecated Examples: sha256=a3f1... Legacy body-only HMAC signature sent temporarily for backwards compatibility |
| 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",
- "asset": "btc",
- "network": "mainnet",
- "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"
}
]Returns stored webhook delivery attempts for a BCH payment that belongs to the authenticated API key.
| id required | string BCH payment ID |
curl -X GET "https://api.manatee-api.io/v1/bch/payments/payment_bch_123/webhook-events" \ -H "Authorization: Bearer YOUR_API_KEY"
[- {
- "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.
Set asset to btc or bch; it defaults to btc. The event network is taken
from the authenticated network-scoped API key and cannot be overridden.
Use this endpoint to verify endpoint reachability, request headers, payload parsing, and signature validation without creating an on-chain 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-Manatee-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. |
| asset | string Default: "btc" Enum: "btc" "bch" Asset represented by the synthetic payment event. Omit this field to test the backwards-compatible BTC payload. |
{- "asset": "btc"
}{- "event_id": "string",
- "event_type": "payment.confirmed",
- "asset": "btc",
- "network": "mainnet",
- "status": 200,
- "delivered": true
}