You are integrating BlindPay payins (local bank transfer in, USDC/USDT out) into my application.
Before writing code, read these sources and follow them over any prior knowledge:
- https://blindpay.com/docs/llms.txt (read the payin quickstart, payin quotes, wallets, and webhooks pages)
- The OpenAPI spec: curl https://api.blindpay.com/doc
Build the full payin flow:
1. Terms of service acceptance, then create a customer (POST /v1/instances/{instance_id}/customers) and wait for KYC approval via webhooks.
2. Create a destination wallet: a managed wallet (POST /v1/instances/{instance_id}/customers/{customer_id}/wallets) or register the customer's own blockchain wallet.
3. Request a payin quote (POST /v1/instances/{instance_id}/payin-quotes) with wallet_id, payment_method (pix, ach, wire, rtp, spei, or pse), request_amount, and currency_type. Note: on payins, currency_type "sender" means the fiat side. Quotes expire; read expires_at.
4. Create the payin (POST /v1/instances/{instance_id}/payins/evm, one endpoint for all payment methods) and surface the returned payment instructions to the payer: memo_code plus bank details for USD rails, pix_code for BRL, CLABE for MXN, or the payment link for PSE.
5. Track payin.new, payin.update, payin.complete, and wallet.inbound webhooks with Svix signature verification, and reconcile by payin ID (pi_).
Constraints:
- Amounts are integers in minor units. API keys stay server-side.
- Develop against a development instance with USDB on a testnet; payins auto-complete about 30 seconds after creation there.
- Show the payer exact transfer instructions including the memo code where the rail requires it; a missing memo is the top cause of unmatched deposits.
Deliverables: payin service, payment-instructions UI or API response, webhook handler with signature verification, and an integration test that creates a payin on the development instance and asserts the completion webhook.