[{"data":1,"prerenderedAt":1403},["ShallowReactive",2],{"content-\u002Fresources\u002Fmore\u002Fstablecoin-api-objects-explained":3,"resources-category-stablecoin-api-objects-explained":1073},{"id":4,"title":5,"authors":6,"body":7,"categories":6,"category":1041,"categoryType":6,"compare":6,"contributors":6,"date":1042,"description":1043,"extension":1044,"faq":1045,"howto":6,"isBlog":1064,"isChangelog":1064,"meta":1065,"navigation":515,"path":1067,"pillar":1064,"products":6,"rawbody":1068,"role":6,"seo":1069,"seoTitle":1070,"stem":1071,"thumbnail":6,"updated":1042,"__hash__":1072},"content\u002Fresources\u002Fmore\u002Fstablecoin-api-objects-explained.md","Stablecoin API objects explained: customers, bank accounts, wallets, quotes, payouts, and webhooks",null,{"type":8,"value":9,"toc":1030},"minimark",[10,14,20,45,53,58,61,249,252,256,259,262,265,268,293,297,300,394,405,409,412,608,687,718,722,725,806,809,813,816,876,880,883,988,992,1019,1023,1026],[11,12,13],"p",{},"A stablecoin API is built from about eight objects. A customer is the verified person or business. Bank accounts and wallets are where money goes or sits. A quote locks the rate and fees. A payout or payin executes that quote, a virtual account collects repeat deposits, and webhook events report every change. Get those relationships right and the integration code stays small.",[11,15,16],{},[17,18,19],"strong",{},"Key takeaways",[21,22,23,27,30,33,36],"ul",{},[24,25,26],"li",{},"The customer is a verified legal party, not your login user. Model it that way from day one.",[24,28,29],{},"A quote is single use and lives for minutes. A payout or payin is the durable record you reconcile.",[24,31,32],{},"Store the provider's IDs, your idempotency key, and the rail reference on every payment, with amounts as integers in minor units.",[24,34,35],{},"Webhooks are delivered at least once and can arrive out of order. Your state machine should only move forward.",[24,37,38,39,44],{},"Names vary by provider (receiver, beneficiary, counterparty), but the roles below show up in nearly every ",[40,41,43],"a",{"href":42},"\u002Fresources\u002Fmore\u002Ftypes-of-stablecoin-apis","type of stablecoin API",".",[11,46,47,48,52],{},"The ",[40,49,51],{"href":50},"\u002Fresources\u002Fmore\u002Fhow-to-integrate-a-stablecoin-api","integration guide"," walks through the calls in order. This page covers the layer under the calls: what each object means, how they link, and what your own database should keep.",[54,55,57],"h2",{"id":56},"what-are-the-core-objects-in-a-stablecoin-api","What are the core objects in a stablecoin API?",[11,59,60],{},"The core objects are the environment, customer, bank account, wallet, quote, payout, payin, virtual account, and webhook event.",[62,63,64,83],"table",{},[65,66,67],"thead",{},[68,69,70,74,77,80],"tr",{},[71,72,73],"th",{},"Object",[71,75,76],{},"What it represents",[71,78,79],{},"How long it lives",[71,81,82],{},"Example ID at BlindPay",[84,85,86,104,119,135,150,165,186,202,217,233],"tbody",{},[68,87,88,92,95,98],{},[89,90,91],"td",{},"Instance (environment)",[89,93,94],{},"An isolated sandbox or production space. Nothing crosses between them",[89,96,97],{},"Permanent",[89,99,100],{},[101,102,103],"code",{},"in_...",[68,105,106,109,112,114],{},[89,107,108],{},"Customer",[89,110,111],{},"The verified individual or business that sends or receives money. Passes KYC or KYB",[89,113,97],{},[89,115,116],{},[101,117,118],{},"re_...",[68,120,121,124,127,130],{},[89,122,123],{},"Bank account",[89,125,126],{},"A fiat destination for payouts: rail, account details, holder name. Can belong to a third party",[89,128,129],{},"Until deleted",[89,131,132],{},[101,133,134],{},"ba_...",[68,136,137,140,143,145],{},[89,138,139],{},"Blockchain wallet",[89,141,142],{},"An external address the customer controls, on a specific network",[89,144,129],{},[89,146,147],{},[101,148,149],{},"bw_...",[68,151,152,155,158,160],{},[89,153,154],{},"Managed wallet",[89,156,157],{},"A stablecoin balance the provider holds for the customer",[89,159,97],{},[89,161,162],{},[101,163,164],{},"bl_...",[68,166,167,170,173,176],{},[89,168,169],{},"Quote",[89,171,172],{},"A locked rate, fee split, and amount for one payment",[89,174,175],{},"Minutes",[89,177,178,181,182,185],{},[101,179,180],{},"qu_..."," (payout), ",[101,183,184],{},"pq_..."," (payin)",[68,187,188,191,194,197],{},[89,189,190],{},"Payout",[89,192,193],{},"Stablecoins out, local currency into a bank account",[89,195,196],{},"Permanent record",[89,198,199],{},[101,200,201],{},"po_...",[68,203,204,207,210,212],{},[89,205,206],{},"Payin",[89,208,209],{},"Local currency in, stablecoins out to a wallet",[89,211,196],{},[89,213,214],{},[101,215,216],{},"pi_...",[68,218,219,222,225,228],{},[89,220,221],{},"Virtual account",[89,223,224],{},"A reusable bank account in the customer's name for repeat deposits",[89,226,227],{},"Until closed",[89,229,230],{},[101,231,232],{},"va_...",[68,234,235,238,241,244],{},[89,236,237],{},"Webhook endpoint and event",[89,239,240],{},"Your URL, and the messages sent to it on each state change",[89,242,243],{},"Endpoint permanent, events replayable",[89,245,246],{},[101,247,248],{},"we_...",[11,250,251],{},"Less common objects follow the same pattern: transfers between wallets, bills to pay (payables), off-ramp wallets that pay out on deposit, and partner fees. If you understand the ten above, you can read any of them.",[54,253,255],{"id":254},"how-do-the-objects-relate-to-each-other","How do the objects relate to each other?",[11,257,258],{},"Every object hangs off a customer inside one environment, and every money movement points back to a quote.",[11,260,261],{},"Picture a tree. The instance is the root. Customers sit under it. Each customer owns its destinations and sources: many bank accounts, many wallets, and usually one or a few virtual accounts. A virtual account points at the wallet where converted stablecoins land.",[11,263,264],{},"Money movements sit beside the tree, not inside it. A payout quote references a customer's bank account plus the network and token that fund it. The payout references that quote and the wallet the stablecoins come from. A payin references its payin quote and the destination wallet. Webhook events reference whichever object changed.",[11,266,267],{},"Three cardinality rules save the most bugs:",[21,269,270,276,282],{},[24,271,272,275],{},[17,273,274],{},"One quote backs one payout."," A second payout with the same quote ID should be rejected.",[24,277,278,281],{},[17,279,280],{},"A bank account belongs to the paying customer, not the payee."," A customer named John can pay a bank account held by Jack.",[24,283,284,287,288,292],{},[17,285,286],{},"Funds sit in exactly one place at a time."," An external wallet is under the customer's control, a managed wallet is held by the provider, and a payout in flight is in the provider's hands until it completes or returns. ",[40,289,291],{"href":290},"\u002Fresources\u002Fmore\u002Fstablecoin-payout-statuses-explained","Payout statuses"," shows each step.",[54,294,296],{"id":295},"which-ids-should-you-store-in-your-own-database","Which IDs should you store in your own database?",[11,298,299],{},"Store every provider ID next to the record it maps to, plus the references your finance team will ask for later.",[62,301,302,315],{},[65,303,304],{},[68,305,306,309,312],{},[71,307,308],{},"Your record",[71,310,311],{},"What to store",[71,313,314],{},"Why",[84,316,317,328,339,350,361,372,383],{},[68,318,319,322,325],{},[89,320,321],{},"User or business",[89,323,324],{},"Customer ID, KYC status",[89,326,327],{},"Every payment needs the customer; status gates what they can do",[68,329,330,333,336],{},[89,331,332],{},"Payee",[89,334,335],{},"Bank account ID, rail, last four digits",[89,337,338],{},"Lets you reuse the destination without resending details",[68,340,341,344,347],{},[89,342,343],{},"Wallet",[89,345,346],{},"Wallet ID, address, network",[89,348,349],{},"The same address on two networks is two different wallets",[68,351,352,355,358],{},[89,353,354],{},"Payment",[89,356,357],{},"Quote ID, payout or payin ID, your idempotency key, status, amounts in minor units, token, network",[89,359,360],{},"The core of reconciliation",[68,362,363,366,369],{},[89,364,365],{},"Rail reference",[89,367,368],{},"SWIFT UETR, Fedwire IMAD, or bank reference when the rail returns one",[89,370,371],{},"What the recipient's bank asks for when a payment goes missing",[68,373,374,377,380],{},[89,375,376],{},"Onchain reference",[89,378,379],{},"Transaction hash",[89,381,382],{},"Proves the stablecoin leg happened",[68,384,385,388,391],{},[89,386,387],{},"Webhook log",[89,389,390],{},"Message ID, event type, received time, processed time",[89,392,393],{},"Deduplication and audit",[11,395,396,397,400,401,404],{},"Amounts deserve their own rule. Store integers in minor units, the way the API sends them. A ",[101,398,399],{},"request_amount"," of ",[101,402,403],{},"66600"," in USD means $666.00. A float will eventually round a cent the wrong way, and finance will find it at month end.",[54,406,408],{"id":407},"what-does-a-quote-and-payout-request-look-like","What does a quote and payout request look like?",[11,410,411],{},"A quote request names the destination, amount, and funding token; the payout request names the quote. The example below is generic and illustrative. Field names differ by provider.",[413,414,419],"pre",{"className":415,"code":416,"language":417,"meta":418,"style":418},"language-json shiki shiki-themes github-light","\u002F\u002F POST \u002Fquotes  (illustrative)\n{\n  \"bank_account_id\": \"ba_123\",\n  \"request_amount\": 100000,\n  \"currency_type\": \"sender\",\n  \"token\": \"USDC\",\n  \"network\": \"base\"\n}\n\n\u002F\u002F 200 OK\n{\n  \"id\": \"qu_456\",\n  \"sender_amount\": 100000,\n  \"receiver_amount\": 532150,\n  \"commercial_rate\": 5.35,\n  \"flat_fee\": 300,\n  \"expires_at\": 1790000000000\n}\n","json","",[101,420,421,430,437,454,467,480,493,504,510,517,523,528,541,553,566,579,592,603],{"__ignoreMap":418},[422,423,426],"span",{"class":424,"line":425},"line",1,[422,427,429],{"class":428},"sAwPA","\u002F\u002F POST \u002Fquotes  (illustrative)\n",[422,431,433],{"class":424,"line":432},2,[422,434,436],{"class":435},"sgsFI","{\n",[422,438,440,444,447,451],{"class":424,"line":439},3,[422,441,443],{"class":442},"sYu0t","  \"bank_account_id\"",[422,445,446],{"class":435},": ",[422,448,450],{"class":449},"sYBdl","\"ba_123\"",[422,452,453],{"class":435},",\n",[422,455,457,460,462,465],{"class":424,"line":456},4,[422,458,459],{"class":442},"  \"request_amount\"",[422,461,446],{"class":435},[422,463,464],{"class":442},"100000",[422,466,453],{"class":435},[422,468,470,473,475,478],{"class":424,"line":469},5,[422,471,472],{"class":442},"  \"currency_type\"",[422,474,446],{"class":435},[422,476,477],{"class":449},"\"sender\"",[422,479,453],{"class":435},[422,481,483,486,488,491],{"class":424,"line":482},6,[422,484,485],{"class":442},"  \"token\"",[422,487,446],{"class":435},[422,489,490],{"class":449},"\"USDC\"",[422,492,453],{"class":435},[422,494,496,499,501],{"class":424,"line":495},7,[422,497,498],{"class":442},"  \"network\"",[422,500,446],{"class":435},[422,502,503],{"class":449},"\"base\"\n",[422,505,507],{"class":424,"line":506},8,[422,508,509],{"class":435},"}\n",[422,511,513],{"class":424,"line":512},9,[422,514,516],{"emptyLinePlaceholder":515},true,"\n",[422,518,520],{"class":424,"line":519},10,[422,521,522],{"class":428},"\u002F\u002F 200 OK\n",[422,524,526],{"class":424,"line":525},11,[422,527,436],{"class":435},[422,529,531,534,536,539],{"class":424,"line":530},12,[422,532,533],{"class":442},"  \"id\"",[422,535,446],{"class":435},[422,537,538],{"class":449},"\"qu_456\"",[422,540,453],{"class":435},[422,542,544,547,549,551],{"class":424,"line":543},13,[422,545,546],{"class":442},"  \"sender_amount\"",[422,548,446],{"class":435},[422,550,464],{"class":442},[422,552,453],{"class":435},[422,554,556,559,561,564],{"class":424,"line":555},14,[422,557,558],{"class":442},"  \"receiver_amount\"",[422,560,446],{"class":435},[422,562,563],{"class":442},"532150",[422,565,453],{"class":435},[422,567,569,572,574,577],{"class":424,"line":568},15,[422,570,571],{"class":442},"  \"commercial_rate\"",[422,573,446],{"class":435},[422,575,576],{"class":442},"5.35",[422,578,453],{"class":435},[422,580,582,585,587,590],{"class":424,"line":581},16,[422,583,584],{"class":442},"  \"flat_fee\"",[422,586,446],{"class":435},[422,588,589],{"class":442},"300",[422,591,453],{"class":435},[422,593,595,598,600],{"class":424,"line":594},17,[422,596,597],{"class":442},"  \"expires_at\"",[422,599,446],{"class":435},[422,601,602],{"class":442},"1790000000000\n",[422,604,606],{"class":424,"line":605},18,[422,607,509],{"class":435},[413,609,611],{"className":415,"code":610,"language":417,"meta":418,"style":418},"\u002F\u002F POST \u002Fpayouts  (illustrative)\n\u002F\u002F Header: Idempotency-Key: 7b0c4c2e-payroll-2026-09-30-row-118\n{\n  \"quote_id\": \"qu_456\",\n  \"sender_wallet_address\": \"0xabc...\"\n}\n\n\u002F\u002F 200 OK\n{ \"id\": \"po_789\", \"status\": \"processing\" }\n",[101,612,613,618,623,627,638,648,652,656,660],{"__ignoreMap":418},[422,614,615],{"class":424,"line":425},[422,616,617],{"class":428},"\u002F\u002F POST \u002Fpayouts  (illustrative)\n",[422,619,620],{"class":424,"line":432},[422,621,622],{"class":428},"\u002F\u002F Header: Idempotency-Key: 7b0c4c2e-payroll-2026-09-30-row-118\n",[422,624,625],{"class":424,"line":439},[422,626,436],{"class":435},[422,628,629,632,634,636],{"class":424,"line":456},[422,630,631],{"class":442},"  \"quote_id\"",[422,633,446],{"class":435},[422,635,538],{"class":449},[422,637,453],{"class":435},[422,639,640,643,645],{"class":424,"line":469},[422,641,642],{"class":442},"  \"sender_wallet_address\"",[422,644,446],{"class":435},[422,646,647],{"class":449},"\"0xabc...\"\n",[422,649,650],{"class":424,"line":482},[422,651,509],{"class":435},[422,653,654],{"class":424,"line":495},[422,655,516],{"emptyLinePlaceholder":515},[422,657,658],{"class":424,"line":506},[422,659,522],{"class":428},[422,661,662,665,668,670,673,676,679,681,684],{"class":424,"line":512},[422,663,664],{"class":435},"{ ",[422,666,667],{"class":442},"\"id\"",[422,669,446],{"class":435},[422,671,672],{"class":449},"\"po_789\"",[422,674,675],{"class":435},", ",[422,677,678],{"class":442},"\"status\"",[422,680,446],{"class":435},[422,682,683],{"class":449},"\"processing\"",[422,685,686],{"class":435}," }\n",[11,688,689,690,693,694,697,698,704,705,709,710,713,714,717],{},"Three details in that exchange matter. ",[101,691,692],{},"expires_at"," is a timestamp you read, not a window you assume. The ",[101,695,696],{},"Idempotency-Key"," header, described in an ",[40,699,703],{"href":700,"rel":701},"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fdraft-ietf-httpapi-idempotency-key-header\u002F",[702],"nofollow","IETF draft",", lets you retry the POST without paying twice; our ",[40,706,708],{"href":707},"\u002Fresources\u002Fmore\u002Fstablecoin-api-idempotency-keys","idempotency guide"," covers the edge cases. And the payout comes back as ",[101,711,712],{},"processing",", not ",[101,715,716],{},"completed",". The final answer arrives by webhook.",[54,719,721],{"id":720},"which-states-does-each-object-move-through","Which states does each object move through?",[11,723,724],{},"Each object has a small state machine, and your code should mirror it rather than invent its own.",[62,726,727,742],{},[65,728,729],{},[68,730,731,733,736,739],{},[71,732,73],{},[71,734,735],{},"Common states",[71,737,738],{},"Terminal states",[71,740,741],{},"Watch for",[84,743,744,757,769,782,795],{},[68,745,746,748,751,754],{},[89,747,108],{},[89,749,750],{},"verifying, pending review",[89,752,753],{},"approved, rejected",[89,755,756],{},"Approved with an open information request",[68,758,759,761,764,766],{},[89,760,221],{},[89,762,763],{},"pending review, bank review",[89,765,753],{},[89,767,768],{},"Rail details are empty until approval",[68,770,771,773,776,779],{},[89,772,169],{},[89,774,775],{},"active",[89,777,778],{},"expired, used",[89,780,781],{},"Expiry before the sender confirms",[68,783,784,786,789,792],{},[89,785,190],{},[89,787,788],{},"processing, on hold",[89,790,791],{},"completed, failed, refunded",[89,793,794],{},"A failed payout is not automatically refunded",[68,796,797,799,801,803],{},[89,798,206],{},[89,800,788],{},[89,802,791],{},[89,804,805],{},"A refunded payin means the deposit went back to the sender",[11,807,808],{},"Model \"on hold\" as pending, not as an error. SWIFT and USD payouts often pass through a review hold as a standard step, so most users will see it at least once.",[54,810,812],{"id":811},"how-should-you-build-the-data-model-step-by-step","How should you build the data model, step by step?",[11,814,815],{},"Build it in the same order money moves. Seven steps:",[817,818,819,825,831,837,847,853,865],"ol",{},[24,820,821,824],{},[17,822,823],{},"Create one environment per stage."," Keep sandbox and production IDs in separate databases or clearly tagged columns. An ID from one never works in the other.",[24,826,827,830],{},[17,828,829],{},"Map your users to customers."," One customer per legal party that sends or receives money. A company with five admins is one business customer, not five.",[24,832,833,836],{},[17,834,835],{},"Attach destinations to the customer."," Bank accounts and wallets get their own tables with a foreign key to the customer.",[24,838,839,842,843,846],{},[17,840,841],{},"Write the payment row before you call the API."," Generate the idempotency key, store it with status ",[101,844,845],{},"created",", then request the quote and the payout.",[24,848,849,852],{},[17,850,851],{},"Record every provider ID as it comes back."," Quote ID, then payout ID, then the transaction hash and rail reference.",[24,854,855,858,859,864],{},[17,856,857],{},"Apply webhooks through a forward-only state machine."," Deduplicate by message ID. The ",[40,860,863],{"href":861,"rel":862},"https:\u002F\u002Fgithub.com\u002Fstandard-webhooks\u002Fstandard-webhooks\u002Fblob\u002Fmain\u002Fspec\u002Fstandard-webhooks.md",[702],"Standard Webhooks spec"," recommends using the message ID as an idempotency key for this.",[24,866,867,870,871,875],{},[17,868,869],{},"Reconcile on a schedule."," Fetch anything still open past its expected arrival and compare it with your ledger. The ",[40,872,874],{"href":873},"\u002Fresources\u002Fmore\u002Fstablecoin-api-webhooks-reconciliation","webhooks and reconciliation guide"," has the matching logic.",[54,877,879],{"id":878},"what-are-the-8-most-common-data-model-mistakes","What are the 8 most common data-model mistakes?",[11,881,882],{},"These eight show up in nearly every first integration, and each has a one-line fix.",[62,884,885,898],{},[65,886,887],{},[68,888,889,892,895],{},[71,890,891],{},"Mistake",[71,893,894],{},"What breaks",[71,896,897],{},"Fix",[84,899,900,911,922,933,944,955,966,977],{},[68,901,902,905,908],{},[89,903,904],{},"Treating the customer as your login user",[89,906,907],{},"Duplicate KYC, payments split across \"customers\" for one company",[89,909,910],{},"One customer per legal party; many logins can act for it",[68,912,913,916,919],{},[89,914,915],{},"Registering only your direct clients when you pay on behalf of others",[89,917,918],{},"Compliance gaps in nested flows",[89,920,921],{},"Register each end customer as its own customer when the provider requires it",[68,923,924,927,930],{},[89,925,926],{},"Storing the bank account on the payee profile only",[89,928,929],{},"Third-party payouts fail to map",[89,931,932],{},"Bank account belongs to the paying customer, with holder name stored separately",[68,934,935,938,941],{},[89,936,937],{},"Storing amounts as floats",[89,939,940],{},"Cent-level drift at reconciliation",[89,942,943],{},"Integers in minor units, converted only for display",[68,945,946,949,952],{},[89,947,948],{},"Caching or reusing quotes",[89,950,951],{},"Expired or rejected payouts",[89,953,954],{},"New quote per payment, executed immediately",[68,956,957,960,963],{},[89,958,959],{},"Generating a new idempotency key on each retry",[89,961,962],{},"Duplicate payouts after a timeout",[89,964,965],{},"One key per intended payment, saved before the first call",[68,967,968,971,974],{},[89,969,970],{},"Applying webhooks in arrival order",[89,972,973],{},"A late event moves a completed payout back to processing",[89,975,976],{},"Forward-only transitions, dedupe by message ID",[68,978,979,982,985],{},[89,980,981],{},"Counting linked events twice",[89,983,984],{},"One bill payment shows as two payments",[89,986,987],{},"Correlate linked records (for example a payable and its payout) by ID and count once",[54,989,991],{"id":990},"where-does-blindpay-fit","Where does BlindPay fit?",[11,993,994,995,1000,1001,1006,1007,1012,1013,1018],{},"BlindPay's API uses these same objects with prefixed IDs, so a log line tells you what you are looking at. The docs come in two flavors: Abstracted, for teams that think in bank rails (virtual accounts, payins, payouts), and Advanced, for teams that work with wallets, approvals, and chains directly. Both describe the same API. Official ",[40,996,999],{"href":997,"rel":998},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fsdks",[702],"SDKs"," for Node.js, Python, Go, PHP, and Swift are generated from one ",[40,1002,1005],{"href":1003,"rel":1004},"https:\u002F\u002Fspec.openapis.org\u002Foas\u002Fv3.1.0",[702],"OpenAPI 3.1"," spec, so the object shapes match across languages. The ",[40,1008,1011],{"href":1009,"rel":1010},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Flearn\u002Fcustomers",[702],"customers reference"," and the ",[40,1014,1017],{"href":1015,"rel":1016},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Flearn\u002Fwebhooks-events",[702],"webhook event list"," are good first reads.",[54,1020,1022],{"id":1021},"what-to-do-next","What to do next",[11,1024,1025],{},"Draw your current schema next to the table in this article. For each payment row, check that you store the quote ID, the payout or payin ID, your idempotency key, and the amount in minor units. If any of those is missing, add the column before your first production payout, not after the first reconciliation break.",[1027,1028,1029],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":418,"searchDepth":432,"depth":432,"links":1031},[1032,1033,1034,1035,1036,1037,1038,1039,1040],{"id":56,"depth":432,"text":57},{"id":254,"depth":432,"text":255},{"id":295,"depth":432,"text":296},{"id":407,"depth":432,"text":408},{"id":720,"depth":432,"text":721},{"id":811,"depth":432,"text":812},{"id":878,"depth":432,"text":879},{"id":990,"depth":432,"text":991},{"id":1021,"depth":432,"text":1022},"payments","2026-09-28","The core objects behind a stablecoin API, how they relate, which IDs to store in your ledger, and 8 data-model mistakes that break payout integrations.","md",[1046,1049,1052,1055,1058,1061],{"q":1047,"a":1048},"What are the main objects in a stablecoin API?","Most stablecoin APIs share the same core objects: a customer (the verified person or business), bank accounts and blockchain wallets that hold or receive funds, a quote that locks the rate and fees, a payout or payin that executes the quote, an optional virtual account for repeat deposits, and webhook events that report every state change. Names vary by provider, but the roles stay the same.",{"q":1050,"a":1051},"What is the difference between a customer and a receiver in a stablecoin API?","A customer is the verified legal party on whose behalf money moves, and it passes KYC or KYB. A receiver, beneficiary, or bank account is a payment destination attached to that customer. Some providers use receiver to mean the customer itself, so read the docs. At BlindPay, customer IDs start with re_ and bank accounts start with ba_.",{"q":1053,"a":1054},"Why do stablecoin API quotes expire so quickly?","A quote locks an exchange rate and fees that the provider has to honor, while FX and liquidity keep moving. Short windows, often five minutes, limit that exposure. Treat a quote as single use: create it when the sender confirms, execute the payout right away, and request a new one if it expires. Never cache a quote for a later payment.",{"q":1056,"a":1057},"Which provider IDs should I store in my database?","Store the customer ID next to your user or business record, the bank account and wallet IDs next to each payee, and the quote ID, payout or payin ID, and your own idempotency key on every payment. Keep the rail reference too, such as the SWIFT UETR, plus the webhook message ID you used for deduplication. Store amounts as integers in minor units.",{"q":1059,"a":1060},"Should my app update payment status from webhooks or by polling?","Use webhooks as the primary signal and polling as the safety net. Webhooks arrive at least once, can repeat, and can arrive out of order, so deduplicate by message ID and only move a payment forward in its state machine. Run a scheduled job that fetches any payment still open past its expected arrival time and reconciles it against the API.",{"q":1062,"a":1063},"How many virtual accounts can one customer have?","It depends on the provider. Many issue one account per customer per banking partner, and some allow several for separate purposes. Model the virtual account as its own object linked to the customer and to the wallet where converted stablecoins land, rather than as a field on the customer, so a second account later does not force a schema change.",false,{"author":1066},"BlindPay Team","\u002Fresources\u002Fmore\u002Fstablecoin-api-objects-explained","---\ntitle: \"Stablecoin API objects explained: customers, bank accounts, wallets, quotes, payouts, and webhooks\"\nseoTitle: \"Stablecoin API objects explained: the data model\"\ndescription: \"The core objects behind a stablecoin API, how they relate, which IDs to store in your ledger, and 8 data-model mistakes that break payout integrations.\"\ndate: \"2026-09-28\"\nupdated: \"2026-09-28\"\ncategory: \"payments\"\nauthor: \"BlindPay Team\"\nfaq:\n  - q: \"What are the main objects in a stablecoin API?\"\n    a: \"Most stablecoin APIs share the same core objects: a customer (the verified person or business), bank accounts and blockchain wallets that hold or receive funds, a quote that locks the rate and fees, a payout or payin that executes the quote, an optional virtual account for repeat deposits, and webhook events that report every state change. Names vary by provider, but the roles stay the same.\"\n  - q: \"What is the difference between a customer and a receiver in a stablecoin API?\"\n    a: \"A customer is the verified legal party on whose behalf money moves, and it passes KYC or KYB. A receiver, beneficiary, or bank account is a payment destination attached to that customer. Some providers use receiver to mean the customer itself, so read the docs. At BlindPay, customer IDs start with re_ and bank accounts start with ba_.\"\n  - q: \"Why do stablecoin API quotes expire so quickly?\"\n    a: \"A quote locks an exchange rate and fees that the provider has to honor, while FX and liquidity keep moving. Short windows, often five minutes, limit that exposure. Treat a quote as single use: create it when the sender confirms, execute the payout right away, and request a new one if it expires. Never cache a quote for a later payment.\"\n  - q: \"Which provider IDs should I store in my database?\"\n    a: \"Store the customer ID next to your user or business record, the bank account and wallet IDs next to each payee, and the quote ID, payout or payin ID, and your own idempotency key on every payment. Keep the rail reference too, such as the SWIFT UETR, plus the webhook message ID you used for deduplication. Store amounts as integers in minor units.\"\n  - q: \"Should my app update payment status from webhooks or by polling?\"\n    a: \"Use webhooks as the primary signal and polling as the safety net. Webhooks arrive at least once, can repeat, and can arrive out of order, so deduplicate by message ID and only move a payment forward in its state machine. Run a scheduled job that fetches any payment still open past its expected arrival time and reconciles it against the API.\"\n  - q: \"How many virtual accounts can one customer have?\"\n    a: \"It depends on the provider. Many issue one account per customer per banking partner, and some allow several for separate purposes. Model the virtual account as its own object linked to the customer and to the wallet where converted stablecoins land, rather than as a field on the customer, so a second account later does not force a schema change.\"\n---\n\nA stablecoin API is built from about eight objects. A customer is the verified person or business. Bank accounts and wallets are where money goes or sits. A quote locks the rate and fees. A payout or payin executes that quote, a virtual account collects repeat deposits, and webhook events report every change. Get those relationships right and the integration code stays small.\n\n**Key takeaways**\n\n- The customer is a verified legal party, not your login user. Model it that way from day one.\n- A quote is single use and lives for minutes. A payout or payin is the durable record you reconcile.\n- Store the provider's IDs, your idempotency key, and the rail reference on every payment, with amounts as integers in minor units.\n- Webhooks are delivered at least once and can arrive out of order. Your state machine should only move forward.\n- Names vary by provider (receiver, beneficiary, counterparty), but the roles below show up in nearly every [type of stablecoin API](\u002Fresources\u002Fmore\u002Ftypes-of-stablecoin-apis).\n\nThe [integration guide](\u002Fresources\u002Fmore\u002Fhow-to-integrate-a-stablecoin-api) walks through the calls in order. This page covers the layer under the calls: what each object means, how they link, and what your own database should keep.\n\n## What are the core objects in a stablecoin API?\n\nThe core objects are the environment, customer, bank account, wallet, quote, payout, payin, virtual account, and webhook event.\n\n| Object | What it represents | How long it lives | Example ID at BlindPay |\n| --- | --- | --- | --- |\n| Instance (environment) | An isolated sandbox or production space. Nothing crosses between them | Permanent | `in_...` |\n| Customer | The verified individual or business that sends or receives money. Passes KYC or KYB | Permanent | `re_...` |\n| Bank account | A fiat destination for payouts: rail, account details, holder name. Can belong to a third party | Until deleted | `ba_...` |\n| Blockchain wallet | An external address the customer controls, on a specific network | Until deleted | `bw_...` |\n| Managed wallet | A stablecoin balance the provider holds for the customer | Permanent | `bl_...` |\n| Quote | A locked rate, fee split, and amount for one payment | Minutes | `qu_...` (payout), `pq_...` (payin) |\n| Payout | Stablecoins out, local currency into a bank account | Permanent record | `po_...` |\n| Payin | Local currency in, stablecoins out to a wallet | Permanent record | `pi_...` |\n| Virtual account | A reusable bank account in the customer's name for repeat deposits | Until closed | `va_...` |\n| Webhook endpoint and event | Your URL, and the messages sent to it on each state change | Endpoint permanent, events replayable | `we_...` |\n\nLess common objects follow the same pattern: transfers between wallets, bills to pay (payables), off-ramp wallets that pay out on deposit, and partner fees. If you understand the ten above, you can read any of them.\n\n## How do the objects relate to each other?\n\nEvery object hangs off a customer inside one environment, and every money movement points back to a quote.\n\nPicture a tree. The instance is the root. Customers sit under it. Each customer owns its destinations and sources: many bank accounts, many wallets, and usually one or a few virtual accounts. A virtual account points at the wallet where converted stablecoins land.\n\nMoney movements sit beside the tree, not inside it. A payout quote references a customer's bank account plus the network and token that fund it. The payout references that quote and the wallet the stablecoins come from. A payin references its payin quote and the destination wallet. Webhook events reference whichever object changed.\n\nThree cardinality rules save the most bugs:\n\n- **One quote backs one payout.** A second payout with the same quote ID should be rejected.\n- **A bank account belongs to the paying customer, not the payee.** A customer named John can pay a bank account held by Jack.\n- **Funds sit in exactly one place at a time.** An external wallet is under the customer's control, a managed wallet is held by the provider, and a payout in flight is in the provider's hands until it completes or returns. [Payout statuses](\u002Fresources\u002Fmore\u002Fstablecoin-payout-statuses-explained) shows each step.\n\n## Which IDs should you store in your own database?\n\nStore every provider ID next to the record it maps to, plus the references your finance team will ask for later.\n\n| Your record | What to store | Why |\n| --- | --- | --- |\n| User or business | Customer ID, KYC status | Every payment needs the customer; status gates what they can do |\n| Payee | Bank account ID, rail, last four digits | Lets you reuse the destination without resending details |\n| Wallet | Wallet ID, address, network | The same address on two networks is two different wallets |\n| Payment | Quote ID, payout or payin ID, your idempotency key, status, amounts in minor units, token, network | The core of reconciliation |\n| Rail reference | SWIFT UETR, Fedwire IMAD, or bank reference when the rail returns one | What the recipient's bank asks for when a payment goes missing |\n| Onchain reference | Transaction hash | Proves the stablecoin leg happened |\n| Webhook log | Message ID, event type, received time, processed time | Deduplication and audit |\n\nAmounts deserve their own rule. Store integers in minor units, the way the API sends them. A `request_amount` of `66600` in USD means $666.00. A float will eventually round a cent the wrong way, and finance will find it at month end.\n\n## What does a quote and payout request look like?\n\nA quote request names the destination, amount, and funding token; the payout request names the quote. The example below is generic and illustrative. Field names differ by provider.\n\n```json\n\u002F\u002F POST \u002Fquotes  (illustrative)\n{\n  \"bank_account_id\": \"ba_123\",\n  \"request_amount\": 100000,\n  \"currency_type\": \"sender\",\n  \"token\": \"USDC\",\n  \"network\": \"base\"\n}\n\n\u002F\u002F 200 OK\n{\n  \"id\": \"qu_456\",\n  \"sender_amount\": 100000,\n  \"receiver_amount\": 532150,\n  \"commercial_rate\": 5.35,\n  \"flat_fee\": 300,\n  \"expires_at\": 1790000000000\n}\n```\n\n```json\n\u002F\u002F POST \u002Fpayouts  (illustrative)\n\u002F\u002F Header: Idempotency-Key: 7b0c4c2e-payroll-2026-09-30-row-118\n{\n  \"quote_id\": \"qu_456\",\n  \"sender_wallet_address\": \"0xabc...\"\n}\n\n\u002F\u002F 200 OK\n{ \"id\": \"po_789\", \"status\": \"processing\" }\n```\n\nThree details in that exchange matter. `expires_at` is a timestamp you read, not a window you assume. The `Idempotency-Key` header, described in an [IETF draft](https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fdraft-ietf-httpapi-idempotency-key-header\u002F), lets you retry the POST without paying twice; our [idempotency guide](\u002Fresources\u002Fmore\u002Fstablecoin-api-idempotency-keys) covers the edge cases. And the payout comes back as `processing`, not `completed`. The final answer arrives by webhook.\n\n## Which states does each object move through?\n\nEach object has a small state machine, and your code should mirror it rather than invent its own.\n\n| Object | Common states | Terminal states | Watch for |\n| --- | --- | --- | --- |\n| Customer | verifying, pending review | approved, rejected | Approved with an open information request |\n| Virtual account | pending review, bank review | approved, rejected | Rail details are empty until approval |\n| Quote | active | expired, used | Expiry before the sender confirms |\n| Payout | processing, on hold | completed, failed, refunded | A failed payout is not automatically refunded |\n| Payin | processing, on hold | completed, failed, refunded | A refunded payin means the deposit went back to the sender |\n\nModel \"on hold\" as pending, not as an error. SWIFT and USD payouts often pass through a review hold as a standard step, so most users will see it at least once.\n\n## How should you build the data model, step by step?\n\nBuild it in the same order money moves. Seven steps:\n\n1. **Create one environment per stage.** Keep sandbox and production IDs in separate databases or clearly tagged columns. An ID from one never works in the other.\n2. **Map your users to customers.** One customer per legal party that sends or receives money. A company with five admins is one business customer, not five.\n3. **Attach destinations to the customer.** Bank accounts and wallets get their own tables with a foreign key to the customer.\n4. **Write the payment row before you call the API.** Generate the idempotency key, store it with status `created`, then request the quote and the payout.\n5. **Record every provider ID as it comes back.** Quote ID, then payout ID, then the transaction hash and rail reference.\n6. **Apply webhooks through a forward-only state machine.** Deduplicate by message ID. The [Standard Webhooks spec](https:\u002F\u002Fgithub.com\u002Fstandard-webhooks\u002Fstandard-webhooks\u002Fblob\u002Fmain\u002Fspec\u002Fstandard-webhooks.md) recommends using the message ID as an idempotency key for this.\n7. **Reconcile on a schedule.** Fetch anything still open past its expected arrival and compare it with your ledger. The [webhooks and reconciliation guide](\u002Fresources\u002Fmore\u002Fstablecoin-api-webhooks-reconciliation) has the matching logic.\n\n## What are the 8 most common data-model mistakes?\n\nThese eight show up in nearly every first integration, and each has a one-line fix.\n\n| Mistake | What breaks | Fix |\n| --- | --- | --- |\n| Treating the customer as your login user | Duplicate KYC, payments split across \"customers\" for one company | One customer per legal party; many logins can act for it |\n| Registering only your direct clients when you pay on behalf of others | Compliance gaps in nested flows | Register each end customer as its own customer when the provider requires it |\n| Storing the bank account on the payee profile only | Third-party payouts fail to map | Bank account belongs to the paying customer, with holder name stored separately |\n| Storing amounts as floats | Cent-level drift at reconciliation | Integers in minor units, converted only for display |\n| Caching or reusing quotes | Expired or rejected payouts | New quote per payment, executed immediately |\n| Generating a new idempotency key on each retry | Duplicate payouts after a timeout | One key per intended payment, saved before the first call |\n| Applying webhooks in arrival order | A late event moves a completed payout back to processing | Forward-only transitions, dedupe by message ID |\n| Counting linked events twice | One bill payment shows as two payments | Correlate linked records (for example a payable and its payout) by ID and count once |\n\n## Where does BlindPay fit?\n\nBlindPay's API uses these same objects with prefixed IDs, so a log line tells you what you are looking at. The docs come in two flavors: Abstracted, for teams that think in bank rails (virtual accounts, payins, payouts), and Advanced, for teams that work with wallets, approvals, and chains directly. Both describe the same API. Official [SDKs](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fsdks) for Node.js, Python, Go, PHP, and Swift are generated from one [OpenAPI 3.1](https:\u002F\u002Fspec.openapis.org\u002Foas\u002Fv3.1.0) spec, so the object shapes match across languages. The [customers reference](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Flearn\u002Fcustomers) and the [webhook event list](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Flearn\u002Fwebhooks-events) are good first reads.\n\n## What to do next\n\nDraw your current schema next to the table in this article. For each payment row, check that you store the quote ID, the payout or payin ID, your idempotency key, and the amount in minor units. If any of those is missing, add the column before your first production payout, not after the first reconciliation break.\n",{"title":5,"description":1043},"Stablecoin API objects explained: the data model","resources\u002Fmore\u002Fstablecoin-api-objects-explained","jPIeJpAx3w_Njpw1ON10TrKNauCuBL9Ynyr_6LYcbGE",[1074,1078,1082,1086,1090,1094,1098,1102,1106,1110,1114,1118,1122,1126,1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178,1182,1186,1190,1194,1198,1202,1206,1210,1214,1218,1222,1225,1228,1232,1236,1240,1244,1248,1252,1256,1260,1264,1265,1269,1273,1276,1280,1284,1288,1292,1296,1299,1303,1307,1311,1315,1319,1323,1327,1331,1335,1339,1343,1347,1351,1355,1359,1363,1367,1371,1375,1379,1383,1387,1391,1395,1399],{"path":1075,"title":1076,"description":1077},"\u002Fresources\u002Fmore\u002Fblockchain-payment-use-cases","7 real-world blockchain payment use cases: payroll, remittances, B2B, and more","Seven places blockchain payments beat bank rails: contractor payroll, remittances, B2B suppliers, marketplaces, 24\u002F7 treasury, bill pay, and PSP payouts.",{"path":1079,"title":1080,"description":1081},"\u002Fresources\u002Fmore\u002Fagent-payment-protocols-compared","AP2 vs ACP vs x402: agent payment protocols compared","AP2, ACP, and x402 each verify that an AI agent had permission to spend. Here is what every protocol covers, who backs it, and the reconciliation gap none of them close.",{"path":1083,"title":1084,"description":1085},"\u002Fresources\u002Fmore\u002Fbest-stablecoin-payment-platform-fintech-2026","Best stablecoin payment platforms for fintech in 2026: a US comparison","Seven stablecoin payment platforms compared for US fintechs in 2026: what makes an API production-ready, how each provider handles compliance, settlement speed against ACH, and how to run the evaluation.",{"path":1087,"title":1088,"description":1089},"\u002Fresources\u002Fmore\u002Fbest-stablecoin-payment-providers-2026","Best stablecoin payment providers in 2026: how to choose","How to choose a stablecoin payment provider in 2026: the four provider types, a comparison of 10 options, and the questions that decide the fit.",{"path":1091,"title":1092,"description":1093},"\u002Fresources\u002Fmore\u002Fwhat-are-blockchain-payments","Blockchain payments explained: how stablecoins move money without correspondent banks","Blockchain payments move a stablecoin on a public ledger instead of messages between banks. How they work, what they cost, and how they compare with SWIFT.",{"path":1095,"title":1096,"description":1097},"\u002Fresources\u002Fmore\u002Fblockchain-payments-glossary","Blockchain payments glossary: 34 terms explained in plain English","Stablecoin, on-ramp, off-ramp, finality, gas, non-custodial, travel rule. The 34 terms of blockchain payments, each defined in one or two lines.",{"path":1099,"title":1100,"description":1101},"\u002Fresources\u002Fmore\u002Fbuild-vs-buy-stablecoin-payments","Build vs buy: should you build stablecoin payouts in-house or use an API?","Building stablecoin payouts in-house means wallets, liquidity, banking partners, licenses, and a compliance program. When building makes sense.",{"path":1103,"title":1104,"description":1105},"\u002Fresources\u002Fmore\u002Fcan-a-virtual-account-replace-a-bank-account","Can a virtual account replace a business bank account? What each one does for cross-border companies","Usually not. A virtual account collects and settles payments; a bank account runs payroll, taxes, and credit. A job-by-job guide for cross-border teams.",{"path":1107,"title":1108,"description":1109},"\u002Fresources\u002Fmore\u002Flatam-payout-liquidity-partner-pix-spei","Choosing a liquidity partner for LatAm payouts: Pix, SPEI, and beyond","How to choose a liquidity partner for payouts into Latin America: how Pix and SPEI work, how a stablecoin liquidity layer replaces local bank accounts, and a checklist for coverage, pricing, and compliance.",{"path":1111,"title":1112,"description":1113},"\u002Fresources\u002Fmore\u002Fstablecoin-payout-mistakes","Common stablecoin payout mistakes: wrong network, expired quotes, and bad bank details","The mistakes that make stablecoin payouts fail or stall: wrong network or token, expired quotes, deposits below minimums, bad bank details, and cut-offs.",{"path":1115,"title":1116,"description":1117},"\u002Fresources\u002Fmore\u002Fcorrespondent-banking-vs-stablecoin-liquidity","Correspondent banking vs stablecoin liquidity: why pre-funding traps your capital","Correspondent banking keeps cross-border payouts liquid by parking cash in nostro accounts in every country. What that trapped capital costs a treasury team, and what stablecoin liquidity changes.",{"path":1119,"title":1120,"description":1121},"\u002Fresources\u002Fmore\u002Fcrypto-payment-processor-for-businesses","Crypto payment processor for businesses: what to compare before you choose","Compare crypto payment processors on six criteria: settlement speed, stablecoins, compliance, dev effort, payout coverage, and pricing. Scorecard inside.",{"path":1123,"title":1124,"description":1125},"\u002Fresources\u002Fmore\u002Fcustodial-vs-non-custodial-off-ramps","Custodial vs non-custodial off-ramps: who holds the money, and what happens if the provider fails","A custodial off-ramp holds your stablecoins; a non-custodial one pulls them only at payout. What changes in insolvency, de-banking, and failed payouts.",{"path":1127,"title":1128,"description":1129},"\u002Fresources\u002Fmore\u002Fcustodial-vs-non-custodial-vs-mpc-wallets","Custodial vs non-custodial vs MPC wallets: how to choose","Custodial, non-custodial, and MPC wallets differ in who holds the keys. Compare control, recovery, risk, and regulation, with product examples for each.",{"path":1131,"title":1132,"description":1133},"\u002Fresources\u002Fmore\u002Fstablecoin-payout-cut-off-times-weekends-holidays","Do stablecoin payouts work on weekends and holidays? Cut-offs and bank calendars by rail","The stablecoin leg runs 24\u002F7, and so do Pix, SPEI, and RTP. ACH, wire, SEPA, TED, and SWIFT wait for a business day. Cut-offs and calendars by rail.",{"path":1135,"title":1136,"description":1137},"\u002Fresources\u002Fmore\u002Fstablecoin-cross-border-payments-savings","How businesses use stablecoins for cross-border payments (and where the savings come from)","Correspondent hops, FX markup, and pre-funding: what stablecoin settlement does to each cost of a cross-border payment, with a $50,000 example to Brazil.",{"path":1139,"title":1140,"description":1141},"\u002Fresources\u002Fmore\u002Fhow-a-stablecoin-payment-works","How does a stablecoin payment move? From bank deposit to local payout, step by step","A stablecoin payment moves in legs: fiat collected, stablecoin settled, fiat paid out. What happens at each step, where delays hide, what recipients see.",{"path":1143,"title":1144,"description":1145},"\u002Fresources\u002Fmore\u002Fcross-border-merchant-payments-without-pre-funding","How global merchants get paid across borders with stablecoins, no pre-funding required","Pre-funding means parking local currency in every market before money moves. Stablecoin virtual accounts remove it. A worked example across 4 countries.",{"path":1147,"title":1148,"description":1149},"\u002Fresources\u002Fmore\u002Fstablecoin-payout-settlement-times","How long does a stablecoin payout take? Settlement times by country and rail","Stablecoin payouts settle in minutes on Pix, SPEI, RTP, and Transfers 3.0, and in 1 to 5 business days on ACH, SEPA, and SWIFT. Full table by rail.",{"path":1151,"title":1152,"description":1153},"\u002Fresources\u002Fmore\u002Fcrypto-on-ramp-fees-explained","How much does a crypto on-ramp cost? Fees, spreads, and how to read a quote","A crypto on-ramp charges through the rate spread, a service fee, the payment rail, and sometimes the network. How each works, and how to read the quote.",{"path":1155,"title":1156,"description":1157},"\u002Fresources\u002Fmore\u002Fstablecoin-off-ramp-fees-explained","How much does a stablecoin off-ramp cost? Fees per transaction vs a bank wire","What a stablecoin off-ramp costs per transaction: network fee, FX spread, percentage and flat fees, worked at $200, $2,000, and $20,000 vs a bank wire.",{"path":1159,"title":1160,"description":1161},"\u002Fresources\u002Fmore\u002Fhow-to-add-stablecoin-payments-to-your-wallet-integration","How to add stablecoin payments to your wallet integration","Connect the wallets you already run to bank deposits and local payouts: register addresses, open virtual accounts, quote, authorize, and track webhooks.",{"path":1163,"title":1164,"description":1165},"\u002Fresources\u002Fmore\u002Fhow-to-choose-a-virtual-account-provider","How to choose a virtual account provider: a 12-point checklist for developers and finance teams","Twelve criteria for evaluating a virtual account API, from rails and naming to custody, webhooks, and pricing, plus red flags and a scorecard to copy.",{"path":1167,"title":1168,"description":1169},"\u002Fresources\u002Fmore\u002Fhow-to-choose-on-off-ramp-provider","How to choose the best on\u002Foff ramp provider for your fintech app","Six criteria for evaluating a crypto on\u002Foff ramp provider: corridor coverage, live quotes, fiat settlement speed, licensing, API quality, and liquidity depth. Each with concrete tests to run, a comparison table, and a scoring framework.",{"path":1171,"title":1172,"description":1173},"\u002Fresources\u002Fmore\u002Fhow-to-evaluate-payment-orchestration-platform","How to evaluate a payment orchestration platform for cross-border payments","Six criteria that decide whether an orchestration platform works for cross-border money: rail coverage, compliance per corridor, developer experience, settlement speed, FX transparency, and pricing.",{"path":1175,"title":1176,"description":1177},"\u002Fresources\u002Fmore\u002Fstablecoin-api-30-day-evaluation-plan","How to evaluate a stablecoin API in 30 days: a week-by-week plan","A 30-day plan to evaluate a stablecoin API: shortlist, sandbox tests, compliance review, and a live pilot, plus where costs hide and a worked cost model.",{"path":1179,"title":1180,"description":1181},"\u002Fresources\u002Fmore\u002Fhow-to-integrate-a-crypto-on-ramp-api","How to integrate a crypto on-ramp API: payin quotes, deposit instructions, and webhooks","The on-ramp API flow step by step: verify the customer, pick the wallet, quote, create the payin, show deposit instructions, and handle webhooks.",{"path":1183,"title":1184,"description":1185},"\u002Fresources\u002Fmore\u002Fhow-to-issue-stablecoin-cards-api","How to issue stablecoin-funded cards through an API: a developer's guide","Build vs. buy for stablecoin card issuing, the objects a card issuing API must expose, a step-by-step integration flow, and where KYC and KYB sit in it.",{"path":1187,"title":1188,"description":1189},"\u002Fresources\u002Fmore\u002Fhow-to-off-ramp-usdc-to-us-bank-account","How to off-ramp USDC to a US bank account: ACH, RTP, or wire","Cashing out USDC or USDT to a US bank account: when ACH, Same Day ACH, RTP, and wire pay out, the cut-offs in ET, the fields you need, and what delays it.",{"path":1191,"title":1192,"description":1193},"\u002Fresources\u002Fmore\u002Fhow-to-off-ramp-usdc-to-euros-sepa","How to off-ramp USDC to euros over SEPA: networks, IBAN details, and timing","Converting USDC to EUR in a SEPA bank account: which networks work, the IBAN details you need, SEPA vs SEPA Instant timing, limits, and what MiCA changes.",{"path":1195,"title":1196,"description":1197},"\u002Fresources\u002Fmore\u002Fhow-to-off-ramp-usdt-latin-america","How to off-ramp USDT to local currency in Latin America","Converting USDT to BRL, MXN, ARS, or COP: which networks work, the payout rail in each country, weekend timing, fees, and the documents a business needs.",{"path":1199,"title":1200,"description":1201},"\u002Fresources\u002Fmore\u002Fhow-to-on-ramp-local-currency-latin-america","How to on-ramp BRL, MXN, ARS, and COP into stablecoins: Pix, SPEI, Transfers 3.0, and PSE","How Latin American bank payments become USDC or USDT: what each rail shows the payer, the payer data it needs, how fast it lands, and the traps by country.",{"path":1203,"title":1204,"description":1205},"\u002Fresources\u002Fmore\u002Fhow-to-pay-invoices-with-stablecoins-api","How to pay invoices, boletos, and Pix codes with stablecoins through an API","Register the bill, quote it, pay it from USDC or USDT, and track two webhook streams. A developer guide to stablecoin bill pay, boleto gotchas included.",{"path":1207,"title":1208,"description":1209},"\u002Fresources\u002Fmore\u002Fhow-to-send-usdc-to-bank-account-brazil","How to send USDC to a bank account in Brazil","Step-by-step: convert USDC to Brazilian reais and deliver them to a bank account over Pix using a stablecoin payout API. Quote, verify, send, settle in minutes.",{"path":1211,"title":1212,"description":1213},"\u002Fresources\u002Fmore\u002Fhow-to-send-usdc-to-bank-account-mexico","How to send USDC to a bank account in Mexico: a step-by-step guide over SPEI","Send USDC to a Mexican bank account: verify the recipient, quote in pesos, fund from a wallet, and confirm on SPEI. Recipient data, statuses, and failures.",{"path":1215,"title":1216,"description":1217},"\u002Fresources\u002Fmore\u002Fhow-to-test-virtual-accounts-sandbox","How to test a virtual accounts API integration before going live","The integration sequence for a virtual accounts API, what a sandbox simulates and what it can't, and a test plan with the statuses and webhooks to expect.",{"path":1219,"title":1220,"description":1221},"\u002Fresources\u002Fmore\u002Fvirtual-account-reconciliation","How virtual accounts automate payment reconciliation (with a worked example)","Virtual accounts match each deposit to a customer by account number, not a free-text reference. A worked example with partial payments and micro-deposits.",{"path":707,"title":1223,"description":1224},"Idempotency keys in a stablecoin API: how to never send the same payout twice","A timeout on a payout call is the most common way to pay someone twice. How idempotency keys prevent it, what replays, what conflicts, and how to retry.",{"path":50,"title":1226,"description":1227},"Integrating a stablecoin API: a developer's guide to cross-border payments with BlindPay","Step-by-step integration of a stablecoin API: authenticate, onboard a customer, create a virtual USD account, quote and send a cross-border payout, and handle signed webhooks. Endpoints, statuses, and SDKs for BlindPay.",{"path":1229,"title":1230,"description":1231},"\u002Fresources\u002Fmore\u002Fliquidity-risk-global-payouts","Managing liquidity risk in global payouts: a practical guide for fintechs and PSPs","Liquidity risk in payouts is the chance funds aren't available at the right rate, in the right currency, when a payout settles. Its four sources and a six-step framework to manage them.",{"path":1233,"title":1234,"description":1235},"\u002Fresources\u002Fmore\u002Fmarketplace-stablecoin-payouts-latam","Marketplace payouts in Latin America: stablecoin rails for sellers in Brazil, Mexico, Colombia, and Argentina","How marketplaces pay sellers, creators, and vendors across Latin America with stablecoin settlement: supported rails (Pix, SPEI, PSE, Argentine transfers), the end-to-end payout workflow, API integration, and what changes for speed, minimums, and FX cost.",{"path":1237,"title":1238,"description":1239},"\u002Fresources\u002Fmore\u002Fnon-custodial-payments-explained","Non-custodial payments: what they are and why they reduce risk for businesses","A non-custodial payment provider moves your money without holding it between payments. Who controls the funds, who carries the risk, and what to ask.",{"path":1241,"title":1242,"description":1243},"\u002Fresources\u002Fmore\u002Fon-ramp-or-off-ramp-which-does-your-product-need","On-ramp, off-ramp, or both? How to tell which stablecoin API your product needs","Match your use case to the direction money moves: on-ramp, off-ramp, or both. Covers payroll, remittance, marketplaces, treasury, and 10 questions to ask.",{"path":1245,"title":1246,"description":1247},"\u002Fresources\u002Fmore\u002Fon-off-ramp-liquidity-live-quotes","On\u002Foff ramp liquidity with live quotes: how it works and why it matters","What on\u002Foff ramp liquidity with live quotes means for developers: live quote vs batch rate, the quote ID flow in an API, what happens on expiry, how liquidity depth changes spread by transaction size, rate windows and UX, and a checklist for evaluating a live quote API.",{"path":1249,"title":1250,"description":1251},"\u002Fresources\u002Fmore\u002Fswift-pobo-vs-cobo-explained","POBO vs COBO: SWIFT payments and collections on behalf of, explained","POBO sends a SWIFT payment for a customer, COBO collects one for them. Whose name shows, how UETR tracking works, and where stablecoin settlement fits.",{"path":1253,"title":1254,"description":1255},"\u002Fresources\u002Fmore\u002Fpayment-orchestration-vs-payment-gateway","Payment orchestration vs payment gateway: what's the difference?","A gateway connects you to one processor. An orchestration platform connects to many rails and picks the best path per transaction. The table, the triggers, and a worked USD to BRL example.",{"path":1257,"title":1258,"description":1259},"\u002Fresources\u002Fmore\u002Fstablecoin-api-openapi-sdks","Stablecoin API SDKs: how one OpenAPI spec keeps five languages in sync","BlindPay's stablecoin API is described by one OpenAPI 3.1 spec that drives validation, docs, SDKs for Node, Python, Go, PHP, and Swift, and the MCP server.",{"path":1261,"title":1262,"description":1263},"\u002Fresources\u002Fmore\u002Fstablecoin-api-sla-settlement-finality","Stablecoin API SLAs and settlement finality explained","Stablecoin API uptime numbers cluster near 99.9% for a reason: most providers measure API acceptance instead of the point where money becomes final and spendable.",{"path":1067,"title":5,"description":1043},{"path":1266,"title":1267,"description":1268},"\u002Fresources\u002Fmore\u002Fstablecoin-api-quotes-explained","Stablecoin API quotes explained: expiry, fee direction, and minor units","A stablecoin API quote locks the rate, fees, and amounts for a few minutes. How expiry works, which side pays the fee, and the field that flips meaning.",{"path":1270,"title":1271,"description":1272},"\u002Fresources\u002Fmore\u002Fstablecoin-api-sandbox-vs-production","Stablecoin API sandbox vs production: what testing misses","Most stablecoin API sandboxes pass every integration test and still leave a team unprepared for production, because webhook delivery and idempotent retries are exactly what sandboxes fake or skip.",{"path":873,"title":1274,"description":1275},"Stablecoin API webhooks: signature checks, duplicate events, and reconciliation","How to handle stablecoin API webhooks in production: verify signatures on raw bytes, dedupe retries, never regress a final status, reconcile daily.",{"path":1277,"title":1278,"description":1279},"\u002Fresources\u002Fmore\u002Fstablecoin-fx-slippage-live-quotes","Stablecoin FX slippage: how live quotes turn the quoted rate into the rate you get","FX slippage is the gap between the rate a stablecoin on-ramp or off-ramp shows and the rate that settles. Why quote freshness is a liquidity signal, and how to check a quote-then-execute flow.",{"path":1281,"title":1282,"description":1283},"\u002Fresources\u002Fmore\u002Fstablecoin-cards-latin-america","Stablecoin cards in Latin America: how they work in Brazil, Mexico, Argentina, and Colombia","How USD stablecoin cards work in Brazil, Mexico, Argentina, and Colombia: local card and crypto rules, costs at the point of sale, and when a Pix or SPEI payout fits better.",{"path":1285,"title":1286,"description":1287},"\u002Fresources\u002Fmore\u002Fstablecoin-liquidity-provider-vs-fx-desk","Stablecoin liquidity providers vs traditional FX desks: what finance teams should know","A bank FX desk prices cross-border payouts by relationship. A stablecoin liquidity provider prices them by API. How the two compare on cost, speed, minimums, coverage, and compliance.",{"path":1289,"title":1290,"description":1291},"\u002Fresources\u002Fmore\u002Fstablecoin-payment-fees-vs-card-processing-fees","Stablecoin payment fees vs credit card processing fees: what merchants actually pay","Cards cost merchants 1.5% to 3.5% plus cross-border, FX, and chargeback fees. Stablecoin payments cost cents on-chain plus a sub-percent conversion spread.",{"path":1293,"title":1294,"description":1295},"\u002Fresources\u002Fmore\u002Fstablecoin-payments-guide","Stablecoin payments explained: a guide for businesses","Stablecoin payments move dollar-pegged tokens between parties and settle in minutes, 24\u002F7. How they work, what they cost, and how businesses accept and send them.",{"path":290,"title":1297,"description":1298},"Stablecoin payout statuses explained: processing, on hold, completed, failed, and refunded","What each stablecoin payout status means, which are final, why an on-chain confirmation isn't a completed payout, and how to test every failure.",{"path":1300,"title":1301,"description":1302},"\u002Fresources\u002Fmore\u002Fstablecoin-payroll-latam-contractors","Stablecoin payroll for LATAM contractors: how it actually works in 2026","How US companies pay contractors in Argentina, Brazil, Mexico, and Colombia with stablecoins in 2026: USDC vs USDT, the step-by-step payout flow, US tax reporting, a platform comparison, and how to start.",{"path":1304,"title":1305,"description":1306},"\u002Fresources\u002Fmore\u002Fstablecoin-settlement-for-merchants","Stablecoin settlement explained: how merchants get paid faster than card networks","Stablecoin payments settle in seconds to minutes, final and 24\u002F7. Cards take 1 to 3 business days and wires up to 5. How it works and how to cash out.",{"path":1308,"title":1309,"description":1310},"\u002Fresources\u002Fmore\u002Fstablecoin-virtual-accounts-explained","Stablecoin virtual accounts explained: from bank transfer to wallet balance","A stablecoin virtual account is a bank account in your customer's name whose deposits convert to USDC or USDT. How approval, deposits, and fees work.",{"path":1312,"title":1313,"description":1314},"\u002Fresources\u002Fmore\u002Fstablecoin-virtual-cards-cross-border-payouts","Stablecoin-funded virtual cards vs. traditional virtual cards for cross-border payouts","Stablecoin-funded vs. bank-funded virtual cards for paying contractors and vendors abroad: funding speed, pre-funding, FX cost, settlement finality, and a Brazil walkthrough.",{"path":1316,"title":1317,"description":1318},"\u002Fresources\u002Fmore\u002Fstablecoins-local-rails-latin-america","Stablecoins plus local rails: how cross-border payments actually land in Latin America","A stablecoin crosses the border in seconds, but the payment lands over Pix, SPEI, or another local rail. How that last mile works in Brazil and Mexico.",{"path":1320,"title":1321,"description":1322},"\u002Fresources\u002Fmore\u002Fstablecoin-vs-swift-b2b-payments","Stablecoins vs SWIFT for B2B cross-border payments: a real comparison","Where SWIFT wires still win, where stablecoin settlement wins, and how to compare the two on cost, speed, traceability, and failure modes for business payments in 2026.",{"path":1324,"title":1325,"description":1326},"\u002Fresources\u002Fmore\u002Fusdc-to-ars-routes-2026","USDC to ARS in 2026: routes, fees, and rules compared","Four ways to convert USDC to Argentine pesos in 2026: stablecoin payout APIs, local exchanges, P2P, and global exchanges with Transfers 3.0. Fees, speed, KYC, and Argentina's PSAV rules compared.",{"path":1328,"title":1329,"description":1330},"\u002Fresources\u002Fmore\u002Fusdc-to-brl-routes-2026","USDC to BRL in 2026: routes, fees, and rules compared","Four ways to convert USDC to Brazilian reais in 2026: stablecoin payout APIs, local exchanges, P2P, and global exchanges with Pix. Fees, speed, KYC, and Brazil's VASP rules compared.",{"path":1332,"title":1333,"description":1334},"\u002Fresources\u002Fmore\u002Fusdc-to-cop-routes-2026","USDC to COP in 2026: routes, fees, and rules compared","Four ways to convert USDC to Colombian pesos in 2026: stablecoin payout APIs, local exchanges, P2P, and global exchanges with PSE. Fees, speed, KYC, and Colombia's VASP rules compared.",{"path":1336,"title":1337,"description":1338},"\u002Fresources\u002Fmore\u002Fusdc-to-mxn-routes-2026","USDC to MXN in 2026: routes, fees, and rules compared","Four ways to convert USDC to Mexican pesos in 2026: stablecoin payout APIs, local exchanges, P2P, and global exchanges with SPEI. Fees, speed, KYC, and Mexico's rules compared.",{"path":1340,"title":1341,"description":1342},"\u002Fresources\u002Fmore\u002Fvirtual-account-deposit-not-received","Virtual account deposit not received? Why deposits get delayed, held, or returned","Why a virtual account deposit is late, on hold, or returned: arrival windows, payin statuses, RFIs, wrong rails, and how to trace a wire or SWIFT payment.",{"path":1344,"title":1345,"description":1346},"\u002Fresources\u002Fmore\u002Fvirtual-account-vs-virtual-iban","Virtual account vs virtual IBAN vs real bank account: what's the difference?","A real account holds funds for one holder. A virtual account routes deposits into a master account. A virtual IBAN is the IBAN version. When to use each.",{"path":1348,"title":1349,"description":1350},"\u002Fresources\u002Fmore\u002Fvirtual-accounts-cross-border-payments","Virtual accounts for cross-border payments: use cases, payment rails, and costs","How virtual accounts let payers abroad pay a local-style account, which rails collect and pay out, what drives the cost, and five questions to ask.",{"path":1352,"title":1353,"description":1354},"\u002Fresources\u002Fmore\u002Fvirtual-account-vs-one-time-deposit-instructions","Virtual accounts vs one-time deposit instructions: how to collect bank transfers as stablecoins","One-time deposit instructions suit occasional payers and local rails. Virtual accounts suit repeat US payers. How each matches deposits and when to switch.",{"path":1356,"title":1357,"description":1358},"\u002Fresources\u002Fmore\u002Fpix-key-cpf-clabe-payout-details","What details do you need to pay someone in Brazil or Mexico? Pix keys, CPF, and CLABE","What a payout to Brazil or Mexico needs from the recipient: Pix key types, CPF and CNPJ formats, the 18-digit CLABE, and the checks that stop a bad payout.",{"path":1360,"title":1361,"description":1362},"\u002Fresources\u002Fmore\u002Fno-pre-funding-stablecoin-payouts","What does \"no pre-funding\" mean in a stablecoin API?","No pre-funding means each payout is funded when you send it, not from a balance parked in advance. The three funding models, the math, and what to ask.",{"path":1364,"title":1365,"description":1366},"\u002Fresources\u002Fmore\u002Fwhat-is-a-crypto-on-ramp-and-off-ramp","What is a crypto on-ramp and off-ramp? A guide for fintech builders","A crypto on-ramp converts fiat into stablecoins or crypto; an off-ramp converts them back into fiat in a bank account. How each works step by step, how they differ, which payment methods on-ramps support, and who they are built for.",{"path":1368,"title":1369,"description":1370},"\u002Fresources\u002Fmore\u002Fwhat-is-a-liquidity-market-cross-border-payments","What is a liquidity market in cross-border payments? And why stablecoin liquidity is changing it","A liquidity market in cross-border payments is where the currency to settle a transfer gets sourced. How correspondent banks pre-fund it, and how stablecoin liquidity changes the model.",{"path":1372,"title":1373,"description":1374},"\u002Fresources\u002Fmore\u002Fwhat-is-a-stablecoin-offramp","What is a stablecoin off-ramp? How crypto becomes cash","A stablecoin off-ramp converts stablecoins like USDC or USDT back into fiat currency in a bank account. How the conversion works and who regulates it.",{"path":1376,"title":1377,"description":1378},"\u002Fresources\u002Fmore\u002Fwhat-is-a-virtual-account","What is a virtual account? A plain-English guide for fintech teams","A virtual account is a unique set of bank details that routes incoming payments to one customer or purpose. How it works, who uses it, and where it fits.",{"path":1380,"title":1381,"description":1382},"\u002Fresources\u002Fmore\u002Fwhat-is-payment-orchestration","What is payment orchestration? The routing layer, explained","Payment orchestration is the routing layer between your app and every processor, bank, and rail you use. The five layers, how stablecoin settlement fits, and how it differs from a gateway.",{"path":1384,"title":1385,"description":1386},"\u002Fresources\u002Fmore\u002Fstablecoin-payments-provider-due-diligence","What to ask a stablecoin payments provider: 30 due diligence questions","The questions to ask a stablecoin payments vendor before you sign: licensing, custody, pricing, rails, compliance, failure handling, security, and exit.",{"path":1388,"title":1389,"description":1390},"\u002Fresources\u002Fmore\u002Fwhen-not-to-use-blockchain-payments","When not to use blockchain payments: 7 cases where a bank rail wins","Blockchain payments beat wires on many corridors, not all of them. Seven cases where a domestic rail, a card, or a plain wire is still the better choice.",{"path":1392,"title":1393,"description":1394},"\u002Fresources\u002Fmore\u002Fhow-to-track-a-crypto-off-ramp-payout","Where is my off-ramp payout? How to track it rail by rail, and what to tell the recipient","Track an off-ramp payout from transaction hash to bank: the reference each rail gives you (Pix E2E ID, SPEI key, ACH trace, UETR) and status copy.",{"path":1396,"title":1397,"description":1398},"\u002Fresources\u002Fmore\u002Fwhy-are-cross-border-payments-slow","Why are cross-border payments slow? Where the days go in an international wire","Most SWIFT payments reach the destination bank within an hour. The days go to cut-offs, correspondent hops, compliance checks, and local crediting.",{"path":1400,"title":1401,"description":1402},"\u002Fresources\u002Fmore\u002Fwhy-crypto-on-ramp-deposits-fail","Why crypto on-ramp deposits fail: missing references, late transfers, holds, and refunds","Most failed on-ramps fail on the fiat side: a missing reference, the wrong payer, a late transfer, a hold. What happens to the money in each case.",1791398893324]