[{"data":1,"prerenderedAt":3466},["ShallowReactive",2],{"apis-partner-event-authentication":3},{"id":4,"title":5,"body":6,"description":3458,"extension":3459,"meta":3460,"navigation":115,"path":3462,"seo":3463,"stem":3464,"__hash__":3465},"content/apis/partner/event-authentication.md","Partner Event API Authentication",{"type":7,"value":8,"toc":3427},"minimal",[9,13,17,51,54,59,62,68,70,74,159,161,165,172,177,180,211,215,218,238,259,261,265,268,272,275,366,371,454,458,464,469,774,779,1040,1047,1049,1053,1056,1060,1111,1116,1151,1155,1160,1207,1212,1255,1257,1261,1268,1272,1289,1293,1411,1413,1417,1421,1424,1444,1449,1981,1985,1988,2006,2012,2014,2018,2022,2026,2061,2067,2072,2105,2110,2115,2149,2154,2170,2172,2176,2214,2216,2220,2223,3385,3387,3391,3394,3402,3404,3408,3411,3423],[10,11,5],"h1",{"id":12},"partner-event-api-authentication",[14,15,16],"p",{},"The Partner Event API uses OAuth 2.0 Client Credentials Grant with JWT assertions for M2M (Machine-to-Machine) authentication. This guide explains how to set up authentication for sending events to CHeKT.",[18,19,22,25,42],"guide-alert",{"title":20,"type":21},"Different from Partner API","warning",[14,23,24],{},"While both Partner API and Partner Event API use OAuth 2.0, they have different authentication requirements:",[26,27,28,36],"ul",{},[29,30,31,35],"li",{},[32,33,34],"strong",{},"Partner API",": Requires Authorization Code Flow for Dealer Connect + M2M for other endpoints",[29,37,38,41],{},[32,39,40],{},"Partner Event API",": Only requires M2M authentication (no Authorization Code Flow)",[14,43,44,45,50],{},"See ",[46,47,49],"a",{"href":48},"/apis/partner/authentication","Partner API Authentication"," for Partner API details.",[52,53],"hr",{},[55,56,58],"h2",{"id":57},"overview","Overview",[14,60,61],{},"The Partner Event API authentication is simpler than the Partner API because it only requires M2M authentication. There's no need for the Authorization Code Flow.",[14,63,64,67],{},[32,65,66],{},"Authentication Method",": OAuth 2.0 Client Credentials Grant with JWT Bearer Assertions",[52,69],{},[55,71,73],{"id":72},"authentication-flow","Authentication Flow",[75,76,81],"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"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 EventAPI as Event API\n\n    Partner->>Partner: Create JWT Assertion\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->>EventAPI: POST /partner/v1/events (Bearer token)\n    EventAPI->>Partner: Return upload URLs\n","mermaid","",[82,83,84,92,98,104,110,117,123,129,135,141,147,153],"code",{"__ignoreMap":80},[85,86,89],"span",{"class":87,"line":88},"line",1,[85,90,91],{},"sequenceDiagram\n",[85,93,95],{"class":87,"line":94},2,[85,96,97],{},"    participant Partner as Your Platform\n",[85,99,101],{"class":87,"line":100},3,[85,102,103],{},"    participant Auth as CHeKT Auth Server\n",[85,105,107],{"class":87,"line":106},4,[85,108,109],{},"    participant EventAPI as Event API\n",[85,111,113],{"class":87,"line":112},5,[85,114,116],{"emptyLinePlaceholder":115},true,"\n",[85,118,120],{"class":87,"line":119},6,[85,121,122],{},"    Partner->>Partner: Create JWT Assertion\n",[85,124,126],{"class":87,"line":125},7,[85,127,128],{},"    Partner->>Partner: Sign with M2M Secret\n",[85,130,132],{"class":87,"line":131},8,[85,133,134],{},"    Partner->>Auth: POST /oauth/token (with assertion)\n",[85,136,138],{"class":87,"line":137},9,[85,139,140],{},"    Auth->>Auth: Verify signature\n",[85,142,144],{"class":87,"line":143},10,[85,145,146],{},"    Auth->>Partner: Return access_token\n",[85,148,150],{"class":87,"line":149},11,[85,151,152],{},"    Partner->>EventAPI: POST /partner/v1/events (Bearer token)\n",[85,154,156],{"class":87,"line":155},12,[85,157,158],{},"    EventAPI->>Partner: Return upload URLs\n",[52,160],{},[55,162,164],{"id":163},"step-1-register-auth-application","Step 1: Register Auth Application",[14,166,167,168,171],{},"Before using the Partner Event API, you must register an ",[32,169,170],{},"Auth Application"," for event ingestion with CHeKT.",[173,174,176],"h3",{"id":175},"registration-requirements","Registration Requirements",[14,178,179],{},"Contact CHeKT support to register your Auth Application. You will need to provide:",[26,181,182,188,194],{},[29,183,184,187],{},[32,185,186],{},"Application Name",": Your platform or company name",[29,189,190,193],{},[32,191,192],{},"Public Key",": Your RSA public key for JWT signing verification",[29,195,196,199,200],{},[32,197,198],{},"Additional Information",":\n",[26,201,202,205,208],{},[29,203,204],{},"Event types you'll send (alarm, trouble, arming)",[29,206,207],{},"Expected event volume",[29,209,210],{},"Platform technical details",[173,212,214],{"id":213},"what-you-receive","What You Receive",[14,216,217],{},"After registration, you will receive:",[26,219,220,226,232],{},[29,221,222,225],{},[32,223,224],{},"Client ID",": Your application identifier",[29,227,228,231],{},[32,229,230],{},"Secret Key",": Your private secret for signing JWT assertions",[29,233,234,237],{},[32,235,236],{},"Auth Server URL",": The token endpoint for authentication",[18,239,241],{"title":240,"type":21},"Keep Credentials Secure",[26,242,243,250,253,256],{},[29,244,245,246,249],{},"Store your ",[32,247,248],{},"secret key"," securely - never commit it to version control",[29,251,252],{},"Treat credentials like passwords",[29,254,255],{},"Use separate credentials for development and production",[29,257,258],{},"Rotate keys periodically for enhanced security",[52,260],{},[55,262,264],{"id":263},"step-2-create-jwt-assertion-token","Step 2: Create JWT Assertion Token",[14,266,267],{},"Generate a JWT assertion token signed with your M2M secret key.",[173,269,271],{"id":270},"jwt-claims","JWT Claims",[14,273,274],{},"Your JWT must include these claims:",[75,276,280],{"className":277,"code":278,"language":279,"meta":80,"style":80},"language-json shiki shiki-themes github-light github-dark","{\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","json",[82,281,282,288,304,315,327,339,351,361],{"__ignoreMap":80},[85,283,284],{"class":87,"line":88},[85,285,287],{"class":286},"sVt8B","{\n",[85,289,290,294,297,301],{"class":87,"line":94},[85,291,293],{"class":292},"sj4cs","  \"iss\"",[85,295,296],{"class":286},": ",[85,298,300],{"class":299},"sZZnC","\"YOUR_CLIENT_ID\"",[85,302,303],{"class":286},",\n",[85,305,306,309,311,313],{"class":87,"line":100},[85,307,308],{"class":292},"  \"sub\"",[85,310,296],{"class":286},[85,312,300],{"class":299},[85,314,303],{"class":286},[85,316,317,320,322,325],{"class":87,"line":106},[85,318,319],{"class":292},"  \"aud\"",[85,321,296],{"class":286},[85,323,324],{"class":299},"\"https://auth.chekt.com\"",[85,326,303],{"class":286},[85,328,329,332,334,337],{"class":87,"line":112},[85,330,331],{"class":292},"  \"exp\"",[85,333,296],{"class":286},[85,335,336],{"class":292},"1234567890",[85,338,303],{"class":286},[85,340,341,344,346,349],{"class":87,"line":119},[85,342,343],{"class":292},"  \"iat\"",[85,345,296],{"class":286},[85,347,348],{"class":292},"1234567800",[85,350,303],{"class":286},[85,352,353,356,358],{"class":87,"line":125},[85,354,355],{"class":292},"  \"jti\"",[85,357,296],{"class":286},[85,359,360],{"class":299},"\"unique-jwt-id\"\n",[85,362,363],{"class":87,"line":131},[85,364,365],{"class":286},"}\n",[14,367,368],{},[32,369,370],{},"Claim Descriptions:",[372,373,374,387],"table",{},[375,376,377],"thead",{},[378,379,380,384],"tr",{},[381,382,383],"th",{},"Claim",[381,385,386],{},"Description",[388,389,390,401,411,421,435,444],"tbody",{},[378,391,392,398],{},[393,394,395],"td",{},[82,396,397],{},"iss",[393,399,400],{},"Issuer - your Client ID",[378,402,403,408],{},[393,404,405],{},[82,406,407],{},"sub",[393,409,410],{},"Subject - your Client ID",[378,412,413,418],{},[393,414,415],{},[82,416,417],{},"aud",[393,419,420],{},"Audience - CHeKT auth server URL",[378,422,423,428],{},[393,424,425],{},[82,426,427],{},"exp",[393,429,430,431,434],{},"Expiration time (Unix timestamp, typically 5 minutes from ",[82,432,433],{},"iat",")",[378,436,437,441],{},[393,438,439],{},[82,440,433],{},[393,442,443],{},"Issued at time (Unix timestamp)",[378,445,446,451],{},[393,447,448],{},[82,449,450],{},"jti",[393,452,453],{},"JWT ID - unique identifier to prevent replay attacks",[173,455,457],{"id":456},"sign-with-secret-key","Sign with Secret Key",[14,459,460,461,463],{},"Sign the JWT using your M2M ",[32,462,248],{}," with the RS256 algorithm:",[14,465,466],{},[32,467,468],{},"Node.js Example:",[75,470,474],{"className":471,"code":472,"language":473,"meta":80,"style":80},"language-javascript shiki shiki-themes github-light github-dark","const jwt = require('jsonwebtoken');\nconst crypto = require('crypto');\n\n// Your M2M credentials\nconst CLIENT_ID = process.env.CHEKT_EVENT_CLIENT_ID;\nconst SECRET_KEY = process.env.CHEKT_EVENT_SECRET_KEY;\n\nfunction createJWTAssertion() {\n  const now = Math.floor(Date.now() / 1000);\n\n  const claims = {\n    iss: CLIENT_ID,\n    sub: CLIENT_ID,\n    aud: 'https://auth.chekt.com',\n    exp: now + 300,  // Expires in 5 minutes\n    iat: now,\n    jti: crypto.randomUUID()\n  };\n\n  return jwt.sign(claims, SECRET_KEY, { algorithm: 'RS256' });\n}\n\nconst assertion = createJWTAssertion();\nconsole.log('JWT Assertion:', assertion);\n","javascript",[82,475,476,501,519,523,529,547,563,567,578,611,615,627,637,647,658,676,682,694,700,705,732,737,742,757],{"__ignoreMap":80},[85,477,478,482,485,488,492,495,498],{"class":87,"line":88},[85,479,481],{"class":480},"szBVR","const",[85,483,484],{"class":292}," jwt",[85,486,487],{"class":480}," =",[85,489,491],{"class":490},"sScJk"," require",[85,493,494],{"class":286},"(",[85,496,497],{"class":299},"'jsonwebtoken'",[85,499,500],{"class":286},");\n",[85,502,503,505,508,510,512,514,517],{"class":87,"line":94},[85,504,481],{"class":480},[85,506,507],{"class":292}," crypto",[85,509,487],{"class":480},[85,511,491],{"class":490},[85,513,494],{"class":286},[85,515,516],{"class":299},"'crypto'",[85,518,500],{"class":286},[85,520,521],{"class":87,"line":100},[85,522,116],{"emptyLinePlaceholder":115},[85,524,525],{"class":87,"line":106},[85,526,528],{"class":527},"sJ8bj","// Your M2M credentials\n",[85,530,531,533,536,538,541,544],{"class":87,"line":112},[85,532,481],{"class":480},[85,534,535],{"class":292}," CLIENT_ID",[85,537,487],{"class":480},[85,539,540],{"class":286}," process.env.",[85,542,543],{"class":292},"CHEKT_EVENT_CLIENT_ID",[85,545,546],{"class":286},";\n",[85,548,549,551,554,556,558,561],{"class":87,"line":119},[85,550,481],{"class":480},[85,552,553],{"class":292}," SECRET_KEY",[85,555,487],{"class":480},[85,557,540],{"class":286},[85,559,560],{"class":292},"CHEKT_EVENT_SECRET_KEY",[85,562,546],{"class":286},[85,564,565],{"class":87,"line":125},[85,566,116],{"emptyLinePlaceholder":115},[85,568,569,572,575],{"class":87,"line":131},[85,570,571],{"class":480},"function",[85,573,574],{"class":490}," createJWTAssertion",[85,576,577],{"class":286},"() {\n",[85,579,580,583,586,588,591,594,597,600,603,606,609],{"class":87,"line":137},[85,581,582],{"class":480},"  const",[85,584,585],{"class":292}," now",[85,587,487],{"class":480},[85,589,590],{"class":286}," Math.",[85,592,593],{"class":490},"floor",[85,595,596],{"class":286},"(Date.",[85,598,599],{"class":490},"now",[85,601,602],{"class":286},"() ",[85,604,605],{"class":480},"/",[85,607,608],{"class":292}," 1000",[85,610,500],{"class":286},[85,612,613],{"class":87,"line":143},[85,614,116],{"emptyLinePlaceholder":115},[85,616,617,619,622,624],{"class":87,"line":149},[85,618,582],{"class":480},[85,620,621],{"class":292}," claims",[85,623,487],{"class":480},[85,625,626],{"class":286}," {\n",[85,628,629,632,635],{"class":87,"line":155},[85,630,631],{"class":286},"    iss: ",[85,633,634],{"class":292},"CLIENT_ID",[85,636,303],{"class":286},[85,638,640,643,645],{"class":87,"line":639},13,[85,641,642],{"class":286},"    sub: ",[85,644,634],{"class":292},[85,646,303],{"class":286},[85,648,650,653,656],{"class":87,"line":649},14,[85,651,652],{"class":286},"    aud: ",[85,654,655],{"class":299},"'https://auth.chekt.com'",[85,657,303],{"class":286},[85,659,661,664,667,670,673],{"class":87,"line":660},15,[85,662,663],{"class":286},"    exp: now ",[85,665,666],{"class":480},"+",[85,668,669],{"class":292}," 300",[85,671,672],{"class":286},",  ",[85,674,675],{"class":527},"// Expires in 5 minutes\n",[85,677,679],{"class":87,"line":678},16,[85,680,681],{"class":286},"    iat: now,\n",[85,683,685,688,691],{"class":87,"line":684},17,[85,686,687],{"class":286},"    jti: crypto.",[85,689,690],{"class":490},"randomUUID",[85,692,693],{"class":286},"()\n",[85,695,697],{"class":87,"line":696},18,[85,698,699],{"class":286},"  };\n",[85,701,703],{"class":87,"line":702},19,[85,704,116],{"emptyLinePlaceholder":115},[85,706,708,711,714,717,720,723,726,729],{"class":87,"line":707},20,[85,709,710],{"class":480},"  return",[85,712,713],{"class":286}," jwt.",[85,715,716],{"class":490},"sign",[85,718,719],{"class":286},"(claims, ",[85,721,722],{"class":292},"SECRET_KEY",[85,724,725],{"class":286},", { algorithm: ",[85,727,728],{"class":299},"'RS256'",[85,730,731],{"class":286}," });\n",[85,733,735],{"class":87,"line":734},21,[85,736,365],{"class":286},[85,738,740],{"class":87,"line":739},22,[85,741,116],{"emptyLinePlaceholder":115},[85,743,745,747,750,752,754],{"class":87,"line":744},23,[85,746,481],{"class":480},[85,748,749],{"class":292}," assertion",[85,751,487],{"class":480},[85,753,574],{"class":490},[85,755,756],{"class":286},"();\n",[85,758,760,763,766,768,771],{"class":87,"line":759},24,[85,761,762],{"class":286},"console.",[85,764,765],{"class":490},"log",[85,767,494],{"class":286},[85,769,770],{"class":299},"'JWT Assertion:'",[85,772,773],{"class":286},", assertion);\n",[14,775,776],{},[32,777,778],{},"Python Example:",[75,780,784],{"className":781,"code":782,"language":783,"meta":80,"style":80},"language-python shiki shiki-themes github-light github-dark","import jwt\nimport time\nimport uuid\nimport os\n\n# Your M2M credentials\nCLIENT_ID = os.getenv('CHEKT_EVENT_CLIENT_ID')\nSECRET_KEY = os.getenv('CHEKT_EVENT_SECRET_KEY')\n\ndef create_jwt_assertion():\n    now = int(time.time())\n\n    claims = {\n        \"iss\": CLIENT_ID,\n        \"sub\": CLIENT_ID,\n        \"aud\": \"https://auth.chekt.com\",\n        \"exp\": now + 300,  # Expires in 5 minutes\n        \"iat\": now,\n        \"jti\": str(uuid.uuid4())\n    }\n\n    return jwt.encode(claims, SECRET_KEY, algorithm=\"RS256\")\n\nassertion = create_jwt_assertion()\nprint(f\"JWT Assertion: {assertion}\")\n","python",[82,785,786,794,801,808,815,819,824,839,852,856,867,881,885,894,905,916,927,944,952,965,970,974,998,1002,1012],{"__ignoreMap":80},[85,787,788,791],{"class":87,"line":88},[85,789,790],{"class":480},"import",[85,792,793],{"class":286}," jwt\n",[85,795,796,798],{"class":87,"line":94},[85,797,790],{"class":480},[85,799,800],{"class":286}," time\n",[85,802,803,805],{"class":87,"line":100},[85,804,790],{"class":480},[85,806,807],{"class":286}," uuid\n",[85,809,810,812],{"class":87,"line":106},[85,811,790],{"class":480},[85,813,814],{"class":286}," os\n",[85,816,817],{"class":87,"line":112},[85,818,116],{"emptyLinePlaceholder":115},[85,820,821],{"class":87,"line":119},[85,822,823],{"class":527},"# Your M2M credentials\n",[85,825,826,828,830,833,836],{"class":87,"line":125},[85,827,634],{"class":292},[85,829,487],{"class":480},[85,831,832],{"class":286}," os.getenv(",[85,834,835],{"class":299},"'CHEKT_EVENT_CLIENT_ID'",[85,837,838],{"class":286},")\n",[85,840,841,843,845,847,850],{"class":87,"line":131},[85,842,722],{"class":292},[85,844,487],{"class":480},[85,846,832],{"class":286},[85,848,849],{"class":299},"'CHEKT_EVENT_SECRET_KEY'",[85,851,838],{"class":286},[85,853,854],{"class":87,"line":137},[85,855,116],{"emptyLinePlaceholder":115},[85,857,858,861,864],{"class":87,"line":143},[85,859,860],{"class":480},"def",[85,862,863],{"class":490}," create_jwt_assertion",[85,865,866],{"class":286},"():\n",[85,868,869,872,875,878],{"class":87,"line":149},[85,870,871],{"class":286},"    now ",[85,873,874],{"class":480},"=",[85,876,877],{"class":292}," int",[85,879,880],{"class":286},"(time.time())\n",[85,882,883],{"class":87,"line":155},[85,884,116],{"emptyLinePlaceholder":115},[85,886,887,890,892],{"class":87,"line":639},[85,888,889],{"class":286},"    claims ",[85,891,874],{"class":480},[85,893,626],{"class":286},[85,895,896,899,901,903],{"class":87,"line":649},[85,897,898],{"class":299},"        \"iss\"",[85,900,296],{"class":286},[85,902,634],{"class":292},[85,904,303],{"class":286},[85,906,907,910,912,914],{"class":87,"line":660},[85,908,909],{"class":299},"        \"sub\"",[85,911,296],{"class":286},[85,913,634],{"class":292},[85,915,303],{"class":286},[85,917,918,921,923,925],{"class":87,"line":678},[85,919,920],{"class":299},"        \"aud\"",[85,922,296],{"class":286},[85,924,324],{"class":299},[85,926,303],{"class":286},[85,928,929,932,935,937,939,941],{"class":87,"line":684},[85,930,931],{"class":299},"        \"exp\"",[85,933,934],{"class":286},": now ",[85,936,666],{"class":480},[85,938,669],{"class":292},[85,940,672],{"class":286},[85,942,943],{"class":527},"# Expires in 5 minutes\n",[85,945,946,949],{"class":87,"line":696},[85,947,948],{"class":299},"        \"iat\"",[85,950,951],{"class":286},": now,\n",[85,953,954,957,959,962],{"class":87,"line":702},[85,955,956],{"class":299},"        \"jti\"",[85,958,296],{"class":286},[85,960,961],{"class":292},"str",[85,963,964],{"class":286},"(uuid.uuid4())\n",[85,966,967],{"class":87,"line":707},[85,968,969],{"class":286},"    }\n",[85,971,972],{"class":87,"line":734},[85,973,116],{"emptyLinePlaceholder":115},[85,975,976,979,982,984,987,991,993,996],{"class":87,"line":739},[85,977,978],{"class":480},"    return",[85,980,981],{"class":286}," jwt.encode(claims, ",[85,983,722],{"class":292},[85,985,986],{"class":286},", ",[85,988,990],{"class":989},"s4XuR","algorithm",[85,992,874],{"class":480},[85,994,995],{"class":299},"\"RS256\"",[85,997,838],{"class":286},[85,999,1000],{"class":87,"line":744},[85,1001,116],{"emptyLinePlaceholder":115},[85,1003,1004,1007,1009],{"class":87,"line":759},[85,1005,1006],{"class":286},"assertion ",[85,1008,874],{"class":480},[85,1010,1011],{"class":286}," create_jwt_assertion()\n",[85,1013,1015,1018,1020,1023,1026,1029,1032,1035,1038],{"class":87,"line":1014},25,[85,1016,1017],{"class":292},"print",[85,1019,494],{"class":286},[85,1021,1022],{"class":480},"f",[85,1024,1025],{"class":299},"\"JWT Assertion: ",[85,1027,1028],{"class":292},"{",[85,1030,1031],{"class":286},"assertion",[85,1033,1034],{"class":292},"}",[85,1036,1037],{"class":299},"\"",[85,1039,838],{"class":286},[18,1041,1044],{"title":1042,"type":1043},"Assertion Expiration","info",[14,1045,1046],{},"JWT assertions should have a short expiration time (5 minutes recommended). This limits the window for potential replay attacks.",[52,1048],{},[55,1050,1052],{"id":1051},"step-3-exchange-assertion-for-access-token","Step 3: Exchange Assertion for Access Token",[14,1054,1055],{},"Send the JWT assertion to CHeKT's token endpoint to receive an access token.",[173,1057,1059],{"id":1058},"request","Request",[75,1061,1065],{"className":1062,"code":1063,"language":1064,"meta":80,"style":80},"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=urn:ietf:params:oauth:grant-type:jwt-bearer\" \\\n  -d \"assertion=YOUR_JWT_ASSERTION\"\n","bash",[82,1066,1067,1084,1094,1104],{"__ignoreMap":80},[85,1068,1069,1072,1075,1078,1081],{"class":87,"line":88},[85,1070,1071],{"class":490},"curl",[85,1073,1074],{"class":292}," -X",[85,1076,1077],{"class":299}," POST",[85,1079,1080],{"class":299}," https://auth.chekt.com/oauth/token",[85,1082,1083],{"class":292}," \\\n",[85,1085,1086,1089,1092],{"class":87,"line":94},[85,1087,1088],{"class":292},"  -H",[85,1090,1091],{"class":299}," \"Content-Type: application/x-www-form-urlencoded\"",[85,1093,1083],{"class":292},[85,1095,1096,1099,1102],{"class":87,"line":100},[85,1097,1098],{"class":292},"  -d",[85,1100,1101],{"class":299}," \"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\"",[85,1103,1083],{"class":292},[85,1105,1106,1108],{"class":87,"line":106},[85,1107,1098],{"class":292},[85,1109,1110],{"class":299}," \"assertion=YOUR_JWT_ASSERTION\"\n",[14,1112,1113],{},[32,1114,1115],{},"Parameters:",[372,1117,1118,1128],{},[375,1119,1120],{},[378,1121,1122,1125],{},[381,1123,1124],{},"Parameter",[381,1126,1127],{},"Value",[388,1129,1130,1142],{},[378,1131,1132,1137],{},[393,1133,1134],{},[82,1135,1136],{},"grant_type",[393,1138,1139],{},[82,1140,1141],{},"urn:ietf:params:oauth:grant-type:jwt-bearer",[378,1143,1144,1148],{},[393,1145,1146],{},[82,1147,1031],{},[393,1149,1150],{},"Your signed JWT assertion token",[173,1152,1154],{"id":1153},"response","Response",[14,1156,1157],{},[32,1158,1159],{},"Success (200 OK):",[75,1161,1163],{"className":277,"code":1162,"language":279,"meta":80,"style":80},"{\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600\n}\n",[82,1164,1165,1169,1181,1193,1203],{"__ignoreMap":80},[85,1166,1167],{"class":87,"line":88},[85,1168,287],{"class":286},[85,1170,1171,1174,1176,1179],{"class":87,"line":94},[85,1172,1173],{"class":292},"  \"access_token\"",[85,1175,296],{"class":286},[85,1177,1178],{"class":299},"\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"",[85,1180,303],{"class":286},[85,1182,1183,1186,1188,1191],{"class":87,"line":100},[85,1184,1185],{"class":292},"  \"token_type\"",[85,1187,296],{"class":286},[85,1189,1190],{"class":299},"\"Bearer\"",[85,1192,303],{"class":286},[85,1194,1195,1198,1200],{"class":87,"line":106},[85,1196,1197],{"class":292},"  \"expires_in\"",[85,1199,296],{"class":286},[85,1201,1202],{"class":292},"3600\n",[85,1204,1205],{"class":87,"line":112},[85,1206,365],{"class":286},[14,1208,1209],{},[32,1210,1211],{},"Response Fields:",[372,1213,1214,1223],{},[375,1215,1216],{},[378,1217,1218,1221],{},[381,1219,1220],{},"Field",[381,1222,386],{},[388,1224,1225,1235,1245],{},[378,1226,1227,1232],{},[393,1228,1229],{},[82,1230,1231],{},"access_token",[393,1233,1234],{},"The access token to use for API requests",[378,1236,1237,1242],{},[393,1238,1239],{},[82,1240,1241],{},"token_type",[393,1243,1244],{},"Always \"Bearer\"",[378,1246,1247,1252],{},[393,1248,1249],{},[82,1250,1251],{},"expires_in",[393,1253,1254],{},"Token lifetime in seconds (typically 3600 = 1 hour)",[52,1256],{},[55,1258,1260],{"id":1259},"step-4-use-access-token-for-api-requests","Step 4: Use Access Token for API Requests",[14,1262,1263,1264,1267],{},"Include the access token in the ",[82,1265,1266],{},"Authorization"," header for all Event API requests.",[173,1269,1271],{"id":1270},"request-headers","Request Headers",[75,1273,1277],{"className":1274,"code":1275,"language":1276,"meta":80,"style":80},"language-http shiki shiki-themes github-light github-dark","Authorization: Bearer YOUR_ACCESS_TOKEN\nContent-Type: application/json\n","http",[82,1278,1279,1284],{"__ignoreMap":80},[85,1280,1281],{"class":87,"line":88},[85,1282,1283],{},"Authorization: Bearer YOUR_ACCESS_TOKEN\n",[85,1285,1286],{"class":87,"line":94},[85,1287,1288],{},"Content-Type: application/json\n",[173,1290,1292],{"id":1291},"example-send-event","Example: Send Event",[75,1294,1296],{"className":1062,"code":1295,"language":1064,"meta":80,"style":80},"curl -X POST https://api.chekt.com/partner/v1/events \\\n  -H \"Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"version\": \"1.0\",\n    \"location_id\": \"Z6RSOG\",\n    \"recorder_id\": \"Z6RANV\",\n    \"camera_id\": \"2fe519b4-2438-4aa1-b051-87cf22bb\",\n    \"event_id\": \"1763603245534315\",\n    \"event_type\": \"alarm\",\n    \"event_status\": \"active\",\n    \"event_time\": \"2025-11-20T01:46:25.534Z\",\n    \"sent_at\": \"2025-11-20T01:46:28.534Z\",\n    \"should_signal_to_monitoring_center\": true,\n    \"upload_snapshot_count\": 1,\n    \"upload_short_mp4\": false,\n    \"upload_event_mp4\": true,\n    \"payload\": {}\n  }'\n",[82,1297,1298,1311,1320,1329,1336,1341,1346,1351,1356,1361,1366,1371,1376,1381,1386,1391,1396,1401,1406],{"__ignoreMap":80},[85,1299,1300,1302,1304,1306,1309],{"class":87,"line":88},[85,1301,1071],{"class":490},[85,1303,1074],{"class":292},[85,1305,1077],{"class":299},[85,1307,1308],{"class":299}," https://api.chekt.com/partner/v1/events",[85,1310,1083],{"class":292},[85,1312,1313,1315,1318],{"class":87,"line":94},[85,1314,1088],{"class":292},[85,1316,1317],{"class":299}," \"Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"",[85,1319,1083],{"class":292},[85,1321,1322,1324,1327],{"class":87,"line":100},[85,1323,1088],{"class":292},[85,1325,1326],{"class":299}," \"Content-Type: application/json\"",[85,1328,1083],{"class":292},[85,1330,1331,1333],{"class":87,"line":106},[85,1332,1098],{"class":292},[85,1334,1335],{"class":299}," '{\n",[85,1337,1338],{"class":87,"line":112},[85,1339,1340],{"class":299},"    \"version\": \"1.0\",\n",[85,1342,1343],{"class":87,"line":119},[85,1344,1345],{"class":299},"    \"location_id\": \"Z6RSOG\",\n",[85,1347,1348],{"class":87,"line":125},[85,1349,1350],{"class":299},"    \"recorder_id\": \"Z6RANV\",\n",[85,1352,1353],{"class":87,"line":131},[85,1354,1355],{"class":299},"    \"camera_id\": \"2fe519b4-2438-4aa1-b051-87cf22bb\",\n",[85,1357,1358],{"class":87,"line":137},[85,1359,1360],{"class":299},"    \"event_id\": \"1763603245534315\",\n",[85,1362,1363],{"class":87,"line":143},[85,1364,1365],{"class":299},"    \"event_type\": \"alarm\",\n",[85,1367,1368],{"class":87,"line":149},[85,1369,1370],{"class":299},"    \"event_status\": \"active\",\n",[85,1372,1373],{"class":87,"line":155},[85,1374,1375],{"class":299},"    \"event_time\": \"2025-11-20T01:46:25.534Z\",\n",[85,1377,1378],{"class":87,"line":639},[85,1379,1380],{"class":299},"    \"sent_at\": \"2025-11-20T01:46:28.534Z\",\n",[85,1382,1383],{"class":87,"line":649},[85,1384,1385],{"class":299},"    \"should_signal_to_monitoring_center\": true,\n",[85,1387,1388],{"class":87,"line":660},[85,1389,1390],{"class":299},"    \"upload_snapshot_count\": 1,\n",[85,1392,1393],{"class":87,"line":678},[85,1394,1395],{"class":299},"    \"upload_short_mp4\": false,\n",[85,1397,1398],{"class":87,"line":684},[85,1399,1400],{"class":299},"    \"upload_event_mp4\": true,\n",[85,1402,1403],{"class":87,"line":696},[85,1404,1405],{"class":299},"    \"payload\": {}\n",[85,1407,1408],{"class":87,"line":702},[85,1409,1410],{"class":299},"  }'\n",[52,1412],{},[55,1414,1416],{"id":1415},"token-management","Token Management",[173,1418,1420],{"id":1419},"token-caching","Token Caching",[14,1422,1423],{},"Access tokens are valid for a limited time (typically 1 hour). To optimize performance:",[26,1425,1426,1432,1438],{},[29,1427,1428,1431],{},[32,1429,1430],{},"Cache"," the access token in memory",[29,1433,1434,1437],{},[32,1435,1436],{},"Reuse"," the token until it expires",[29,1439,1440,1443],{},[32,1441,1442],{},"Generate a new token"," only when the current one expires",[14,1445,1446],{},[32,1447,1448],{},"Implementation Example:",[75,1450,1452],{"className":471,"code":1451,"language":473,"meta":80,"style":80},"class EventAPIClient {\n  constructor(clientId, secretKey) {\n    this.clientId = clientId;\n    this.secretKey = secretKey;\n    this.accessToken = null;\n    this.tokenExpiry = 0;\n  }\n\n  async getAccessToken() {\n    // Check if current token is still valid\n    if (this.accessToken && Date.now() \u003C this.tokenExpiry) {\n      return this.accessToken;\n    }\n\n    // Generate new JWT assertion\n    const assertion = this.createJWTAssertion();\n\n    // Exchange for access token\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\n    // Cache token with safety margin (refresh 1 minute early)\n    this.accessToken = data.access_token;\n    this.tokenExpiry = Date.now() + (data.expires_in * 1000) - 60000;\n\n    return this.accessToken;\n  }\n\n  createJWTAssertion() {\n    // Implementation from Step 2\n    // ...\n  }\n\n  async sendEvent(eventData) {\n    const token = await this.getAccessToken();\n\n    return fetch('https://api.chekt.com/partner/v1/events', {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify(eventData)\n    });\n  }\n}\n",[82,1453,1454,1464,1482,1495,1507,1521,1535,1540,1544,1554,1559,1591,1601,1605,1609,1614,1633,1637,1642,1665,1675,1691,1704,1709,1713,1731,1736,1742,1754,1790,1795,1804,1809,1814,1822,1828,1834,1839,1844,1859,1880,1885,1899,1908,1914,1933,1944,1950,1966,1971,1976],{"__ignoreMap":80},[85,1455,1456,1459,1462],{"class":87,"line":88},[85,1457,1458],{"class":480},"class",[85,1460,1461],{"class":490}," EventAPIClient",[85,1463,626],{"class":286},[85,1465,1466,1469,1471,1474,1476,1479],{"class":87,"line":94},[85,1467,1468],{"class":480},"  constructor",[85,1470,494],{"class":286},[85,1472,1473],{"class":989},"clientId",[85,1475,986],{"class":286},[85,1477,1478],{"class":989},"secretKey",[85,1480,1481],{"class":286},") {\n",[85,1483,1484,1487,1490,1492],{"class":87,"line":100},[85,1485,1486],{"class":292},"    this",[85,1488,1489],{"class":286},".clientId ",[85,1491,874],{"class":480},[85,1493,1494],{"class":286}," clientId;\n",[85,1496,1497,1499,1502,1504],{"class":87,"line":106},[85,1498,1486],{"class":292},[85,1500,1501],{"class":286},".secretKey ",[85,1503,874],{"class":480},[85,1505,1506],{"class":286}," secretKey;\n",[85,1508,1509,1511,1514,1516,1519],{"class":87,"line":112},[85,1510,1486],{"class":292},[85,1512,1513],{"class":286},".accessToken ",[85,1515,874],{"class":480},[85,1517,1518],{"class":292}," null",[85,1520,546],{"class":286},[85,1522,1523,1525,1528,1530,1533],{"class":87,"line":119},[85,1524,1486],{"class":292},[85,1526,1527],{"class":286},".tokenExpiry ",[85,1529,874],{"class":480},[85,1531,1532],{"class":292}," 0",[85,1534,546],{"class":286},[85,1536,1537],{"class":87,"line":125},[85,1538,1539],{"class":286},"  }\n",[85,1541,1542],{"class":87,"line":131},[85,1543,116],{"emptyLinePlaceholder":115},[85,1545,1546,1549,1552],{"class":87,"line":137},[85,1547,1548],{"class":480},"  async",[85,1550,1551],{"class":490}," getAccessToken",[85,1553,577],{"class":286},[85,1555,1556],{"class":87,"line":143},[85,1557,1558],{"class":527},"    // Check if current token is still valid\n",[85,1560,1561,1564,1567,1570,1572,1575,1578,1580,1582,1585,1588],{"class":87,"line":149},[85,1562,1563],{"class":480},"    if",[85,1565,1566],{"class":286}," (",[85,1568,1569],{"class":292},"this",[85,1571,1513],{"class":286},[85,1573,1574],{"class":480},"&&",[85,1576,1577],{"class":286}," Date.",[85,1579,599],{"class":490},[85,1581,602],{"class":286},[85,1583,1584],{"class":480},"\u003C",[85,1586,1587],{"class":292}," this",[85,1589,1590],{"class":286},".tokenExpiry) {\n",[85,1592,1593,1596,1598],{"class":87,"line":155},[85,1594,1595],{"class":480},"      return",[85,1597,1587],{"class":292},[85,1599,1600],{"class":286},".accessToken;\n",[85,1602,1603],{"class":87,"line":639},[85,1604,969],{"class":286},[85,1606,1607],{"class":87,"line":649},[85,1608,116],{"emptyLinePlaceholder":115},[85,1610,1611],{"class":87,"line":660},[85,1612,1613],{"class":527},"    // Generate new JWT assertion\n",[85,1615,1616,1619,1621,1623,1625,1628,1631],{"class":87,"line":678},[85,1617,1618],{"class":480},"    const",[85,1620,749],{"class":292},[85,1622,487],{"class":480},[85,1624,1587],{"class":292},[85,1626,1627],{"class":286},".",[85,1629,1630],{"class":490},"createJWTAssertion",[85,1632,756],{"class":286},[85,1634,1635],{"class":87,"line":684},[85,1636,116],{"emptyLinePlaceholder":115},[85,1638,1639],{"class":87,"line":696},[85,1640,1641],{"class":527},"    // Exchange for access token\n",[85,1643,1644,1646,1649,1651,1654,1657,1659,1662],{"class":87,"line":702},[85,1645,1618],{"class":480},[85,1647,1648],{"class":292}," response",[85,1650,487],{"class":480},[85,1652,1653],{"class":480}," await",[85,1655,1656],{"class":490}," fetch",[85,1658,494],{"class":286},[85,1660,1661],{"class":299},"'https://auth.chekt.com/oauth/token'",[85,1663,1664],{"class":286},", {\n",[85,1666,1667,1670,1673],{"class":87,"line":707},[85,1668,1669],{"class":286},"      method: ",[85,1671,1672],{"class":299},"'POST'",[85,1674,303],{"class":286},[85,1676,1677,1680,1683,1685,1688],{"class":87,"line":734},[85,1678,1679],{"class":286},"      headers: { ",[85,1681,1682],{"class":299},"'Content-Type'",[85,1684,296],{"class":286},[85,1686,1687],{"class":299},"'application/x-www-form-urlencoded'",[85,1689,1690],{"class":286}," },\n",[85,1692,1693,1696,1699,1701],{"class":87,"line":739},[85,1694,1695],{"class":286},"      body: ",[85,1697,1698],{"class":299},"`grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${",[85,1700,1031],{"class":286},[85,1702,1703],{"class":299},"}`\n",[85,1705,1706],{"class":87,"line":744},[85,1707,1708],{"class":286},"    });\n",[85,1710,1711],{"class":87,"line":759},[85,1712,116],{"emptyLinePlaceholder":115},[85,1714,1715,1717,1720,1722,1724,1727,1729],{"class":87,"line":1014},[85,1716,1618],{"class":480},[85,1718,1719],{"class":292}," data",[85,1721,487],{"class":480},[85,1723,1653],{"class":480},[85,1725,1726],{"class":286}," response.",[85,1728,279],{"class":490},[85,1730,756],{"class":286},[85,1732,1734],{"class":87,"line":1733},26,[85,1735,116],{"emptyLinePlaceholder":115},[85,1737,1739],{"class":87,"line":1738},27,[85,1740,1741],{"class":527},"    // Cache token with safety margin (refresh 1 minute early)\n",[85,1743,1745,1747,1749,1751],{"class":87,"line":1744},28,[85,1746,1486],{"class":292},[85,1748,1513],{"class":286},[85,1750,874],{"class":480},[85,1752,1753],{"class":286}," data.access_token;\n",[85,1755,1757,1759,1761,1763,1765,1767,1769,1771,1774,1777,1779,1782,1785,1788],{"class":87,"line":1756},29,[85,1758,1486],{"class":292},[85,1760,1527],{"class":286},[85,1762,874],{"class":480},[85,1764,1577],{"class":286},[85,1766,599],{"class":490},[85,1768,602],{"class":286},[85,1770,666],{"class":480},[85,1772,1773],{"class":286}," (data.expires_in ",[85,1775,1776],{"class":480},"*",[85,1778,608],{"class":292},[85,1780,1781],{"class":286},") ",[85,1783,1784],{"class":480},"-",[85,1786,1787],{"class":292}," 60000",[85,1789,546],{"class":286},[85,1791,1793],{"class":87,"line":1792},30,[85,1794,116],{"emptyLinePlaceholder":115},[85,1796,1798,1800,1802],{"class":87,"line":1797},31,[85,1799,978],{"class":480},[85,1801,1587],{"class":292},[85,1803,1600],{"class":286},[85,1805,1807],{"class":87,"line":1806},32,[85,1808,1539],{"class":286},[85,1810,1812],{"class":87,"line":1811},33,[85,1813,116],{"emptyLinePlaceholder":115},[85,1815,1817,1820],{"class":87,"line":1816},34,[85,1818,1819],{"class":490},"  createJWTAssertion",[85,1821,577],{"class":286},[85,1823,1825],{"class":87,"line":1824},35,[85,1826,1827],{"class":527},"    // Implementation from Step 2\n",[85,1829,1831],{"class":87,"line":1830},36,[85,1832,1833],{"class":527},"    // ...\n",[85,1835,1837],{"class":87,"line":1836},37,[85,1838,1539],{"class":286},[85,1840,1842],{"class":87,"line":1841},38,[85,1843,116],{"emptyLinePlaceholder":115},[85,1845,1847,1849,1852,1854,1857],{"class":87,"line":1846},39,[85,1848,1548],{"class":480},[85,1850,1851],{"class":490}," sendEvent",[85,1853,494],{"class":286},[85,1855,1856],{"class":989},"eventData",[85,1858,1481],{"class":286},[85,1860,1862,1864,1867,1869,1871,1873,1875,1878],{"class":87,"line":1861},40,[85,1863,1618],{"class":480},[85,1865,1866],{"class":292}," token",[85,1868,487],{"class":480},[85,1870,1653],{"class":480},[85,1872,1587],{"class":292},[85,1874,1627],{"class":286},[85,1876,1877],{"class":490},"getAccessToken",[85,1879,756],{"class":286},[85,1881,1883],{"class":87,"line":1882},41,[85,1884,116],{"emptyLinePlaceholder":115},[85,1886,1888,1890,1892,1894,1897],{"class":87,"line":1887},42,[85,1889,978],{"class":480},[85,1891,1656],{"class":490},[85,1893,494],{"class":286},[85,1895,1896],{"class":299},"'https://api.chekt.com/partner/v1/events'",[85,1898,1664],{"class":286},[85,1900,1902,1904,1906],{"class":87,"line":1901},43,[85,1903,1669],{"class":286},[85,1905,1672],{"class":299},[85,1907,303],{"class":286},[85,1909,1911],{"class":87,"line":1910},44,[85,1912,1913],{"class":286},"      headers: {\n",[85,1915,1917,1920,1922,1925,1928,1931],{"class":87,"line":1916},45,[85,1918,1919],{"class":299},"        'Authorization'",[85,1921,296],{"class":286},[85,1923,1924],{"class":299},"`Bearer ${",[85,1926,1927],{"class":286},"token",[85,1929,1930],{"class":299},"}`",[85,1932,303],{"class":286},[85,1934,1936,1939,1941],{"class":87,"line":1935},46,[85,1937,1938],{"class":299},"        'Content-Type'",[85,1940,296],{"class":286},[85,1942,1943],{"class":299},"'application/json'\n",[85,1945,1947],{"class":87,"line":1946},47,[85,1948,1949],{"class":286},"      },\n",[85,1951,1953,1955,1958,1960,1963],{"class":87,"line":1952},48,[85,1954,1695],{"class":286},[85,1956,1957],{"class":292},"JSON",[85,1959,1627],{"class":286},[85,1961,1962],{"class":490},"stringify",[85,1964,1965],{"class":286},"(eventData)\n",[85,1967,1969],{"class":87,"line":1968},49,[85,1970,1708],{"class":286},[85,1972,1974],{"class":87,"line":1973},50,[85,1975,1539],{"class":286},[85,1977,1979],{"class":87,"line":1978},51,[85,1980,365],{"class":286},[173,1982,1984],{"id":1983},"token-refresh-strategy","Token Refresh Strategy",[14,1986,1987],{},"When an access token expires:",[1989,1990,1991,1997,2000,2003],"ol",{},[29,1992,1993,1994,1648],{},"You'll receive a ",[82,1995,1996],{},"401 Unauthorized",[29,1998,1999],{},"Generate a new JWT assertion",[29,2001,2002],{},"Request a new access token",[29,2004,2005],{},"Retry the API request with the new token",[18,2007,2009],{"title":2008,"type":1043},"Automatic Retry",[14,2010,2011],{},"Implement automatic token refresh and request retry in your API client to handle token expiration gracefully.",[52,2013],{},[55,2015,2017],{"id":2016},"authentication-errors","Authentication Errors",[173,2019,2021],{"id":2020},"common-error-responses","Common Error Responses",[14,2023,2024],{},[32,2025,1996],{},[75,2027,2029],{"className":277,"code":2028,"language":279,"meta":80,"style":80},"{\n  \"error\": \"Unauthorized\",\n  \"message\": \"Invalid or expired access token\"\n}\n",[82,2030,2031,2035,2047,2057],{"__ignoreMap":80},[85,2032,2033],{"class":87,"line":88},[85,2034,287],{"class":286},[85,2036,2037,2040,2042,2045],{"class":87,"line":94},[85,2038,2039],{"class":292},"  \"error\"",[85,2041,296],{"class":286},[85,2043,2044],{"class":299},"\"Unauthorized\"",[85,2046,303],{"class":286},[85,2048,2049,2052,2054],{"class":87,"line":100},[85,2050,2051],{"class":292},"  \"message\"",[85,2053,296],{"class":286},[85,2055,2056],{"class":299},"\"Invalid or expired access token\"\n",[85,2058,2059],{"class":87,"line":106},[85,2060,365],{"class":286},[14,2062,2063,2066],{},[32,2064,2065],{},"Solution",": Generate a new access token using a fresh JWT assertion",[14,2068,2069],{},[32,2070,2071],{},"403 Forbidden",[75,2073,2075],{"className":277,"code":2074,"language":279,"meta":80,"style":80},"{\n  \"error\": \"Forbidden\",\n  \"message\": \"Insufficient permissions for event ingestion\"\n}\n",[82,2076,2077,2081,2092,2101],{"__ignoreMap":80},[85,2078,2079],{"class":87,"line":88},[85,2080,287],{"class":286},[85,2082,2083,2085,2087,2090],{"class":87,"line":94},[85,2084,2039],{"class":292},[85,2086,296],{"class":286},[85,2088,2089],{"class":299},"\"Forbidden\"",[85,2091,303],{"class":286},[85,2093,2094,2096,2098],{"class":87,"line":100},[85,2095,2051],{"class":292},[85,2097,296],{"class":286},[85,2099,2100],{"class":299},"\"Insufficient permissions for event ingestion\"\n",[85,2102,2103],{"class":87,"line":106},[85,2104,365],{"class":286},[14,2106,2107,2109],{},[32,2108,2065],{},": Verify your Auth Application has event ingestion permissions",[14,2111,2112],{},[32,2113,2114],{},"400 Bad Request - Invalid Assertion",[75,2116,2118],{"className":277,"code":2117,"language":279,"meta":80,"style":80},"{\n  \"error\": \"invalid_grant\",\n  \"error_description\": \"Invalid JWT assertion\"\n}\n",[82,2119,2120,2124,2135,2145],{"__ignoreMap":80},[85,2121,2122],{"class":87,"line":88},[85,2123,287],{"class":286},[85,2125,2126,2128,2130,2133],{"class":87,"line":94},[85,2127,2039],{"class":292},[85,2129,296],{"class":286},[85,2131,2132],{"class":299},"\"invalid_grant\"",[85,2134,303],{"class":286},[85,2136,2137,2140,2142],{"class":87,"line":100},[85,2138,2139],{"class":292},"  \"error_description\"",[85,2141,296],{"class":286},[85,2143,2144],{"class":299},"\"Invalid JWT assertion\"\n",[85,2146,2147],{"class":87,"line":106},[85,2148,365],{"class":286},[14,2150,2151],{},[32,2152,2153],{},"Possible Causes:",[26,2155,2156,2159,2162,2165],{},[29,2157,2158],{},"JWT signature is invalid (wrong secret key)",[29,2160,2161],{},"JWT has expired",[29,2163,2164],{},"JWT claims are malformed",[29,2166,2167,2169],{},[82,2168,417],{}," claim doesn't match auth server",[52,2171],{},[55,2173,2175],{"id":2174},"security-best-practices","Security Best Practices",[2177,2178,2179],"guide-check-list",{},[26,2180,2181,2184,2187,2190,2193,2196,2199,2205,2208,2211],{},[29,2182,2183],{},"✓ Store secret keys in secure environment variables, never in code",[29,2185,2186],{},"✓ Use separate Auth Applications for development and production",[29,2188,2189],{},"✓ Rotate secret keys periodically (every 90 days recommended)",[29,2191,2192],{},"✓ Implement token caching to minimize authentication requests",[29,2194,2195],{},"✓ Use HTTPS for all API requests",[29,2197,2198],{},"✓ Set short expiration times for JWT assertions (5 minutes max)",[29,2200,2201,2202,2204],{},"✓ Use unique ",[82,2203,450],{}," values for each assertion to prevent replay attacks",[29,2206,2207],{},"✓ Validate token expiration before making API requests",[29,2209,2210],{},"✓ Log authentication failures for security monitoring",[29,2212,2213],{},"✓ Implement automatic token refresh on 401 errors",[52,2215],{},[55,2217,2219],{"id":2218},"complete-authentication-example","Complete Authentication Example",[14,2221,2222],{},"Here's a complete example of authenticating and sending an event:",[75,2224,2226],{"className":471,"code":2225,"language":473,"meta":80,"style":80},"const jwt = require('jsonwebtoken');\nconst axios = require('axios');\n\n// Configuration\nconst CLIENT_ID = process.env.CHEKT_EVENT_CLIENT_ID;\nconst SECRET_KEY = process.env.CHEKT_EVENT_SECRET_KEY;\nconst AUTH_SERVER = 'https://auth.chekt.com';\nconst API_BASE = 'https://api.chekt.com';\n\n// Token cache\nlet cachedToken = null;\nlet tokenExpiry = 0;\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 (with caching)\nasync function getAccessToken() {\n  // Return cached token if still valid\n  if (cachedToken && Date.now() \u003C tokenExpiry) {\n    return cachedToken;\n  }\n\n  // Generate new assertion\n  const assertion = createAssertion();\n\n  // Exchange for access token\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  // Cache token\n  cachedToken = response.data.access_token;\n  tokenExpiry = Date.now() + (response.data.expires_in * 1000) - 60000; // Refresh 1 min early\n\n  return cachedToken;\n}\n\n// Send event\nasync function sendEvent(eventData) {\n  const accessToken = await getAccessToken();\n\n  try {\n    const response = await axios.post(\n      `${API_BASE}/partner/v1/events`,\n      eventData,\n      {\n        headers: {\n          'Authorization': `Bearer ${accessToken}`,\n          'Content-Type': 'application/json'\n        }\n      }\n    );\n\n    return response.data;\n  } catch (error) {\n    // Handle 401 by refreshing token and retrying\n    if (error.response?.status === 401) {\n      cachedToken = null; // Invalidate cache\n      const newToken = await getAccessToken();\n\n      const retryResponse = await axios.post(\n        `${API_BASE}/partner/v1/events`,\n        eventData,\n        {\n          headers: {\n            'Authorization': `Bearer ${newToken}`,\n            'Content-Type': 'application/json'\n          }\n        }\n      );\n\n      return retryResponse.data;\n    }\n\n    throw error;\n  }\n}\n\n// Usage\nconst eventData = {\n  version: \"1.0\",\n  location_id: \"Z6RSOG\",\n  recorder_id: \"Z6RANV\",\n  camera_id: \"2fe519b4-2438-4aa1-b051-87cf22bb\",\n  event_id: \"1763603245534315\",\n  event_type: \"alarm\",\n  event_status: \"active\",\n  event_time: \"2025-11-20T01:46:25.534Z\",\n  sent_at: \"2025-11-20T01:46:28.534Z\",\n  should_signal_to_monitoring_center: true,\n  upload_snapshot_count: 1,\n  upload_short_mp4: false,\n  upload_event_mp4: true,\n  payload: {}\n};\n\nsendEvent(eventData)\n  .then(result => console.log('Event sent:', result))\n  .catch(error => console.error('Error:', error.response?.data || error.message));\n",[82,2227,2228,2244,2262,2266,2271,2285,2299,2313,2327,2331,2336,2350,2363,2367,2372,2381,2392,2397,2406,2415,2425,2450,2470,2489,2494,2501,2511,2516,2520,2524,2529,2541,2546,2567,2574,2578,2582,2587,2599,2603,2608,2626,2638,2649,2659,2664,2669,2673,2685,2689,2693,2697,2703,2714,2749,2754,2761,2766,2771,2777,2792,2808,2813,2821,2838,2852,2858,2864,2870,2887,2897,2903,2909,2915,2920,2928,2940,2946,2962,2977,2994,2999,3017,3029,3035,3041,3047,3064,3074,3080,3085,3091,3096,3104,3109,3114,3123,3128,3133,3138,3144,3156,3167,3178,3189,3200,3211,3222,3233,3244,3255,3266,3277,3288,3298,3304,3310,3315,3323,3353],{"__ignoreMap":80},[85,2229,2230,2232,2234,2236,2238,2240,2242],{"class":87,"line":88},[85,2231,481],{"class":480},[85,2233,484],{"class":292},[85,2235,487],{"class":480},[85,2237,491],{"class":490},[85,2239,494],{"class":286},[85,2241,497],{"class":299},[85,2243,500],{"class":286},[85,2245,2246,2248,2251,2253,2255,2257,2260],{"class":87,"line":94},[85,2247,481],{"class":480},[85,2249,2250],{"class":292}," axios",[85,2252,487],{"class":480},[85,2254,491],{"class":490},[85,2256,494],{"class":286},[85,2258,2259],{"class":299},"'axios'",[85,2261,500],{"class":286},[85,2263,2264],{"class":87,"line":100},[85,2265,116],{"emptyLinePlaceholder":115},[85,2267,2268],{"class":87,"line":106},[85,2269,2270],{"class":527},"// Configuration\n",[85,2272,2273,2275,2277,2279,2281,2283],{"class":87,"line":112},[85,2274,481],{"class":480},[85,2276,535],{"class":292},[85,2278,487],{"class":480},[85,2280,540],{"class":286},[85,2282,543],{"class":292},[85,2284,546],{"class":286},[85,2286,2287,2289,2291,2293,2295,2297],{"class":87,"line":119},[85,2288,481],{"class":480},[85,2290,553],{"class":292},[85,2292,487],{"class":480},[85,2294,540],{"class":286},[85,2296,560],{"class":292},[85,2298,546],{"class":286},[85,2300,2301,2303,2306,2308,2311],{"class":87,"line":125},[85,2302,481],{"class":480},[85,2304,2305],{"class":292}," AUTH_SERVER",[85,2307,487],{"class":480},[85,2309,2310],{"class":299}," 'https://auth.chekt.com'",[85,2312,546],{"class":286},[85,2314,2315,2317,2320,2322,2325],{"class":87,"line":131},[85,2316,481],{"class":480},[85,2318,2319],{"class":292}," API_BASE",[85,2321,487],{"class":480},[85,2323,2324],{"class":299}," 'https://api.chekt.com'",[85,2326,546],{"class":286},[85,2328,2329],{"class":87,"line":137},[85,2330,116],{"emptyLinePlaceholder":115},[85,2332,2333],{"class":87,"line":143},[85,2334,2335],{"class":527},"// Token cache\n",[85,2337,2338,2341,2344,2346,2348],{"class":87,"line":149},[85,2339,2340],{"class":480},"let",[85,2342,2343],{"class":286}," cachedToken ",[85,2345,874],{"class":480},[85,2347,1518],{"class":292},[85,2349,546],{"class":286},[85,2351,2352,2354,2357,2359,2361],{"class":87,"line":155},[85,2353,2340],{"class":480},[85,2355,2356],{"class":286}," tokenExpiry ",[85,2358,874],{"class":480},[85,2360,1532],{"class":292},[85,2362,546],{"class":286},[85,2364,2365],{"class":87,"line":639},[85,2366,116],{"emptyLinePlaceholder":115},[85,2368,2369],{"class":87,"line":649},[85,2370,2371],{"class":527},"// Generate JWT assertion\n",[85,2373,2374,2376,2379],{"class":87,"line":660},[85,2375,571],{"class":480},[85,2377,2378],{"class":490}," createAssertion",[85,2380,577],{"class":286},[85,2382,2383,2385,2387,2389],{"class":87,"line":678},[85,2384,710],{"class":480},[85,2386,713],{"class":286},[85,2388,716],{"class":490},[85,2390,2391],{"class":286},"(\n",[85,2393,2394],{"class":87,"line":684},[85,2395,2396],{"class":286},"    {\n",[85,2398,2399,2402,2404],{"class":87,"line":696},[85,2400,2401],{"class":286},"      iss: ",[85,2403,634],{"class":292},[85,2405,303],{"class":286},[85,2407,2408,2411,2413],{"class":87,"line":702},[85,2409,2410],{"class":286},"      sub: ",[85,2412,634],{"class":292},[85,2414,303],{"class":286},[85,2416,2417,2420,2423],{"class":87,"line":707},[85,2418,2419],{"class":286},"      aud: ",[85,2421,2422],{"class":292},"AUTH_SERVER",[85,2424,303],{"class":286},[85,2426,2427,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448],{"class":87,"line":734},[85,2428,2429],{"class":286},"      exp: Math.",[85,2431,593],{"class":490},[85,2433,596],{"class":286},[85,2435,599],{"class":490},[85,2437,602],{"class":286},[85,2439,605],{"class":480},[85,2441,608],{"class":292},[85,2443,1781],{"class":286},[85,2445,666],{"class":480},[85,2447,669],{"class":292},[85,2449,303],{"class":286},[85,2451,2452,2455,2457,2459,2461,2463,2465,2467],{"class":87,"line":739},[85,2453,2454],{"class":286},"      iat: Math.",[85,2456,593],{"class":490},[85,2458,596],{"class":286},[85,2460,599],{"class":490},[85,2462,602],{"class":286},[85,2464,605],{"class":480},[85,2466,608],{"class":292},[85,2468,2469],{"class":286},"),\n",[85,2471,2472,2475,2478,2480,2482,2485,2487],{"class":87,"line":744},[85,2473,2474],{"class":286},"      jti: ",[85,2476,2477],{"class":490},"require",[85,2479,494],{"class":286},[85,2481,516],{"class":299},[85,2483,2484],{"class":286},").",[85,2486,690],{"class":490},[85,2488,693],{"class":286},[85,2490,2491],{"class":87,"line":759},[85,2492,2493],{"class":286},"    },\n",[85,2495,2496,2499],{"class":87,"line":1014},[85,2497,2498],{"class":292},"    SECRET_KEY",[85,2500,303],{"class":286},[85,2502,2503,2506,2508],{"class":87,"line":1733},[85,2504,2505],{"class":286},"    { algorithm: ",[85,2507,728],{"class":299},[85,2509,2510],{"class":286}," }\n",[85,2512,2513],{"class":87,"line":1738},[85,2514,2515],{"class":286},"  );\n",[85,2517,2518],{"class":87,"line":1744},[85,2519,365],{"class":286},[85,2521,2522],{"class":87,"line":1756},[85,2523,116],{"emptyLinePlaceholder":115},[85,2525,2526],{"class":87,"line":1792},[85,2527,2528],{"class":527},"// Get access token (with caching)\n",[85,2530,2531,2534,2537,2539],{"class":87,"line":1797},[85,2532,2533],{"class":480},"async",[85,2535,2536],{"class":480}," function",[85,2538,1551],{"class":490},[85,2540,577],{"class":286},[85,2542,2543],{"class":87,"line":1806},[85,2544,2545],{"class":527},"  // Return cached token if still valid\n",[85,2547,2548,2551,2554,2556,2558,2560,2562,2564],{"class":87,"line":1811},[85,2549,2550],{"class":480},"  if",[85,2552,2553],{"class":286}," (cachedToken ",[85,2555,1574],{"class":480},[85,2557,1577],{"class":286},[85,2559,599],{"class":490},[85,2561,602],{"class":286},[85,2563,1584],{"class":480},[85,2565,2566],{"class":286}," tokenExpiry) {\n",[85,2568,2569,2571],{"class":87,"line":1816},[85,2570,978],{"class":480},[85,2572,2573],{"class":286}," cachedToken;\n",[85,2575,2576],{"class":87,"line":1824},[85,2577,1539],{"class":286},[85,2579,2580],{"class":87,"line":1830},[85,2581,116],{"emptyLinePlaceholder":115},[85,2583,2584],{"class":87,"line":1836},[85,2585,2586],{"class":527},"  // Generate new assertion\n",[85,2588,2589,2591,2593,2595,2597],{"class":87,"line":1841},[85,2590,582],{"class":480},[85,2592,749],{"class":292},[85,2594,487],{"class":480},[85,2596,2378],{"class":490},[85,2598,756],{"class":286},[85,2600,2601],{"class":87,"line":1846},[85,2602,116],{"emptyLinePlaceholder":115},[85,2604,2605],{"class":87,"line":1861},[85,2606,2607],{"class":527},"  // Exchange for access token\n",[85,2609,2610,2612,2614,2616,2618,2621,2624],{"class":87,"line":1882},[85,2611,582],{"class":480},[85,2613,1648],{"class":292},[85,2615,487],{"class":480},[85,2617,1653],{"class":480},[85,2619,2620],{"class":286}," axios.",[85,2622,2623],{"class":490},"post",[85,2625,2391],{"class":286},[85,2627,2628,2631,2633,2636],{"class":87,"line":1887},[85,2629,2630],{"class":299},"    `${",[85,2632,2422],{"class":292},[85,2634,2635],{"class":299},"}/oauth/token`",[85,2637,303],{"class":286},[85,2639,2640,2643,2646],{"class":87,"line":1901},[85,2641,2642],{"class":480},"    new",[85,2644,2645],{"class":490}," URLSearchParams",[85,2647,2648],{"class":286},"({\n",[85,2650,2651,2654,2657],{"class":87,"line":1910},[85,2652,2653],{"class":286},"      grant_type: ",[85,2655,2656],{"class":299},"'urn:ietf:params:oauth:grant-type:jwt-bearer'",[85,2658,303],{"class":286},[85,2660,2661],{"class":87,"line":1916},[85,2662,2663],{"class":286},"      assertion: assertion\n",[85,2665,2666],{"class":87,"line":1935},[85,2667,2668],{"class":286},"    }),\n",[85,2670,2671],{"class":87,"line":1946},[85,2672,2396],{"class":286},[85,2674,2675,2677,2679,2681,2683],{"class":87,"line":1952},[85,2676,1679],{"class":286},[85,2678,1682],{"class":299},[85,2680,296],{"class":286},[85,2682,1687],{"class":299},[85,2684,2510],{"class":286},[85,2686,2687],{"class":87,"line":1968},[85,2688,969],{"class":286},[85,2690,2691],{"class":87,"line":1973},[85,2692,2515],{"class":286},[85,2694,2695],{"class":87,"line":1978},[85,2696,116],{"emptyLinePlaceholder":115},[85,2698,2700],{"class":87,"line":2699},52,[85,2701,2702],{"class":527},"  // Cache token\n",[85,2704,2706,2709,2711],{"class":87,"line":2705},53,[85,2707,2708],{"class":286},"  cachedToken ",[85,2710,874],{"class":480},[85,2712,2713],{"class":286}," response.data.access_token;\n",[85,2715,2717,2720,2722,2724,2726,2728,2730,2733,2735,2737,2739,2741,2743,2746],{"class":87,"line":2716},54,[85,2718,2719],{"class":286},"  tokenExpiry ",[85,2721,874],{"class":480},[85,2723,1577],{"class":286},[85,2725,599],{"class":490},[85,2727,602],{"class":286},[85,2729,666],{"class":480},[85,2731,2732],{"class":286}," (response.data.expires_in ",[85,2734,1776],{"class":480},[85,2736,608],{"class":292},[85,2738,1781],{"class":286},[85,2740,1784],{"class":480},[85,2742,1787],{"class":292},[85,2744,2745],{"class":286},"; ",[85,2747,2748],{"class":527},"// Refresh 1 min early\n",[85,2750,2752],{"class":87,"line":2751},55,[85,2753,116],{"emptyLinePlaceholder":115},[85,2755,2757,2759],{"class":87,"line":2756},56,[85,2758,710],{"class":480},[85,2760,2573],{"class":286},[85,2762,2764],{"class":87,"line":2763},57,[85,2765,365],{"class":286},[85,2767,2769],{"class":87,"line":2768},58,[85,2770,116],{"emptyLinePlaceholder":115},[85,2772,2774],{"class":87,"line":2773},59,[85,2775,2776],{"class":527},"// Send event\n",[85,2778,2780,2782,2784,2786,2788,2790],{"class":87,"line":2779},60,[85,2781,2533],{"class":480},[85,2783,2536],{"class":480},[85,2785,1851],{"class":490},[85,2787,494],{"class":286},[85,2789,1856],{"class":989},[85,2791,1481],{"class":286},[85,2793,2795,2797,2800,2802,2804,2806],{"class":87,"line":2794},61,[85,2796,582],{"class":480},[85,2798,2799],{"class":292}," accessToken",[85,2801,487],{"class":480},[85,2803,1653],{"class":480},[85,2805,1551],{"class":490},[85,2807,756],{"class":286},[85,2809,2811],{"class":87,"line":2810},62,[85,2812,116],{"emptyLinePlaceholder":115},[85,2814,2816,2819],{"class":87,"line":2815},63,[85,2817,2818],{"class":480},"  try",[85,2820,626],{"class":286},[85,2822,2824,2826,2828,2830,2832,2834,2836],{"class":87,"line":2823},64,[85,2825,1618],{"class":480},[85,2827,1648],{"class":292},[85,2829,487],{"class":480},[85,2831,1653],{"class":480},[85,2833,2620],{"class":286},[85,2835,2623],{"class":490},[85,2837,2391],{"class":286},[85,2839,2841,2844,2847,2850],{"class":87,"line":2840},65,[85,2842,2843],{"class":299},"      `${",[85,2845,2846],{"class":292},"API_BASE",[85,2848,2849],{"class":299},"}/partner/v1/events`",[85,2851,303],{"class":286},[85,2853,2855],{"class":87,"line":2854},66,[85,2856,2857],{"class":286},"      eventData,\n",[85,2859,2861],{"class":87,"line":2860},67,[85,2862,2863],{"class":286},"      {\n",[85,2865,2867],{"class":87,"line":2866},68,[85,2868,2869],{"class":286},"        headers: {\n",[85,2871,2873,2876,2878,2880,2883,2885],{"class":87,"line":2872},69,[85,2874,2875],{"class":299},"          'Authorization'",[85,2877,296],{"class":286},[85,2879,1924],{"class":299},[85,2881,2882],{"class":286},"accessToken",[85,2884,1930],{"class":299},[85,2886,303],{"class":286},[85,2888,2890,2893,2895],{"class":87,"line":2889},70,[85,2891,2892],{"class":299},"          'Content-Type'",[85,2894,296],{"class":286},[85,2896,1943],{"class":299},[85,2898,2900],{"class":87,"line":2899},71,[85,2901,2902],{"class":286},"        }\n",[85,2904,2906],{"class":87,"line":2905},72,[85,2907,2908],{"class":286},"      }\n",[85,2910,2912],{"class":87,"line":2911},73,[85,2913,2914],{"class":286},"    );\n",[85,2916,2918],{"class":87,"line":2917},74,[85,2919,116],{"emptyLinePlaceholder":115},[85,2921,2923,2925],{"class":87,"line":2922},75,[85,2924,978],{"class":480},[85,2926,2927],{"class":286}," response.data;\n",[85,2929,2931,2934,2937],{"class":87,"line":2930},76,[85,2932,2933],{"class":286},"  } ",[85,2935,2936],{"class":480},"catch",[85,2938,2939],{"class":286}," (error) {\n",[85,2941,2943],{"class":87,"line":2942},77,[85,2944,2945],{"class":527},"    // Handle 401 by refreshing token and retrying\n",[85,2947,2949,2951,2954,2957,2960],{"class":87,"line":2948},78,[85,2950,1563],{"class":480},[85,2952,2953],{"class":286}," (error.response?.status ",[85,2955,2956],{"class":480},"===",[85,2958,2959],{"class":292}," 401",[85,2961,1481],{"class":286},[85,2963,2965,2968,2970,2972,2974],{"class":87,"line":2964},79,[85,2966,2967],{"class":286},"      cachedToken ",[85,2969,874],{"class":480},[85,2971,1518],{"class":292},[85,2973,2745],{"class":286},[85,2975,2976],{"class":527},"// Invalidate cache\n",[85,2978,2980,2983,2986,2988,2990,2992],{"class":87,"line":2979},80,[85,2981,2982],{"class":480},"      const",[85,2984,2985],{"class":292}," newToken",[85,2987,487],{"class":480},[85,2989,1653],{"class":480},[85,2991,1551],{"class":490},[85,2993,756],{"class":286},[85,2995,2997],{"class":87,"line":2996},81,[85,2998,116],{"emptyLinePlaceholder":115},[85,3000,3002,3004,3007,3009,3011,3013,3015],{"class":87,"line":3001},82,[85,3003,2982],{"class":480},[85,3005,3006],{"class":292}," retryResponse",[85,3008,487],{"class":480},[85,3010,1653],{"class":480},[85,3012,2620],{"class":286},[85,3014,2623],{"class":490},[85,3016,2391],{"class":286},[85,3018,3020,3023,3025,3027],{"class":87,"line":3019},83,[85,3021,3022],{"class":299},"        `${",[85,3024,2846],{"class":292},[85,3026,2849],{"class":299},[85,3028,303],{"class":286},[85,3030,3032],{"class":87,"line":3031},84,[85,3033,3034],{"class":286},"        eventData,\n",[85,3036,3038],{"class":87,"line":3037},85,[85,3039,3040],{"class":286},"        {\n",[85,3042,3044],{"class":87,"line":3043},86,[85,3045,3046],{"class":286},"          headers: {\n",[85,3048,3050,3053,3055,3057,3060,3062],{"class":87,"line":3049},87,[85,3051,3052],{"class":299},"            'Authorization'",[85,3054,296],{"class":286},[85,3056,1924],{"class":299},[85,3058,3059],{"class":286},"newToken",[85,3061,1930],{"class":299},[85,3063,303],{"class":286},[85,3065,3067,3070,3072],{"class":87,"line":3066},88,[85,3068,3069],{"class":299},"            'Content-Type'",[85,3071,296],{"class":286},[85,3073,1943],{"class":299},[85,3075,3077],{"class":87,"line":3076},89,[85,3078,3079],{"class":286},"          }\n",[85,3081,3083],{"class":87,"line":3082},90,[85,3084,2902],{"class":286},[85,3086,3088],{"class":87,"line":3087},91,[85,3089,3090],{"class":286},"      );\n",[85,3092,3094],{"class":87,"line":3093},92,[85,3095,116],{"emptyLinePlaceholder":115},[85,3097,3099,3101],{"class":87,"line":3098},93,[85,3100,1595],{"class":480},[85,3102,3103],{"class":286}," retryResponse.data;\n",[85,3105,3107],{"class":87,"line":3106},94,[85,3108,969],{"class":286},[85,3110,3112],{"class":87,"line":3111},95,[85,3113,116],{"emptyLinePlaceholder":115},[85,3115,3117,3120],{"class":87,"line":3116},96,[85,3118,3119],{"class":480},"    throw",[85,3121,3122],{"class":286}," error;\n",[85,3124,3126],{"class":87,"line":3125},97,[85,3127,1539],{"class":286},[85,3129,3131],{"class":87,"line":3130},98,[85,3132,365],{"class":286},[85,3134,3136],{"class":87,"line":3135},99,[85,3137,116],{"emptyLinePlaceholder":115},[85,3139,3141],{"class":87,"line":3140},100,[85,3142,3143],{"class":527},"// Usage\n",[85,3145,3147,3149,3152,3154],{"class":87,"line":3146},101,[85,3148,481],{"class":480},[85,3150,3151],{"class":292}," eventData",[85,3153,487],{"class":480},[85,3155,626],{"class":286},[85,3157,3159,3162,3165],{"class":87,"line":3158},102,[85,3160,3161],{"class":286},"  version: ",[85,3163,3164],{"class":299},"\"1.0\"",[85,3166,303],{"class":286},[85,3168,3170,3173,3176],{"class":87,"line":3169},103,[85,3171,3172],{"class":286},"  location_id: ",[85,3174,3175],{"class":299},"\"Z6RSOG\"",[85,3177,303],{"class":286},[85,3179,3181,3184,3187],{"class":87,"line":3180},104,[85,3182,3183],{"class":286},"  recorder_id: ",[85,3185,3186],{"class":299},"\"Z6RANV\"",[85,3188,303],{"class":286},[85,3190,3192,3195,3198],{"class":87,"line":3191},105,[85,3193,3194],{"class":286},"  camera_id: ",[85,3196,3197],{"class":299},"\"2fe519b4-2438-4aa1-b051-87cf22bb\"",[85,3199,303],{"class":286},[85,3201,3203,3206,3209],{"class":87,"line":3202},106,[85,3204,3205],{"class":286},"  event_id: ",[85,3207,3208],{"class":299},"\"1763603245534315\"",[85,3210,303],{"class":286},[85,3212,3214,3217,3220],{"class":87,"line":3213},107,[85,3215,3216],{"class":286},"  event_type: ",[85,3218,3219],{"class":299},"\"alarm\"",[85,3221,303],{"class":286},[85,3223,3225,3228,3231],{"class":87,"line":3224},108,[85,3226,3227],{"class":286},"  event_status: ",[85,3229,3230],{"class":299},"\"active\"",[85,3232,303],{"class":286},[85,3234,3236,3239,3242],{"class":87,"line":3235},109,[85,3237,3238],{"class":286},"  event_time: ",[85,3240,3241],{"class":299},"\"2025-11-20T01:46:25.534Z\"",[85,3243,303],{"class":286},[85,3245,3247,3250,3253],{"class":87,"line":3246},110,[85,3248,3249],{"class":286},"  sent_at: ",[85,3251,3252],{"class":299},"\"2025-11-20T01:46:28.534Z\"",[85,3254,303],{"class":286},[85,3256,3258,3261,3264],{"class":87,"line":3257},111,[85,3259,3260],{"class":286},"  should_signal_to_monitoring_center: ",[85,3262,3263],{"class":292},"true",[85,3265,303],{"class":286},[85,3267,3269,3272,3275],{"class":87,"line":3268},112,[85,3270,3271],{"class":286},"  upload_snapshot_count: ",[85,3273,3274],{"class":292},"1",[85,3276,303],{"class":286},[85,3278,3280,3283,3286],{"class":87,"line":3279},113,[85,3281,3282],{"class":286},"  upload_short_mp4: ",[85,3284,3285],{"class":292},"false",[85,3287,303],{"class":286},[85,3289,3291,3294,3296],{"class":87,"line":3290},114,[85,3292,3293],{"class":286},"  upload_event_mp4: ",[85,3295,3263],{"class":292},[85,3297,303],{"class":286},[85,3299,3301],{"class":87,"line":3300},115,[85,3302,3303],{"class":286},"  payload: {}\n",[85,3305,3307],{"class":87,"line":3306},116,[85,3308,3309],{"class":286},"};\n",[85,3311,3313],{"class":87,"line":3312},117,[85,3314,116],{"emptyLinePlaceholder":115},[85,3316,3318,3321],{"class":87,"line":3317},118,[85,3319,3320],{"class":490},"sendEvent",[85,3322,1965],{"class":286},[85,3324,3326,3329,3332,3334,3337,3340,3343,3345,3347,3350],{"class":87,"line":3325},119,[85,3327,3328],{"class":286},"  .",[85,3330,3331],{"class":490},"then",[85,3333,494],{"class":286},[85,3335,3336],{"class":989},"result",[85,3338,3339],{"class":480}," =>",[85,3341,3342],{"class":286}," console.",[85,3344,765],{"class":490},[85,3346,494],{"class":286},[85,3348,3349],{"class":299},"'Event sent:'",[85,3351,3352],{"class":286},", result))\n",[85,3354,3356,3358,3360,3362,3365,3367,3369,3371,3373,3376,3379,3382],{"class":87,"line":3355},120,[85,3357,3328],{"class":286},[85,3359,2936],{"class":490},[85,3361,494],{"class":286},[85,3363,3364],{"class":989},"error",[85,3366,3339],{"class":480},[85,3368,3342],{"class":286},[85,3370,3364],{"class":490},[85,3372,494],{"class":286},[85,3374,3375],{"class":299},"'Error:'",[85,3377,3378],{"class":286},", error.response?.data ",[85,3380,3381],{"class":480},"||",[85,3383,3384],{"class":286}," error.message));\n",[52,3386],{},[55,3388,3390],{"id":3389},"next-steps","Next Steps",[14,3392,3393],{},"Now that you understand authentication, you can start sending events:",[3395,3396,3397],"guide-next-steps",{},[14,3398,3399],{},[85,3400,3401],{},"\n{\n\"title\": \"Event API Overview\",\n\"description\": \"Learn how to send events to CHeKT\",\n\"link\": \"/apis/partner/event-api\"\n},\n{\n\"title\": \"Partner API\",\n\"description\": \"Explore the Partner API for data synchronization\",\n\"link\": \"/apis/partner/overview\"\n},\n{\n\"title\": \"Partner API Authentication\",\n\"description\": \"Learn about Partner API authentication\",\n\"link\": \"/apis/partner/authentication\"\n}\n",[52,3403],{},[55,3405,3407],{"id":3406},"support","Support",[14,3409,3410],{},"For authentication issues or questions:",[26,3412,3413,3420],{},[29,3414,3415,3416],{},"Email: ",[46,3417,3419],{"href":3418},"mailto:support@chekt.com","support@chekt.com",[29,3421,3422],{},"Documentation: developer.chekt.com",[3424,3425,3426],"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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":80,"searchDepth":100,"depth":100,"links":3428},[3429,3430,3431,3435,3439,3443,3447,3451,3454,3455,3456,3457],{"id":57,"depth":94,"text":58},{"id":72,"depth":94,"text":73},{"id":163,"depth":94,"text":164,"children":3432},[3433,3434],{"id":175,"depth":100,"text":176},{"id":213,"depth":100,"text":214},{"id":263,"depth":94,"text":264,"children":3436},[3437,3438],{"id":270,"depth":100,"text":271},{"id":456,"depth":100,"text":457},{"id":1051,"depth":94,"text":1052,"children":3440},[3441,3442],{"id":1058,"depth":100,"text":1059},{"id":1153,"depth":100,"text":1154},{"id":1259,"depth":94,"text":1260,"children":3444},[3445,3446],{"id":1270,"depth":100,"text":1271},{"id":1291,"depth":100,"text":1292},{"id":1415,"depth":94,"text":1416,"children":3448},[3449,3450],{"id":1419,"depth":100,"text":1420},{"id":1983,"depth":100,"text":1984},{"id":2016,"depth":94,"text":2017,"children":3452},[3453],{"id":2020,"depth":100,"text":2021},{"id":2174,"depth":94,"text":2175},{"id":2218,"depth":94,"text":2219},{"id":3389,"depth":94,"text":3390},{"id":3406,"depth":94,"text":3407},"Learn how to authenticate requests to the CHeKT Partner Event API","md",{"category":3461,"order":94},"Event Integration","/apis/partner/event-authentication",{"title":5,"description":3458},"apis/partner/event-authentication","cRYN6c9L0n0P4sHLmyZnzXkPN0q_qMXLYCMbqyqManU",1770959188153]