[{"data":1,"prerenderedAt":433},["ShallowReactive",2],{"doc-/docs/rate-limits":3},{"id":4,"title":5,"body":6,"description":424,"extension":425,"meta":426,"navigation":427,"order":242,"path":428,"section":429,"seo":430,"stem":431,"__hash__":432},"docs/docs/rate-limits.md","Rate limits",{"type":7,"value":8,"toc":418},"minimal",[9,13,17,22,78,90,94,97,120,124,135,378,382,414],[10,11,5],"h1",{"id":12},"rate-limits",[14,15,16],"p",{},"Every CHeKT App gets a baseline rate limit that scales with the plan. We use a token bucket per app and a separate burst allowance for read-heavy endpoints.",[18,19,21],"h2",{"id":20},"default-limits","Default limits",[23,24,25,41],"table",{},[26,27,28],"thead",{},[29,30,31,35,38],"tr",{},[32,33,34],"th",{},"Tier",[32,36,37],{},"Sustained (req/min)",[32,39,40],{},"Burst (req/s)",[42,43,44,56,67],"tbody",{},[29,45,46,50,53],{},[47,48,49],"td",{},"Free",[47,51,52],{},"60",[47,54,55],{},"5",[29,57,58,61,64],{},[47,59,60],{},"Pro",[47,62,63],{},"600",[47,65,66],{},"30",[29,68,69,72,75],{},[47,70,71],{},"Enterprise",[47,73,74],{},"3,000",[47,76,77],{},"200",[79,80,81],"blockquote",{},[14,82,83,84,89],{},"Need more? ",[85,86,88],"a",{"href":87},"mailto:partners@chekt.com","Contact partnerships"," — Enterprise tiers can be lifted.",[18,91,93],{"id":92},"headers-we-return","Headers we return",[14,95,96],{},"Every response includes:",[98,99,100,108,114],"ul",{},[101,102,103,107],"li",{},[104,105,106],"code",{},"X-RateLimit-Limit"," — your current ceiling per minute",[101,109,110,113],{},[104,111,112],{},"X-RateLimit-Remaining"," — requests left in the current window",[101,115,116,119],{},[104,117,118],{},"X-RateLimit-Reset"," — Unix timestamp when the window resets",[18,121,123],{"id":122},"when-you-hit-the-limit","When you hit the limit",[14,125,126,127,130,131,134],{},"You'll receive a ",[104,128,129],{},"429 Too Many Requests",". Back off with exponential jitter and respect ",[104,132,133],{},"Retry-After",". Most SDKs do this automatically.",[136,137,142],"pre",{"className":138,"code":139,"language":140,"meta":141,"style":141},"language-ts shiki shiki-themes github-light github-dark","async function withBackoff(fn, max = 5) {\n  for (let i = 0; i \u003C max; i++) {\n    try { return await fn(); }\n    catch (e) {\n      if (e.status !== 429) throw e;\n      const wait = Math.min(1000 * 2 ** i + Math.random() * 250, 30000);\n      await new Promise((r) => setTimeout(r, wait));\n    }\n  }\n}\n","ts","",[104,143,144,184,219,240,249,273,331,360,366,372],{"__ignoreMap":141},[145,146,149,153,156,160,164,168,171,174,177,181],"span",{"class":147,"line":148},"line",1,[145,150,152],{"class":151},"szBVR","async",[145,154,155],{"class":151}," function",[145,157,159],{"class":158},"sScJk"," withBackoff",[145,161,163],{"class":162},"sVt8B","(",[145,165,167],{"class":166},"s4XuR","fn",[145,169,170],{"class":162},", ",[145,172,173],{"class":166},"max",[145,175,176],{"class":151}," =",[145,178,180],{"class":179},"sj4cs"," 5",[145,182,183],{"class":162},") {\n",[145,185,187,190,193,196,199,202,205,208,211,214,217],{"class":147,"line":186},2,[145,188,189],{"class":151},"  for",[145,191,192],{"class":162}," (",[145,194,195],{"class":151},"let",[145,197,198],{"class":162}," i ",[145,200,201],{"class":151},"=",[145,203,204],{"class":179}," 0",[145,206,207],{"class":162},"; i ",[145,209,210],{"class":151},"\u003C",[145,212,213],{"class":162}," max; i",[145,215,216],{"class":151},"++",[145,218,183],{"class":162},[145,220,222,225,228,231,234,237],{"class":147,"line":221},3,[145,223,224],{"class":151},"    try",[145,226,227],{"class":162}," { ",[145,229,230],{"class":151},"return",[145,232,233],{"class":151}," await",[145,235,236],{"class":158}," fn",[145,238,239],{"class":162},"(); }\n",[145,241,243,246],{"class":147,"line":242},4,[145,244,245],{"class":151},"    catch",[145,247,248],{"class":162}," (e) {\n",[145,250,252,255,258,261,264,267,270],{"class":147,"line":251},5,[145,253,254],{"class":151},"      if",[145,256,257],{"class":162}," (e.status ",[145,259,260],{"class":151},"!==",[145,262,263],{"class":179}," 429",[145,265,266],{"class":162},") ",[145,268,269],{"class":151},"throw",[145,271,272],{"class":162}," e;\n",[145,274,276,279,282,284,287,290,292,295,298,301,304,306,309,311,314,317,320,323,325,328],{"class":147,"line":275},6,[145,277,278],{"class":151},"      const",[145,280,281],{"class":179}," wait",[145,283,176],{"class":151},[145,285,286],{"class":162}," Math.",[145,288,289],{"class":158},"min",[145,291,163],{"class":162},[145,293,294],{"class":179},"1000",[145,296,297],{"class":151}," *",[145,299,300],{"class":179}," 2",[145,302,303],{"class":151}," **",[145,305,198],{"class":162},[145,307,308],{"class":151},"+",[145,310,286],{"class":162},[145,312,313],{"class":158},"random",[145,315,316],{"class":162},"() ",[145,318,319],{"class":151},"*",[145,321,322],{"class":179}," 250",[145,324,170],{"class":162},[145,326,327],{"class":179},"30000",[145,329,330],{"class":162},");\n",[145,332,334,337,340,343,346,349,351,354,357],{"class":147,"line":333},7,[145,335,336],{"class":151},"      await",[145,338,339],{"class":151}," new",[145,341,342],{"class":179}," Promise",[145,344,345],{"class":162},"((",[145,347,348],{"class":166},"r",[145,350,266],{"class":162},[145,352,353],{"class":151},"=>",[145,355,356],{"class":158}," setTimeout",[145,358,359],{"class":162},"(r, wait));\n",[145,361,363],{"class":147,"line":362},8,[145,364,365],{"class":162},"    }\n",[145,367,369],{"class":147,"line":368},9,[145,370,371],{"class":162},"  }\n",[145,373,375],{"class":147,"line":374},10,[145,376,377],{"class":162},"}\n",[18,379,381],{"id":380},"patterns-to-avoid","Patterns to avoid",[98,383,384,396,411],{},[101,385,386,387,390,391,395],{},"Polling ",[104,388,389],{},"/v1/events"," faster than once per 5 seconds. Use ",[392,393,394],"strong",{},"webhooks"," instead.",[101,397,398,399,402,403,406,407,410],{},"Hammering ",[104,400,401],{},"/v1/devices/{id}"," in a tight loop. ",[392,404,405],{},"Batch"," with ",[104,408,409],{},"/v1/devices?ids=...",".",[101,412,413],{},"Fanning out from a webhook handler without a queue.",[415,416,417],"style",{},"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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":141,"searchDepth":221,"depth":221,"links":419},[420,421,422,423],{"id":20,"depth":186,"text":21},{"id":92,"depth":186,"text":93},{"id":122,"depth":186,"text":123},{"id":380,"depth":186,"text":381},"Stay inside the limits so your app stays fast and reliable.","md",{},true,"/docs/rate-limits","Get Started",{"title":5,"description":424},"docs/rate-limits","tSQxbCakfuGYDSBIuEPJEuNxZtQeKUGn87q1L--P0yI",1779905486697]