[{"data":1,"prerenderedAt":308},["ShallowReactive",2],{"doc-\u002Fapi\u002Frate-limits":3},{"id":4,"title":5,"body":6,"description":298,"edit":299,"extension":300,"meta":301,"navigation":302,"path":303,"seo":304,"stem":305,"vertical":299,"weight":306,"__hash__":307},"content\u002Fapi\u002Frate-limits.md","Rate limits",{"type":7,"value":8,"toc":288},"minimark",[9,24,29,190,194,197,219,226,234,238,244,247,255,259,266,270,281],[10,11,12,13,18,19,23],"p",{},"A reference table of the rate-limit budgets and the response headers\nwe set. For client-side retry guidance, see\n",[14,15,17],"a",{"href":16},"\u002Fapi\u002Fingest","POST \u002Fv1\u002Fingest"," and the\n",[14,20,22],{"href":21},"\u002Ftroubleshooting\u002Frate-limited","troubleshooting page on 429",".",[25,26,28],"h2",{"id":27},"budgets","Budgets",[30,31,32,51],"table",{},[33,34,35],"thead",{},[36,37,38,42,45,48],"tr",{},[39,40,41],"th",{},"Route family",[39,43,44],{},"Budget",[39,46,47],{},"Reset window",[39,49,50],{},"Header",[52,53,54,73,88,103,120,138,155,172],"tbody",{},[36,55,56,62,65,68],{},[57,58,59],"td",{},[60,61,17],"code",{},[57,63,64],{},"60 req \u002F min per device",[57,66,67],{},"rolling 60 s",[57,69,70],{},[60,71,72],{},"X-RateLimit-Device",[36,74,75,80,82,84],{},[57,76,77],{},[60,78,79],{},"GET  \u002Fv1\u002Fingest\u002Fshelly",[57,81,64],{},[57,83,67],{},[57,85,86],{},[60,87,72],{},[36,89,90,95,98,101],{},[57,91,92],{},[60,93,94],{},"POST \u002Fv1\u002Fingest\u002Florawan",[57,96,97],{},"unlimited per webhook",[57,99,100],{},"—",[57,102,100],{},[36,104,105,110,113,115],{},[57,106,107],{},[60,108,109],{},"GET  \u002Fv1\u002Fmeasurements",[57,111,112],{},"120 req \u002F min per account",[57,114,67],{},[57,116,117],{},[60,118,119],{},"X-RateLimit-Read",[36,121,122,127,130,133],{},[57,123,124],{},[60,125,126],{},"GET  \u002Fv1\u002Fmeasurements?export",[57,128,129],{},"1 req \u002F 5 min per account",[57,131,132],{},"rolling 5 min",[57,134,135],{},[60,136,137],{},"X-RateLimit-Export",[36,139,140,145,148,150],{},[57,141,142],{},[60,143,144],{},"POST \u002Fv1\u002Freports",[57,146,147],{},"4 req \u002F min per account",[57,149,67],{},[57,151,152],{},[60,153,154],{},"X-RateLimit-Report",[36,156,157,162,165,167],{},[57,158,159],{},[60,160,161],{},"POST \u002Fv1\u002Fauth\u002Frequest",[57,163,164],{},"10 req \u002F min per IP",[57,166,67],{},[57,168,169],{},[60,170,171],{},"X-RateLimit-Auth",[36,173,174,180,183,185],{},[57,175,176,179],{},[60,177,178],{},"* \u002Fv1\u002F*"," (catch-all)",[57,181,182],{},"600 req \u002F min per account",[57,184,67],{},[57,186,187],{},[60,188,189],{},"X-RateLimit-Mgmt",[25,191,193],{"id":192},"response-headers","Response headers",[10,195,196],{},"Every response on a rate-limited route includes:",[198,199,200,207,213],"ul",{},[201,202,203,206],"li",{},[60,204,205],{},"X-RateLimit-\u003Cfamily>","     — the budget for the family.",[201,208,209,212],{},[60,210,211],{},"X-RateLimit-Remaining","    — what is left in the current window.",[201,214,215,218],{},[60,216,217],{},"X-RateLimit-Reset","        — UNIX epoch seconds when the window resets.",[10,220,221,222,225],{},"On ",[60,223,224],{},"429 Too Many Requests",", the response additionally includes:",[198,227,228],{},[201,229,230,233],{},[60,231,232],{},"Retry-After","              — seconds until you can retry.",[25,235,237],{"id":236},"limits-are-advisory-not-punitive","Limits are advisory, not punitive",[10,239,240,241,23],{},"The defaults above are sized so that a well-behaved device cannot\ntrip them. If you trip them, the system is telling you something\nabout your client — see\n",[14,242,243],{"href":21},"the troubleshooting page",[10,245,246],{},"If your operation is genuinely larger than the defaults — a 1 Hz\npower-meter sampling that genuinely needs 60 req \u002F min — open a\nticket. We raise budgets per-account on request; the limit exists to\nprotect the pipeline, not to be a paywall.",[10,248,249,250,254],{},"We do ",[251,252,253],"strong",{},"not"," charge for higher rate limits. The Solo tier is\npriced for the entire usage profile; rate limits exist for safety.",[25,256,258],{"id":257},"multi-tenant-fairness","Multi-tenant fairness",[10,260,261,262,265],{},"When the ingest path is contested (many tenants pushing simultaneously)\nthe per-account budget is still the same, but ",[251,263,264],{},"latency"," can drift.\nWe target ingest p99 \u003C 500 ms. If you observe latency > 1 s\nsustained, file a ticket — it is a load problem on our side, not on\nyour side.",[25,267,269],{"id":268},"throttling-philosophy","Throttling philosophy",[10,271,272,273,276,277,280],{},"We throttle the ",[251,274,275],{},"client",", not the ",[251,278,279],{},"storage",". A burst of 1000\nmeasurements in one second is fine if they arrive in one batched POST\n(under the 32-per-request cap, that means 32 batched POSTs in one\nsecond — still inside budget). It is not fine if those 1000\nmeasurements arrive as 1000 individual POSTs — that is what the rate\nlimit blocks.",[10,282,283,284,287],{},"This means the right strategy for high-rate sensors is ",[251,285,286],{},"batching at\nthe device",", not \"buy a higher rate limit\". The 32-per-request\ningest endpoint is sized to make this easy.",{"title":289,"searchDepth":290,"depth":290,"links":291},"",3,[292,294,295,296,297],{"id":27,"depth":293,"text":28},2,{"id":192,"depth":293,"text":193},{"id":236,"depth":293,"text":237},{"id":257,"depth":293,"text":258},{"id":268,"depth":293,"text":269},"Per-route budgets and retry guidance",null,"md",{},true,"\u002Fapi\u002Frate-limits",{"title":5,"description":298},"api\u002Frate-limits",297,"dKNmqfToUcT45C-aG1taGAWccydJyXo13eB_IRisMdU",1779022954592]