[{"data":1,"prerenderedAt":2019},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-authentication":132,"-getting-started-authentication-surround":2014},[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":18,"body":134,"description":2008,"extension":2009,"links":2010,"meta":2011,"navigation":917,"path":19,"seo":2012,"stem":20,"__hash__":2013},"docs\u002F1.getting-started\u002F3.authentication.md",{"type":135,"value":136,"toc":1989},"minimark",[137,155,210,258,263,266,338,341,644,655,660,667,670,710,713,754,760,783,787,790,973,1015,1018,1022,1025,1088,1092,1095,1335,1339,1343,1348,1415,1421,1432,1436,1593,1597,1600,1674,1678,1740,1744,1748,1751,1799,1803,1806,1851,1855,1858,1903,1907,1914,1967,1985],[138,139,140,141,145,146,150,151,154],"p",{},"Every request carries a Bearer token in the ",[142,143,144],"code",{},"Authorization"," header. That token is either an ",[147,148,149],"strong",{},"access token"," for a person signed in to your organisation, or an ",[147,152,153],{},"API key"," for a server.",[156,157,158,174],"table",{},[159,160,161],"thead",{},[162,163,164,168,171],"tr",{},[165,166,167],"th",{},"Credential",[165,169,170],{},"Who uses it",[165,172,173],{},"What it can do",[175,176,177,198],"tbody",{},[162,178,179,186,189],{},[180,181,182,185],"td",{},[147,183,184],{},"Access token"," (JWT)",[180,187,188],{},"People, through the dashboard",[180,190,191,192,197],{},"What their ",[193,194,196],"a",{"href":195},"#roles","role"," allows",[162,199,200,204,207],{},[180,201,202],{},[147,203,153],{},[180,205,206],{},"Your servers",[180,208,209],{},"The whole API, except managing the team and approving payouts",[211,212,217],"pre",{"className":213,"code":214,"language":215,"meta":216,"style":216},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Authorization: Bearer \u003Caccess token or API key>\n","bash","",[142,218,219],{"__ignoreMap":216},[220,221,224,228,232,236,239,242,245,248,251,255],"span",{"class":222,"line":223},"line",1,[220,225,227],{"class":226},"sBMFI","Authorization:",[220,229,231],{"class":230},"sfazB"," Bearer",[220,233,235],{"class":234},"sMK4o"," \u003C",[220,237,238],{"class":230},"access",[220,240,241],{"class":230}," token",[220,243,244],{"class":230}," or",[220,246,247],{"class":230}," API",[220,249,250],{"class":230}," ke",[220,252,254],{"class":253},"sTEyZ","y",[220,256,257],{"class":234},">\n",[259,260,262],"h2",{"id":261},"signing-in","Signing In",[138,264,265],{},"Sign in with an email and password to receive an access token and a refresh token.",[211,267,269],{"className":213,"code":268,"language":215,"meta":216,"style":216},"curl -X POST http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fauth\u002Flogin \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"email\": \"admin@acmecorp.com\",\n    \"password\": \"securepassword123\"\n  }'\n",[142,270,271,288,305,317,323,329],{"__ignoreMap":216},[220,272,273,276,279,282,285],{"class":222,"line":223},[220,274,275],{"class":226},"curl",[220,277,278],{"class":230}," -X",[220,280,281],{"class":230}," POST",[220,283,284],{"class":230}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fauth\u002Flogin",[220,286,287],{"class":253}," \\\n",[220,289,291,294,297,300,303],{"class":222,"line":290},2,[220,292,293],{"class":230},"  -H",[220,295,296],{"class":234}," \"",[220,298,299],{"class":230},"Content-Type: application\u002Fjson",[220,301,302],{"class":234},"\"",[220,304,287],{"class":253},[220,306,308,311,314],{"class":222,"line":307},3,[220,309,310],{"class":230},"  -d",[220,312,313],{"class":234}," '",[220,315,316],{"class":230},"{\n",[220,318,320],{"class":222,"line":319},4,[220,321,322],{"class":230},"    \"email\": \"admin@acmecorp.com\",\n",[220,324,326],{"class":222,"line":325},5,[220,327,328],{"class":230},"    \"password\": \"securepassword123\"\n",[220,330,332,335],{"class":222,"line":331},6,[220,333,334],{"class":230},"  }",[220,336,337],{"class":234},"'\n",[138,339,340],{},"The response holds the tokens and who you are in the organisation:",[211,342,346],{"className":343,"code":344,"language":345,"meta":216,"style":216},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"refreshToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"role\": \"OWNER\",\n  \"permissions\": [\"read\", \"billing.write\", \"money.move\", \"money.approve\", \"settings.developer\", \"settings.providers\", \"org.manage\", \"team.manage\"],\n  \"user\": { \"id\": \"usr_...\", \"name\": \"Jane Doe\", \"email\": \"admin@acmecorp.com\" },\n  \"tenant\": { \"id\": \"ten_...\", \"name\": \"Acme Corp\", \"slug\": \"acme-corp\" }\n}\n","json",[142,347,348,352,376,395,414,502,571,638],{"__ignoreMap":216},[220,349,350],{"class":222,"line":223},[220,351,316],{"class":234},[220,353,354,357,361,363,366,368,371,373],{"class":222,"line":290},[220,355,356],{"class":234},"  \"",[220,358,360],{"class":359},"spNyl","accessToken",[220,362,302],{"class":234},[220,364,365],{"class":234},":",[220,367,296],{"class":234},[220,369,370],{"class":230},"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",[220,372,302],{"class":234},[220,374,375],{"class":234},",\n",[220,377,378,380,383,385,387,389,391,393],{"class":222,"line":307},[220,379,356],{"class":234},[220,381,382],{"class":359},"refreshToken",[220,384,302],{"class":234},[220,386,365],{"class":234},[220,388,296],{"class":234},[220,390,370],{"class":230},[220,392,302],{"class":234},[220,394,375],{"class":234},[220,396,397,399,401,403,405,407,410,412],{"class":222,"line":319},[220,398,356],{"class":234},[220,400,196],{"class":359},[220,402,302],{"class":234},[220,404,365],{"class":234},[220,406,296],{"class":234},[220,408,409],{"class":230},"OWNER",[220,411,302],{"class":234},[220,413,375],{"class":234},[220,415,416,418,421,423,425,428,430,433,435,438,440,443,445,447,449,452,454,456,458,461,463,465,467,470,472,474,476,479,481,483,485,488,490,492,494,497,499],{"class":222,"line":325},[220,417,356],{"class":234},[220,419,420],{"class":359},"permissions",[220,422,302],{"class":234},[220,424,365],{"class":234},[220,426,427],{"class":234}," [",[220,429,302],{"class":234},[220,431,432],{"class":230},"read",[220,434,302],{"class":234},[220,436,437],{"class":234},",",[220,439,296],{"class":234},[220,441,442],{"class":230},"billing.write",[220,444,302],{"class":234},[220,446,437],{"class":234},[220,448,296],{"class":234},[220,450,451],{"class":230},"money.move",[220,453,302],{"class":234},[220,455,437],{"class":234},[220,457,296],{"class":234},[220,459,460],{"class":230},"money.approve",[220,462,302],{"class":234},[220,464,437],{"class":234},[220,466,296],{"class":234},[220,468,469],{"class":230},"settings.developer",[220,471,302],{"class":234},[220,473,437],{"class":234},[220,475,296],{"class":234},[220,477,478],{"class":230},"settings.providers",[220,480,302],{"class":234},[220,482,437],{"class":234},[220,484,296],{"class":234},[220,486,487],{"class":230},"org.manage",[220,489,302],{"class":234},[220,491,437],{"class":234},[220,493,296],{"class":234},[220,495,496],{"class":230},"team.manage",[220,498,302],{"class":234},[220,500,501],{"class":234},"],\n",[220,503,504,506,509,511,513,516,518,521,523,525,527,530,532,534,536,539,541,543,545,548,550,552,554,557,559,561,563,566,568],{"class":222,"line":331},[220,505,356],{"class":234},[220,507,508],{"class":359},"user",[220,510,302],{"class":234},[220,512,365],{"class":234},[220,514,515],{"class":234}," {",[220,517,296],{"class":234},[220,519,520],{"class":226},"id",[220,522,302],{"class":234},[220,524,365],{"class":234},[220,526,296],{"class":234},[220,528,529],{"class":230},"usr_...",[220,531,302],{"class":234},[220,533,437],{"class":234},[220,535,296],{"class":234},[220,537,538],{"class":226},"name",[220,540,302],{"class":234},[220,542,365],{"class":234},[220,544,296],{"class":234},[220,546,547],{"class":230},"Jane Doe",[220,549,302],{"class":234},[220,551,437],{"class":234},[220,553,296],{"class":234},[220,555,556],{"class":226},"email",[220,558,302],{"class":234},[220,560,365],{"class":234},[220,562,296],{"class":234},[220,564,565],{"class":230},"admin@acmecorp.com",[220,567,302],{"class":234},[220,569,570],{"class":234}," },\n",[220,572,574,576,579,581,583,585,587,589,591,593,595,598,600,602,604,606,608,610,612,615,617,619,621,624,626,628,630,633,635],{"class":222,"line":573},7,[220,575,356],{"class":234},[220,577,578],{"class":359},"tenant",[220,580,302],{"class":234},[220,582,365],{"class":234},[220,584,515],{"class":234},[220,586,296],{"class":234},[220,588,520],{"class":226},[220,590,302],{"class":234},[220,592,365],{"class":234},[220,594,296],{"class":234},[220,596,597],{"class":230},"ten_...",[220,599,302],{"class":234},[220,601,437],{"class":234},[220,603,296],{"class":234},[220,605,538],{"class":226},[220,607,302],{"class":234},[220,609,365],{"class":234},[220,611,296],{"class":234},[220,613,614],{"class":230},"Acme Corp",[220,616,302],{"class":234},[220,618,437],{"class":234},[220,620,296],{"class":234},[220,622,623],{"class":226},"slug",[220,625,302],{"class":234},[220,627,365],{"class":234},[220,629,296],{"class":234},[220,631,632],{"class":230},"acme-corp",[220,634,302],{"class":234},[220,636,637],{"class":234}," }\n",[220,639,641],{"class":222,"line":640},8,[220,642,643],{"class":234},"}\n",[138,645,646,647,650,651,654],{},"A person who belongs to several organisations signs in to the one they used last; pass ",[142,648,649],{},"tenantId"," to choose, or switch later with ",[142,652,653],{},"POST \u002Fapi\u002Fauth\u002Fswitch",".",[656,657,659],"h3",{"id":658},"two-step-sign-in","Two-step sign-in",[138,661,662,663,666],{},"Anyone can turn on two-step sign-in in ",[147,664,665],{},"Settings → Security",": scan the QR code with an authenticator app (Google Authenticator, Microsoft Authenticator, 1Password, Authy) and enter the code it shows. You get ten recovery codes, shown once; each one signs you in once if you lose your phone.",[138,668,669],{},"With it on, a correct password doesn't sign you in yet. The response asks for the code instead:",[211,671,673],{"className":343,"code":672,"language":345,"meta":216,"style":216},"{ \"mfaRequired\": true, \"mfaToken\": \"eyJhbGciOiJIUzI1NiIs...\" }\n",[142,674,675],{"__ignoreMap":216},[220,676,677,680,682,685,687,689,692,694,697,699,701,703,706,708],{"class":222,"line":223},[220,678,679],{"class":234},"{",[220,681,296],{"class":234},[220,683,684],{"class":359},"mfaRequired",[220,686,302],{"class":234},[220,688,365],{"class":234},[220,690,691],{"class":234}," true,",[220,693,296],{"class":234},[220,695,696],{"class":359},"mfaToken",[220,698,302],{"class":234},[220,700,365],{"class":234},[220,702,296],{"class":234},[220,704,705],{"class":230},"eyJhbGciOiJIUzI1NiIs...",[220,707,302],{"class":234},[220,709,637],{"class":234},[138,711,712],{},"Finish within five minutes with the six-digit code from the app, or a recovery code:",[211,714,716],{"className":213,"code":715,"language":215,"meta":216,"style":216},"curl -X POST http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fauth\u002Fmfa\u002Fverify \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"mfaToken\": \"eyJhbGciOiJIUzI1NiIs...\", \"code\": \"123456\" }'\n",[142,717,718,731,743],{"__ignoreMap":216},[220,719,720,722,724,726,729],{"class":222,"line":223},[220,721,275],{"class":226},[220,723,278],{"class":230},[220,725,281],{"class":230},[220,727,728],{"class":230}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fauth\u002Fmfa\u002Fverify",[220,730,287],{"class":253},[220,732,733,735,737,739,741],{"class":222,"line":290},[220,734,293],{"class":230},[220,736,296],{"class":234},[220,738,299],{"class":230},[220,740,302],{"class":234},[220,742,287],{"class":253},[220,744,745,747,749,752],{"class":222,"line":307},[220,746,310],{"class":230},[220,748,313],{"class":234},[220,750,751],{"class":230},"{ \"mfaToken\": \"eyJhbGciOiJIUzI1NiIs...\", \"code\": \"123456\" }",[220,753,337],{"class":234},[138,755,756,757,654],{},"The response is the same as a normal sign-in. Each code works once. Accepting an invitation with an existing account that uses two-step sign-in also needs ",[142,758,759],{},"mfaCode",[138,761,762,763,766,767,770,771,774,775,778,779,782],{},"Owners and admins can ",[147,764,765],{},"require"," two-step sign-in for everyone in the organisation (Settings → Security, or ",[142,768,769],{},"PUT \u002Fapi\u002Fauth\u002Fmfa\u002Forganisation"," with ",[142,772,773],{},"{ \"required\": true }","), once they use it themselves. Until a member turns it on, the only thing they can do is set it up: every other request is refused with ",[142,776,777],{},"403"," and ",[142,780,781],{},"\"code\": \"MFA_SETUP_REQUIRED\"",". While an organisation requires it, its members cannot turn it off. API keys are not affected.",[656,784,786],{"id":785},"refreshing-the-access-token","Refreshing the Access Token",[138,788,789],{},"Access tokens expire after 1 hour. Exchange the refresh token for a new pair without signing in again.",[791,792,794,844,951],"code-group",{"sync":793},"lang",[211,795,798],{"className":213,"code":796,"filename":797,"language":215,"meta":216,"style":216},"curl -X POST http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fauth\u002Frefresh \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"refreshToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n  }'\n","cURL",[142,799,800,813,825,833,838],{"__ignoreMap":216},[220,801,802,804,806,808,811],{"class":222,"line":223},[220,803,275],{"class":226},[220,805,278],{"class":230},[220,807,281],{"class":230},[220,809,810],{"class":230}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fauth\u002Frefresh",[220,812,287],{"class":253},[220,814,815,817,819,821,823],{"class":222,"line":290},[220,816,293],{"class":230},[220,818,296],{"class":234},[220,820,299],{"class":230},[220,822,302],{"class":234},[220,824,287],{"class":253},[220,826,827,829,831],{"class":222,"line":307},[220,828,310],{"class":230},[220,830,313],{"class":234},[220,832,316],{"class":230},[220,834,835],{"class":222,"line":319},[220,836,837],{"class":230},"    \"refreshToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n",[220,839,840,842],{"class":222,"line":325},[220,841,334],{"class":230},[220,843,337],{"class":234},[211,845,850],{"className":846,"code":847,"filename":848,"language":849,"meta":216,"style":216},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const tokens = await client.auth.refreshToken({\n  refreshToken: session.refreshToken,\n});\n\nconsole.log('New access token:', tokens.accessToken);\n","TypeScript","typescript",[142,851,852,885,902,913,919],{"__ignoreMap":216},[220,853,854,857,860,863,867,870,872,875,877,880,883],{"class":222,"line":223},[220,855,856],{"class":359},"const",[220,858,859],{"class":253}," tokens ",[220,861,862],{"class":234},"=",[220,864,866],{"class":865},"s7zQu"," await",[220,868,869],{"class":253}," client",[220,871,654],{"class":234},[220,873,874],{"class":253},"auth",[220,876,654],{"class":234},[220,878,382],{"class":879},"s2Zo4",[220,881,882],{"class":253},"(",[220,884,316],{"class":234},[220,886,887,891,893,896,898,900],{"class":222,"line":290},[220,888,890],{"class":889},"swJcz","  refreshToken",[220,892,365],{"class":234},[220,894,895],{"class":253}," session",[220,897,654],{"class":234},[220,899,382],{"class":253},[220,901,375],{"class":234},[220,903,904,907,910],{"class":222,"line":307},[220,905,906],{"class":234},"}",[220,908,909],{"class":253},")",[220,911,912],{"class":234},";\n",[220,914,915],{"class":222,"line":319},[220,916,918],{"emptyLinePlaceholder":917},true,"\n",[220,920,921,924,926,929,931,934,937,939,941,944,946,949],{"class":222,"line":325},[220,922,923],{"class":253},"console",[220,925,654],{"class":234},[220,927,928],{"class":879},"log",[220,930,882],{"class":253},[220,932,933],{"class":234},"'",[220,935,936],{"class":230},"New access token:",[220,938,933],{"class":234},[220,940,437],{"class":234},[220,942,943],{"class":253}," tokens",[220,945,654],{"class":234},[220,947,948],{"class":253},"accessToken)",[220,950,912],{"class":234},[211,952,957],{"className":953,"code":954,"filename":955,"language":956,"meta":216,"style":216},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tokens = client.auth.refresh_token(refresh_token=session.refresh_token)\n\nprint(f\"New access token: {tokens.access_token}\")\n","Python","python",[142,958,959,964,968],{"__ignoreMap":216},[220,960,961],{"class":222,"line":223},[220,962,963],{},"tokens = client.auth.refresh_token(refresh_token=session.refresh_token)\n",[220,965,966],{"class":222,"line":290},[220,967,918],{"emptyLinePlaceholder":917},[220,969,970],{"class":222,"line":307},[220,971,972],{},"print(f\"New access token: {tokens.access_token}\")\n",[156,974,975,988],{},[159,976,977],{},[162,978,979,982,985],{},[165,980,981],{},"Token",[165,983,984],{},"Lifetime",[165,986,987],{},"Setting",[175,989,990,1002],{},[162,991,992,994,997],{},[180,993,184],{},[180,995,996],{},"1 hour",[180,998,999],{},[142,1000,1001],{},"JWT_EXPIRATION",[162,1003,1004,1007,1010],{},[180,1005,1006],{},"Refresh token",[180,1008,1009],{},"7 days",[180,1011,1012],{},[142,1013,1014],{},"JWT_REFRESH_EXPIRATION",[138,1016,1017],{},"A refresh token stays valid until it expires, and stops working as soon as the person is deactivated or removed from the organisation.",[259,1019,1021],{"id":1020},"roles","Roles",[138,1023,1024],{},"Signed-in people are held to their role, read fresh on every request, so a role change or removal applies at once.",[156,1026,1027,1037],{},[159,1028,1029],{},[162,1030,1031,1034],{},[165,1032,1033],{},"Role",[165,1035,1036],{},"Can",[175,1038,1039,1048,1058,1068,1078],{},[162,1040,1041,1045],{},[180,1042,1043],{},[142,1044,409],{},[180,1046,1047],{},"Everything. Only owners can make, change or remove other owners",[162,1049,1050,1055],{},[180,1051,1052],{},[142,1053,1054],{},"ADMIN",[180,1056,1057],{},"Everything else: team, payment providers, organisation settings, billing and money",[162,1059,1060,1065],{},[180,1061,1062],{},[142,1063,1064],{},"FINANCE",[180,1066,1067],{},"Billing, collections, payouts and transfers, including approving payouts",[162,1069,1070,1075],{},[180,1071,1072],{},[142,1073,1074],{},"DEVELOPER",[180,1076,1077],{},"API keys, plus read access to everything",[162,1079,1080,1085],{},[180,1081,1082],{},[142,1083,1084],{},"VIEWER",[180,1086,1087],{},"Read only",[259,1089,1091],{"id":1090},"api-keys","API Keys",[138,1093,1094],{},"API keys are for server-to-server calls. Your organisation's first key comes back when you register; create more from the dashboard or the API.",[791,1096,1097,1164,1311],{"sync":793},[211,1098,1100],{"className":213,"code":1099,"filename":797,"language":215,"meta":216,"style":216},"curl -X POST http:\u002F\u002Flocalhost:4000\u002Fapi\u002Ftenants\u002Fme\u002Fapi-keys \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer sk_live_a1b2c3d4...\" \\\n  -d '{\n    \"name\": \"Production Key\",\n    \"scopes\": [\"customers:read\", \"customers:write\"]\n  }'\n",[142,1101,1102,1115,1127,1140,1148,1153,1158],{"__ignoreMap":216},[220,1103,1104,1106,1108,1110,1113],{"class":222,"line":223},[220,1105,275],{"class":226},[220,1107,278],{"class":230},[220,1109,281],{"class":230},[220,1111,1112],{"class":230}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Ftenants\u002Fme\u002Fapi-keys",[220,1114,287],{"class":253},[220,1116,1117,1119,1121,1123,1125],{"class":222,"line":290},[220,1118,293],{"class":230},[220,1120,296],{"class":234},[220,1122,299],{"class":230},[220,1124,302],{"class":234},[220,1126,287],{"class":253},[220,1128,1129,1131,1133,1136,1138],{"class":222,"line":307},[220,1130,293],{"class":230},[220,1132,296],{"class":234},[220,1134,1135],{"class":230},"Authorization: Bearer sk_live_a1b2c3d4...",[220,1137,302],{"class":234},[220,1139,287],{"class":253},[220,1141,1142,1144,1146],{"class":222,"line":319},[220,1143,310],{"class":230},[220,1145,313],{"class":234},[220,1147,316],{"class":230},[220,1149,1150],{"class":222,"line":325},[220,1151,1152],{"class":230},"    \"name\": \"Production Key\",\n",[220,1154,1155],{"class":222,"line":331},[220,1156,1157],{"class":230},"    \"scopes\": [\"customers:read\", \"customers:write\"]\n",[220,1159,1160,1162],{"class":222,"line":573},[220,1161,334],{"class":230},[220,1163,337],{"class":234},[211,1165,1167],{"className":846,"code":1166,"filename":848,"language":849,"meta":216,"style":216},"const apiKey = await client.apiKeys.create({\n  name: 'Production Key',\n  scopes: ['customers:read', 'customers:write'],\n});\n\nconsole.log('API Key:', apiKey.key);\nconsole.log('Key ID:', apiKey.id);\n",[142,1168,1169,1196,1212,1242,1250,1254,1283],{"__ignoreMap":216},[220,1170,1171,1173,1176,1178,1180,1182,1184,1187,1189,1192,1194],{"class":222,"line":223},[220,1172,856],{"class":359},[220,1174,1175],{"class":253}," apiKey ",[220,1177,862],{"class":234},[220,1179,866],{"class":865},[220,1181,869],{"class":253},[220,1183,654],{"class":234},[220,1185,1186],{"class":253},"apiKeys",[220,1188,654],{"class":234},[220,1190,1191],{"class":879},"create",[220,1193,882],{"class":253},[220,1195,316],{"class":234},[220,1197,1198,1201,1203,1205,1208,1210],{"class":222,"line":290},[220,1199,1200],{"class":889},"  name",[220,1202,365],{"class":234},[220,1204,313],{"class":234},[220,1206,1207],{"class":230},"Production Key",[220,1209,933],{"class":234},[220,1211,375],{"class":234},[220,1213,1214,1217,1219,1221,1223,1226,1228,1230,1232,1235,1237,1240],{"class":222,"line":307},[220,1215,1216],{"class":889},"  scopes",[220,1218,365],{"class":234},[220,1220,427],{"class":253},[220,1222,933],{"class":234},[220,1224,1225],{"class":230},"customers:read",[220,1227,933],{"class":234},[220,1229,437],{"class":234},[220,1231,313],{"class":234},[220,1233,1234],{"class":230},"customers:write",[220,1236,933],{"class":234},[220,1238,1239],{"class":253},"]",[220,1241,375],{"class":234},[220,1243,1244,1246,1248],{"class":222,"line":319},[220,1245,906],{"class":234},[220,1247,909],{"class":253},[220,1249,912],{"class":234},[220,1251,1252],{"class":222,"line":325},[220,1253,918],{"emptyLinePlaceholder":917},[220,1255,1256,1258,1260,1262,1264,1266,1269,1271,1273,1276,1278,1281],{"class":222,"line":331},[220,1257,923],{"class":253},[220,1259,654],{"class":234},[220,1261,928],{"class":879},[220,1263,882],{"class":253},[220,1265,933],{"class":234},[220,1267,1268],{"class":230},"API Key:",[220,1270,933],{"class":234},[220,1272,437],{"class":234},[220,1274,1275],{"class":253}," apiKey",[220,1277,654],{"class":234},[220,1279,1280],{"class":253},"key)",[220,1282,912],{"class":234},[220,1284,1285,1287,1289,1291,1293,1295,1298,1300,1302,1304,1306,1309],{"class":222,"line":573},[220,1286,923],{"class":253},[220,1288,654],{"class":234},[220,1290,928],{"class":879},[220,1292,882],{"class":253},[220,1294,933],{"class":234},[220,1296,1297],{"class":230},"Key ID:",[220,1299,933],{"class":234},[220,1301,437],{"class":234},[220,1303,1275],{"class":253},[220,1305,654],{"class":234},[220,1307,1308],{"class":253},"id)",[220,1310,912],{"class":234},[211,1312,1314],{"className":953,"code":1313,"filename":955,"language":956,"meta":216,"style":216},"api_key = client.api_keys.create(name=\"Production Key\", scopes=[\"customers:read\", \"customers:write\"])\n\nprint(f\"API Key: {api_key.key}\")\nprint(f\"Key ID: {api_key.id}\")\n",[142,1315,1316,1321,1325,1330],{"__ignoreMap":216},[220,1317,1318],{"class":222,"line":223},[220,1319,1320],{},"api_key = client.api_keys.create(name=\"Production Key\", scopes=[\"customers:read\", \"customers:write\"])\n",[220,1322,1323],{"class":222,"line":290},[220,1324,918],{"emptyLinePlaceholder":917},[220,1326,1327],{"class":222,"line":307},[220,1328,1329],{},"print(f\"API Key: {api_key.key}\")\n",[220,1331,1332],{"class":222,"line":319},[220,1333,1334],{},"print(f\"Key ID: {api_key.id}\")\n",[1336,1337,1338],"warning",{},"A key is shown in full only when it is created. Store it in an environment variable or a secrets manager; if you lose it, create a new one and delete the old one.",[656,1340,1342],{"id":1341},"scopes","Scopes",[138,1344,1345,1346,654],{},"Every key acts only within its scopes; a request outside them is refused with ",[142,1347,777],{},[156,1349,1350,1360],{},[159,1351,1352],{},[162,1353,1354,1357],{},[165,1355,1356],{},"Scope",[165,1358,1359],{},"Allows",[175,1361,1362,1374,1384,1402],{},[162,1363,1364,1368],{},[180,1365,1366],{},[142,1367,432],{},[180,1369,1370,1373],{},[142,1371,1372],{},"GET"," requests anywhere in the API",[162,1375,1376,1381],{},[180,1377,1378],{},[142,1379,1380],{},"write",[180,1382,1383],{},"Every request (write includes read)",[162,1385,1386,1391],{},[180,1387,1388],{},[142,1389,1390],{},"\u003Cresource>:read",[180,1392,1393,1395,1396,1398,1399],{},[142,1394,1372],{}," requests to one resource, e.g. ",[142,1397,1225],{}," covers ",[142,1400,1401],{},"\u002Fapi\u002Fcustomers\u002F...",[162,1403,1404,1409],{},[180,1405,1406],{},[142,1407,1408],{},"\u003Cresource>:write",[180,1410,1411,1412],{},"Every request to one resource, e.g. ",[142,1413,1414],{},"invoices:write",[138,1416,1417,1418,1420],{},"Give each system the narrowest scopes it needs: a reporting job only needs ",[142,1419,432],{},". Team management and payout approval always need a signed-in person, whatever the key's scopes.",[138,1422,1423,1424,1427,1428,1431],{},"Your organisation's own key (returned at registration) has full access. Keys are stored only as a hash, so the dashboard shows them masked; rotate the organisation key from ",[147,1425,1426],{},"Settings → API Keys"," or with ",[142,1429,1430],{},"POST \u002Fapi\u002Ftenants\u002Fme\u002Fapi-key\u002Frotate",", which returns the new key once and stops the old one at once.",[656,1433,1435],{"id":1434},"listing-api-keys","Listing API Keys",[791,1437,1438,1462,1578],{"sync":793},[211,1439,1441],{"className":213,"code":1440,"filename":797,"language":215,"meta":216,"style":216},"curl http:\u002F\u002Flocalhost:4000\u002Fapi\u002Ftenants\u002Fme\u002Fapi-keys \\\n  -H \"Authorization: Bearer sk_live_a1b2c3d4...\"\n",[142,1442,1443,1451],{"__ignoreMap":216},[220,1444,1445,1447,1449],{"class":222,"line":223},[220,1446,275],{"class":226},[220,1448,1112],{"class":230},[220,1450,287],{"class":253},[220,1452,1453,1455,1457,1459],{"class":222,"line":290},[220,1454,293],{"class":230},[220,1456,296],{"class":234},[220,1458,1135],{"class":230},[220,1460,1461],{"class":234},"\"\n",[211,1463,1465],{"className":846,"code":1464,"filename":848,"language":849,"meta":216,"style":216},"const keys = await client.apiKeys.list();\n\nfor (const key of keys) {\n  console.log(`${key.name} (${key.id}) - Created: ${key.createdAt}`);\n}\n",[142,1466,1467,1494,1498,1519,1574],{"__ignoreMap":216},[220,1468,1469,1471,1474,1476,1478,1480,1482,1484,1486,1489,1492],{"class":222,"line":223},[220,1470,856],{"class":359},[220,1472,1473],{"class":253}," keys ",[220,1475,862],{"class":234},[220,1477,866],{"class":865},[220,1479,869],{"class":253},[220,1481,654],{"class":234},[220,1483,1186],{"class":253},[220,1485,654],{"class":234},[220,1487,1488],{"class":879},"list",[220,1490,1491],{"class":253},"()",[220,1493,912],{"class":234},[220,1495,1496],{"class":222,"line":290},[220,1497,918],{"emptyLinePlaceholder":917},[220,1499,1500,1503,1506,1508,1511,1514,1517],{"class":222,"line":307},[220,1501,1502],{"class":865},"for",[220,1504,1505],{"class":253}," (",[220,1507,856],{"class":359},[220,1509,1510],{"class":253}," key ",[220,1512,1513],{"class":234},"of",[220,1515,1516],{"class":253}," keys) ",[220,1518,316],{"class":234},[220,1520,1521,1524,1526,1528,1530,1533,1536,1538,1540,1542,1544,1547,1549,1551,1553,1555,1558,1560,1562,1564,1567,1570,1572],{"class":222,"line":319},[220,1522,1523],{"class":253},"  console",[220,1525,654],{"class":234},[220,1527,928],{"class":879},[220,1529,882],{"class":889},[220,1531,1532],{"class":234},"`${",[220,1534,1535],{"class":253},"key",[220,1537,654],{"class":234},[220,1539,538],{"class":253},[220,1541,906],{"class":234},[220,1543,1505],{"class":230},[220,1545,1546],{"class":234},"${",[220,1548,1535],{"class":253},[220,1550,654],{"class":234},[220,1552,520],{"class":253},[220,1554,906],{"class":234},[220,1556,1557],{"class":230},") - Created: ",[220,1559,1546],{"class":234},[220,1561,1535],{"class":253},[220,1563,654],{"class":234},[220,1565,1566],{"class":253},"createdAt",[220,1568,1569],{"class":234},"}`",[220,1571,909],{"class":889},[220,1573,912],{"class":234},[220,1575,1576],{"class":222,"line":325},[220,1577,643],{"class":234},[211,1579,1581],{"className":953,"code":1580,"filename":955,"language":956,"meta":216,"style":216},"for key in client.api_keys.list():\n    print(f\"{key.name} ({key.id}) - Created: {key.created_at}\")\n",[142,1582,1583,1588],{"__ignoreMap":216},[220,1584,1585],{"class":222,"line":223},[220,1586,1587],{},"for key in client.api_keys.list():\n",[220,1589,1590],{"class":222,"line":290},[220,1591,1592],{},"    print(f\"{key.name} ({key.id}) - Created: {key.created_at}\")\n",[656,1594,1596],{"id":1595},"deleting-api-keys","Deleting API Keys",[138,1598,1599],{},"Delete a key as soon as it is compromised or no longer needed; requests with it fail immediately.",[791,1601,1602,1631,1665],{"sync":793},[211,1603,1605],{"className":213,"code":1604,"filename":797,"language":215,"meta":216,"style":216},"curl -X DELETE http:\u002F\u002Flocalhost:4000\u002Fapi\u002Ftenants\u002Fme\u002Fapi-keys\u002Fkey_m9n8o7p6q5r4 \\\n  -H \"Authorization: Bearer sk_live_a1b2c3d4...\"\n",[142,1606,1607,1621],{"__ignoreMap":216},[220,1608,1609,1611,1613,1616,1619],{"class":222,"line":223},[220,1610,275],{"class":226},[220,1612,278],{"class":230},[220,1614,1615],{"class":230}," DELETE",[220,1617,1618],{"class":230}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Ftenants\u002Fme\u002Fapi-keys\u002Fkey_m9n8o7p6q5r4",[220,1620,287],{"class":253},[220,1622,1623,1625,1627,1629],{"class":222,"line":290},[220,1624,293],{"class":230},[220,1626,296],{"class":234},[220,1628,1135],{"class":230},[220,1630,1461],{"class":234},[211,1632,1634],{"className":846,"code":1633,"filename":848,"language":849,"meta":216,"style":216},"await client.apiKeys.delete('key_m9n8o7p6q5r4');\n",[142,1635,1636],{"__ignoreMap":216},[220,1637,1638,1641,1643,1645,1647,1649,1652,1654,1656,1659,1661,1663],{"class":222,"line":223},[220,1639,1640],{"class":865},"await",[220,1642,869],{"class":253},[220,1644,654],{"class":234},[220,1646,1186],{"class":253},[220,1648,654],{"class":234},[220,1650,1651],{"class":879},"delete",[220,1653,882],{"class":253},[220,1655,933],{"class":234},[220,1657,1658],{"class":230},"key_m9n8o7p6q5r4",[220,1660,933],{"class":234},[220,1662,909],{"class":253},[220,1664,912],{"class":234},[211,1666,1668],{"className":953,"code":1667,"filename":955,"language":956,"meta":216,"style":216},"client.api_keys.delete(\"key_m9n8o7p6q5r4\")\n",[142,1669,1670],{"__ignoreMap":216},[220,1671,1672],{"class":222,"line":223},[220,1673,1667],{},[259,1675,1677],{"id":1676},"security-best-practices","Security Best Practices",[1679,1680,1681,1688,1716,1722,1728,1734],"ol",{},[1682,1683,1684,1687],"li",{},[147,1685,1686],{},"Keep keys on the server."," Never put an API key in browser JavaScript, a mobile app, or a link you give a customer; those call your own backend, which calls PimaBill. For the hosted customer portal, create a short-lived portal link instead (see below).",[1682,1689,1690,1693,1694],{},[147,1691,1692],{},"Use environment variables."," Never commit keys to source control.",[211,1695,1697],{"className":213,"code":1696,"language":215,"meta":216,"style":216},"export PIMABILL_API_KEY=\"sk_live_a1b2c3d4e5f6g7h8i9j0...\"\n",[142,1698,1699],{"__ignoreMap":216},[220,1700,1701,1704,1707,1709,1711,1714],{"class":222,"line":223},[220,1702,1703],{"class":359},"export",[220,1705,1706],{"class":253}," PIMABILL_API_KEY",[220,1708,862],{"class":234},[220,1710,302],{"class":234},[220,1712,1713],{"class":230},"sk_live_a1b2c3d4e5f6g7h8i9j0...",[220,1715,1461],{"class":234},[1682,1717,1718,1721],{},[147,1719,1720],{},"One key per service and environment."," Separate keys for development, staging and production, and per service, so one can be deleted without touching the others.",[1682,1723,1724,1727],{},[147,1725,1726],{},"Rotate keys."," Create a new key, deploy it, then delete the old one.",[1682,1729,1730,1733],{},[147,1731,1732],{},"Review usage."," Each key records when it was last used.",[1682,1735,1736,1739],{},[147,1737,1738],{},"Use two-step sign-in"," for everyone who signs in to the dashboard, and require it for the organisation once your team has it on.",[259,1741,1743],{"id":1742},"error-responses","Error Responses",[656,1745,1747],{"id":1746},"_401-unauthorized","401 Unauthorized",[138,1749,1750],{},"No credentials, or an invalid or expired token or key.",[211,1752,1754],{"className":343,"code":1753,"language":345,"meta":216,"style":216},"{\n  \"statusCode\": 401,\n  \"message\": \"Invalid credentials\"\n}\n",[142,1755,1756,1760,1777,1795],{"__ignoreMap":216},[220,1757,1758],{"class":222,"line":223},[220,1759,316],{"class":234},[220,1761,1762,1764,1767,1769,1771,1775],{"class":222,"line":290},[220,1763,356],{"class":234},[220,1765,1766],{"class":359},"statusCode",[220,1768,302],{"class":234},[220,1770,365],{"class":234},[220,1772,1774],{"class":1773},"sbssI"," 401",[220,1776,375],{"class":234},[220,1778,1779,1781,1784,1786,1788,1790,1793],{"class":222,"line":307},[220,1780,356],{"class":234},[220,1782,1783],{"class":359},"message",[220,1785,302],{"class":234},[220,1787,365],{"class":234},[220,1789,296],{"class":234},[220,1791,1792],{"class":230},"Invalid credentials",[220,1794,1461],{"class":234},[220,1796,1797],{"class":222,"line":319},[220,1798,643],{"class":234},[656,1800,1802],{"id":1801},"_403-forbidden","403 Forbidden",[138,1804,1805],{},"The credentials are valid, but the person's role does not allow this.",[211,1807,1809],{"className":343,"code":1808,"language":345,"meta":216,"style":216},"{\n  \"statusCode\": 403,\n  \"message\": \"Your role (viewer) cannot do this. Ask an owner or admin.\"\n}\n",[142,1810,1811,1815,1830,1847],{"__ignoreMap":216},[220,1812,1813],{"class":222,"line":223},[220,1814,316],{"class":234},[220,1816,1817,1819,1821,1823,1825,1828],{"class":222,"line":290},[220,1818,356],{"class":234},[220,1820,1766],{"class":359},[220,1822,302],{"class":234},[220,1824,365],{"class":234},[220,1826,1827],{"class":1773}," 403",[220,1829,375],{"class":234},[220,1831,1832,1834,1836,1838,1840,1842,1845],{"class":222,"line":307},[220,1833,356],{"class":234},[220,1835,1783],{"class":359},[220,1837,302],{"class":234},[220,1839,365],{"class":234},[220,1841,296],{"class":234},[220,1843,1844],{"class":230},"Your role (viewer) cannot do this. Ask an owner or admin.",[220,1846,1461],{"class":234},[220,1848,1849],{"class":222,"line":319},[220,1850,643],{"class":234},[656,1852,1854],{"id":1853},"_429-too-many-requests","429 Too Many Requests",[138,1856,1857],{},"More than 100 requests in a minute from one address.",[211,1859,1861],{"className":343,"code":1860,"language":345,"meta":216,"style":216},"{\n  \"statusCode\": 429,\n  \"message\": \"ThrottlerException: Too Many Requests\"\n}\n",[142,1862,1863,1867,1882,1899],{"__ignoreMap":216},[220,1864,1865],{"class":222,"line":223},[220,1866,316],{"class":234},[220,1868,1869,1871,1873,1875,1877,1880],{"class":222,"line":290},[220,1870,356],{"class":234},[220,1872,1766],{"class":359},[220,1874,302],{"class":234},[220,1876,365],{"class":234},[220,1878,1879],{"class":1773}," 429",[220,1881,375],{"class":234},[220,1883,1884,1886,1888,1890,1892,1894,1897],{"class":222,"line":307},[220,1885,356],{"class":234},[220,1887,1783],{"class":359},[220,1889,302],{"class":234},[220,1891,365],{"class":234},[220,1893,296],{"class":234},[220,1895,1896],{"class":230},"ThrottlerException: Too Many Requests",[220,1898,1461],{"class":234},[220,1900,1901],{"class":222,"line":319},[220,1902,643],{"class":234},[259,1904,1906],{"id":1905},"customer-portal-links","Customer Portal Links",[138,1908,1909,1910,1913],{},"The hosted customer portal is opened with a ",[147,1911,1912],{},"portal token",", never an API key: an API key in a link would give the customer full access to your account. Your server asks for a link for one customer, and hands that link to the customer:",[211,1915,1917],{"className":213,"code":1916,"language":215,"meta":216,"style":216},"curl -X POST http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fportal\u002Fcustomers\u002F{externalId}\u002Fsessions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer sk_live_a1b2c3d4...\" \\\n  -d '{ \"expiresInMinutes\": 60 }'\n",[142,1918,1919,1932,1944,1956],{"__ignoreMap":216},[220,1920,1921,1923,1925,1927,1930],{"class":222,"line":223},[220,1922,275],{"class":226},[220,1924,278],{"class":230},[220,1926,281],{"class":230},[220,1928,1929],{"class":230}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fportal\u002Fcustomers\u002F{externalId}\u002Fsessions",[220,1931,287],{"class":253},[220,1933,1934,1936,1938,1940,1942],{"class":222,"line":290},[220,1935,293],{"class":230},[220,1937,296],{"class":234},[220,1939,299],{"class":230},[220,1941,302],{"class":234},[220,1943,287],{"class":253},[220,1945,1946,1948,1950,1952,1954],{"class":222,"line":307},[220,1947,293],{"class":230},[220,1949,296],{"class":234},[220,1951,1135],{"class":230},[220,1953,302],{"class":234},[220,1955,287],{"class":253},[220,1957,1958,1960,1962,1965],{"class":222,"line":319},[220,1959,310],{"class":230},[220,1961,313],{"class":234},[220,1963,1964],{"class":230},"{ \"expiresInMinutes\": 60 }",[220,1966,337],{"class":234},[138,1968,1969,1970,1973,1974,778,1977,1980,1981,1984],{},"The response has the ",[142,1971,1972],{},"token",", the ready-to-use ",[142,1975,1976],{},"url",[142,1978,1979],{},"expiresAt",". A portal token works only for that customer's portal routes (their billing, invoices, invoice PDFs, payments and checkout), and for at most 7 days. Links that carry ",[142,1982,1983],{},"?key="," no longer work.",[1986,1987,1988],"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);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":216,"searchDepth":290,"depth":290,"links":1990},[1991,1995,1996,2001,2002,2007],{"id":261,"depth":290,"text":262,"children":1992},[1993,1994],{"id":658,"depth":307,"text":659},{"id":785,"depth":307,"text":786},{"id":1020,"depth":290,"text":1021},{"id":1090,"depth":290,"text":1091,"children":1997},[1998,1999,2000],{"id":1341,"depth":307,"text":1342},{"id":1434,"depth":307,"text":1435},{"id":1595,"depth":307,"text":1596},{"id":1676,"depth":290,"text":1677},{"id":1742,"depth":290,"text":1743,"children":2003},[2004,2005,2006],{"id":1746,"depth":307,"text":1747},{"id":1801,"depth":307,"text":1802},{"id":1853,"depth":307,"text":1854},{"id":1905,"depth":290,"text":1906},"How PimaBill authenticates people signed in to the dashboard and servers calling the API with an API key.","md",null,{},{"title":18,"description":2008},"QHdtCfAq4Fd_LzifsGvZkCONU6lc2ok-qHLAS92_qnM",[2015,2017],{"title":14,"path":15,"stem":16,"description":2016,"children":-1},"Get up and running with PimaBill in under 5 minutes.",{"title":22,"path":23,"stem":24,"description":2018,"children":-1},"Run PimaBill on your own servers with Docker, and what differs from the hosted cloud.",1793401242783]