[{"data":1,"prerenderedAt":173},["ShallowReactive",2],{"content-\u002Fprompts\u002Fmigrate-from-utila":3,"prompts-category-migrations":107},{"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":103,"seo":104,"stem":105,"thumbnail":6,"updated":6,"__hash__":106},"content\u002Fprompts\u002Fmigrate-from-utila.md","Migrate from Utila to 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 to move the stablecoin-to-fiat leg of a Utila (docs.utila.io) integration to BlindPay while Utila keeps custody and signing.",[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 migrating the stablecoin-to-fiat leg of my application from Utila (docs.utila.io) to BlindPay. Utila stays in place as custodian and transaction signer (vaults, wallets, transaction initiation, policy engine, co-signer). Only the payout and offramp flow moves to BlindPay.\n\nBefore writing code, read these sources and follow them over any prior knowledge:\n- https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fllms.txt (read the quickstarts, customers, bank accounts, quotes, payouts, offramp wallets, and webhooks pages)\n- The OpenAPI spec: curl https:\u002F\u002Fapi.blindpay.com\u002Fdoc\n\nDo the migration in this order:\n1. Inventory my Utila usage from the codebase: every Utila endpoint called (vaults, wallets, transactions_initiatetransaction, transactions_voteontransactionrequest, addressbook entries) and every stored Utila resource name (vault, wallet, transaction). Separate transactions that are actually fiat payouts (transfers to OTC desks, exchange addresses, or address book entries tagged for offramp) from internal treasury moves. Confirm the exact policy engine vote-threshold and co-signer behavior in the Utila docs rather than assuming, since these are account-configurable. Produce a written report listing what stays on Utila (custody, signing, policy engine) and what moves to BlindPay (the fiat leg), before touching code.\n2. Register each Utila wallet address that will keep custody with BlindPay as an external wallet, using the sign-message challenge flow, and store the resulting bw_ ID next to the Utila wallet resource name. This is the connection point: funds keep living in Utila wallets, BlindPay only needs proof of ownership to route payouts against them.\n3. Onboard recipients as BlindPay customers (re_) with KYC\u002FKYB and add their rail-specific bank accounts (ba_) for Pix, SPEI, SEPA, ACH, or wire. Utila KYC and policy approvals do not transfer, so sequence re-verification ahead of cutover.\n4. Rebuild the payout leg on BlindPay's two-step model: request a quote (qu_), then execute the payout (po_) referencing the registered external wallet before expires_at (about 5 minutes). The actual on-chain transfer still goes through Utila's transaction initiation and policy engine vote. Store qu_ and po_ IDs alongside the originating Utila transaction resource name so both sides of one payout are traceable.\n5. Port event handling to BlindPay's Svix-signed webhooks (customer.*, payout.*, wallet.inbound) with signature verification and svix-id dedup, and run these handlers alongside the existing Utila webhook handler (x-utila-signature, TRANSACTION_STATE_UPDATED) so custody-side and fiat-side state both stay current.\n6. Cut over per flow behind a feature flag: dual-run with new payouts going through the BlindPay quote and payout path while Utila continues to sign and enforce policy on every transfer, keep both webhook handlers live during the window, and retire the old direct-to-OTC or direct-to-exchange transaction path only once a full dual-run settlement cycle completes with no discrepancies.\n\nConstraints:\n- Develop against a BlindPay development instance (USDB on testnets) first; test the $666.00 forced-failed and $777.00 forced-refunded sentinels before touching production amounts.\n- Amounts are integer minor units on both sides; no floating point money math.\n- API keys stay server-side.\n- Produce the written inventory and mapping report before changing code.\n\nDeliverables: the migration report, the external wallet registration script and stored bw_ mapping, the BlindPay client and quote\u002Fpayout code paths behind a flag, both webhook handlers, and a cutover checklist.\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",{},"Point the agent at your codebase so it inventories real Utila usage instead of assuming which transactions are payouts.",[38,42,43],{},"Review the migration report, especially which vaults and wallets stay on Utila and the re-KYC sequencing, before approving code changes.",[38,45,46],{},"Dual-run at least one full settlement cycle, with both webhook handlers live, before retiring the old Utila-to-OTC path.",[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\u002Fintroduction",[61],"nofollow","Introduction",[38,64,65],{},[57,66,69],{"href":67,"rel":68},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Flearn\u002Fcustomers",[61],"Customers",[38,71,72],{},[57,73,76],{"href":74,"rel":75},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fofframp-wallets",[61],"Offramp wallets",[38,78,79],{},[57,80,83],{"href":81,"rel":82},"https:\u002F\u002Fdocs.utila.io\u002Freference\u002Fwebhooks",[61],"Utila webhooks",{"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},"migrations","2026-08-26","Keep Utila as custodian and signer, and route the stablecoin-to-fiat leg through BlindPay: map vaults, wallets, transactions, and webhooks to their BlindPay equivalents.","md",false,{},true,"\u002Fprompts\u002Fmigrate-from-utila",[99,100,101,102],"payouts","quotes","compliance","webhooks","---\ntitle: \"Migrate from Utila to BlindPay\"\ndescription: \"Keep Utila as custodian and signer, and route the stablecoin-to-fiat leg through BlindPay: map vaults, wallets, transactions, and webhooks to their BlindPay equivalents.\"\ndate: \"2026-08-26\"\ncategory: \"migrations\"\nproducts: [\"payouts\", \"quotes\", \"compliance\", \"webhooks\"]\n---\n\nPaste this prompt into your coding agent to move the stablecoin-to-fiat leg of a Utila (docs.utila.io) integration to BlindPay while Utila keeps custody and signing.\n\n## Prompt\n\n```text\nYou are migrating the stablecoin-to-fiat leg of my application from Utila (docs.utila.io) to BlindPay. Utila stays in place as custodian and transaction signer (vaults, wallets, transaction initiation, policy engine, co-signer). Only the payout and offramp flow moves to BlindPay.\n\nBefore writing code, read these sources and follow them over any prior knowledge:\n- https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fllms.txt (read the quickstarts, customers, bank accounts, quotes, payouts, offramp wallets, and webhooks pages)\n- The OpenAPI spec: curl https:\u002F\u002Fapi.blindpay.com\u002Fdoc\n\nDo the migration in this order:\n1. Inventory my Utila usage from the codebase: every Utila endpoint called (vaults, wallets, transactions_initiatetransaction, transactions_voteontransactionrequest, addressbook entries) and every stored Utila resource name (vault, wallet, transaction). Separate transactions that are actually fiat payouts (transfers to OTC desks, exchange addresses, or address book entries tagged for offramp) from internal treasury moves. Confirm the exact policy engine vote-threshold and co-signer behavior in the Utila docs rather than assuming, since these are account-configurable. Produce a written report listing what stays on Utila (custody, signing, policy engine) and what moves to BlindPay (the fiat leg), before touching code.\n2. Register each Utila wallet address that will keep custody with BlindPay as an external wallet, using the sign-message challenge flow, and store the resulting bw_ ID next to the Utila wallet resource name. This is the connection point: funds keep living in Utila wallets, BlindPay only needs proof of ownership to route payouts against them.\n3. Onboard recipients as BlindPay customers (re_) with KYC\u002FKYB and add their rail-specific bank accounts (ba_) for Pix, SPEI, SEPA, ACH, or wire. Utila KYC and policy approvals do not transfer, so sequence re-verification ahead of cutover.\n4. Rebuild the payout leg on BlindPay's two-step model: request a quote (qu_), then execute the payout (po_) referencing the registered external wallet before expires_at (about 5 minutes). The actual on-chain transfer still goes through Utila's transaction initiation and policy engine vote. Store qu_ and po_ IDs alongside the originating Utila transaction resource name so both sides of one payout are traceable.\n5. Port event handling to BlindPay's Svix-signed webhooks (customer.*, payout.*, wallet.inbound) with signature verification and svix-id dedup, and run these handlers alongside the existing Utila webhook handler (x-utila-signature, TRANSACTION_STATE_UPDATED) so custody-side and fiat-side state both stay current.\n6. Cut over per flow behind a feature flag: dual-run with new payouts going through the BlindPay quote and payout path while Utila continues to sign and enforce policy on every transfer, keep both webhook handlers live during the window, and retire the old direct-to-OTC or direct-to-exchange transaction path only once a full dual-run settlement cycle completes with no discrepancies.\n\nConstraints:\n- Develop against a BlindPay development instance (USDB on testnets) first; test the $666.00 forced-failed and $777.00 forced-refunded sentinels before touching production amounts.\n- Amounts are integer minor units on both sides; no floating point money math.\n- API keys stay server-side.\n- Produce the written inventory and mapping report before changing code.\n\nDeliverables: the migration report, the external wallet registration script and stored bw_ mapping, the BlindPay client and quote\u002Fpayout code paths behind a flag, both webhook handlers, and a cutover checklist.\n```\n\n## How to use\n\n1. Point the agent at your codebase so it inventories real Utila usage instead of assuming which transactions are payouts.\n2. Review the migration report, especially which vaults and wallets stay on Utila and the re-KYC sequencing, before approving code changes.\n3. Dual-run at least one full settlement cycle, with both webhook handlers live, before retiring the old Utila-to-OTC path.\n\n## Related docs\n\n- [Introduction](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fintroduction)\n- [Customers](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Flearn\u002Fcustomers)\n- [Offramp wallets](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fofframp-wallets)\n- [Utila webhooks](https:\u002F\u002Fdocs.utila.io\u002Freference\u002Fwebhooks)\n",{"title":5,"description":92},"prompts\u002Fmigrate-from-utila","b14e-Ztx-R2FEpxaGgdtm3nn1KQb6UWQPnX_wfnlNAg",[108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,169],{"path":109,"title":110,"description":111},"\u002Fprompts\u002Fmigrate-from-anchorage","Migrate from Anchorage Digital to BlindPay","Keep Anchorage Digital for custody and move the stablecoin-to-fiat leg to BlindPay: map transfers, withdrawals, and settlement events to BlindPay quotes, payouts, and webhooks.",{"path":113,"title":114,"description":115},"\u002Fprompts\u002Fmigrate-from-bitgo","Migrate from BitGo to BlindPay","Move the stablecoin-to-fiat leg of a BitGo integration to BlindPay: map wallets, transfers, and settlement webhooks to BlindPay customers, quotes, payouts, and Svix events.",{"path":117,"title":118,"description":119},"\u002Fprompts\u002Fmigrate-from-bridge","Migrate from Bridge to BlindPay","Move an existing Bridge integration to the BlindPay API: map customers, external accounts, liquidation addresses, and transfers to their BlindPay equivalents.",{"path":121,"title":122,"description":123},"\u002Fprompts\u002Fmigrate-from-circle","Migrate from Circle to BlindPay","Move payouts and fiat on\u002Foff ramps from Circle Mint or the Circle Payments Network to BlindPay's quote-and-execute API with local rails.",{"path":125,"title":126,"description":127},"\u002Fprompts\u002Fmigrate-from-cobo","Migrate from Cobo to BlindPay","Move an existing Cobo Payments integration to the BlindPay API: keep Cobo for custody if you want, and replace the stablecoin-to-fiat leg with BlindPay's customers, quotes, and payouts.",{"path":129,"title":130,"description":131},"\u002Fprompts\u002Fmigrate-from-coinbase-cdp","Migrate from Coinbase CDP to BlindPay","Move the stablecoin-to-fiat offramp leg of a Coinbase Developer Platform integration to BlindPay: add Pix, SPEI, SEPA, ACH, and wire payouts while CDP wallets keep custody.",{"path":133,"title":134,"description":135},"\u002Fprompts\u002Fmigrate-from-conduit","Migrate from Conduit to BlindPay","Move a Conduit cross-border payments integration to BlindPay: counterparties, corridors, and settlement tracking on the quote-and-execute model.",{"path":137,"title":138,"description":139},"\u002Fprompts\u002Fmigrate-from-crossmint","Migrate from Crossmint to BlindPay","Move the stablecoin-to-fiat leg of a Crossmint integration to BlindPay while Crossmint keeps handling wallets, checkout, or orchestration.",{"path":141,"title":142,"description":143},"\u002Fprompts\u002Fmigrate-from-dfns","Migrate from Dfns to BlindPay","Keep Dfns for MPC wallet custody and move the stablecoin-to-fiat leg to BlindPay: map transfers and exchange withdrawals to quotes, payouts, and registered external wallets.",{"path":145,"title":146,"description":147},"\u002Fprompts\u002Fmigrate-from-dynamic","Migrate from Dynamic to BlindPay","Keep Dynamic for embedded and server wallets, move the stablecoin-to-fiat offramp leg to BlindPay: register the Dynamic wallet, quote and execute payouts, and verify webhooks.",{"path":149,"title":150,"description":151},"\u002Fprompts\u002Fmigrate-from-fern","Migrate from Fern to BlindPay","Move a Fern stablecoin integration to BlindPay: customers, wallets, on\u002Foff ramps, and webhook-driven settlement on the quote-and-execute model.",{"path":153,"title":154,"description":155},"\u002Fprompts\u002Fmigrate-from-fireblocks","Migrate from Fireblocks to BlindPay","Move the stablecoin-to-fiat payout leg of a Fireblocks integration to BlindPay: map payout instruction sets, fiat accounts, and webhooks while Fireblocks stays as custodian.",{"path":157,"title":158,"description":159},"\u002Fprompts\u002Fmigrate-from-privy","Migrate from Privy to BlindPay","Keep Privy for embedded and server wallets, move the stablecoin-to-fiat offramp leg to BlindPay: register the Privy wallet, quote and execute payouts, and verify webhooks.",{"path":161,"title":162,"description":163},"\u002Fprompts\u002Fmigrate-from-swift-wires","Migrate from SWIFT wires to stablecoin payouts","Replace multi-day international wires with same-day stablecoin settlement over local rails, keeping SWIFT as a fallback where you still need it.",{"path":165,"title":166,"description":167},"\u002Fprompts\u002Fmigrate-from-turnkey","Migrate from Turnkey to BlindPay","Keep Turnkey for wallets and signing, and move the stablecoin-to-fiat offramp leg of a Turnkey-based product to BlindPay: map payout accounts, quotes, and webhooks.",{"path":97,"title":5,"description":92},{"path":170,"title":171,"description":172},"\u002Fprompts\u002Fmigrate-from-manual-payouts","Migrate from manual bank payouts to the API","Turn a spreadsheet-and-bank-portal payout operation into an automated, webhook-driven API flow with an auditable state machine.",1787868850862]