[{"data":1,"prerenderedAt":1015},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-build-an-integration":132,"-getting-started-build-an-integration-surround":1010},[4,30,47,128],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fgetting-started","1.getting-started",[9,13,17,21,25],{"title":10,"path":11,"stem":12},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":14,"path":15,"stem":16},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart",{"title":18,"path":19,"stem":20},"Authentication","\u002Fgetting-started\u002Fauthentication","1.getting-started\u002F3.authentication",{"title":22,"path":23,"stem":24},"Self-Hosting","\u002Fgetting-started\u002Fself-hosting","1.getting-started\u002F4.self-hosting",{"title":26,"path":27,"stem":28},"Build an Integration","\u002Fgetting-started\u002Fbuild-an-integration","1.getting-started\u002F5.build-an-integration",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Sdks","\u002Fsdks","2.sdks",[35,39,43],{"title":36,"path":37,"stem":38},"TypeScript SDK","\u002Fsdks\u002Ftypescript","2.sdks\u002F1.typescript",{"title":40,"path":41,"stem":42},"Python SDK","\u002Fsdks\u002Fpython","2.sdks\u002F2.python",{"title":44,"path":45,"stem":46},"PHP SDK","\u002Fsdks\u002Fphp","2.sdks\u002F3.php",{"title":48,"path":49,"stem":50,"children":51,"page":29},"Guides","\u002Fguides","3.guides",[52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124],{"title":53,"path":54,"stem":55},"Customers","\u002Fguides\u002Fcustomers","3.guides\u002F1.customers",{"title":57,"path":58,"stem":59},"Usage-Based Billing","\u002Fguides\u002Fusage-billing","3.guides\u002F10.usage-billing",{"title":61,"path":62,"stem":63},"Wallets","\u002Fguides\u002Fwallets","3.guides\u002F11.wallets",{"title":65,"path":66,"stem":67},"Coupons, Add-ons and Credit Notes","\u002Fguides\u002Fcoupons-add-ons-credit-notes","3.guides\u002F12.coupons-add-ons-credit-notes",{"title":69,"path":70,"stem":71},"Taxes","\u002Fguides\u002Ftaxes","3.guides\u002F13.taxes",{"title":73,"path":74,"stem":75},"Customer Portal","\u002Fguides\u002Fcustomer-portal","3.guides\u002F14.customer-portal",{"title":77,"path":78,"stem":79},"Ledger","\u002Fguides\u002Fledger","3.guides\u002F15.ledger",{"title":81,"path":82,"stem":83},"Plan Limits and Access","\u002Fguides\u002Fplan-limits-and-access","3.guides\u002F16.plan-limits-and-access",{"title":85,"path":86,"stem":87},"Currencies and Exchange Rates","\u002Fguides\u002Fcurrencies","3.guides\u002F17.currencies",{"title":89,"path":90,"stem":91},"Charge a Customer","\u002Fguides\u002Fcharge-a-customer","3.guides\u002F18.charge-a-customer",{"title":93,"path":94,"stem":95},"One-time Products & Partial Payments","\u002Fguides\u002Fone-time-products-and-partial-payments","3.guides\u002F19.one-time-products-and-partial-payments",{"title":97,"path":98,"stem":99},"Plans & Pricing","\u002Fguides\u002Fplans-and-pricing","3.guides\u002F2.plans-and-pricing",{"title":101,"path":102,"stem":103},"Subscriptions","\u002Fguides\u002Fsubscriptions","3.guides\u002F3.subscriptions",{"title":105,"path":106,"stem":107},"Invoices & Payments","\u002Fguides\u002Finvoices-and-payments","3.guides\u002F4.invoices-and-payments",{"title":109,"path":110,"stem":111},"Payment Providers","\u002Fguides\u002Fpayment-providers","3.guides\u002F5.payment-providers",{"title":113,"path":114,"stem":115},"Analytics","\u002Fguides\u002Fanalytics","3.guides\u002F6.analytics",{"title":117,"path":118,"stem":119},"Webhooks","\u002Fguides\u002Fwebhooks","3.guides\u002F7.webhooks",{"title":121,"path":122,"stem":123},"Sandbox","\u002Fguides\u002Fsandbox","3.guides\u002F8.sandbox",{"title":125,"path":126,"stem":127},"Money Movement","\u002Fguides\u002Fmoney-movement","3.guides\u002F9.money-movement",{"title":129,"path":130,"stem":131},"API Reference","\u002Fapi-reference","4.api-reference",{"id":133,"title":26,"body":134,"description":1004,"extension":1005,"links":1006,"meta":1007,"navigation":874,"path":27,"seo":1008,"stem":28,"__hash__":1009},"docs\u002F1.getting-started\u002F5.build-an-integration.md",{"type":135,"value":136,"toc":993},"minimark",[137,147,152,155,235,272,278,282,285,353,356,360,363,390,393,397,403,492,508,512,628,639,659,663,666,772,775,839,846,850,859,863,917,921,924,989],[138,139,140,141,146],"p",{},"This page covers the whole job of connecting an app (a school, an ISP, a SaaS product) to PimaBill. Each step links to the guide with the details. If you're an AI agent doing the integration, follow the steps in order and keep the ",[142,143,145],"a",{"href":144},"#rules-for-ai-agents","rules for agents"," at the end.",[148,149,151],"h2",{"id":150},"_1-two-environments-two-keys","1. Two environments, two keys",[138,153,154],{},"The hosted cloud runs two separate copies of PimaBill. They share no data.",[156,157,158,172],"table",{},[159,160,161],"thead",{},[162,163,164,167,170],"tr",{},[165,166],"th",{},[165,168,169],{},"Live",[165,171,121],{},[173,174,175,192,209,224],"tbody",{},[162,176,177,181,187],{},[178,179,180],"td",{},"API base URL",[178,182,183],{},[184,185,186],"code",{},"https:\u002F\u002Fapi.pimabill.com\u002Fapi",[178,188,189],{},[184,190,191],{},"https:\u002F\u002Fsandbox.pimabill.com\u002Fapi",[162,193,194,197,202],{},[178,195,196],{},"Dashboard",[178,198,199],{},[184,200,201],{},"https:\u002F\u002Fapp.pimabill.com",[178,203,204,205,208],{},"The same, with the ",[206,207,121],"strong",{}," switch (foot of the sidebar) on",[162,210,211,214,219],{},[178,212,213],{},"API key",[178,215,216],{},[184,217,218],{},"sk_live_...",[178,220,221],{},[184,222,223],{},"sk_test_...",[162,225,226,229,232],{},[178,227,228],{},"Money",[178,230,231],{},"Real",[178,233,234],{},"Test only",[236,237,238,249,260],"ul",{},[239,240,241,242,245,246,248],"li",{},"Get each key from ",[206,243,244],{},"Settings → API keys"," in the dashboard: with ",[206,247,121],{}," off for the live key, and on for the test key. A key only works in the environment that issued it.",[239,250,251,252,255,256,259],{},"Configure your app per environment, for example ",[184,253,254],{},"PIMABILL_API_URL"," and ",[184,257,258],{},"PIMABILL_API_KEY",". Never hard-code either.",[239,261,262,263,266,267,271],{},"Send the key as ",[184,264,265],{},"Authorization: Bearer sk_...",". Give each system the narrowest ",[142,268,270],{"href":269},"\u002Fgetting-started\u002Fauthentication#scopes","scopes"," it needs.",[138,273,274,275,277],{},"Build and test everything in the sandbox first, then repeat the same setup in live. See ",[142,276,121],{"href":122},".",[148,279,281],{"id":280},"_2-refer-to-things-by-your-own-codes-not-ids","2. Refer to things by your own codes, not IDs",[138,283,284],{},"Every record has a different ID in each environment. Your own identifiers don't change, so make your app depend on them:",[156,286,287,300],{},[159,288,289],{},[162,290,291,294,297],{},[165,292,293],{},"Record",[165,295,296],{},"Your identifier",[165,298,299],{},"Look it up with",[173,301,302,320,337],{},[162,303,304,307,315],{},[178,305,306],{},"Plan",[178,308,309,311,312],{},[184,310,184],{},", e.g. ",[184,313,314],{},"diploma-monthly",[178,316,317],{},[184,318,319],{},"GET \u002Fapi\u002Fplans?code=diploma-monthly",[162,321,322,325,332],{},[178,323,324],{},"Add-on (one-time product)",[178,326,327,311,329],{},[184,328,184],{},[184,330,331],{},"cert-bundle-3m",[178,333,334],{},[184,335,336],{},"GET \u002Fapi\u002Fadd-ons?code=cert-bundle-3m",[162,338,339,342,348],{},[178,340,341],{},"Customer",[178,343,344,347],{},[184,345,346],{},"externalId",": your user's ID",[178,349,350],{},[184,351,352],{},"GET \u002Fapi\u002Fcustomers?externalId=usr_123",[138,354,355],{},"If you store PimaBill IDs, for example the customer ID on your user record, store them per environment.",[148,357,359],{"id":358},"_3-set-up-your-catalogue","3. Set up your catalogue",[138,361,362],{},"Decide, for each thing you sell, whether it renews:",[236,364,365,377],{},[239,366,367,370,371,374,375,277],{},[206,368,369],{},"It's billed again every period"," (a monthly fee, a yearly licence): create a ",[206,372,373],{},"plan"," with a price in each currency. See ",[142,376,97],{"href":98},[239,378,379,382,383,386,387,277],{},[206,380,381],{},"It's bought once"," (a course, a bundle, a setup fee, a \"3-month package\" paid up front): create an ",[206,384,385],{},"add-on",". It never renews; your app decides how long access lasts. See ",[142,388,389],{"href":94},"One-time products & partial payments",[138,391,392],{},"Create the catalogue with a script that you can run against either environment and that is safe to run twice. If the code exists, update it; otherwise, create it.",[148,394,396],{"id":395},"_4-create-customers","4. Create customers",[138,398,399,400,402],{},"Create a PimaBill customer when your user first needs to pay, with your user's ID as ",[184,401,346],{},":",[404,405,410],"pre",{"className":406,"code":407,"language":408,"meta":409,"style":409},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST \"$PIMABILL_API_URL\u002Fcustomers\" \\\n  -H \"Authorization: Bearer $PIMABILL_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"externalId\": \"usr_123\", \"name\": \"Amina N.\", \"email\": \"amina@example.com\", \"country\": \"UG\", \"currency\": \"UGX\" }'\n","bash","",[184,411,412,445,463,477],{"__ignoreMap":409},[413,414,417,421,425,428,432,436,439,442],"span",{"class":415,"line":416},"line",1,[413,418,420],{"class":419},"sBMFI","curl",[413,422,424],{"class":423},"sfazB"," -X",[413,426,427],{"class":423}," POST",[413,429,431],{"class":430},"sMK4o"," \"",[413,433,435],{"class":434},"sTEyZ","$PIMABILL_API_URL",[413,437,438],{"class":423},"\u002Fcustomers",[413,440,441],{"class":430},"\"",[413,443,444],{"class":434}," \\\n",[413,446,448,451,453,456,459,461],{"class":415,"line":447},2,[413,449,450],{"class":423},"  -H",[413,452,431],{"class":430},[413,454,455],{"class":423},"Authorization: Bearer ",[413,457,458],{"class":434},"$PIMABILL_API_KEY",[413,460,441],{"class":430},[413,462,444],{"class":434},[413,464,466,468,470,473,475],{"class":415,"line":465},3,[413,467,450],{"class":423},[413,469,431],{"class":430},[413,471,472],{"class":423},"Content-Type: application\u002Fjson",[413,474,441],{"class":430},[413,476,444],{"class":434},[413,478,480,483,486,489],{"class":415,"line":479},4,[413,481,482],{"class":423},"  -d",[413,484,485],{"class":430}," '",[413,487,488],{"class":423},"{ \"externalId\": \"usr_123\", \"name\": \"Amina N.\", \"email\": \"amina@example.com\", \"country\": \"UG\", \"currency\": \"UGX\" }",[413,490,491],{"class":430},"'\n",[138,493,494,495,497,498,501,502,505,506,277],{},"A second create with the same ",[184,496,346],{}," is refused with ",[184,499,500],{},"409",". Look the customer up with ",[184,503,504],{},"?externalId="," instead. See ",[142,507,53],{"href":54},[148,509,511],{"id":510},"_5-take-payments","5. Take payments",[156,513,514,527],{},[159,515,516],{},[162,517,518,521,524],{},[165,519,520],{},"You're selling",[165,522,523],{},"Call",[165,525,526],{},"Guide",[173,528,529,548,570,587,614],{},[162,530,531,534,544],{},[178,532,533],{},"A plan",[178,535,536,539,540,543],{},[184,537,538],{},"POST \u002Fapi\u002Fsubscriptions",", then ",[184,541,542],{},"POST \u002Fapi\u002Finvoices\u002F{id}\u002Fcheckout"," for the first invoice",[178,545,546],{},[142,547,101],{"href":102},[162,549,550,553,565],{},[178,551,552],{},"A one-time product",[178,554,555,558,559,255,562],{},[184,556,557],{},"POST \u002Fapi\u002Finvoices"," with ",[184,560,561],{},"items: [{ \"addOnCode\": \"...\", \"quantity\": 1 }]",[184,563,564],{},"checkout: {}",[178,566,567],{},[142,568,569],{"href":94},"One-time products",[162,571,572,575,582],{},[178,573,574],{},"A custom amount",[178,576,577,579,580],{},[184,578,557],{}," with your own items and ",[184,581,564],{},[178,583,584],{},[142,585,586],{"href":90},"Charge a customer",[162,588,589,592,608],{},[178,590,591],{},"A deposit or instalments",[178,593,594,597,598,601,602,255,605],{},[184,595,596],{},"checkout.amount",", or ",[184,599,600],{},"amount"," on ",[184,603,604],{},"\u002Fcheckout",[184,606,607],{},"\u002Fmark-paid",[178,609,610],{},[142,611,613],{"href":612},"\u002Fguides\u002Finvoices-and-payments#paying-in-parts","Paying in parts",[162,615,616,619,624],{},[178,617,618],{},"Cash or a bank transfer you received",[178,620,621],{},[184,622,623],{},"POST \u002Fapi\u002Finvoices\u002F{id}\u002Fmark-paid",[178,625,626],{},[142,627,105],{"href":106},[138,629,630,631,634,635,638],{},"Each checkout returns a ",[184,632,633],{},"checkoutUrl",". Redirect the customer to it, or send it by WhatsApp, SMS or email. Set ",[184,636,637],{},"callbackUrl"," to the page they come back to. That page should say \"we're confirming your payment\", not \"paid\": the webhook is what confirms it.",[138,640,641,644,645,648,649,652,653,255,655,277],{},[206,642,643],{},"Payment providers."," Checkouts use your own connected providers first, in priority order. If none can take the payment, they use ",[206,646,647],{},"managed payments"," (the provider named ",[184,650,651],{},"managed","). With managed payments, PimaBill collects for you and pays out to your mobile money, bank or PayPal. You don't need a provider account to start. See ",[142,654,109],{"href":110},[142,656,658],{"href":657},"\u002Fguides\u002Fmoney-movement#managed-payments","Managed payments",[148,660,662],{"id":661},"_6-listen-to-webhooks","6. Listen to webhooks",[138,664,665],{},"Your app learns about payments from webhooks, not from the redirect.",[667,668,669,743,754,765],"ol",{},[239,670,671,672,734,735,738,739,742],{},"Register your endpoint in each environment, with that environment's key:\n",[404,673,675],{"className":406,"code":674,"language":408,"meta":409,"style":409},"curl -X PATCH \"$PIMABILL_API_URL\u002Ftenants\u002Fme\" \\\n  -H \"Authorization: Bearer $PIMABILL_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"webhookUrl\": \"https:\u002F\u002Fyour-app.example.com\u002Fwebhooks\u002Fpimabill\" }'\n",[184,676,677,697,711,723],{"__ignoreMap":409},[413,678,679,681,683,686,688,690,693,695],{"class":415,"line":416},[413,680,420],{"class":419},[413,682,424],{"class":423},[413,684,685],{"class":423}," PATCH",[413,687,431],{"class":430},[413,689,435],{"class":434},[413,691,692],{"class":423},"\u002Ftenants\u002Fme",[413,694,441],{"class":430},[413,696,444],{"class":434},[413,698,699,701,703,705,707,709],{"class":415,"line":447},[413,700,450],{"class":423},[413,702,431],{"class":430},[413,704,455],{"class":423},[413,706,458],{"class":434},[413,708,441],{"class":430},[413,710,444],{"class":434},[413,712,713,715,717,719,721],{"class":415,"line":465},[413,714,450],{"class":423},[413,716,431],{"class":430},[413,718,472],{"class":423},[413,720,441],{"class":430},[413,722,444],{"class":434},[413,724,725,727,729,732],{"class":415,"line":479},[413,726,482],{"class":423},[413,728,485],{"class":430},[413,730,731],{"class":423},"{ \"webhookUrl\": \"https:\u002F\u002Fyour-app.example.com\u002Fwebhooks\u002Fpimabill\" }",[413,733,491],{"class":430},"\nFor example, point live at your production app and the sandbox at your staging app. The key needs the ",[184,736,737],{},"write"," or ",[184,740,741],{},"tenants:write"," scope.",[239,744,745,746,749,750,753],{},"Read the signing secret from ",[184,747,748],{},"GET \u002Fapi\u002Ftenants\u002Fme"," (",[184,751,752],{},"webhookSecret",") and store it with your other secrets.",[239,755,756,757,760,761,277],{},"Check ",[184,758,759],{},"X-Webhook-Signature-V2"," on every request before trusting it. See ",[142,762,764],{"href":763},"\u002Fguides\u002Fwebhooks#handling-webhooks","Handling webhooks",[239,766,767,768,771],{},"Handle each event ",[206,769,770],{},"idempotently",". Deliveries are retried, so the same event can arrive more than once. Key your handling on the invoice or payment ID.",[138,773,774],{},"The events most apps need:",[156,776,777,787],{},[159,778,779],{},[162,780,781,784],{},[165,782,783],{},"Event",[165,785,786],{},"What to do",[173,788,789,799,809,819,829],{},[162,790,791,796],{},[178,792,793],{},[184,794,795],{},"invoice.paid",[178,797,798],{},"Grant what was bought, or extend access for a renewal",[162,800,801,806],{},[178,802,803],{},[184,804,805],{},"invoice.partially_paid",[178,807,808],{},"Record the part payment; apply your deposit policy",[162,810,811,816],{},[178,812,813],{},[184,814,815],{},"payment.failed",[178,817,818],{},"Tell the customer; renewals are retried automatically",[162,820,821,826],{},[178,822,823],{},[184,824,825],{},"subscription.canceled",[178,827,828],{},"Remove access at the end of what was paid for",[162,830,831,836],{},[178,832,833],{},[184,834,835],{},"subscription.renewed",[178,837,838],{},"A new period began; its invoice follows",[138,840,841,842,277],{},"See the ",[142,843,845],{"href":844},"\u002Fguides\u002Fwebhooks#event-types","full event list",[148,847,849],{"id":848},"_7-let-customers-help-themselves","7. Let customers help themselves",[138,851,852,853,856,857,277],{},"Give customers a link to the hosted portal, where they can see invoices, download PDFs and pay. Your server asks for a short-lived link per customer with ",[184,854,855],{},"POST \u002Fapi\u002Fportal\u002Fcustomers\u002F{externalId}\u002Fsessions",". Never put an API key in a link. See ",[142,858,73],{"href":74},[148,860,862],{"id":861},"_8-go-live","8. Go live",[236,864,867,877,883,889,895,908],{"className":865},[866],"contains-task-list",[239,868,871,876],{"className":869},[870],"task-list-item",[872,873],"input",{"disabled":874,"type":875},true,"checkbox"," Every flow passes in the sandbox: buy, renew, pay in parts, fail and retry, cancel.",[239,878,880,882],{"className":879},[870],[872,881],{"disabled":874,"type":875}," The catalogue script has run against live, with the same codes.",[239,884,886,888],{"className":885},[870],[872,887],{"disabled":874,"type":875}," Live has a payment provider: your own, or managed payments approved for your organisation.",[239,890,892,894],{"className":891},[870],[872,893],{"disabled":874,"type":875}," Your live webhook URL is set, its secret is stored, and signature checks are on.",[239,896,898,900,901,903,904,907],{"className":897},[870],[872,899],{"disabled":874,"type":875}," Your app's live config uses ",[184,902,186],{}," and the ",[184,905,906],{},"sk_live_"," key.",[239,909,911,913,914,916],{"className":910},[870],[872,912],{"disabled":874,"type":875}," One small real payment has gone through and the ",[184,915,795],{}," webhook was received.",[148,918,920],{"id":919},"rules-for-ai-agents","Rules for AI agents",[138,922,923],{},"If you're an agent integrating an app with PimaBill:",[236,925,926,938,944,955,961,973,979],{},[239,927,928,749,931,934,935,937],{},[206,929,930],{},"Work in the sandbox",[184,932,933],{},"sk_test_",", ",[184,936,191],{},") until the owner says to go live. Never use a live key for tests.",[239,939,940,943],{},[206,941,942],{},"Never print, log or commit API keys or the webhook secret."," Read them from the app's secret store.",[239,945,946,949,950,738,952,954],{},[206,947,948],{},"Make every setup step safe to repeat."," Look up by ",[184,951,184],{},[184,953,346],{}," before creating, and update instead of duplicating.",[239,956,957,960],{},[206,958,959],{},"Don't create plans for things that are paid once."," Use add-ons. Plans renew and charge again.",[239,962,963,966,967,969,970,972],{},[206,964,965],{},"Don't treat the redirect back from checkout as payment."," Wait for ",[184,968,795],{}," (or ",[184,971,805],{},").",[239,974,975,978],{},[206,976,977],{},"Ask the owner before anything irreversible in live",": voiding invoices, refunds, deleting catalogue items, changing prices customers already pay.",[239,980,981,982,985,986,277],{},"The ",[142,983,984],{"href":130},"API reference"," lists every endpoint and field. The OpenAPI document is at ",[184,987,988],{},"https:\u002F\u002Fapi.pimabill.com\u002Fapi\u002Fopenapi.json",[990,991,992],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":409,"searchDepth":447,"depth":447,"links":994},[995,996,997,998,999,1000,1001,1002,1003],{"id":150,"depth":447,"text":151},{"id":280,"depth":447,"text":281},{"id":358,"depth":447,"text":359},{"id":395,"depth":447,"text":396},{"id":510,"depth":447,"text":511},{"id":661,"depth":447,"text":662},{"id":848,"depth":447,"text":849},{"id":861,"depth":447,"text":862},{"id":919,"depth":447,"text":920},"Connect your app or platform to PimaBill from start to finish, covering environments, catalogue, customers, selling, webhooks and going live.","md",null,{},{"title":26,"description":1004},"q4J6d0hmIIw5MxcZyi9DeKY2u9UPX7Bd-qXtt49vgl8",[1011,1013],{"title":22,"path":23,"stem":24,"description":1012,"children":-1},"Run PimaBill on your own servers with Docker, and what differs from the hosted cloud.",{"title":36,"path":37,"stem":38,"description":1014,"children":-1},"Complete guide to using the PimaBill TypeScript SDK for Node.js and browser environments.",1793401244611]