Bitcoin wallet setup
Before you start
- A Manatee account with a Test API key
- A dedicated Testnet4 wallet or account
- A public HTTPS webhook URL
curland a way to inspect incoming webhook requests
Submit only read-only wallet information. Never share a seed phrase, private key, or wallet password.
What you'll do
Configure a receive source, create an exact BTC payment, send a synthetic webhook, and verify the normal pending → detected → confirmed lifecycle.
Step 1 — Create a dedicated Testnet4 wallet
Create a new wallet account in a Testnet4-compatible wallet such as Sparrow. Keep the seed offline and record the first receiving address.
tb1.Step 2 — Export read-only receive information
Prefer a ranged receive descriptor such as:
wpkh([FINGERPRINT/84h/1h/0h]tpub.../0/*)
An account-level tpub, upub, or vpub is also read-only, but choose the matching address type in the dashboard.
Public wallet data cannot spend funds, but it can reveal all receiving addresses and incoming history for that account. Use a dedicated payment account.
Step 3 — Configure Bitcoin in the dashboard
Open Dashboard → Wallets → Test → Bitcoin, enter the descriptor or extended public key, verify the first derived address against your wallet, and save.
Step 4 — Create a test payment
curl https://api.manatee-api.io/v1/btc/payments \
-H "Authorization: Bearer <TEST_API_KEY>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-btc" \
-d '{
"amount_sats": 25000,
"reference": "order-1042",
"webhook_url": "https://shop.example/webhooks/manatee",
"confirmations_required": 1
}'
Store the returned id, address, amount_sats, network, and expires_at with the order.
asset: "btc", network: "testnet", and status: "pending".Step 5 — Verify webhook handling
Use Dashboard → Webhooks → Send test event, or call the test-webhook endpoint documented in Webhooks. Verify the timestamp and HMAC signature against the raw request body before changing an order.
Do not treat the browser redirect or customer screenshot as payment proof. Only a verified webhook or authenticated API lookup should update payment state.
Step 6 — Complete a Testnet4 transfer
Send the exact amount to the returned address. Observe payment.detected, then payment.confirmed after the configured threshold.
Failure and recovery
invalid_receive_config: confirm descriptor checksum, network, derivation branch, and address type.idempotency_conflict: reuse an idempotency key only with an identical request.- Missing webhook: query
GET /v1/btc/payments/{id}, then inspect delivery attempts. - Wrong address: stop and compare the first dashboard-derived address with the wallet before using Mainnet.