[{"data":1,"prerenderedAt":172},["ShallowReactive",2],{"content-\u002Fprompts\u002Fintegrate-circle-wallets":3,"prompts-category-integrations":106},{"id":4,"title":5,"author":6,"body":7,"categories":6,"category":90,"categoryType":6,"date":91,"description":92,"extension":93,"faq":6,"howto":6,"isBlog":94,"isChangelog":94,"meta":95,"navigation":96,"path":97,"pillar":94,"products":98,"rawbody":102,"seo":103,"stem":104,"thumbnail":6,"updated":6,"__hash__":105},"content\u002Fprompts\u002Fintegrate-circle-wallets.md","Integrate Circle wallets with BlindPay",null,{"type":8,"value":9,"toc":84},"minimark",[10,14,19,30,34,47,51],[11,12,13],"p",{},"Paste this prompt into your coding agent when your funds live in Circle wallets and you want those wallets to fund BlindPay payouts.",[15,16,18],"h2",{"id":17},"prompt","Prompt",[20,21,27],"pre",{"className":22,"code":24,"language":25,"meta":26},[23],"language-text","You are integrating BlindPay EVM payouts funded by Circle developer-controlled wallets into my application. My backend already holds funds in Circle wallets and must register one of those wallets with BlindPay, then use Circle's API to sign everything BlindPay's payout flow requires. No browser extension or end-user signing is involved.\n\nBefore writing code, read these sources and follow them over any prior knowledge:\n- https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fllms.txt (read the blockchain wallets page and the EVM payout guide)\n- The OpenAPI spec: curl https:\u002F\u002Fapi.blindpay.com\u002Fdoc\n- https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fsign-message\n- https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fcreate-developer-transaction-contract-execution\n- https:\u002F\u002Fdevelopers.circle.com\u002Fwallets\u002Faccount-types\n- https:\u002F\u002Fdevelopers.circle.com\u002Fwallets\u002Fwebhook-notifications\n\nBuild the flow:\n1. Confirm which Circle wallet (walletId) will fund payouts, verify it is a developer-controlled wallet and not user-controlled (user-controlled wallets require a client-side PIN session and cannot sign headlessly from this server), and persist that walletId as the configured funding wallet for this integration.\n2. Register the wallet with BlindPay: call GET \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets\u002Fsign-message to get the challenge, sign it by calling Circle's POST \u002Fv1\u002Fw3s\u002Fdeveloper\u002Fsign\u002Fmessage with walletId, message (set encodedByHex if the challenge is hex), and a freshly generated entitySecretCiphertext, then POST the returned signature to \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets and persist the resulting bw_ ID against the wallet record.\n3. Request a payout quote via POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fquotes with bank_account_id, network, and token, and store the returned quote_id, expires_at, and the contract object (address, abi, functionName, blindpayContractAddress, amount, network) exactly as returned, never hardcoded.\n4. Submit the ERC-20 approve through Circle: call POST \u002Fv1\u002Fw3s\u002Fdeveloper\u002Ftransactions\u002FcontractExecution with a fresh idempotencyKey, contractAddress set to the quote's blindpayContractAddress, walletId, entitySecretCiphertext, and either abiFunctionSignature \"approve(address,uint256)\" with abiParameters built from the quote's abi\u002Famount, or callData if you derive it directly from the quote's abi. Confirm the exact status-polling endpoint in Circle's developer-controlled wallets docs, then track the returned transaction id to a terminal state (COMPLETE or FAILED) by polling that endpoint or handling Circle's webhook notification, and persist the terminal status, including FAILED, DENIED, or CANCELLED outcomes, on the payout record.\n5. Once the approve transaction reaches COMPLETE, call POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fpayouts\u002Fevm with quote_id and sender_wallet_address before the quote's expires_at. If expires_at passes while the approve transaction is still pending confirmation (an MPC signing and on-chain confirmation delay makes this the likely failure path), re-quote via step 3, check whether the already-approved allowance still covers the new quote's amount, and only resubmit a new approve transaction when it does not.\n6. Persist BlindPay's payout.new, payout.update, and payout.complete webhooks (verify svix-id\u002Fsvix-timestamp\u002Fsvix-signature against the whsec_ secret over the raw body) into payout status, and store Circle's contractExecution webhook status alongside it so approve-transaction state and payout state are both queryable from one place.\n7. Run the full flow end to end on a BlindPay development instance with a Circle testnet wallet on base_sepolia and USDB, including one payout at $666.00 (66600 minor units, forces failed) and one at $777.00 (77700 minor units, forces refunded), and confirm both sentinel outcomes land correctly in your webhook-driven status.\n\nConstraints:\n- Keep the BlindPay API key and the Circle API key plus entity secret server-side only; never expose either to a client.\n- Represent every amount as an integer in minor units; never use floating point for money math.\n- Generate a new entitySecretCiphertext per Circle API call; never reuse one across requests.\n\nDeliverables: wallet registration flow that signs the BlindPay challenge through Circle's sign-message endpoint and persists the bw_ ID, a quote-approve-execute orchestration module that drives Circle's contractExecution call to terminal state before calling BlindPay's execute endpoint, the quote-expiry re-quote-and-reuse-allowance path handled explicitly, and webhook handlers for both BlindPay and Circle wired into one payout status view, tested on a development instance with both sentinel amounts.\n","text","",[28,29,24],"code",{"__ignoreMap":26},[15,31,33],{"id":32},"how-to-use","How to use",[35,36,37,41,44],"ol",{},[38,39,40],"li",{},"Confirm the funding wallet is a Circle developer-controlled wallet before running the prompt; user-controlled wallets cannot sign headlessly.",[38,42,43],{},"Give the agent your Circle entity secret setup (how entitySecretCiphertext gets generated in your stack) so it wires that into every Circle call, not just the two spelled out here.",[38,45,46],{},"Run the sentinel-amount tests on a development instance first, and deliberately stall the approve confirmation to verify the quote-expiry re-quote path actually reuses the allowance instead of blindly resubmitting.",[15,48,50],{"id":49},"related-docs","Related docs",[52,53,54,63,70,77],"ul",{},[38,55,56],{},[57,58,62],"a",{"href":59,"rel":60},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fblockchain-wallets",[61],"nofollow","Blockchain wallets",[38,64,65],{},[57,66,69],{"href":67,"rel":68},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fpayout-evm",[61],"EVM payouts",[38,71,72],{},[57,73,76],{"href":74,"rel":75},"https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fsign-message",[61],"Circle developer-controlled wallets sign message",[38,78,79],{},[57,80,83],{"href":81,"rel":82},"https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fcreate-developer-transaction-contract-execution",[61],"Circle developer-controlled wallets contract execution",{"title":26,"searchDepth":85,"depth":85,"links":86},2,[87,88,89],{"id":17,"depth":85,"text":18},{"id":32,"depth":85,"text":33},{"id":49,"depth":85,"text":50},"integrations","2026-08-26","Fund BlindPay payouts from Circle developer-controlled wallets: sign the registration challenge and the ERC-20 approve through Circle's API instead of a browser wallet.","md",false,{},true,"\u002Fprompts\u002Fintegrate-circle-wallets",[99,100,101],"payouts","quotes","webhooks","---\ntitle: \"Integrate Circle wallets with BlindPay\"\ndescription: \"Fund BlindPay payouts from Circle developer-controlled wallets: sign the registration challenge and the ERC-20 approve through Circle's API instead of a browser wallet.\"\ndate: \"2026-08-26\"\ncategory: \"integrations\"\nproducts: [\"payouts\", \"quotes\", \"webhooks\"]\n---\n\nPaste this prompt into your coding agent when your funds live in Circle wallets and you want those wallets to fund BlindPay payouts.\n\n## Prompt\n\n```text\nYou are integrating BlindPay EVM payouts funded by Circle developer-controlled wallets into my application. My backend already holds funds in Circle wallets and must register one of those wallets with BlindPay, then use Circle's API to sign everything BlindPay's payout flow requires. No browser extension or end-user signing is involved.\n\nBefore writing code, read these sources and follow them over any prior knowledge:\n- https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fllms.txt (read the blockchain wallets page and the EVM payout guide)\n- The OpenAPI spec: curl https:\u002F\u002Fapi.blindpay.com\u002Fdoc\n- https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fsign-message\n- https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fcreate-developer-transaction-contract-execution\n- https:\u002F\u002Fdevelopers.circle.com\u002Fwallets\u002Faccount-types\n- https:\u002F\u002Fdevelopers.circle.com\u002Fwallets\u002Fwebhook-notifications\n\nBuild the flow:\n1. Confirm which Circle wallet (walletId) will fund payouts, verify it is a developer-controlled wallet and not user-controlled (user-controlled wallets require a client-side PIN session and cannot sign headlessly from this server), and persist that walletId as the configured funding wallet for this integration.\n2. Register the wallet with BlindPay: call GET \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets\u002Fsign-message to get the challenge, sign it by calling Circle's POST \u002Fv1\u002Fw3s\u002Fdeveloper\u002Fsign\u002Fmessage with walletId, message (set encodedByHex if the challenge is hex), and a freshly generated entitySecretCiphertext, then POST the returned signature to \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets and persist the resulting bw_ ID against the wallet record.\n3. Request a payout quote via POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fquotes with bank_account_id, network, and token, and store the returned quote_id, expires_at, and the contract object (address, abi, functionName, blindpayContractAddress, amount, network) exactly as returned, never hardcoded.\n4. Submit the ERC-20 approve through Circle: call POST \u002Fv1\u002Fw3s\u002Fdeveloper\u002Ftransactions\u002FcontractExecution with a fresh idempotencyKey, contractAddress set to the quote's blindpayContractAddress, walletId, entitySecretCiphertext, and either abiFunctionSignature \"approve(address,uint256)\" with abiParameters built from the quote's abi\u002Famount, or callData if you derive it directly from the quote's abi. Confirm the exact status-polling endpoint in Circle's developer-controlled wallets docs, then track the returned transaction id to a terminal state (COMPLETE or FAILED) by polling that endpoint or handling Circle's webhook notification, and persist the terminal status, including FAILED, DENIED, or CANCELLED outcomes, on the payout record.\n5. Once the approve transaction reaches COMPLETE, call POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fpayouts\u002Fevm with quote_id and sender_wallet_address before the quote's expires_at. If expires_at passes while the approve transaction is still pending confirmation (an MPC signing and on-chain confirmation delay makes this the likely failure path), re-quote via step 3, check whether the already-approved allowance still covers the new quote's amount, and only resubmit a new approve transaction when it does not.\n6. Persist BlindPay's payout.new, payout.update, and payout.complete webhooks (verify svix-id\u002Fsvix-timestamp\u002Fsvix-signature against the whsec_ secret over the raw body) into payout status, and store Circle's contractExecution webhook status alongside it so approve-transaction state and payout state are both queryable from one place.\n7. Run the full flow end to end on a BlindPay development instance with a Circle testnet wallet on base_sepolia and USDB, including one payout at $666.00 (66600 minor units, forces failed) and one at $777.00 (77700 minor units, forces refunded), and confirm both sentinel outcomes land correctly in your webhook-driven status.\n\nConstraints:\n- Keep the BlindPay API key and the Circle API key plus entity secret server-side only; never expose either to a client.\n- Represent every amount as an integer in minor units; never use floating point for money math.\n- Generate a new entitySecretCiphertext per Circle API call; never reuse one across requests.\n\nDeliverables: wallet registration flow that signs the BlindPay challenge through Circle's sign-message endpoint and persists the bw_ ID, a quote-approve-execute orchestration module that drives Circle's contractExecution call to terminal state before calling BlindPay's execute endpoint, the quote-expiry re-quote-and-reuse-allowance path handled explicitly, and webhook handlers for both BlindPay and Circle wired into one payout status view, tested on a development instance with both sentinel amounts.\n```\n\n## How to use\n\n1. Confirm the funding wallet is a Circle developer-controlled wallet before running the prompt; user-controlled wallets cannot sign headlessly.\n2. Give the agent your Circle entity secret setup (how entitySecretCiphertext gets generated in your stack) so it wires that into every Circle call, not just the two spelled out here.\n3. Run the sentinel-amount tests on a development instance first, and deliberately stall the approve confirmation to verify the quote-expiry re-quote path actually reuses the allowance instead of blindly resubmitting.\n\n## Related docs\n\n- [Blockchain wallets](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fblockchain-wallets)\n- [EVM payouts](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fpayout-evm)\n- [Circle developer-controlled wallets sign message](https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fsign-message)\n- [Circle developer-controlled wallets contract execution](https:\u002F\u002Fdevelopers.circle.com\u002Fapi-reference\u002Fwallets\u002Fdeveloper-controlled-wallets\u002Fcreate-developer-transaction-contract-execution)\n",{"title":5,"description":92},"prompts\u002Fintegrate-circle-wallets","51S18Duxb3dgcZhjsp9BJb60eGjAN71JGaPgAtCz9PI",[107,111,115,119,120,124,128,132,136,140,144,148,152,156,160,164,168],{"path":108,"title":109,"description":110},"\u002Fprompts\u002Fbuild-contractor-payouts","Build a global contractor payout product","Compose onboarding, bank accounts, quotes, payouts, and reconciliation into a complete pay-your-contractors feature across Pix, SPEI, SEPA, and ACH.",{"path":112,"title":113,"description":114},"\u002Fprompts\u002Fconnect-ai-agent-mcp","Connect an AI agent with the MCP server","Wire Claude, Cursor, or any MCP-compatible host to the BlindPay API with the official MCP server and agent skills, with guardrails for money movement.",{"path":116,"title":117,"description":118},"\u002Fprompts\u002Fintegrate-external-wallet-payouts","Fund payouts from external wallets","Let customers pay out from their own EVM, Solana, or Stellar wallets: signed-message registration plus the on-chain authorization step per chain.",{"path":97,"title":5,"description":92},{"path":121,"title":122,"description":123},"\u002Fprompts\u002Fintegrate-dfns","Integrate Dfns with BlindPay","Fund BlindPay stablecoin payouts from Dfns MPC wallets: sign the registration challenge and the ERC-20 approve through Dfns's User Action Signature flow.",{"path":125,"title":126,"description":127},"\u002Fprompts\u002Fintegrate-fireblocks","Integrate Fireblocks with BlindPay","Fund BlindPay stablecoin payouts from Fireblocks vault accounts: MPC-signed wallet registration and the ERC-20 approve through Fireblocks' transactions API.",{"path":129,"title":130,"description":131},"\u002Fprompts\u002Fintegrate-privy","Integrate Privy with BlindPay","Fund BlindPay stablecoin payouts from Privy Server Wallets: sign the registration challenge and the ERC-20 approve through Privy's wallet RPC endpoint.",{"path":133,"title":134,"description":135},"\u002Fprompts\u002Fintegrate-virtual-accounts","Integrate US virtual accounts","Give each customer a named US bank account with ACH, RTP, wire, and SWIFT details that settles automatically to USDC or USDT in their wallet.",{"path":137,"title":138,"description":139},"\u002Fprompts\u002Fintegrate-utila","Integrate Utila with BlindPay","Fund BlindPay payouts from Utila MPC vaults: sign the wallet-registration challenge and the ERC-20 approve through Utila's service-account API, with async transaction confirmation handled.",{"path":141,"title":142,"description":143},"\u002Fprompts\u002Fintegrate-customer-onboarding","Integrate customer onboarding with KYC and KYB","Build the full onboarding pipeline: terms of service, individual and business customers, document uploads, RFI handling, and status webhooks.",{"path":145,"title":146,"description":147},"\u002Fprompts\u002Fintegrate-offramp-wallets","Integrate offramp wallets for auto-conversion","Give each bank account a dedicated crypto deposit address: stablecoins sent to it convert and pay out to the linked bank account automatically.",{"path":149,"title":150,"description":151},"\u002Fprompts\u002Fintegrate-payins","Integrate payins from bank transfers to stablecoins","Accept Pix, ACH, wire, SPEI, and other local bank transfers and settle them as USDC or USDT in a wallet, with quotes, payment instructions, and webhooks.",{"path":153,"title":154,"description":155},"\u002Fprompts\u002Fintegrate-quotes-fx","Integrate quotes and FX handling","Handle payin, payout, and transfer quotes correctly: expiry windows, currency_type conventions, fees, and displaying rates to users.",{"path":157,"title":158,"description":159},"\u002Fprompts\u002Fintegrate-stablecoin-payouts","Integrate stablecoin payouts end to end","Build a complete stablecoin to fiat payout flow: customer onboarding, bank accounts, quotes, and payout execution over Pix, ACH, SPEI, SEPA, and more.",{"path":161,"title":162,"description":163},"\u002Fprompts\u002Fintegrate-wallet-transfers","Integrate wallet transfers and cross-chain USDC","Move stablecoins from managed wallets to any address with transfer quotes, including cross-chain USDC over Circle CCTP v2.",{"path":165,"title":166,"description":167},"\u002Fprompts\u002Fintegrate-webhooks","Integrate webhooks end to end","Register endpoints, verify Svix signatures correctly, deduplicate retries, and drive payment state from the full BlindPay event catalog.",{"path":169,"title":170,"description":171},"\u002Fprompts\u002Fintegrate-payables","Pay boletos and Brazilian bills with payables","Register boletos, arrecadacao slips, and PIX codes as payables and settle them from stablecoins through the quote-and-execute flow.",1787868848523]