[{"data":1,"prerenderedAt":2557},["ShallowReactive",2],{"apis-partner-authentication":3},{"id":4,"title":5,"body":6,"description":2549,"extension":2550,"meta":2551,"navigation":583,"path":2553,"seo":2554,"stem":2555,"__hash__":2556},"content/apis/partner/authentication.md","Partner API Authentication",{"type":7,"value":8,"toc":2517},"minimal",[9,13,17,39,42,47,50,89,91,95,102,107,110,132,136,139,159,178,180,184,190,193,200,210,214,219,222,269,274,277,282,289,308,313,316,398,403,469,474,477,535,537,541,548,552,625,629,634,637,719,724,730,922,1087,1091,1096,1137,1141,1183,1187,1194,1228,1230,1234,1238,1241,1253,1259,1263,1266,1548,1550,1554,1558,1561,1576,1580,1588,1591,1600,1603,1605,1609,1613,1617,1652,1658,1663,1696,1701,1706,1739,1744,1746,1750,1783,1785,1789,1792,2467,2469,2473,2476,2484,2486,2490,2493,2513],[10,11,5],"h1",{"id":12},"partner-api-authentication",[14,15,16],"p",{},"The Partner API uses OAuth 2.0 for authentication with two different flows depending on the endpoint. This guide explains how to set up authentication and make authorized API calls.",[18,19,22],"guide-alert",{"title":20,"type":21},"Two APIs, Two Auth Methods","info",[14,23,24,28,29,32,33,38],{},[25,26,27],"strong",{},"Partner API"," and ",[25,30,31],{},"Partner Event API"," have different authentication methods. This document covers Partner API authentication. For Partner Event API authentication, see the ",[34,35,37],"a",{"href":36},"/apis/partner/event-api#authentication","Event API documentation",".",[40,41],"hr",{},[43,44,46],"h2",{"id":45},"overview","Overview",[14,48,49],{},"The Partner API requires different authentication methods based on the endpoint:",[51,52,53,66],"table",{},[54,55,56],"thead",{},[57,58,59,63],"tr",{},[60,61,62],"th",{},"Endpoint",[60,64,65],{},"Authentication Method",[67,68,69,81],"tbody",{},[57,70,71,78],{},[72,73,74],"td",{},[75,76,77],"code",{},"/partner/v1/dealers/connect",[72,79,80],{},"OAuth 2.0 Authorization Code Flow",[57,82,83,86],{},[72,84,85],{},"All other endpoints",[72,87,88],{},"OAuth 2.0 Client Credentials Grant (M2M)",[40,90],{},[43,92,94],{"id":93},"step-1-register-auth-application","Step 1: Register Auth Application",[14,96,97,98,101],{},"Before you can use the Partner API, you must register an ",[25,99,100],{},"Auth Application"," with CHeKT to obtain credentials for M2M (Machine-to-Machine) authentication.",[103,104,106],"h3",{"id":105},"registration-requirements","Registration Requirements",[14,108,109],{},"Contact CHeKT support to register your Auth Application. You will need to provide:",[111,112,113,120,126],"ul",{},[114,115,116,119],"li",{},[25,117,118],{},"Application Name",": Your platform or company name",[114,121,122,125],{},[25,123,124],{},"Public Key",": Your RSA public key for JWT signing verification",[114,127,128,131],{},[25,129,130],{},"Additional Information",": Platform details, integration scope, and technical contact",[103,133,135],{"id":134},"what-you-receive","What You Receive",[14,137,138],{},"After registration, you will receive:",[111,140,141,147,153],{},[114,142,143,146],{},[25,144,145],{},"Client ID",": Your application identifier",[114,148,149,152],{},[25,150,151],{},"Secret Key",": Your private secret for signing assertions",[114,154,155,158],{},[25,156,157],{},"Auth Server URL",": The token endpoint for authentication",[18,160,163],{"title":161,"type":162},"Keep Credentials Secure","warning",[111,164,165,172,175],{},[114,166,167,168,171],{},"Store your ",[25,169,170],{},"secret key"," securely - never commit it to version control",[114,173,174],{},"Treat credentials like passwords",[114,176,177],{},"Rotate keys periodically for enhanced security",[40,179],{},[43,181,183],{"id":182},"step-2-dealer-connection-flow","Step 2: Dealer Connection Flow",[14,185,186,187,189],{},"The ",[75,188,77],{}," endpoint requires a special authentication flow to establish the relationship between dealers on both platforms.",[103,191,80],{"id":192},"oauth-20-authorization-code-flow",[14,194,195,196,199],{},"This endpoint uses the ",[25,197,198],{},"Authorization Code Flow"," to authenticate users and exchange dealer information between platforms.",[18,201,203],{"title":202,"type":21},"Separate Auth Application Required",[14,204,205,206,209],{},"You need a ",[25,207,208],{},"second Auth Application"," specifically for the Authorization Code Flow. Contact CHeKT support to register this additional application.",[103,211,213],{"id":212},"authorization-code-flow-steps","Authorization Code Flow Steps",[14,215,216],{},[25,217,218],{},"1. User Authorization Request",[14,220,221],{},"Redirect the user to CHeKT's authorization endpoint:",[223,224,229],"pre",{"className":225,"code":226,"language":227,"meta":228,"style":228},"language-http shiki shiki-themes github-light github-dark","GET https://auth.chekt.com/oauth/authorize?\n  response_type=code&\n  client_id=YOUR_CLIENT_ID&\n  redirect_uri=YOUR_REDIRECT_URI&\n  scope=dealer:connect&\n  state=RANDOM_STATE_STRING\n","http","",[75,230,231,239,245,251,257,263],{"__ignoreMap":228},[232,233,236],"span",{"class":234,"line":235},"line",1,[232,237,238],{},"GET https://auth.chekt.com/oauth/authorize?\n",[232,240,242],{"class":234,"line":241},2,[232,243,244],{},"  response_type=code&\n",[232,246,248],{"class":234,"line":247},3,[232,249,250],{},"  client_id=YOUR_CLIENT_ID&\n",[232,252,254],{"class":234,"line":253},4,[232,255,256],{},"  redirect_uri=YOUR_REDIRECT_URI&\n",[232,258,260],{"class":234,"line":259},5,[232,261,262],{},"  scope=dealer:connect&\n",[232,264,266],{"class":234,"line":265},6,[232,267,268],{},"  state=RANDOM_STATE_STRING\n",[14,270,271],{},[25,272,273],{},"2. User Grants Permission",[14,275,276],{},"The user logs in to CHeKT and authorizes your application to access their dealer information.",[14,278,279],{},[25,280,281],{},"3. Receive Authorization Code",[14,283,284,285,288],{},"CHeKT redirects back to your ",[75,286,287],{},"redirect_uri"," with an authorization code:",[223,290,292],{"className":225,"code":291,"language":227,"meta":228,"style":228},"GET https://yourapp.com/callback?\n  code=AUTHORIZATION_CODE&\n  state=RANDOM_STATE_STRING\n",[75,293,294,299,304],{"__ignoreMap":228},[232,295,296],{"class":234,"line":235},[232,297,298],{},"GET https://yourapp.com/callback?\n",[232,300,301],{"class":234,"line":241},[232,302,303],{},"  code=AUTHORIZATION_CODE&\n",[232,305,306],{"class":234,"line":247},[232,307,268],{},[14,309,310],{},[25,311,312],{},"4. Exchange Code for Access Token",[14,314,315],{},"Make a POST request to exchange the authorization code for an access token:",[223,317,321],{"className":318,"code":319,"language":320,"meta":228,"style":228},"language-bash shiki shiki-themes github-light github-dark","curl -X POST https://auth.chekt.com/oauth/token \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"grant_type=authorization_code\" \\\n  -d \"code=AUTHORIZATION_CODE\" \\\n  -d \"client_id=YOUR_CLIENT_ID\" \\\n  -d \"client_secret=YOUR_CLIENT_SECRET\" \\\n  -d \"redirect_uri=YOUR_REDIRECT_URI\"\n","bash",[75,322,323,343,353,363,372,381,390],{"__ignoreMap":228},[232,324,325,329,333,337,340],{"class":234,"line":235},[232,326,328],{"class":327},"sScJk","curl",[232,330,332],{"class":331},"sj4cs"," -X",[232,334,336],{"class":335},"sZZnC"," POST",[232,338,339],{"class":335}," https://auth.chekt.com/oauth/token",[232,341,342],{"class":331}," \\\n",[232,344,345,348,351],{"class":234,"line":241},[232,346,347],{"class":331},"  -H",[232,349,350],{"class":335}," \"Content-Type: application/x-www-form-urlencoded\"",[232,352,342],{"class":331},[232,354,355,358,361],{"class":234,"line":247},[232,356,357],{"class":331},"  -d",[232,359,360],{"class":335}," \"grant_type=authorization_code\"",[232,362,342],{"class":331},[232,364,365,367,370],{"class":234,"line":253},[232,366,357],{"class":331},[232,368,369],{"class":335}," \"code=AUTHORIZATION_CODE\"",[232,371,342],{"class":331},[232,373,374,376,379],{"class":234,"line":259},[232,375,357],{"class":331},[232,377,378],{"class":335}," \"client_id=YOUR_CLIENT_ID\"",[232,380,342],{"class":331},[232,382,383,385,388],{"class":234,"line":265},[232,384,357],{"class":331},[232,386,387],{"class":335}," \"client_secret=YOUR_CLIENT_SECRET\"",[232,389,342],{"class":331},[232,391,393,395],{"class":234,"line":392},7,[232,394,357],{"class":331},[232,396,397],{"class":335}," \"redirect_uri=YOUR_REDIRECT_URI\"\n",[14,399,400],{},[25,401,402],{},"Response:",[223,404,408],{"className":405,"code":406,"language":407,"meta":228,"style":228},"language-json shiki shiki-themes github-light github-dark","{\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"refresh_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n}\n","json",[75,409,410,416,430,442,454,464],{"__ignoreMap":228},[232,411,412],{"class":234,"line":235},[232,413,415],{"class":414},"sVt8B","{\n",[232,417,418,421,424,427],{"class":234,"line":241},[232,419,420],{"class":331},"  \"access_token\"",[232,422,423],{"class":414},": ",[232,425,426],{"class":335},"\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"",[232,428,429],{"class":414},",\n",[232,431,432,435,437,440],{"class":234,"line":247},[232,433,434],{"class":331},"  \"token_type\"",[232,436,423],{"class":414},[232,438,439],{"class":335},"\"Bearer\"",[232,441,429],{"class":414},[232,443,444,447,449,452],{"class":234,"line":253},[232,445,446],{"class":331},"  \"expires_in\"",[232,448,423],{"class":414},[232,450,451],{"class":331},"3600",[232,453,429],{"class":414},[232,455,456,459,461],{"class":234,"line":259},[232,457,458],{"class":331},"  \"refresh_token\"",[232,460,423],{"class":414},[232,462,463],{"class":335},"\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n",[232,465,466],{"class":234,"line":265},[232,467,468],{"class":414},"}\n",[14,470,471],{},[25,472,473],{},"5. Call Dealer Connect API",[14,475,476],{},"Use the access token to call the dealer connect endpoint:",[223,478,480],{"className":318,"code":479,"language":320,"meta":228,"style":228},"curl -X POST https://api.chekt.com/partner/v1/dealers/connect \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"partner_dealer_id\": \"your_dealer_id\",\n    \"dealer_name\": \"Dealer Name\"\n  }'\n",[75,481,482,495,504,513,520,525,530],{"__ignoreMap":228},[232,483,484,486,488,490,493],{"class":234,"line":235},[232,485,328],{"class":327},[232,487,332],{"class":331},[232,489,336],{"class":335},[232,491,492],{"class":335}," https://api.chekt.com/partner/v1/dealers/connect",[232,494,342],{"class":331},[232,496,497,499,502],{"class":234,"line":241},[232,498,347],{"class":331},[232,500,501],{"class":335}," \"Authorization: Bearer YOUR_ACCESS_TOKEN\"",[232,503,342],{"class":331},[232,505,506,508,511],{"class":234,"line":247},[232,507,347],{"class":331},[232,509,510],{"class":335}," \"Content-Type: application/json\"",[232,512,342],{"class":331},[232,514,515,517],{"class":234,"line":253},[232,516,357],{"class":331},[232,518,519],{"class":335}," '{\n",[232,521,522],{"class":234,"line":259},[232,523,524],{"class":335},"    \"partner_dealer_id\": \"your_dealer_id\",\n",[232,526,527],{"class":234,"line":265},[232,528,529],{"class":335},"    \"dealer_name\": \"Dealer Name\"\n",[232,531,532],{"class":234,"line":392},[232,533,534],{"class":335},"  }'\n",[40,536],{},[43,538,540],{"id":539},"step-3-m2m-authentication-for-all-other-endpoints","Step 3: M2M Authentication for All Other Endpoints",[14,542,543,544,547],{},"Once dealers are connected, all other Partner API endpoints use ",[25,545,546],{},"OAuth 2.0 Client Credentials Grant"," with JWT assertion tokens.",[103,549,551],{"id":550},"authentication-flow","Authentication Flow",[223,553,557],{"className":554,"code":555,"language":556,"meta":228,"style":228},"language-mermaid shiki shiki-themes github-light github-dark","sequenceDiagram\n    participant Partner as Your Platform\n    participant Auth as CHeKT Auth Server\n    participant API as Partner API\n\n    Partner->>Partner: Create JWT Assertion Token\n    Partner->>Partner: Sign with M2M Secret\n    Partner->>Auth: POST /oauth/token (with assertion)\n    Auth->>Auth: Verify signature\n    Auth->>Partner: Return access_token\n    Partner->>API: API Request (Bearer token)\n    API->>Partner: API Response\n","mermaid",[75,558,559,564,569,574,579,585,590,595,601,607,613,619],{"__ignoreMap":228},[232,560,561],{"class":234,"line":235},[232,562,563],{},"sequenceDiagram\n",[232,565,566],{"class":234,"line":241},[232,567,568],{},"    participant Partner as Your Platform\n",[232,570,571],{"class":234,"line":247},[232,572,573],{},"    participant Auth as CHeKT Auth Server\n",[232,575,576],{"class":234,"line":253},[232,577,578],{},"    participant API as Partner API\n",[232,580,581],{"class":234,"line":259},[232,582,584],{"emptyLinePlaceholder":583},true,"\n",[232,586,587],{"class":234,"line":265},[232,588,589],{},"    Partner->>Partner: Create JWT Assertion Token\n",[232,591,592],{"class":234,"line":392},[232,593,594],{},"    Partner->>Partner: Sign with M2M Secret\n",[232,596,598],{"class":234,"line":597},8,[232,599,600],{},"    Partner->>Auth: POST /oauth/token (with assertion)\n",[232,602,604],{"class":234,"line":603},9,[232,605,606],{},"    Auth->>Auth: Verify signature\n",[232,608,610],{"class":234,"line":609},10,[232,611,612],{},"    Auth->>Partner: Return access_token\n",[232,614,616],{"class":234,"line":615},11,[232,617,618],{},"    Partner->>API: API Request (Bearer token)\n",[232,620,622],{"class":234,"line":621},12,[232,623,624],{},"    API->>Partner: API Response\n",[103,626,628],{"id":627},"create-jwt-assertion-token","Create JWT Assertion Token",[14,630,631],{},[25,632,633],{},"1. Build JWT Claims",[14,635,636],{},"Create a JWT with the following claims:",[223,638,640],{"className":405,"code":639,"language":407,"meta":228,"style":228},"{\n  \"iss\": \"YOUR_CLIENT_ID\",\n  \"sub\": \"YOUR_CLIENT_ID\",\n  \"aud\": \"https://auth.chekt.com\",\n  \"exp\": 1234567890,\n  \"iat\": 1234567800,\n  \"jti\": \"unique-jwt-id\"\n}\n",[75,641,642,646,658,669,681,693,705,715],{"__ignoreMap":228},[232,643,644],{"class":234,"line":235},[232,645,415],{"class":414},[232,647,648,651,653,656],{"class":234,"line":241},[232,649,650],{"class":331},"  \"iss\"",[232,652,423],{"class":414},[232,654,655],{"class":335},"\"YOUR_CLIENT_ID\"",[232,657,429],{"class":414},[232,659,660,663,665,667],{"class":234,"line":247},[232,661,662],{"class":331},"  \"sub\"",[232,664,423],{"class":414},[232,666,655],{"class":335},[232,668,429],{"class":414},[232,670,671,674,676,679],{"class":234,"line":253},[232,672,673],{"class":331},"  \"aud\"",[232,675,423],{"class":414},[232,677,678],{"class":335},"\"https://auth.chekt.com\"",[232,680,429],{"class":414},[232,682,683,686,688,691],{"class":234,"line":259},[232,684,685],{"class":331},"  \"exp\"",[232,687,423],{"class":414},[232,689,690],{"class":331},"1234567890",[232,692,429],{"class":414},[232,694,695,698,700,703],{"class":234,"line":265},[232,696,697],{"class":331},"  \"iat\"",[232,699,423],{"class":414},[232,701,702],{"class":331},"1234567800",[232,704,429],{"class":414},[232,706,707,710,712],{"class":234,"line":392},[232,708,709],{"class":331},"  \"jti\"",[232,711,423],{"class":414},[232,713,714],{"class":335},"\"unique-jwt-id\"\n",[232,716,717],{"class":234,"line":597},[232,718,468],{"class":414},[14,720,721],{},[25,722,723],{},"2. Sign with M2M Secret Key",[14,725,726,727,729],{},"Sign the JWT using your M2M ",[25,728,170],{}," (RS256 algorithm):",[223,731,735],{"className":732,"code":733,"language":734,"meta":228,"style":228},"language-javascript shiki shiki-themes github-light github-dark","// Node.js example\nconst jwt = require('jsonwebtoken');\n\nconst assertion = jwt.sign(\n  {\n    iss: 'YOUR_CLIENT_ID',\n    sub: 'YOUR_CLIENT_ID',\n    aud: 'https://auth.chekt.com',\n    exp: Math.floor(Date.now() / 1000) + 300, // 5 minutes\n    iat: Math.floor(Date.now() / 1000),\n    jti: generateUniqueId()\n  },\n  YOUR_SECRET_KEY,\n  { algorithm: 'RS256' }\n);\n","javascript",[75,736,737,743,767,771,789,794,804,813,823,861,881,892,897,905,917],{"__ignoreMap":228},[232,738,739],{"class":234,"line":235},[232,740,742],{"class":741},"sJ8bj","// Node.js example\n",[232,744,745,749,752,755,758,761,764],{"class":234,"line":241},[232,746,748],{"class":747},"szBVR","const",[232,750,751],{"class":331}," jwt",[232,753,754],{"class":747}," =",[232,756,757],{"class":327}," require",[232,759,760],{"class":414},"(",[232,762,763],{"class":335},"'jsonwebtoken'",[232,765,766],{"class":414},");\n",[232,768,769],{"class":234,"line":247},[232,770,584],{"emptyLinePlaceholder":583},[232,772,773,775,778,780,783,786],{"class":234,"line":253},[232,774,748],{"class":747},[232,776,777],{"class":331}," assertion",[232,779,754],{"class":747},[232,781,782],{"class":414}," jwt.",[232,784,785],{"class":327},"sign",[232,787,788],{"class":414},"(\n",[232,790,791],{"class":234,"line":259},[232,792,793],{"class":414},"  {\n",[232,795,796,799,802],{"class":234,"line":265},[232,797,798],{"class":414},"    iss: ",[232,800,801],{"class":335},"'YOUR_CLIENT_ID'",[232,803,429],{"class":414},[232,805,806,809,811],{"class":234,"line":392},[232,807,808],{"class":414},"    sub: ",[232,810,801],{"class":335},[232,812,429],{"class":414},[232,814,815,818,821],{"class":234,"line":597},[232,816,817],{"class":414},"    aud: ",[232,819,820],{"class":335},"'https://auth.chekt.com'",[232,822,429],{"class":414},[232,824,825,828,831,834,837,840,843,846,849,852,855,858],{"class":234,"line":603},[232,826,827],{"class":414},"    exp: Math.",[232,829,830],{"class":327},"floor",[232,832,833],{"class":414},"(Date.",[232,835,836],{"class":327},"now",[232,838,839],{"class":414},"() ",[232,841,842],{"class":747},"/",[232,844,845],{"class":331}," 1000",[232,847,848],{"class":414},") ",[232,850,851],{"class":747},"+",[232,853,854],{"class":331}," 300",[232,856,857],{"class":414},", ",[232,859,860],{"class":741},"// 5 minutes\n",[232,862,863,866,868,870,872,874,876,878],{"class":234,"line":609},[232,864,865],{"class":414},"    iat: Math.",[232,867,830],{"class":327},[232,869,833],{"class":414},[232,871,836],{"class":327},[232,873,839],{"class":414},[232,875,842],{"class":747},[232,877,845],{"class":331},[232,879,880],{"class":414},"),\n",[232,882,883,886,889],{"class":234,"line":615},[232,884,885],{"class":414},"    jti: ",[232,887,888],{"class":327},"generateUniqueId",[232,890,891],{"class":414},"()\n",[232,893,894],{"class":234,"line":621},[232,895,896],{"class":414},"  },\n",[232,898,900,903],{"class":234,"line":899},13,[232,901,902],{"class":331},"  YOUR_SECRET_KEY",[232,904,429],{"class":414},[232,906,908,911,914],{"class":234,"line":907},14,[232,909,910],{"class":414},"  { algorithm: ",[232,912,913],{"class":335},"'RS256'",[232,915,916],{"class":414}," }\n",[232,918,920],{"class":234,"line":919},15,[232,921,766],{"class":414},[223,923,927],{"className":924,"code":925,"language":926,"meta":228,"style":228},"language-python shiki shiki-themes github-light github-dark","# Python example\nimport jwt\nimport time\nimport uuid\n\nassertion = jwt.encode(\n    {\n        \"iss\": \"YOUR_CLIENT_ID\",\n        \"sub\": \"YOUR_CLIENT_ID\",\n        \"aud\": \"https://auth.chekt.com\",\n        \"exp\": int(time.time()) + 300,  # 5 minutes\n        \"iat\": int(time.time()),\n        \"jti\": str(uuid.uuid4())\n    },\n    YOUR_SECRET_KEY,\n    algorithm=\"RS256\"\n)\n","python",[75,928,929,934,942,949,956,960,971,976,987,998,1009,1032,1044,1057,1062,1069,1081],{"__ignoreMap":228},[232,930,931],{"class":234,"line":235},[232,932,933],{"class":741},"# Python example\n",[232,935,936,939],{"class":234,"line":241},[232,937,938],{"class":747},"import",[232,940,941],{"class":414}," jwt\n",[232,943,944,946],{"class":234,"line":247},[232,945,938],{"class":747},[232,947,948],{"class":414}," time\n",[232,950,951,953],{"class":234,"line":253},[232,952,938],{"class":747},[232,954,955],{"class":414}," uuid\n",[232,957,958],{"class":234,"line":259},[232,959,584],{"emptyLinePlaceholder":583},[232,961,962,965,968],{"class":234,"line":265},[232,963,964],{"class":414},"assertion ",[232,966,967],{"class":747},"=",[232,969,970],{"class":414}," jwt.encode(\n",[232,972,973],{"class":234,"line":392},[232,974,975],{"class":414},"    {\n",[232,977,978,981,983,985],{"class":234,"line":597},[232,979,980],{"class":335},"        \"iss\"",[232,982,423],{"class":414},[232,984,655],{"class":335},[232,986,429],{"class":414},[232,988,989,992,994,996],{"class":234,"line":603},[232,990,991],{"class":335},"        \"sub\"",[232,993,423],{"class":414},[232,995,655],{"class":335},[232,997,429],{"class":414},[232,999,1000,1003,1005,1007],{"class":234,"line":609},[232,1001,1002],{"class":335},"        \"aud\"",[232,1004,423],{"class":414},[232,1006,678],{"class":335},[232,1008,429],{"class":414},[232,1010,1011,1014,1016,1019,1022,1024,1026,1029],{"class":234,"line":615},[232,1012,1013],{"class":335},"        \"exp\"",[232,1015,423],{"class":414},[232,1017,1018],{"class":331},"int",[232,1020,1021],{"class":414},"(time.time()) ",[232,1023,851],{"class":747},[232,1025,854],{"class":331},[232,1027,1028],{"class":414},",  ",[232,1030,1031],{"class":741},"# 5 minutes\n",[232,1033,1034,1037,1039,1041],{"class":234,"line":621},[232,1035,1036],{"class":335},"        \"iat\"",[232,1038,423],{"class":414},[232,1040,1018],{"class":331},[232,1042,1043],{"class":414},"(time.time()),\n",[232,1045,1046,1049,1051,1054],{"class":234,"line":899},[232,1047,1048],{"class":335},"        \"jti\"",[232,1050,423],{"class":414},[232,1052,1053],{"class":331},"str",[232,1055,1056],{"class":414},"(uuid.uuid4())\n",[232,1058,1059],{"class":234,"line":907},[232,1060,1061],{"class":414},"    },\n",[232,1063,1064,1067],{"class":234,"line":919},[232,1065,1066],{"class":331},"    YOUR_SECRET_KEY",[232,1068,429],{"class":414},[232,1070,1072,1076,1078],{"class":234,"line":1071},16,[232,1073,1075],{"class":1074},"s4XuR","    algorithm",[232,1077,967],{"class":747},[232,1079,1080],{"class":335},"\"RS256\"\n",[232,1082,1084],{"class":234,"line":1083},17,[232,1085,1086],{"class":414},")\n",[103,1088,1090],{"id":1089},"exchange-assertion-for-access-token","Exchange Assertion for Access Token",[14,1092,1093],{},[25,1094,1095],{},"Request:",[223,1097,1099],{"className":318,"code":1098,"language":320,"meta":228,"style":228},"curl -X POST https://auth.chekt.com/oauth/token \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\" \\\n  -d \"assertion=YOUR_JWT_ASSERTION\"\n",[75,1100,1101,1113,1121,1130],{"__ignoreMap":228},[232,1102,1103,1105,1107,1109,1111],{"class":234,"line":235},[232,1104,328],{"class":327},[232,1106,332],{"class":331},[232,1108,336],{"class":335},[232,1110,339],{"class":335},[232,1112,342],{"class":331},[232,1114,1115,1117,1119],{"class":234,"line":241},[232,1116,347],{"class":331},[232,1118,350],{"class":335},[232,1120,342],{"class":331},[232,1122,1123,1125,1128],{"class":234,"line":247},[232,1124,357],{"class":331},[232,1126,1127],{"class":335}," \"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\"",[232,1129,342],{"class":331},[232,1131,1132,1134],{"class":234,"line":253},[232,1133,357],{"class":331},[232,1135,1136],{"class":335}," \"assertion=YOUR_JWT_ASSERTION\"\n",[14,1138,1139],{},[25,1140,402],{},[223,1142,1144],{"className":405,"code":1143,"language":407,"meta":228,"style":228},"{\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600\n}\n",[75,1145,1146,1150,1160,1170,1179],{"__ignoreMap":228},[232,1147,1148],{"class":234,"line":235},[232,1149,415],{"class":414},[232,1151,1152,1154,1156,1158],{"class":234,"line":241},[232,1153,420],{"class":331},[232,1155,423],{"class":414},[232,1157,426],{"class":335},[232,1159,429],{"class":414},[232,1161,1162,1164,1166,1168],{"class":234,"line":247},[232,1163,434],{"class":331},[232,1165,423],{"class":414},[232,1167,439],{"class":335},[232,1169,429],{"class":414},[232,1171,1172,1174,1176],{"class":234,"line":253},[232,1173,446],{"class":331},[232,1175,423],{"class":414},[232,1177,1178],{"class":331},"3600\n",[232,1180,1181],{"class":234,"line":259},[232,1182,468],{"class":414},[103,1184,1186],{"id":1185},"make-api-requests","Make API Requests",[14,1188,1189,1190,1193],{},"Include the access token in the ",[75,1191,1192],{},"Authorization"," header:",[223,1195,1197],{"className":318,"code":1196,"language":320,"meta":228,"style":228},"curl -X GET https://api.chekt.com/partner/v1/sites \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\"\n",[75,1198,1199,1213,1221],{"__ignoreMap":228},[232,1200,1201,1203,1205,1208,1211],{"class":234,"line":235},[232,1202,328],{"class":327},[232,1204,332],{"class":331},[232,1206,1207],{"class":335}," GET",[232,1209,1210],{"class":335}," https://api.chekt.com/partner/v1/sites",[232,1212,342],{"class":331},[232,1214,1215,1217,1219],{"class":234,"line":241},[232,1216,347],{"class":331},[232,1218,501],{"class":335},[232,1220,342],{"class":331},[232,1222,1223,1225],{"class":234,"line":247},[232,1224,347],{"class":331},[232,1226,1227],{"class":335}," \"Content-Type: application/json\"\n",[40,1229],{},[43,1231,1233],{"id":1232},"token-management","Token Management",[103,1235,1237],{"id":1236},"token-expiration","Token Expiration",[14,1239,1240],{},"Access tokens expire after a period (typically 1 hour). When a token expires:",[111,1242,1243,1250],{},[114,1244,1245,1246,1249],{},"You'll receive a ",[75,1247,1248],{},"401 Unauthorized"," response",[114,1251,1252],{},"Generate a new JWT assertion and request a new access token",[18,1254,1256],{"title":1255,"type":21},"Token Caching",[14,1257,1258],{},"Cache access tokens and reuse them until they expire to minimize authentication requests. Generate a new token only when the current one expires.",[103,1260,1262],{"id":1261},"refresh-strategy","Refresh Strategy",[14,1264,1265],{},"Implement automatic token refresh in your application:",[223,1267,1269],{"className":732,"code":1268,"language":734,"meta":228,"style":228},"// Example refresh logic\nlet accessToken = null;\nlet tokenExpiry = 0;\n\nasync function getAccessToken() {\n  // Check if current token is still valid\n  if (accessToken && Date.now() \u003C tokenExpiry) {\n    return accessToken;\n  }\n\n  // Generate new assertion and get new token\n  const assertion = createJWTAssertion();\n  const response = await fetch('https://auth.chekt.com/oauth/token', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n    body: `grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${assertion}`\n  });\n\n  const data = await response.json();\n  accessToken = data.access_token;\n  tokenExpiry = Date.now() + (data.expires_in * 1000) - 60000; // Refresh 1 min early\n\n  return accessToken;\n}\n",[75,1270,1271,1276,1292,1306,1310,1324,1329,1353,1361,1366,1370,1375,1390,1412,1422,1438,1452,1457,1462,1481,1492,1530,1535,1543],{"__ignoreMap":228},[232,1272,1273],{"class":234,"line":235},[232,1274,1275],{"class":741},"// Example refresh logic\n",[232,1277,1278,1281,1284,1286,1289],{"class":234,"line":241},[232,1279,1280],{"class":747},"let",[232,1282,1283],{"class":414}," accessToken ",[232,1285,967],{"class":747},[232,1287,1288],{"class":331}," null",[232,1290,1291],{"class":414},";\n",[232,1293,1294,1296,1299,1301,1304],{"class":234,"line":247},[232,1295,1280],{"class":747},[232,1297,1298],{"class":414}," tokenExpiry ",[232,1300,967],{"class":747},[232,1302,1303],{"class":331}," 0",[232,1305,1291],{"class":414},[232,1307,1308],{"class":234,"line":253},[232,1309,584],{"emptyLinePlaceholder":583},[232,1311,1312,1315,1318,1321],{"class":234,"line":259},[232,1313,1314],{"class":747},"async",[232,1316,1317],{"class":747}," function",[232,1319,1320],{"class":327}," getAccessToken",[232,1322,1323],{"class":414},"() {\n",[232,1325,1326],{"class":234,"line":265},[232,1327,1328],{"class":741},"  // Check if current token is still valid\n",[232,1330,1331,1334,1337,1340,1343,1345,1347,1350],{"class":234,"line":392},[232,1332,1333],{"class":747},"  if",[232,1335,1336],{"class":414}," (accessToken ",[232,1338,1339],{"class":747},"&&",[232,1341,1342],{"class":414}," Date.",[232,1344,836],{"class":327},[232,1346,839],{"class":414},[232,1348,1349],{"class":747},"\u003C",[232,1351,1352],{"class":414}," tokenExpiry) {\n",[232,1354,1355,1358],{"class":234,"line":597},[232,1356,1357],{"class":747},"    return",[232,1359,1360],{"class":414}," accessToken;\n",[232,1362,1363],{"class":234,"line":603},[232,1364,1365],{"class":414},"  }\n",[232,1367,1368],{"class":234,"line":609},[232,1369,584],{"emptyLinePlaceholder":583},[232,1371,1372],{"class":234,"line":615},[232,1373,1374],{"class":741},"  // Generate new assertion and get new token\n",[232,1376,1377,1380,1382,1384,1387],{"class":234,"line":621},[232,1378,1379],{"class":747},"  const",[232,1381,777],{"class":331},[232,1383,754],{"class":747},[232,1385,1386],{"class":327}," createJWTAssertion",[232,1388,1389],{"class":414},"();\n",[232,1391,1392,1394,1396,1398,1401,1404,1406,1409],{"class":234,"line":899},[232,1393,1379],{"class":747},[232,1395,1249],{"class":331},[232,1397,754],{"class":747},[232,1399,1400],{"class":747}," await",[232,1402,1403],{"class":327}," fetch",[232,1405,760],{"class":414},[232,1407,1408],{"class":335},"'https://auth.chekt.com/oauth/token'",[232,1410,1411],{"class":414},", {\n",[232,1413,1414,1417,1420],{"class":234,"line":907},[232,1415,1416],{"class":414},"    method: ",[232,1418,1419],{"class":335},"'POST'",[232,1421,429],{"class":414},[232,1423,1424,1427,1430,1432,1435],{"class":234,"line":919},[232,1425,1426],{"class":414},"    headers: { ",[232,1428,1429],{"class":335},"'Content-Type'",[232,1431,423],{"class":414},[232,1433,1434],{"class":335},"'application/x-www-form-urlencoded'",[232,1436,1437],{"class":414}," },\n",[232,1439,1440,1443,1446,1449],{"class":234,"line":1071},[232,1441,1442],{"class":414},"    body: ",[232,1444,1445],{"class":335},"`grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${",[232,1447,1448],{"class":414},"assertion",[232,1450,1451],{"class":335},"}`\n",[232,1453,1454],{"class":234,"line":1083},[232,1455,1456],{"class":414},"  });\n",[232,1458,1460],{"class":234,"line":1459},18,[232,1461,584],{"emptyLinePlaceholder":583},[232,1463,1465,1467,1470,1472,1474,1477,1479],{"class":234,"line":1464},19,[232,1466,1379],{"class":747},[232,1468,1469],{"class":331}," data",[232,1471,754],{"class":747},[232,1473,1400],{"class":747},[232,1475,1476],{"class":414}," response.",[232,1478,407],{"class":327},[232,1480,1389],{"class":414},[232,1482,1484,1487,1489],{"class":234,"line":1483},20,[232,1485,1486],{"class":414},"  accessToken ",[232,1488,967],{"class":747},[232,1490,1491],{"class":414}," data.access_token;\n",[232,1493,1495,1498,1500,1502,1504,1506,1508,1511,1514,1516,1518,1521,1524,1527],{"class":234,"line":1494},21,[232,1496,1497],{"class":414},"  tokenExpiry ",[232,1499,967],{"class":747},[232,1501,1342],{"class":414},[232,1503,836],{"class":327},[232,1505,839],{"class":414},[232,1507,851],{"class":747},[232,1509,1510],{"class":414}," (data.expires_in ",[232,1512,1513],{"class":747},"*",[232,1515,845],{"class":331},[232,1517,848],{"class":414},[232,1519,1520],{"class":747},"-",[232,1522,1523],{"class":331}," 60000",[232,1525,1526],{"class":414},"; ",[232,1528,1529],{"class":741},"// Refresh 1 min early\n",[232,1531,1533],{"class":234,"line":1532},22,[232,1534,584],{"emptyLinePlaceholder":583},[232,1536,1538,1541],{"class":234,"line":1537},23,[232,1539,1540],{"class":747},"  return",[232,1542,1360],{"class":414},[232,1544,1546],{"class":234,"line":1545},24,[232,1547,468],{"class":414},[40,1549],{},[43,1551,1553],{"id":1552},"request-headers","Request Headers",[103,1555,1557],{"id":1556},"required-headers","Required Headers",[14,1559,1560],{},"All Partner API requests must include:",[223,1562,1564],{"className":225,"code":1563,"language":227,"meta":228,"style":228},"Authorization: Bearer YOUR_ACCESS_TOKEN\nContent-Type: application/json\n",[75,1565,1566,1571],{"__ignoreMap":228},[232,1567,1568],{"class":234,"line":235},[232,1569,1570],{},"Authorization: Bearer YOUR_ACCESS_TOKEN\n",[232,1572,1573],{"class":234,"line":241},[232,1574,1575],{},"Content-Type: application/json\n",[103,1577,1579],{"id":1578},"optional-headers","Optional Headers",[14,1581,1582,1587],{},[25,1583,1584],{},[75,1585,1586],{},"x-partner-trace-id"," (Recommended)",[14,1589,1590],{},"Include a UUID to track requests across systems:",[223,1592,1594],{"className":225,"code":1593,"language":227,"meta":228,"style":228},"x-partner-trace-id: 550e8400-e29b-41d4-a716-123456789000\n",[75,1595,1596],{"__ignoreMap":228},[232,1597,1598],{"class":234,"line":235},[232,1599,1593],{},[14,1601,1602],{},"This helps with debugging and monitoring.",[40,1604],{},[43,1606,1608],{"id":1607},"authentication-errors","Authentication Errors",[103,1610,1612],{"id":1611},"common-error-responses","Common Error Responses",[14,1614,1615],{},[25,1616,1248],{},[223,1618,1620],{"className":405,"code":1619,"language":407,"meta":228,"style":228},"{\n  \"error\": \"unauthorized\",\n  \"error_description\": \"The access token expired\"\n}\n",[75,1621,1622,1626,1638,1648],{"__ignoreMap":228},[232,1623,1624],{"class":234,"line":235},[232,1625,415],{"class":414},[232,1627,1628,1631,1633,1636],{"class":234,"line":241},[232,1629,1630],{"class":331},"  \"error\"",[232,1632,423],{"class":414},[232,1634,1635],{"class":335},"\"unauthorized\"",[232,1637,429],{"class":414},[232,1639,1640,1643,1645],{"class":234,"line":247},[232,1641,1642],{"class":331},"  \"error_description\"",[232,1644,423],{"class":414},[232,1646,1647],{"class":335},"\"The access token expired\"\n",[232,1649,1650],{"class":234,"line":253},[232,1651,468],{"class":414},[14,1653,1654,1657],{},[25,1655,1656],{},"Solution",": Generate a new access token",[14,1659,1660],{},[25,1661,1662],{},"403 Forbidden",[223,1664,1666],{"className":405,"code":1665,"language":407,"meta":228,"style":228},"{\n  \"error\": \"insufficient_scope\",\n  \"error_description\": \"The access token does not have the required scope\"\n}\n",[75,1667,1668,1672,1683,1692],{"__ignoreMap":228},[232,1669,1670],{"class":234,"line":235},[232,1671,415],{"class":414},[232,1673,1674,1676,1678,1681],{"class":234,"line":241},[232,1675,1630],{"class":331},[232,1677,423],{"class":414},[232,1679,1680],{"class":335},"\"insufficient_scope\"",[232,1682,429],{"class":414},[232,1684,1685,1687,1689],{"class":234,"line":247},[232,1686,1642],{"class":331},[232,1688,423],{"class":414},[232,1690,1691],{"class":335},"\"The access token does not have the required scope\"\n",[232,1693,1694],{"class":234,"line":253},[232,1695,468],{"class":414},[14,1697,1698,1700],{},[25,1699,1656],{},": Verify your Auth Application has the correct permissions",[14,1702,1703],{},[25,1704,1705],{},"400 Bad Request",[223,1707,1709],{"className":405,"code":1708,"language":407,"meta":228,"style":228},"{\n  \"error\": \"invalid_grant\",\n  \"error_description\": \"Invalid JWT assertion\"\n}\n",[75,1710,1711,1715,1726,1735],{"__ignoreMap":228},[232,1712,1713],{"class":234,"line":235},[232,1714,415],{"class":414},[232,1716,1717,1719,1721,1724],{"class":234,"line":241},[232,1718,1630],{"class":331},[232,1720,423],{"class":414},[232,1722,1723],{"class":335},"\"invalid_grant\"",[232,1725,429],{"class":414},[232,1727,1728,1730,1732],{"class":234,"line":247},[232,1729,1642],{"class":331},[232,1731,423],{"class":414},[232,1733,1734],{"class":335},"\"Invalid JWT assertion\"\n",[232,1736,1737],{"class":234,"line":253},[232,1738,468],{"class":414},[14,1740,1741,1743],{},[25,1742,1656],{},": Check JWT signing and claims",[40,1745],{},[43,1747,1749],{"id":1748},"security-best-practices","Security Best Practices",[1751,1752,1753],"guide-check-list",{},[111,1754,1755,1758,1761,1764,1767,1770,1773,1776],{},[114,1756,1757],{},"✓ Store secret keys in secure environment variables, never in code",[114,1759,1760],{},"✓ Use separate Auth Applications for development and production",[114,1762,1763],{},"✓ Rotate secret keys periodically (every 90 days recommended)",[114,1765,1766],{},"✓ Validate token expiration before making API requests",[114,1768,1769],{},"✓ Use HTTPS for all API requests",[114,1771,1772],{},"✓ Implement proper error handling for authentication failures",[114,1774,1775],{},"✓ Log authentication attempts for security monitoring",[114,1777,1778,1779,1782],{},"✓ Use unique ",[75,1780,1781],{},"jti"," (JWT ID) for each assertion to prevent replay attacks",[40,1784],{},[43,1786,1788],{"id":1787},"complete-authentication-example","Complete Authentication Example",[14,1790,1791],{},"Here's a complete example of authenticating and making an API call:",[223,1793,1795],{"className":732,"code":1794,"language":734,"meta":228,"style":228},"const jwt = require('jsonwebtoken');\nconst axios = require('axios');\n\n// Configuration\nconst CLIENT_ID = process.env.CHEKT_CLIENT_ID;\nconst SECRET_KEY = process.env.CHEKT_SECRET_KEY;\nconst AUTH_SERVER = 'https://auth.chekt.com';\nconst API_BASE = 'https://api.chekt.com';\n\n// Generate JWT assertion\nfunction createAssertion() {\n  return jwt.sign(\n    {\n      iss: CLIENT_ID,\n      sub: CLIENT_ID,\n      aud: AUTH_SERVER,\n      exp: Math.floor(Date.now() / 1000) + 300,\n      iat: Math.floor(Date.now() / 1000),\n      jti: require('crypto').randomUUID()\n    },\n    SECRET_KEY,\n    { algorithm: 'RS256' }\n  );\n}\n\n// Get access token\nasync function getAccessToken() {\n  const assertion = createAssertion();\n\n  const response = await axios.post(\n    `${AUTH_SERVER}/oauth/token`,\n    new URLSearchParams({\n      grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n      assertion: assertion\n    }),\n    {\n      headers: { 'Content-Type': 'application/x-www-form-urlencoded' }\n    }\n  );\n\n  return response.data.access_token;\n}\n\n// Make API request\nasync function listSites() {\n  const accessToken = await getAccessToken();\n\n  const response = await axios.get(\n    `${API_BASE}/partner/v1/sites`,\n    {\n      headers: {\n        'Authorization': `Bearer ${accessToken}`,\n        'Content-Type': 'application/json',\n        'x-partner-trace-id': require('crypto').randomUUID()\n      }\n    }\n  );\n\n  return response.data;\n}\n\n// Usage\nlistSites()\n  .then(sites => console.log('Sites:', sites))\n  .catch(error => console.error('Error:', error.response?.data || error.message));\n",[75,1796,1797,1813,1831,1835,1840,1857,1873,1887,1901,1905,1910,1920,1930,1934,1944,1953,1963,1988,2007,2028,2032,2039,2048,2053,2057,2062,2068,2079,2092,2097,2116,2129,2141,2152,2158,2164,2169,2183,2189,2194,2199,2207,2212,2217,2223,2235,2251,2256,2274,2287,2292,2298,2317,2330,2350,2356,2361,2366,2371,2379,2384,2389,2395,2403,2434],{"__ignoreMap":228},[232,1798,1799,1801,1803,1805,1807,1809,1811],{"class":234,"line":235},[232,1800,748],{"class":747},[232,1802,751],{"class":331},[232,1804,754],{"class":747},[232,1806,757],{"class":327},[232,1808,760],{"class":414},[232,1810,763],{"class":335},[232,1812,766],{"class":414},[232,1814,1815,1817,1820,1822,1824,1826,1829],{"class":234,"line":241},[232,1816,748],{"class":747},[232,1818,1819],{"class":331}," axios",[232,1821,754],{"class":747},[232,1823,757],{"class":327},[232,1825,760],{"class":414},[232,1827,1828],{"class":335},"'axios'",[232,1830,766],{"class":414},[232,1832,1833],{"class":234,"line":247},[232,1834,584],{"emptyLinePlaceholder":583},[232,1836,1837],{"class":234,"line":253},[232,1838,1839],{"class":741},"// Configuration\n",[232,1841,1842,1844,1847,1849,1852,1855],{"class":234,"line":259},[232,1843,748],{"class":747},[232,1845,1846],{"class":331}," CLIENT_ID",[232,1848,754],{"class":747},[232,1850,1851],{"class":414}," process.env.",[232,1853,1854],{"class":331},"CHEKT_CLIENT_ID",[232,1856,1291],{"class":414},[232,1858,1859,1861,1864,1866,1868,1871],{"class":234,"line":265},[232,1860,748],{"class":747},[232,1862,1863],{"class":331}," SECRET_KEY",[232,1865,754],{"class":747},[232,1867,1851],{"class":414},[232,1869,1870],{"class":331},"CHEKT_SECRET_KEY",[232,1872,1291],{"class":414},[232,1874,1875,1877,1880,1882,1885],{"class":234,"line":392},[232,1876,748],{"class":747},[232,1878,1879],{"class":331}," AUTH_SERVER",[232,1881,754],{"class":747},[232,1883,1884],{"class":335}," 'https://auth.chekt.com'",[232,1886,1291],{"class":414},[232,1888,1889,1891,1894,1896,1899],{"class":234,"line":597},[232,1890,748],{"class":747},[232,1892,1893],{"class":331}," API_BASE",[232,1895,754],{"class":747},[232,1897,1898],{"class":335}," 'https://api.chekt.com'",[232,1900,1291],{"class":414},[232,1902,1903],{"class":234,"line":603},[232,1904,584],{"emptyLinePlaceholder":583},[232,1906,1907],{"class":234,"line":609},[232,1908,1909],{"class":741},"// Generate JWT assertion\n",[232,1911,1912,1915,1918],{"class":234,"line":615},[232,1913,1914],{"class":747},"function",[232,1916,1917],{"class":327}," createAssertion",[232,1919,1323],{"class":414},[232,1921,1922,1924,1926,1928],{"class":234,"line":621},[232,1923,1540],{"class":747},[232,1925,782],{"class":414},[232,1927,785],{"class":327},[232,1929,788],{"class":414},[232,1931,1932],{"class":234,"line":899},[232,1933,975],{"class":414},[232,1935,1936,1939,1942],{"class":234,"line":907},[232,1937,1938],{"class":414},"      iss: ",[232,1940,1941],{"class":331},"CLIENT_ID",[232,1943,429],{"class":414},[232,1945,1946,1949,1951],{"class":234,"line":919},[232,1947,1948],{"class":414},"      sub: ",[232,1950,1941],{"class":331},[232,1952,429],{"class":414},[232,1954,1955,1958,1961],{"class":234,"line":1071},[232,1956,1957],{"class":414},"      aud: ",[232,1959,1960],{"class":331},"AUTH_SERVER",[232,1962,429],{"class":414},[232,1964,1965,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986],{"class":234,"line":1083},[232,1966,1967],{"class":414},"      exp: Math.",[232,1969,830],{"class":327},[232,1971,833],{"class":414},[232,1973,836],{"class":327},[232,1975,839],{"class":414},[232,1977,842],{"class":747},[232,1979,845],{"class":331},[232,1981,848],{"class":414},[232,1983,851],{"class":747},[232,1985,854],{"class":331},[232,1987,429],{"class":414},[232,1989,1990,1993,1995,1997,1999,2001,2003,2005],{"class":234,"line":1459},[232,1991,1992],{"class":414},"      iat: Math.",[232,1994,830],{"class":327},[232,1996,833],{"class":414},[232,1998,836],{"class":327},[232,2000,839],{"class":414},[232,2002,842],{"class":747},[232,2004,845],{"class":331},[232,2006,880],{"class":414},[232,2008,2009,2012,2015,2017,2020,2023,2026],{"class":234,"line":1464},[232,2010,2011],{"class":414},"      jti: ",[232,2013,2014],{"class":327},"require",[232,2016,760],{"class":414},[232,2018,2019],{"class":335},"'crypto'",[232,2021,2022],{"class":414},").",[232,2024,2025],{"class":327},"randomUUID",[232,2027,891],{"class":414},[232,2029,2030],{"class":234,"line":1483},[232,2031,1061],{"class":414},[232,2033,2034,2037],{"class":234,"line":1494},[232,2035,2036],{"class":331},"    SECRET_KEY",[232,2038,429],{"class":414},[232,2040,2041,2044,2046],{"class":234,"line":1532},[232,2042,2043],{"class":414},"    { algorithm: ",[232,2045,913],{"class":335},[232,2047,916],{"class":414},[232,2049,2050],{"class":234,"line":1537},[232,2051,2052],{"class":414},"  );\n",[232,2054,2055],{"class":234,"line":1545},[232,2056,468],{"class":414},[232,2058,2060],{"class":234,"line":2059},25,[232,2061,584],{"emptyLinePlaceholder":583},[232,2063,2065],{"class":234,"line":2064},26,[232,2066,2067],{"class":741},"// Get access token\n",[232,2069,2071,2073,2075,2077],{"class":234,"line":2070},27,[232,2072,1314],{"class":747},[232,2074,1317],{"class":747},[232,2076,1320],{"class":327},[232,2078,1323],{"class":414},[232,2080,2082,2084,2086,2088,2090],{"class":234,"line":2081},28,[232,2083,1379],{"class":747},[232,2085,777],{"class":331},[232,2087,754],{"class":747},[232,2089,1917],{"class":327},[232,2091,1389],{"class":414},[232,2093,2095],{"class":234,"line":2094},29,[232,2096,584],{"emptyLinePlaceholder":583},[232,2098,2100,2102,2104,2106,2108,2111,2114],{"class":234,"line":2099},30,[232,2101,1379],{"class":747},[232,2103,1249],{"class":331},[232,2105,754],{"class":747},[232,2107,1400],{"class":747},[232,2109,2110],{"class":414}," axios.",[232,2112,2113],{"class":327},"post",[232,2115,788],{"class":414},[232,2117,2119,2122,2124,2127],{"class":234,"line":2118},31,[232,2120,2121],{"class":335},"    `${",[232,2123,1960],{"class":331},[232,2125,2126],{"class":335},"}/oauth/token`",[232,2128,429],{"class":414},[232,2130,2132,2135,2138],{"class":234,"line":2131},32,[232,2133,2134],{"class":747},"    new",[232,2136,2137],{"class":327}," URLSearchParams",[232,2139,2140],{"class":414},"({\n",[232,2142,2144,2147,2150],{"class":234,"line":2143},33,[232,2145,2146],{"class":414},"      grant_type: ",[232,2148,2149],{"class":335},"'urn:ietf:params:oauth:grant-type:jwt-bearer'",[232,2151,429],{"class":414},[232,2153,2155],{"class":234,"line":2154},34,[232,2156,2157],{"class":414},"      assertion: assertion\n",[232,2159,2161],{"class":234,"line":2160},35,[232,2162,2163],{"class":414},"    }),\n",[232,2165,2167],{"class":234,"line":2166},36,[232,2168,975],{"class":414},[232,2170,2172,2175,2177,2179,2181],{"class":234,"line":2171},37,[232,2173,2174],{"class":414},"      headers: { ",[232,2176,1429],{"class":335},[232,2178,423],{"class":414},[232,2180,1434],{"class":335},[232,2182,916],{"class":414},[232,2184,2186],{"class":234,"line":2185},38,[232,2187,2188],{"class":414},"    }\n",[232,2190,2192],{"class":234,"line":2191},39,[232,2193,2052],{"class":414},[232,2195,2197],{"class":234,"line":2196},40,[232,2198,584],{"emptyLinePlaceholder":583},[232,2200,2202,2204],{"class":234,"line":2201},41,[232,2203,1540],{"class":747},[232,2205,2206],{"class":414}," response.data.access_token;\n",[232,2208,2210],{"class":234,"line":2209},42,[232,2211,468],{"class":414},[232,2213,2215],{"class":234,"line":2214},43,[232,2216,584],{"emptyLinePlaceholder":583},[232,2218,2220],{"class":234,"line":2219},44,[232,2221,2222],{"class":741},"// Make API request\n",[232,2224,2226,2228,2230,2233],{"class":234,"line":2225},45,[232,2227,1314],{"class":747},[232,2229,1317],{"class":747},[232,2231,2232],{"class":327}," listSites",[232,2234,1323],{"class":414},[232,2236,2238,2240,2243,2245,2247,2249],{"class":234,"line":2237},46,[232,2239,1379],{"class":747},[232,2241,2242],{"class":331}," accessToken",[232,2244,754],{"class":747},[232,2246,1400],{"class":747},[232,2248,1320],{"class":327},[232,2250,1389],{"class":414},[232,2252,2254],{"class":234,"line":2253},47,[232,2255,584],{"emptyLinePlaceholder":583},[232,2257,2259,2261,2263,2265,2267,2269,2272],{"class":234,"line":2258},48,[232,2260,1379],{"class":747},[232,2262,1249],{"class":331},[232,2264,754],{"class":747},[232,2266,1400],{"class":747},[232,2268,2110],{"class":414},[232,2270,2271],{"class":327},"get",[232,2273,788],{"class":414},[232,2275,2277,2279,2282,2285],{"class":234,"line":2276},49,[232,2278,2121],{"class":335},[232,2280,2281],{"class":331},"API_BASE",[232,2283,2284],{"class":335},"}/partner/v1/sites`",[232,2286,429],{"class":414},[232,2288,2290],{"class":234,"line":2289},50,[232,2291,975],{"class":414},[232,2293,2295],{"class":234,"line":2294},51,[232,2296,2297],{"class":414},"      headers: {\n",[232,2299,2301,2304,2306,2309,2312,2315],{"class":234,"line":2300},52,[232,2302,2303],{"class":335},"        'Authorization'",[232,2305,423],{"class":414},[232,2307,2308],{"class":335},"`Bearer ${",[232,2310,2311],{"class":414},"accessToken",[232,2313,2314],{"class":335},"}`",[232,2316,429],{"class":414},[232,2318,2320,2323,2325,2328],{"class":234,"line":2319},53,[232,2321,2322],{"class":335},"        'Content-Type'",[232,2324,423],{"class":414},[232,2326,2327],{"class":335},"'application/json'",[232,2329,429],{"class":414},[232,2331,2333,2336,2338,2340,2342,2344,2346,2348],{"class":234,"line":2332},54,[232,2334,2335],{"class":335},"        'x-partner-trace-id'",[232,2337,423],{"class":414},[232,2339,2014],{"class":327},[232,2341,760],{"class":414},[232,2343,2019],{"class":335},[232,2345,2022],{"class":414},[232,2347,2025],{"class":327},[232,2349,891],{"class":414},[232,2351,2353],{"class":234,"line":2352},55,[232,2354,2355],{"class":414},"      }\n",[232,2357,2359],{"class":234,"line":2358},56,[232,2360,2188],{"class":414},[232,2362,2364],{"class":234,"line":2363},57,[232,2365,2052],{"class":414},[232,2367,2369],{"class":234,"line":2368},58,[232,2370,584],{"emptyLinePlaceholder":583},[232,2372,2374,2376],{"class":234,"line":2373},59,[232,2375,1540],{"class":747},[232,2377,2378],{"class":414}," response.data;\n",[232,2380,2382],{"class":234,"line":2381},60,[232,2383,468],{"class":414},[232,2385,2387],{"class":234,"line":2386},61,[232,2388,584],{"emptyLinePlaceholder":583},[232,2390,2392],{"class":234,"line":2391},62,[232,2393,2394],{"class":741},"// Usage\n",[232,2396,2398,2401],{"class":234,"line":2397},63,[232,2399,2400],{"class":327},"listSites",[232,2402,891],{"class":414},[232,2404,2406,2409,2412,2414,2417,2420,2423,2426,2428,2431],{"class":234,"line":2405},64,[232,2407,2408],{"class":414},"  .",[232,2410,2411],{"class":327},"then",[232,2413,760],{"class":414},[232,2415,2416],{"class":1074},"sites",[232,2418,2419],{"class":747}," =>",[232,2421,2422],{"class":414}," console.",[232,2424,2425],{"class":327},"log",[232,2427,760],{"class":414},[232,2429,2430],{"class":335},"'Sites:'",[232,2432,2433],{"class":414},", sites))\n",[232,2435,2437,2439,2442,2444,2447,2449,2451,2453,2455,2458,2461,2464],{"class":234,"line":2436},65,[232,2438,2408],{"class":414},[232,2440,2441],{"class":327},"catch",[232,2443,760],{"class":414},[232,2445,2446],{"class":1074},"error",[232,2448,2419],{"class":747},[232,2450,2422],{"class":414},[232,2452,2446],{"class":327},[232,2454,760],{"class":414},[232,2456,2457],{"class":335},"'Error:'",[232,2459,2460],{"class":414},", error.response?.data ",[232,2462,2463],{"class":747},"||",[232,2465,2466],{"class":414}," error.message));\n",[40,2468],{},[43,2470,2472],{"id":2471},"next-steps","Next Steps",[14,2474,2475],{},"Now that you understand authentication, explore the Partner API endpoints:",[2477,2478,2479],"guide-next-steps",{},[14,2480,2481],{},[232,2482,2483],{},"\n{\n\"title\": \"Dealers\",\n\"description\": \"Connect and manage dealer accounts\",\n\"link\": \"/apis/partner/dealers\"\n},\n{\n\"title\": \"Sites\",\n\"description\": \"Create and manage customer sites\",\n\"link\": \"/apis/partner/sites\"\n},\n{\n\"title\": \"Devices\",\n\"description\": \"Register and manage security devices\",\n\"link\": \"/apis/partner/devices\"\n}\n",[40,2485],{},[43,2487,2489],{"id":2488},"support","Support",[14,2491,2492],{},"For authentication issues or questions:",[111,2494,2495,2502,2505],{},[114,2496,2497,2498],{},"Email: ",[34,2499,2501],{"href":2500},"mailto:support@chekt.com","support@chekt.com",[114,2503,2504],{},"Documentation: developer.chekt.com",[114,2506,2507,2508,2512],{},"Check the ",[34,2509,2511],{"href":2510},"/apis/partner/overview","Partner API Overview"," for general API information",[2514,2515,2516],"style",{},"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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":228,"searchDepth":247,"depth":247,"links":2518},[2519,2520,2524,2528,2534,2538,2542,2545,2546,2547,2548],{"id":45,"depth":241,"text":46},{"id":93,"depth":241,"text":94,"children":2521},[2522,2523],{"id":105,"depth":247,"text":106},{"id":134,"depth":247,"text":135},{"id":182,"depth":241,"text":183,"children":2525},[2526,2527],{"id":192,"depth":247,"text":80},{"id":212,"depth":247,"text":213},{"id":539,"depth":241,"text":540,"children":2529},[2530,2531,2532,2533],{"id":550,"depth":247,"text":551},{"id":627,"depth":247,"text":628},{"id":1089,"depth":247,"text":1090},{"id":1185,"depth":247,"text":1186},{"id":1232,"depth":241,"text":1233,"children":2535},[2536,2537],{"id":1236,"depth":247,"text":1237},{"id":1261,"depth":247,"text":1262},{"id":1552,"depth":241,"text":1553,"children":2539},[2540,2541],{"id":1556,"depth":247,"text":1557},{"id":1578,"depth":247,"text":1579},{"id":1607,"depth":241,"text":1608,"children":2543},[2544],{"id":1611,"depth":247,"text":1612},{"id":1748,"depth":241,"text":1749},{"id":1787,"depth":241,"text":1788},{"id":2471,"depth":241,"text":2472},{"id":2488,"depth":241,"text":2489},"Learn how to authenticate requests to the CHeKT Partner API","md",{"category":2552,"order":241},"API Reference","/apis/partner/authentication",{"title":5,"description":2549},"apis/partner/authentication","RCuEXZ3ukS5jXKRQC3VwDTmfBC_kZ5wd7-YzbVcKxvw",1770959188152]