[{"data":1,"prerenderedAt":529},["ShallowReactive",2],{"navigation-en":3,"en:\u002Fconcepts\u002Fmoney":193,"en:\u002Fconcepts\u002Fmoney:surround":524},[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":37,"badge":195,"body":196,"description":518,"extension":519,"links":195,"meta":520,"method":195,"navigation":521,"path":38,"seo":522,"stem":39,"__hash__":523},"docs_en\u002F2.concepts\u002F3.money.md",null,{"type":197,"value":198,"toc":511},"minimark",[199,203,241,246,300,304,308,327,452,455,496,499],[200,201,202],"p",{},"Before connecting to UnknownPay over S2S, read this convention in full — every endpoint uses the same rule.",[204,205,206],"warning",{},[200,207,208,212,213,216,217,221,222,225,226,229,230,225,233,236,237,240],{},[209,210,211],"strong",{},"Iron rule:"," every money field on the wire (request and response) is a ",[209,214,215],{},"baht string with exactly 2 decimal places",", e.g. ",[218,219,220],"code",{},"\"100.50\""," — ",[209,223,224],{},"not a number"," (",[218,227,228],{},"100.5",") and ",[209,231,232],{},"not satang",[218,234,235],{},"10050","). Only ",[209,238,239],{},"THB"," is supported in this version.",[242,243,245],"h2",{"id":244},"_1-response-side-the-system-sends-to-the-merchant","1. Response side (the system sends to the merchant)",[247,248,249,269,289],"ul",{},[250,251,252,253,216,256,259,260,263,264,259,266,268],"li",{},"Every money field is formatted as a decimal string with ",[209,254,255],{},"always 2 places",[218,257,258],{},"100"," baht → ",[218,261,262],{},"\"100.00\"",", ",[218,265,228],{},[218,267,220],{},".",[250,270,271,272,263,275,278,279,282,283,286,287,268],{},"A money field that has no value yet (e.g. ",[218,273,274],{},"credited_amount",[218,276,277],{},"matched_amount"," not yet credited) will be ",[218,280,281],{},"null"," or dropped from the JSON (omitempty) — the merchant must allow for the case where some money fields are ",[209,284,285],{},"absent"," or ",[218,288,281],{},[250,290,291,292,295,296,299],{},"A field that is a ",[209,293,294],{},"rate"," ends with ",[218,297,298],{},"_bps"," (basis points, an integer), not a money field — e.g. a percentage-based fee.",[301,302],"placeholder-note",{"value":303},"check which response money fields may be null\u002Fomitted, to list them completely in each endpoint's docs",[242,305,307],{"id":306},"_2-request-side-the-merchant-sends-to-the-system","2. Request side (the merchant sends to the system)",[200,309,310,311,314,315,318,319,322,323,326],{},"The system parses the baht string ",[209,312,313],{},"strictly",". A value that fails parsing returns HTTP ",[218,316,317],{},"422"," with error code ",[218,320,321],{},"INVALID_AMOUNT"," in every case. The table below is what the system ",[209,324,325],{},"rejects",":",[328,329,330,346],"table",{},[331,332,333],"thead",{},[334,335,336,340,343],"tr",{},[337,338,339],"th",{},"Value sent",[337,341,342],{},"Result",[337,344,345],{},"Reason",[347,348,349,367,383,407,423,439],"tbody",{},[334,350,351,358,364],{},[352,353,354,357],"td",{},[218,355,356],{},"\"\""," (empty)",[352,359,360,363],{},[218,361,362],{},"422 INVALID_AMOUNT"," — \"amount is required\"",[352,365,366],{},"Must not be empty",[334,368,369,375,380],{},[352,370,371,374],{},[218,372,373],{},"\"abc\""," \u002F non-numeric",[352,376,377,379],{},[218,378,362],{}," — \"amount must be a decimal number\"",[352,381,382],{},"Must be a decimal number",[334,384,385,391,396],{},[352,386,387,390],{},[218,388,389],{},"\"1e2\""," (scientific notation)",[352,392,393,395],{},[218,394,362],{}," — \"amount must be a plain decimal number\"",[352,397,398,399,402,403,406],{},"No ",[218,400,401],{},"e","\u002F",[218,404,405],{},"E","; must be a plain decimal",[334,408,409,415,420],{},[352,410,411,414],{},[218,412,413],{},"\"-100.00\""," (negative)",[352,416,417,419],{},[218,418,362],{}," — \"amount must not be negative\"",[352,421,422],{},"Must not be negative",[334,424,425,431,436],{},[352,426,427,430],{},[218,428,429],{},"\"100.123\""," (more than 2 places)",[352,432,433,435],{},[218,434,362],{}," — \"amount must have at most 2 decimal places\"",[352,437,438],{},"At most 2 decimal places",[334,440,441,444,449],{},[352,442,443],{},"Value beyond the int64 range",[352,445,446,448],{},[218,447,362],{}," — \"amount is too large\"",[352,450,451],{},"Beyond the supported range",[200,453,454],{},"Notes a merchant should know:",[247,456,457,470,479,489],{},[250,458,459,462,463,466,467,469],{},[209,460,461],{},"Trailing zeros are accepted"," — e.g. ",[218,464,465],{},"\"100.5000\""," is treated as equal to ",[218,468,220],{}," (the real precision is at most 2 places) — the system looks at \"real precision\", not the number of characters.",[250,471,472,473,216,476,268],{},"The safe and recommended format is ",[209,474,475],{},"always 2 decimal places",[218,477,478],{},"\"250.00\"",[250,480,481,482,484,485,488],{},"A JSON ",[218,483,281],{}," in some request money fields is interpreted as ",[218,486,487],{},"0"," (for fields mapped directly to the money type) — it is recommended to always send the value as an explicit string to avoid ambiguity.",[250,490,491,492,495],{},"Some \"unlimited\" cap\u002Flimit values use ",[218,493,494],{},"\"0\""," to mean unlimited (depends on the endpoint) — see each endpoint's docs for detail.",[200,497,498],{},"::placeholder-note{value=\"specify per endpoint whether \"0\" means unlimited\"}\n::",[204,500,501],{},[200,502,503,504,506,507,510],{},"If a merchant sends money in the wrong unit (e.g. sends ",[218,505,235],{}," intending 100.50 baht) the system interprets it as ",[209,508,509],{},"ten thousand and fifty baht"," immediately — this is a 100× bug. Always send the value as a baht string.",{"title":512,"searchDepth":513,"depth":514,"links":515},"",1,2,[516,517],{"id":244,"depth":514,"text":245},{"id":306,"depth":514,"text":307},"Every money field on the wire is a baht string with exactly 2 decimals, e.g. \"100.50\" — never a number, never satang","md",{},{"icon":40},{"title":37,"description":518},"bqfRNoWslqNGVv0OeOLJfVjVskJeuP_ZpQVzU6IMtuc",[525,527],{"title":32,"path":33,"stem":34,"description":526,"icon":35,"children":-1},"An IP allowlist on the s2s surface layers on top of HMAC — blocked source IPs get 403 IP_NOT_ALLOWED",{"title":42,"path":43,"stem":44,"description":528,"icon":45,"children":-1},"Every money-moving POST requires an Idempotency-Key header so a retry returns the original result instead of creating a duplicate",1781891152608]