[{"data":1,"prerenderedAt":611},["ShallowReactive",2],{"navigation-en":3,"en:\u002Fgo-live\u002Fchecklist":193,"en:\u002Fgo-live\u002Fchecklist:surround":606},[4,20,51,77,95,110,133,158,172],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15],{"title":11,"path":12,"stem":13,"icon":14},"Portal Preparation","\u002Fgetting-started\u002Fportal-setup","1.getting-started\u002F1.portal-setup","i-lucide-rocket",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-zap",{"title":21,"icon":22,"path":23,"stem":24,"children":25,"page":6},"Core Concepts","i-lucide-key-round","\u002Fconcepts","2.concepts",[26,31,36,41,46],{"title":27,"path":28,"stem":29,"icon":30},"Authentication","\u002Fconcepts\u002Fauthentication","2.concepts\u002F1.authentication","i-lucide-fingerprint",{"title":32,"path":33,"stem":34,"icon":35},"IP Allowlist","\u002Fconcepts\u002Fip-allowlist","2.concepts\u002F2.ip-allowlist","i-lucide-shield-check",{"title":37,"path":38,"stem":39,"icon":40},"Money Format","\u002Fconcepts\u002Fmoney","2.concepts\u002F3.money","i-lucide-banknote",{"title":42,"path":43,"stem":44,"icon":45},"Idempotency","\u002Fconcepts\u002Fidempotency","2.concepts\u002F4.idempotency","i-lucide-repeat",{"title":47,"path":48,"stem":49,"icon":50},"Error envelope & codes","\u002Fconcepts\u002Ferrors","2.concepts\u002F5.errors","i-lucide-octagon-alert",{"title":52,"icon":53,"path":54,"stem":55,"children":56,"page":6},"Deposits","i-lucide-arrow-down-to-line","\u002Fdeposits","3.deposits",[57,62,67,72],{"title":58,"path":59,"stem":60,"icon":61},"Deposit Overview & State Machine","\u002Fdeposits\u002Foverview","3.deposits\u002F1.overview","i-lucide-info",{"title":63,"path":64,"stem":65,"icon":66},"Create a Deposit","\u002Fdeposits\u002Fcreate","3.deposits\u002F2.create","i-lucide-plus",{"title":68,"path":69,"stem":70,"icon":71},"Get a Deposit","\u002Fdeposits\u002Fretrieve","3.deposits\u002F3.retrieve","i-lucide-search",{"title":73,"path":74,"stem":75,"icon":76},"Cancel a Deposit","\u002Fdeposits\u002Fcancel","3.deposits\u002F4.cancel","i-lucide-x",{"title":78,"icon":79,"path":80,"stem":81,"children":82,"page":6},"Withdrawals","i-lucide-arrow-up-from-line","\u002Fwithdrawals","4.withdrawals",[83,87,91],{"title":84,"path":85,"stem":86,"icon":61},"Withdrawal Overview","\u002Fwithdrawals\u002Foverview","4.withdrawals\u002F1.overview",{"title":88,"path":89,"stem":90,"icon":66},"Create a Withdrawal","\u002Fwithdrawals\u002Fcreate","4.withdrawals\u002F2.create",{"title":92,"path":93,"stem":94,"icon":71},"Get & List Withdrawals","\u002Fwithdrawals\u002Fretrieve","4.withdrawals\u002F3.retrieve",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":6},"Balance & Banks","i-lucide-wallet","\u002Fbalance","5.balance",[101,105],{"title":102,"path":103,"stem":104,"icon":97},"Get Balance","\u002Fbalance\u002Fget-balance","5.balance\u002F1.get-balance",{"title":106,"path":107,"stem":108,"icon":109},"Bank List","\u002Fbalance\u002Fbanks","5.balance\u002F2.banks","i-lucide-landmark",{"title":111,"icon":112,"path":113,"stem":114,"children":115,"page":6},"Webhooks","i-lucide-webhook","\u002Fwebhooks","6.webhooks",[116,120,125,129],{"title":117,"path":118,"stem":119,"icon":61},"Webhook Overview","\u002Fwebhooks\u002Foverview","6.webhooks\u002F1.overview",{"title":121,"path":122,"stem":123,"icon":124},"Event Catalog & Payloads","\u002Fwebhooks\u002Fevents","6.webhooks\u002F2.events","i-lucide-list",{"title":126,"path":127,"stem":128,"icon":35},"Signature Verification","\u002Fwebhooks\u002Fsignature-verification","6.webhooks\u002F3.signature-verification",{"title":130,"path":131,"stem":132,"icon":45},"Endpoint Requirements, Retries & SSRF","\u002Fwebhooks\u002Fdelivery-and-retries","6.webhooks\u002F4.delivery-and-retries",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":6},"Sandbox","i-lucide-flask-conical","\u002Fsandbox","7.sandbox",[139,143,148,153],{"title":140,"path":141,"stem":142,"icon":61},"Test Mode Overview","\u002Fsandbox\u002Foverview","7.sandbox\u002F1.overview",{"title":144,"path":145,"stem":146,"icon":147},"Simulate Transfer","\u002Fsandbox\u002Fsimulate-transfer","7.sandbox\u002F2.simulate-transfer","i-lucide-banknote-arrow-down",{"title":149,"path":150,"stem":151,"icon":152},"Top-up & Reset","\u002Fsandbox\u002Ftop-up-and-reset","7.sandbox\u002F3.top-up-and-reset","i-lucide-rotate-ccw",{"title":154,"path":155,"stem":156,"icon":157},"End-to-End Test Flow","\u002Fsandbox\u002Fe2e-test-flow","7.sandbox\u002F4.e2e-test-flow","i-lucide-list-checks",{"title":159,"icon":14,"path":160,"stem":161,"children":162,"page":6},"Go-live","\u002Fgo-live","8.go-live",[163,167],{"title":164,"path":165,"stem":166,"icon":157},"Go-live Checklist","\u002Fgo-live\u002Fchecklist","8.go-live\u002F1.checklist",{"title":168,"path":169,"stem":170,"icon":171},"Contact & Support","\u002Fgo-live\u002Fsupport","8.go-live\u002F2.support","i-lucide-life-buoy",{"title":173,"icon":174,"path":175,"stem":176,"children":177,"page":6},"Reference","i-lucide-book-marked","\u002Freference","9.reference",[178,183,188],{"title":179,"path":180,"stem":181,"icon":182},"Endpoint Catalog","\u002Freference\u002Fendpoints","9.reference\u002F1.endpoints","i-lucide-table",{"title":184,"path":185,"stem":186,"icon":187},"Code Samples (Node.js & PHP)","\u002Freference\u002Fcode-samples","9.reference\u002F2.code-samples","i-lucide-code",{"title":189,"path":190,"stem":191,"icon":192},"Status Values & Glossary","\u002Freference\u002Fglossary-states","9.reference\u002F3.glossary-states","i-lucide-book-a",{"id":194,"title":164,"badge":195,"body":196,"description":600,"extension":601,"links":195,"meta":602,"method":195,"navigation":603,"path":165,"seo":604,"stem":166,"__hash__":605},"docs_en\u002F8.go-live\u002F1.checklist.md",null,{"type":197,"value":198,"toc":588},"minimark",[199,212,231,236,290,294,335,339,384,388,427,431,508,512,568,571,584],[200,201,202,203,207,208,211],"p",{},"Before switching from ",[204,205,206],"strong",{},"test"," to real ",[204,209,210],{},"live",", verify every item below.",[213,214,215],"caution",{},[200,216,217,218,221,222,230],{},"The two highest-impact mistakes are the ",[204,219,220],{},"100× money bug"," (sending or reading money as a number \u002F satang instead of a baht string) and ",[204,223,224,225,229],{},"treating ",[226,227,228],"code",{},"201 PENDING"," as success"," for a withdrawal. Confirm both are handled before you go live.",[232,233,235],"h2",{"id":234},"credentials-connectivity","Credentials & connectivity",[237,238,241,256,266,276],"ul",{"className":239},[240],"contains-task-list",[242,243,246,251,252,255],"li",{"className":244},[245],"task-list-item",[247,248],"input",{"disabled":249,"type":250},true,"checkbox"," You have a ",[204,253,254],{},"live API key + secret"," stored in a secret store (not hardcoded in code\u002Frepo) — the secret is shown only once; if lost, you must rotate.",[242,257,259,261,262,265],{"className":258},[245],[247,260],{"disabled":249,"type":250}," Your server's clock is synced with NTP (to keep ",[226,263,264],{},"X-Timestamp"," within the ±300-second window).",[242,267,269,271,272,275],{"className":268},[245],[247,270],{"disabled":249,"type":250}," Your HMAC signing code signs the ",[204,273,274],{},"same raw body bytes you actually send",", and includes the query string on line 2 of the canonical string.",[242,277,279,281,282,285,286,289],{"className":278},[245],[247,280],{"disabled":249,"type":250}," You have reported the ",[204,283,284],{},"production server IP\u002FCIDR"," to the UnknownPay team to be added to the IP allowlist (surface ",[226,287,288],{},"s2s",") and confirmed requests pass.",[232,291,293],{"id":292},"money-avoid-the-100-bug","Money (avoid the 100× bug)",[237,295,297,307,317],{"className":296},[240],[242,298,300,302,303,306],{"className":299},[245],[247,301],{"disabled":249,"type":250}," Every money field is sent\u002Fread as a ",[204,304,305],{},"baht string with 2 decimals"," — not a number and not satang.",[242,308,310,312,313,316],{"className":309},[245],[247,311],{"disabled":249,"type":250}," Money is parsed as a ",[204,314,315],{},"decimal",", not a float.",[242,318,320,322,323,326,327,330,331,334],{"className":319},[245],[247,321],{"disabled":249,"type":250}," You handle money fields that are ",[226,324,325],{},"null"," \u002F omitted (e.g. ",[226,328,329],{},"matched_amount",", ",[226,332,333],{},"credited_amount"," before credited).",[232,336,338],{"id":337},"idempotency-errors","Idempotency & errors",[237,340,342,364,374],{"className":341},[240],[242,343,345,347,348,351,352,355,356,359,360,363],{"className":344},[245],[247,346],{"disabled":249,"type":250}," Every ",[226,349,350],{},"POST \u002Fv1\u002Fdeposits"," and ",[226,353,354],{},"POST \u002Fv1\u002Fwithdrawals"," sends an ",[226,357,358],{},"Idempotency-Key"," (UUID v4), and retries reuse the ",[204,361,362],{},"same key + same body",".",[242,365,367,369,370,373],{"className":366},[245],[247,368],{"disabled":249,"type":250}," Logic branches on ",[226,371,372],{},"error.code"," (never parses the message) and is default-safe for unknown codes.",[242,375,377,379,380,383],{"className":376},[245],[247,378],{"disabled":249,"type":250}," You log ",[226,381,382],{},"error.request_id"," on every error so you can report it to the team.",[232,385,387],{"id":386},"deposit-flow","Deposit flow",[237,389,391,411,421],{"className":390},[240],[242,392,394,396,397,402,403,406,407,410],{"className":393},[245],[247,395],{"disabled":249,"type":250}," You show the customer ",[204,398,399],{},[226,400,401],{},"expected_amount"," to transfer (not ",[226,404,405],{},"amount","), and use ",[226,408,409],{},"qr_payload"," for PROMPTPAY_QR.",[242,412,414,416,417,420],{"className":413},[245],[247,415],{"disabled":249,"type":250}," You send all ",[204,418,419],{},"3 payer fields"," (anti-fraud) for both PROMPTPAY_QR and BANK_TRANSFER.",[242,422,424,426],{"className":423},[245],[247,425],{"disabled":249,"type":250}," You handle deposit expiry (~5–7 minutes) by creating a new one.",[232,428,430],{"id":429},"withdrawal-flow","Withdrawal flow",[237,432,434,447,468,491],{"className":433},[240],[242,435,437,439,440,443,444,446],{"className":436},[245],[247,438],{"disabled":249,"type":250}," You do ",[204,441,442],{},"not"," treat ",[226,445,228],{}," as success — wait for the terminal webhook only.",[242,448,450,452,453,456,457,460,461,463,464,467],{"className":449},[245],[247,451],{"disabled":249,"type":250}," You check ",[226,454,455],{},"available"," from ",[226,458,459],{},"GET \u002Fv1\u002Fbalance"," before withdrawing (≥ ",[226,462,405],{}," + ",[226,465,466],{},"fee",").",[242,469,471,473,474,477,478,483,484,487,488,363],{"className":470},[245],[247,472],{"disabled":249,"type":250}," You send ",[226,475,476],{},"receiver_bank_provider"," as a ",[204,479,480],{},[226,481,482],{},"bank_code"," (not ",[226,485,486],{},"bank_number",") from ",[226,489,490],{},"GET \u002Fv1\u002Fbanks",[242,492,494,496,497,500,501,500,504,507],{"className":493},[245],[247,495],{"disabled":249,"type":250}," You handle the ",[226,498,499],{},"withdrawal.failed"," \u002F ",[226,502,503],{},"withdrawal.rejected",[226,505,506],{},"withdrawal.refunded"," webhooks (the money returns to the wallet).",[232,509,511],{"id":510},"webhook","Webhook",[237,513,515,525,539,552,562],{"className":514},[240],[242,516,518,520,521,524],{"className":517},[245],[247,519],{"disabled":249,"type":250}," Your endpoint is ",[204,522,523],{},"HTTPS public"," (valid TLS, not localhost \u002F a private IP).",[242,526,528,530,531,534,535,538],{"className":527},[245],[247,529],{"disabled":249,"type":250}," You verify the ",[226,532,533],{},"X-Webhook-Signature"," from the ",[204,536,537],{},"raw body bytes"," in constant time.",[242,540,542,544,545,551],{"className":541},[245],[247,543],{"disabled":249,"type":250}," You apply ",[204,546,547,548],{},"idempotency by ",[226,549,550],{},"event_id"," (to avoid reprocessing on retry\u002Freplay).",[242,553,555,557,558,561],{"className":554},[245],[247,556],{"disabled":249,"type":250}," You return ",[204,559,560],{},"2xx fast"," (\u003C 10 seconds) and process asynchronously.",[242,563,565,567],{"className":564},[245],[247,566],{"disabled":249,"type":250}," You subscribe to all events you need and the Portal \"test\" button has passed.",[232,569,134],{"id":570},"sandbox",[237,572,574],{"className":573},[240],[242,575,577,579,580,583],{"className":576},[245],[247,578],{"disabled":249,"type":250}," You have run the full ",[226,581,582],{},"deposit.success"," flow in test mode (create deposit → simulate-transfer → receive webhook) successfully.",[585,586],"placeholder-note",{"value":587},"add\u002Fremove checklist items to match your team's real onboarding policy, and confirm whether a sign-off step with the team is required before enabling live",{"title":589,"searchDepth":590,"depth":591,"links":592},"",1,2,[593,594,595,596,597,598,599],{"id":234,"depth":591,"text":235},{"id":292,"depth":591,"text":293},{"id":337,"depth":591,"text":338},{"id":386,"depth":591,"text":387},{"id":429,"depth":591,"text":430},{"id":510,"depth":591,"text":511},{"id":570,"depth":591,"text":134},"Everything to verify before switching from test to live — credentials, money, idempotency, deposit, withdrawal, webhook, and sandbox","md",{},{"icon":157},{"title":164,"description":600},"zEALTokZB3jE79uNYyvwz7ljuY9y7iF0QiMM7SO4I_o",[607,609],{"title":154,"path":155,"stem":156,"description":608,"icon":157,"children":-1},"The recommended sandbox rehearsal — create a test deposit, simulate the transfer, and receive a deposit.success webhook",{"title":168,"path":169,"stem":170,"description":610,"icon":171,"children":-1},"How to register your IP, report incidents with request_id\u002Fevent_id, and rotate or recover credentials",1781891157498]