[{"data":1,"prerenderedAt":621},["ShallowReactive",2],{"navigation-en":3,"en:\u002Fgetting-started\u002Fportal-setup":193,"en:\u002Fgetting-started\u002Fportal-setup:surround":618},[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":11,"badge":195,"body":196,"description":612,"extension":613,"links":195,"meta":614,"method":195,"navigation":615,"path":12,"seo":616,"stem":13,"__hash__":617},"docs_en\u002F1.getting-started\u002F1.portal-setup.md",null,{"type":197,"value":198,"toc":601},"minimark",[199,208,229,234,312,319,323,326,330,333,349,352,358,361,364,368,375,384,426,435,438,442,445,493,501,524,527,531,541,552,555,567,570,573,577,580],[200,201,202,203,207],"p",{},"Before integrating the S2S API from your server, prepare your credentials and settings in the ",[204,205,206],"strong",{},"Portal"," (UnknownPay's dashboard) — all through the UI, no code required.",[209,210,211],"note",{},[200,212,213,214,216,217,221,222,216,225,228],{},"The ",[204,215,206],{}," is for ",[218,219,220],"em",{},"configuration"," (issuing API keys, setting up webhooks); the ",[204,223,224],{},"S2S API",[218,226,227],{},"real transactions"," using an API key + HMAC signature. They are separate.",[230,231,233],"h2",{"id":232},"overview-checklist","Overview checklist",[235,236,237,256],"table",{},[238,239,240],"thead",{},[241,242,243,247,250,253],"tr",{},[244,245,246],"th",{},"#",[244,248,249],{},"Step",[244,251,252],{},"Where",[244,254,255],{},"Who can do it",[257,258,259,273,286,298],"tbody",{},[241,260,261,265,268,270],{},[262,263,264],"td",{},"1",[262,266,267],{},"Sign in to the Portal (+ 2FA if enabled)",[262,269,206],{},[262,271,272],{},"Any merchant user",[241,274,275,278,281,283],{},[262,276,277],{},"2",[262,279,280],{},"Create \u002F rotate the API secret (live & test)",[262,282,206],{},[262,284,285],{},"Owner\u002Fadmin",[241,287,288,291,294,296],{},[262,289,290],{},"3",[262,292,293],{},"Configure a webhook (URL + events + secret)",[262,295,206],{},[262,297,285],{},[241,299,300,303,306,309],{},[262,301,302],{},"4",[262,304,305],{},"Register the server IP for the allowlist",[262,307,308],{},"Notify the platform team",[262,310,311],{},"Platform team sets it",[313,314,316],"placeholder-note",{"value":315},"the role \u002F button names shown in the Portal UI",[200,317,318],{},"Confirm these match what users actually see.",[230,320,322],{"id":321},"_1-sign-in-to-the-portal-and-2fa","1. Sign in to the Portal (and 2FA)",[200,324,325],{},"Open the Portal and sign in with the username + password provided by the team.",[327,328],"placeholder-image",{"subject":329},"Portal login screen",[200,331,332],{},"Depending on the account settings, sign-in may have extra steps:",[334,335,336,343],"ul",{},[337,338,339,342],"li",{},[204,340,341],{},"2FA enabled:"," if two-factor authentication is on, you'll enter a 6-digit code from your authenticator app (or a recovery code) before continuing.",[337,344,345,348],{},[204,346,347],{},"Forced password change:"," on first sign-in or when a password expires, you'll set a new password first.",[327,350],{"subject":351},"2FA code entry screen (6-digit OTP) after login",[353,354,355],"tip",{},[200,356,357],{},"Enable 2FA for every account with Portal access — scan the QR with an authenticator app and store the recovery codes somewhere safe.",[327,359],{"subject":360},"2FA setup page (QR code + verification field + recovery codes)",[313,362],{"value":363},"confirm the Portal UI actually has this 2FA setup page",[230,365,367],{"id":366},"_2-createrotate-the-api-secret-live-test-separated","2. Create\u002Frotate the API secret — live \u002F test separated",[200,369,370,371,374],{},"The API key + secret are the credentials your server uses to sign HMAC when calling the S2S API. Open the API credential page in the Portal and click ",[204,372,373],{},"\"Issue \u002F rotate secret\""," to generate a new pair.",[376,377,378],"warning",{},[200,379,380,383],{},[204,381,382],{},"The secret is shown only once, at issue\u002Frotate time (show-once)."," It is never displayed again — copy it into your secret store immediately. If you lose it, you must rotate again (which invalidates the old secret).",[334,385,386,392,406],{},[337,387,388,391],{},[204,389,390],{},"Who can do it:"," owner\u002Fadmin only — operator\u002Fviewer cannot.",[337,393,394,397,398,401,402,405],{},[204,395,396],{},"Live \u002F test separated:"," you can issue both a ",[204,399,400],{},"live"," (real transactions) and a ",[204,403,404],{},"test"," (sandbox) key — you can hold 1 active live + 1 active test at the same time.",[337,407,408,409,412,413,417,418,421,422,425],{},"You receive a ",[204,410,411],{},"key id"," (prefixed ",[414,415,416],"code",{},"unk_live_"," or ",[414,419,420],{},"unk_test_",") paired with a ",[204,423,424],{},"secret",". Keep both to sign requests.",[209,427,428],{},[200,429,430,431,434],{},"The live\u002Ftest mode is bound to the key itself — when calling S2S you ",[204,432,433],{},"don't send a mode","; the server derives it from the signing key.",[327,436],{"subject":437},"API credential page with the Rotate secret button + show-once secret popup",[230,439,441],{"id":440},"_3-configure-a-webhook","3. Configure a webhook",[200,443,444],{},"A webhook is the channel UnknownPay uses to \"call back\" and notify your server of events (e.g. a successful deposit). Open the webhook settings in the Portal, then:",[446,447,448,459,486],"ol",{},[337,449,450,451,454,455,458],{},"Enter your server's ",[204,452,453],{},"destination URL"," (must be ",[414,456,457],{},"https:\u002F\u002F",").",[337,460,461,462,465,466,469,470,469,473,469,476,469,479,469,482,485],{},"Select the ",[204,463,464],{},"events to receive"," from: ",[414,467,468],{},"deposit.success",", ",[414,471,472],{},"deposit.expired",[414,474,475],{},"withdrawal.success",[414,477,478],{},"withdrawal.rejected",[414,480,481],{},"withdrawal.failed",[414,483,484],{},"withdrawal.refunded",".",[337,487,488,489,492],{},"Save — the system issues a ",[204,490,491],{},"signing secret"," for verifying the payload signature.",[376,494,495],{},[200,496,497,500],{},[204,498,499],{},"The webhook signing secret is also show-once."," Copy it immediately. If you lose it, reconfigure to issue a new one.",[334,502,503,508,518],{},[337,504,505,507],{},[204,506,390],{}," owner\u002Fadmin only.",[337,509,510,513,514,517],{},[204,511,512],{},"Test button:"," click ",[204,515,516],{},"\"Test webhook\""," to have the system send a test event to your URL.",[337,519,520,523],{},[204,521,522],{},"Delivery history:"," view the delivery log and replay failed events.",[327,525],{"subject":526},"Webhook config page (URL, event checkboxes, show-once secret, test button)",[230,528,530],{"id":529},"_4-ip-allowlist","4. IP allowlist",[200,532,533,534,537,538,458],{},"The S2S gateway enforces an IP allowlist: only source IPs in your allowlist may call the S2S API on your behalf. An IP not in the allowlist is rejected with ",[414,535,536],{},"IP_NOT_ALLOWED"," (HTTP ",[414,539,540],{},"403",[376,542,543],{},[200,544,545,548,549,485],{},[204,546,547],{},"In the current phase, merchants cannot set the IP allowlist themselves — only the platform team can."," You must ",[204,550,551],{},"send the IP\u002FCIDR of the server(s) that will call S2S to the team",[200,553,554],{},"What to prepare when notifying the team:",[334,556,557,564],{},[337,558,559,560,563],{},"The source IP\u002FCIDR (e.g. ",[414,561,562],{},"203.0.113.10\u002F32",") of the server that will call S2S",[337,565,566],{},"A note for each IP (e.g. server name \u002F environment)",[327,568],{"subject":569},"example IP-report form\u002Femail the merchant sends to the platform team",[313,571],{"value":572},"the official channel to send your IP (email\u002Fform\u002Fonboarding contact)",[230,574,576],{"id":575},"before-you-start-integrating","Before you start integrating",[200,578,579],{},"Once all 4 steps are done, you should have:",[334,581,582,585,592,598],{},[337,583,584],{},"Portal access (with 2FA enabled if you want)",[337,586,587,588,591],{},"A stored ",[204,589,590],{},"API key + secret"," (live and\u002For test)",[337,593,594,595],{},"A configured and tested ",[204,596,597],{},"webhook URL + events + webhook secret",[337,599,600],{},"Your server IP sent to the team and confirmed added to the allowlist",{"title":602,"searchDepth":603,"depth":604,"links":605},"",1,2,[606,607,608,609,610,611],{"id":232,"depth":604,"text":233},{"id":321,"depth":604,"text":322},{"id":366,"depth":604,"text":367},{"id":440,"depth":604,"text":441},{"id":529,"depth":604,"text":530},{"id":575,"depth":604,"text":576},"Issue API keys, configure a webhook, and register your IP in the Portal before integrating S2S","md",{},{"icon":14},{"title":11,"description":612},"Da_rNmSvMJxho6ge4CuyrKeyb7lFDI1zWt_XZkNsE54",[195,619],{"title":16,"path":17,"stem":18,"description":620,"icon":19,"children":-1},"Make your first end-to-end deposit in the sandbox with a test key",1781891152607]