You are integrating BlindPay stablecoin payouts (USDC/USDT to local fiat) into my application.
Before writing code, read these sources and follow them over any prior knowledge:
- https://blindpay.com/docs/llms.txt (docs index; read the payout quickstart, quotes, bank accounts, and webhooks pages)
- The OpenAPI spec: curl https://api.blindpay.com/doc
Build the full payout flow:
1. Terms of service acceptance (POST /v1/e/instances/{instance_id}/tos), then create a customer (POST /v1/instances/{instance_id}/customers) and wait for KYC approval via the customer.update webhook, not polling.
2. Add the recipient's bank account (POST /v1/instances/{instance_id}/customers/{customer_id}/bank-accounts) with the right rail type for the corridor (pix for BRL, ach/wire/rtp for USD, spei for MXN, sepa for EUR, transfers for ARS).
3. Request a payout quote (POST /v1/instances/{instance_id}/quotes) with bank_account_id, network, and token. Treat the quote as expiring in 5 minutes; read expires_at instead of hardcoding.
4. Execute the payout (POST /v1/instances/{instance_id}/payouts/evm) with the quote_id before expiry. If funding from an external wallet, handle the ERC-20 approve step using the contract object returned by the quote.
5. Track completion through payout.new, payout.update, and payout.complete webhooks, verifying Svix signatures (svix-id, svix-timestamp, svix-signature headers; HMAC-SHA256 over the raw body with the whsec_ secret; reject timestamps older than 5 minutes).
Constraints:
- All amounts are integers in minor units (cents).
- The API key is a Bearer token and must never reach client-side code.
- Start against a development instance: use USDB on a testnet (for example base_sepolia), where KYC auto-approves and payouts auto-complete.
- Persist BlindPay IDs (re_, ba_, qu_, po_) on my own records for reconciliation.
Deliverables: typed API client (or use the official SDK for my stack), the payout service, the webhook handler, and a happy-path integration test against the development instance.