[{"data":1,"prerenderedAt":2700},["ShallowReactive",2],{"navigation_docs":3,"-quayel-gateway-plugins-rate-limiting":91,"-quayel-gateway-plugins-rate-limiting-surround":2695},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":90},"Quayel Gateway","i-lucide-network","\u002Fquayel-gateway","quayel-gateway",[10,29,68],{"title":11,"icon":12,"path":13,"stem":14,"children":15},"Getting Started","i-lucide-rocket","\u002Fquayel-gateway\u002Fgetting-started","quayel-gateway\u002F01.getting-started\u002Findex",[16,19,24],{"title":17,"path":13,"stem":14,"icon":18},"Introduction","i-lucide-book-open",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fquayel-gateway\u002Fgetting-started\u002Finstallation","quayel-gateway\u002F01.getting-started\u002F1.installation","i-lucide-container",{"title":25,"path":26,"stem":27,"icon":28},"Project Structure","\u002Fquayel-gateway\u002Fgetting-started\u002Fproject-structure","quayel-gateway\u002F01.getting-started\u002F2.project-structure","i-lucide-folder-tree",{"title":30,"icon":31,"path":32,"stem":33,"children":34},"Plugins","i-lucide-puzzle","\u002Fquayel-gateway\u002Fplugins","quayel-gateway\u002F02.plugins\u002Findex",[35,38,43,48,53,58,63],{"title":36,"path":32,"stem":33,"icon":37},"Overview","i-lucide-workflow",{"title":39,"path":40,"stem":41,"icon":42},"IP Intelligence","\u002Fquayel-gateway\u002Fplugins\u002Fip-intel","quayel-gateway\u002F02.plugins\u002F1.ip-intel","i-lucide-radar",{"title":44,"path":45,"stem":46,"icon":47},"Firewall","\u002Fquayel-gateway\u002Fplugins\u002Ffirewall","quayel-gateway\u002F02.plugins\u002F2.firewall","i-lucide-shield",{"title":49,"path":50,"stem":51,"icon":52},"Rate Limiting","\u002Fquayel-gateway\u002Fplugins\u002Frate-limiting","quayel-gateway\u002F02.plugins\u002F3.rate-limiting","i-lucide-gauge",{"title":54,"path":55,"stem":56,"icon":57},"Cache","\u002Fquayel-gateway\u002Fplugins\u002Fcache","quayel-gateway\u002F02.plugins\u002F4.cache","i-lucide-database",{"title":59,"path":60,"stem":61,"icon":62},"Load Balancer","\u002Fquayel-gateway\u002Fplugins\u002Fload-balancer","quayel-gateway\u002F02.plugins\u002F5.load-balancer","i-lucide-scale",{"title":64,"path":65,"stem":66,"icon":67},"Auto-SSL","\u002Fquayel-gateway\u002Fplugins\u002Fauto-ssl","quayel-gateway\u002F02.plugins\u002F6.auto-ssl","i-lucide-lock",{"title":69,"icon":70,"path":71,"stem":72,"children":73},"AI","i-lucide-bot","\u002Fquayel-gateway\u002Fai","quayel-gateway\u002F03.ai\u002Findex",[74,75,80,85],{"title":36,"path":71,"stem":72,"icon":70},{"title":76,"path":77,"stem":78,"icon":79},"The Quayel Gateway Skill","\u002Fquayel-gateway\u002Fai\u002Fskill","quayel-gateway\u002F03.ai\u002F1.skill","i-lucide-wand-sparkles",{"title":81,"path":82,"stem":83,"icon":84},"Installing the Skill","\u002Fquayel-gateway\u002Fai\u002Finstallation","quayel-gateway\u002F03.ai\u002F2.installation","i-lucide-download",{"title":86,"path":87,"stem":88,"icon":89},"AI Agent Guide","\u002Fquayel-gateway\u002Fai\u002Fagent-guide","quayel-gateway\u002F03.ai\u002F3.agent-guide","i-lucide-braces",false,{"id":92,"title":49,"body":93,"description":2688,"extension":2689,"links":2690,"meta":2691,"navigation":2692,"path":50,"seo":2693,"stem":51,"__hash__":2694},"docs\u002Fquayel-gateway\u002F02.plugins\u002F3.rate-limiting.md",{"type":94,"value":95,"toc":2664},"minimark",[96,101,105,110,500,504,657,661,667,728,734,777,786,791,805,831,839,843,848,873,878,903,908,934,939,965,969,977,981,1000,1004,1010,1014,1017,1111,1114,1120,1124,1128,1249,1253,1428,1432,1608,1612,1846,1850,2231,2235,2410,2414,2503,2506,2590,2594,2632,2636,2660],[97,98,100],"h1",{"id":99},"rate-limiting-plugin","Rate Limiting Plugin",[102,103,104],"p",{},"The rate limiting plugin enforces request quotas using a sliding-window counter. Limits are per-key (IP, header, or custom value) and reset automatically when the window expires.",[106,107,109],"h2",{"id":108},"configuration","Configuration",[111,112,117],"pre",{"className":113,"code":114,"language":115,"meta":116,"style":116},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"plugins\": {\n    \"rate_limiting\": {\n      \"enabled\": true,\n      \"rules\": [\n        {\n          \"id\": \"api-limit\",\n          \"name\": \"API Rate Limit\",\n          \"enabled\": true,\n          \"conditions\": [\n            {\n              \"left\": \"req.path\",\n              \"operator\": \"starts_with\",\n              \"value\": \"\u002Fapi\u002F\"\n            }\n          ],\n          \"key\": \"req.client_ip\",\n          \"limit\": 100,\n          \"window_seconds\": 60,\n          \"action\": {\n            \"type\": \"block\",\n            \"status\": 429\n          }\n        }\n      ]\n    }\n  }\n}\n","json","",[118,119,120,129,148,164,181,196,202,228,249,262,276,282,305,326,346,352,358,379,396,413,427,449,464,470,476,482,488,494],"code",{"__ignoreMap":116},[121,122,125],"span",{"class":123,"line":124},"line",1,[121,126,128],{"class":127},"sMK4o","{\n",[121,130,132,135,139,142,145],{"class":123,"line":131},2,[121,133,134],{"class":127},"  \"",[121,136,138],{"class":137},"spNyl","plugins",[121,140,141],{"class":127},"\"",[121,143,144],{"class":127},":",[121,146,147],{"class":127}," {\n",[121,149,151,154,158,160,162],{"class":123,"line":150},3,[121,152,153],{"class":127},"    \"",[121,155,157],{"class":156},"sBMFI","rate_limiting",[121,159,141],{"class":127},[121,161,144],{"class":127},[121,163,147],{"class":127},[121,165,167,170,174,176,178],{"class":123,"line":166},4,[121,168,169],{"class":127},"      \"",[121,171,173],{"class":172},"sbssI","enabled",[121,175,141],{"class":127},[121,177,144],{"class":127},[121,179,180],{"class":127}," true,\n",[121,182,184,186,189,191,193],{"class":123,"line":183},5,[121,185,169],{"class":127},[121,187,188],{"class":172},"rules",[121,190,141],{"class":127},[121,192,144],{"class":127},[121,194,195],{"class":127}," [\n",[121,197,199],{"class":123,"line":198},6,[121,200,201],{"class":127},"        {\n",[121,203,205,208,212,214,216,219,223,225],{"class":123,"line":204},7,[121,206,207],{"class":127},"          \"",[121,209,211],{"class":210},"swJcz","id",[121,213,141],{"class":127},[121,215,144],{"class":127},[121,217,218],{"class":127}," \"",[121,220,222],{"class":221},"sfazB","api-limit",[121,224,141],{"class":127},[121,226,227],{"class":127},",\n",[121,229,231,233,236,238,240,242,245,247],{"class":123,"line":230},8,[121,232,207],{"class":127},[121,234,235],{"class":210},"name",[121,237,141],{"class":127},[121,239,144],{"class":127},[121,241,218],{"class":127},[121,243,244],{"class":221},"API Rate Limit",[121,246,141],{"class":127},[121,248,227],{"class":127},[121,250,252,254,256,258,260],{"class":123,"line":251},9,[121,253,207],{"class":127},[121,255,173],{"class":210},[121,257,141],{"class":127},[121,259,144],{"class":127},[121,261,180],{"class":127},[121,263,265,267,270,272,274],{"class":123,"line":264},10,[121,266,207],{"class":127},[121,268,269],{"class":210},"conditions",[121,271,141],{"class":127},[121,273,144],{"class":127},[121,275,195],{"class":127},[121,277,279],{"class":123,"line":278},11,[121,280,281],{"class":127},"            {\n",[121,283,285,288,292,294,296,298,301,303],{"class":123,"line":284},12,[121,286,287],{"class":127},"              \"",[121,289,291],{"class":290},"su27w","left",[121,293,141],{"class":127},[121,295,144],{"class":127},[121,297,218],{"class":127},[121,299,300],{"class":221},"req.path",[121,302,141],{"class":127},[121,304,227],{"class":127},[121,306,308,310,313,315,317,319,322,324],{"class":123,"line":307},13,[121,309,287],{"class":127},[121,311,312],{"class":290},"operator",[121,314,141],{"class":127},[121,316,144],{"class":127},[121,318,218],{"class":127},[121,320,321],{"class":221},"starts_with",[121,323,141],{"class":127},[121,325,227],{"class":127},[121,327,329,331,334,336,338,340,343],{"class":123,"line":328},14,[121,330,287],{"class":127},[121,332,333],{"class":290},"value",[121,335,141],{"class":127},[121,337,144],{"class":127},[121,339,218],{"class":127},[121,341,342],{"class":221},"\u002Fapi\u002F",[121,344,345],{"class":127},"\"\n",[121,347,349],{"class":123,"line":348},15,[121,350,351],{"class":127},"            }\n",[121,353,355],{"class":123,"line":354},16,[121,356,357],{"class":127},"          ],\n",[121,359,361,363,366,368,370,372,375,377],{"class":123,"line":360},17,[121,362,207],{"class":127},[121,364,365],{"class":210},"key",[121,367,141],{"class":127},[121,369,144],{"class":127},[121,371,218],{"class":127},[121,373,374],{"class":221},"req.client_ip",[121,376,141],{"class":127},[121,378,227],{"class":127},[121,380,382,384,387,389,391,394],{"class":123,"line":381},18,[121,383,207],{"class":127},[121,385,386],{"class":210},"limit",[121,388,141],{"class":127},[121,390,144],{"class":127},[121,392,393],{"class":172}," 100",[121,395,227],{"class":127},[121,397,399,401,404,406,408,411],{"class":123,"line":398},19,[121,400,207],{"class":127},[121,402,403],{"class":210},"window_seconds",[121,405,141],{"class":127},[121,407,144],{"class":127},[121,409,410],{"class":172}," 60",[121,412,227],{"class":127},[121,414,416,418,421,423,425],{"class":123,"line":415},20,[121,417,207],{"class":127},[121,419,420],{"class":210},"action",[121,422,141],{"class":127},[121,424,144],{"class":127},[121,426,147],{"class":127},[121,428,430,433,436,438,440,442,445,447],{"class":123,"line":429},21,[121,431,432],{"class":127},"            \"",[121,434,435],{"class":290},"type",[121,437,141],{"class":127},[121,439,144],{"class":127},[121,441,218],{"class":127},[121,443,444],{"class":221},"block",[121,446,141],{"class":127},[121,448,227],{"class":127},[121,450,452,454,457,459,461],{"class":123,"line":451},22,[121,453,432],{"class":127},[121,455,456],{"class":290},"status",[121,458,141],{"class":127},[121,460,144],{"class":127},[121,462,463],{"class":172}," 429\n",[121,465,467],{"class":123,"line":466},23,[121,468,469],{"class":127},"          }\n",[121,471,473],{"class":123,"line":472},24,[121,474,475],{"class":127},"        }\n",[121,477,479],{"class":123,"line":478},25,[121,480,481],{"class":127},"      ]\n",[121,483,485],{"class":123,"line":484},26,[121,486,487],{"class":127},"    }\n",[121,489,491],{"class":123,"line":490},27,[121,492,493],{"class":127},"  }\n",[121,495,497],{"class":123,"line":496},28,[121,498,499],{"class":127},"}\n",[106,501,503],{"id":502},"rule-structure","Rule structure",[505,506,507,526],"table",{},[508,509,510],"thead",{},[511,512,513,517,520,523],"tr",{},[514,515,516],"th",{},"Field",[514,518,519],{},"Type",[514,521,522],{},"Required",[514,524,525],{},"Description",[527,528,529,545,558,577,596,610,624,637],"tbody",{},[511,530,531,536,539,542],{},[532,533,534],"td",{},[118,535,211],{},[532,537,538],{},"string",[532,540,541],{},"✅",[532,543,544],{},"Unique rule identifier",[511,546,547,551,553,555],{},[532,548,549],{},[118,550,235],{},[532,552,538],{},[532,554,541],{},[532,556,557],{},"Human-readable name",[511,559,560,564,567,570],{},[532,561,562],{},[118,563,173],{},[532,565,566],{},"bool",[532,568,569],{},"—",[532,571,572,573,576],{},"Enable\u002Fdisable rule (default: ",[118,574,575],{},"true",")",[511,578,579,583,586,588],{},[532,580,581],{},[118,582,269],{},[532,584,585],{},"array",[532,587,569],{},[532,589,590,591,595],{},"When to apply this rule (",[592,593,594],"strong",{},"empty = every request",", e.g. a global limit)",[511,597,598,602,605,607],{},[532,599,600],{},[118,601,365],{},[532,603,604],{},"string | array",[532,606,541],{},[532,608,609],{},"What to rate limit by",[511,611,612,616,619,621],{},[532,613,614],{},[118,615,386],{},[532,617,618],{},"number",[532,620,541],{},[532,622,623],{},"Maximum requests per window (must be > 0)",[511,625,626,630,632,634],{},[532,627,628],{},[118,629,403],{},[532,631,618],{},[532,633,541],{},[532,635,636],{},"Window duration in seconds (must be > 0)",[511,638,639,643,646,648],{},[532,640,641],{},[118,642,420],{},[532,644,645],{},"object",[532,647,569],{},[532,649,650,651,653,654,576],{},"Action when limit exceeded (default: ",[118,652,444],{}," with status ",[118,655,656],{},"429",[106,658,660],{"id":659},"rate-limit-keys","Rate limit keys",[102,662,663,664,666],{},"The ",[118,665,365],{}," field determines what identifier is used to track requests:",[505,668,669,678],{},[508,670,671],{},[511,672,673,676],{},[514,674,675],{},"Key",[514,677,525],{},[527,679,680,689,699,709,718],{},[511,681,682,686],{},[532,683,684],{},[118,685,374],{},[532,687,688],{},"Resolved client IP",[511,690,691,696],{},[532,692,693],{},[118,694,695],{},"req.peer_ip",[532,697,698],{},"Direct connection IP",[511,700,701,706],{},[532,702,703],{},[118,704,705],{},"req.header.\u003Cname>",[532,707,708],{},"Value of a specific header",[511,710,711,716],{},[532,712,713],{},[118,714,715],{},"http.header.\u003Cname>",[532,717,708],{},[511,719,720,725],{},[532,721,722],{},[118,723,724],{},"req.header.\u003Cname>.jwt.\u003Cclaim.path>",[532,726,727],{},"JWT claim decoded from a header",[102,729,730,731,733],{},"Composite keys are given as an array — requests are counted per combination (parts joined with ",[118,732,144],{},"):",[111,735,737],{"className":113,"code":736,"language":115,"meta":116,"style":116},"{ \"key\": [\"req.client_ip\", \"req.header.X-API-Key\"] }\n",[118,738,739],{"__ignoreMap":116},[121,740,741,744,746,748,750,752,755,757,759,761,764,766,769,771,774],{"class":123,"line":124},[121,742,743],{"class":127},"{",[121,745,218],{"class":127},[121,747,365],{"class":137},[121,749,141],{"class":127},[121,751,144],{"class":127},[121,753,754],{"class":127}," [",[121,756,141],{"class":127},[121,758,374],{"class":221},[121,760,141],{"class":127},[121,762,763],{"class":127},",",[121,765,218],{"class":127},[121,767,768],{"class":221},"req.header.X-API-Key",[121,770,141],{"class":127},[121,772,773],{"class":127},"]",[121,775,776],{"class":127}," }\n",[102,778,779,780,785],{},"Any ",[781,782,784],"a",{"href":783},"\u002Fquayel-gateway\u002Fconditions#condition-paths","condition path"," can be used as a key part.",[787,788,790],"h3",{"id":789},"legacy-template-keys","Legacy template keys",[102,792,793,794,796,797,800,801,804],{},"For compatibility, ",[118,795,365],{}," also accepts a ",[592,798,799],{},"template string"," with ",[118,802,803],{},"{path}"," placeholders:",[111,806,808],{"className":113,"code":807,"language":115,"meta":116,"style":116},"{ \"key\": \"{req.client_ip}+{http.header.x-api-key}\" }\n",[118,809,810],{"__ignoreMap":116},[121,811,812,814,816,818,820,822,824,827,829],{"class":123,"line":124},[121,813,743],{"class":127},[121,815,218],{"class":127},[121,817,365],{"class":137},[121,819,141],{"class":127},[121,821,144],{"class":127},[121,823,218],{"class":127},[121,825,826],{"class":221},"{req.client_ip}+{http.header.x-api-key}",[121,828,141],{"class":127},[121,830,776],{"class":127},[102,832,833,834,838],{},"Each placeholder is resolved like a condition path and the parts are joined literally.\nPrefer the array form for new configurations — it is easier to read and validates cleanly\nagainst the ",[781,835,837],{"href":836},"\u002Fconfig.schema.json","JSON schema",".",[787,840,842],{"id":841},"common-key-patterns","Common key patterns",[102,844,845],{},[592,846,847],{},"By client IP:",[111,849,851],{"className":113,"code":850,"language":115,"meta":116,"style":116},"{ \"key\": \"req.client_ip\" }\n",[118,852,853],{"__ignoreMap":116},[121,854,855,857,859,861,863,865,867,869,871],{"class":123,"line":124},[121,856,743],{"class":127},[121,858,218],{"class":127},[121,860,365],{"class":137},[121,862,141],{"class":127},[121,864,144],{"class":127},[121,866,218],{"class":127},[121,868,374],{"class":221},[121,870,141],{"class":127},[121,872,776],{"class":127},[102,874,875],{},[592,876,877],{},"By API key header:",[111,879,881],{"className":113,"code":880,"language":115,"meta":116,"style":116},"{ \"key\": \"req.header.X-API-Key\" }\n",[118,882,883],{"__ignoreMap":116},[121,884,885,887,889,891,893,895,897,899,901],{"class":123,"line":124},[121,886,743],{"class":127},[121,888,218],{"class":127},[121,890,365],{"class":137},[121,892,141],{"class":127},[121,894,144],{"class":127},[121,896,218],{"class":127},[121,898,768],{"class":221},[121,900,141],{"class":127},[121,902,776],{"class":127},[102,904,905],{},[592,906,907],{},"By authorization header:",[111,909,911],{"className":113,"code":910,"language":115,"meta":116,"style":116},"{ \"key\": \"req.header.Authorization\" }\n",[118,912,913],{"__ignoreMap":116},[121,914,915,917,919,921,923,925,927,930,932],{"class":123,"line":124},[121,916,743],{"class":127},[121,918,218],{"class":127},[121,920,365],{"class":137},[121,922,141],{"class":127},[121,924,144],{"class":127},[121,926,218],{"class":127},[121,928,929],{"class":221},"req.header.Authorization",[121,931,141],{"class":127},[121,933,776],{"class":127},[102,935,936],{},[592,937,938],{},"By custom header:",[111,940,942],{"className":113,"code":941,"language":115,"meta":116,"style":116},"{ \"key\": \"req.header.X-Tenant-ID\" }\n",[118,943,944],{"__ignoreMap":116},[121,945,946,948,950,952,954,956,958,961,963],{"class":123,"line":124},[121,947,743],{"class":127},[121,949,218],{"class":127},[121,951,365],{"class":137},[121,953,141],{"class":127},[121,955,144],{"class":127},[121,957,218],{"class":127},[121,959,960],{"class":221},"req.header.X-Tenant-ID",[121,962,141],{"class":127},[121,964,776],{"class":127},[106,966,968],{"id":967},"how-it-works","How it works",[111,970,975],{"className":971,"code":973,"language":974},[972],"language-text","Request arrives\n    │\n    ▼\n1. Evaluate conditions\n    │\n    ├── Conditions don't match → skip this rule\n    │\n    └── Conditions match:\n        │\n        ├── 2. Resolve rate limit key\n        ├── 3. Get or create counter for (rule_id, key)\n        ├── 4. Increment counter\n        │\n        ├── count \u003C= limit → Continue\n        │\n        └── count > limit → Block (429)\n","text",[118,976,973],{"__ignoreMap":116},[787,978,980],{"id":979},"window-behavior","Window behavior",[982,983,984,988,991,997],"ul",{},[985,986,987],"li",{},"Counter starts at 0",[985,989,990],{},"Each request increments the counter",[985,992,993,994,996],{},"When the window expires (elapsed >= ",[118,995,403],{},"), counter resets to 1",[985,998,999],{},"The window starts from the first request, not from a fixed time",[787,1001,1003],{"id":1002},"example-timeline","Example timeline",[111,1005,1008],{"className":1006,"code":1007,"language":974},[972],"Window: 60 seconds, Limit: 5 requests\n\nTime 0s:  Request 1 → count=1, remaining=4 → PASS\nTime 1s:  Request 2 → count=2, remaining=3 → PASS\nTime 2s:  Request 3 → count=3, remaining=2 → PASS\nTime 3s:  Request 4 → count=4, remaining=1 → PASS\nTime 4s:  Request 5 → count=5, remaining=0 → PASS\nTime 5s:  Request 6 → count=6, remaining=0 → BLOCK (429)\nTime 61s: Window expires, counter resets\nTime 61s: Request 7 → count=1, remaining=4 → PASS\n",[118,1009,1007],{"__ignoreMap":116},[106,1011,1013],{"id":1012},"blocked-response","Blocked response",[102,1015,1016],{},"When rate limited, the gateway returns:",[111,1018,1020],{"className":113,"code":1019,"language":115,"meta":116,"style":116},"{\n  \"error\": \"rate_limited\",\n  \"status\": 429,\n  \"rule_id\": \"api-limit\",\n  \"limit\": 100,\n  \"window_seconds\": 60\n}\n",[118,1021,1022,1026,1046,1061,1080,1094,1107],{"__ignoreMap":116},[121,1023,1024],{"class":123,"line":124},[121,1025,128],{"class":127},[121,1027,1028,1030,1033,1035,1037,1039,1042,1044],{"class":123,"line":131},[121,1029,134],{"class":127},[121,1031,1032],{"class":137},"error",[121,1034,141],{"class":127},[121,1036,144],{"class":127},[121,1038,218],{"class":127},[121,1040,1041],{"class":221},"rate_limited",[121,1043,141],{"class":127},[121,1045,227],{"class":127},[121,1047,1048,1050,1052,1054,1056,1059],{"class":123,"line":150},[121,1049,134],{"class":127},[121,1051,456],{"class":137},[121,1053,141],{"class":127},[121,1055,144],{"class":127},[121,1057,1058],{"class":172}," 429",[121,1060,227],{"class":127},[121,1062,1063,1065,1068,1070,1072,1074,1076,1078],{"class":123,"line":166},[121,1064,134],{"class":127},[121,1066,1067],{"class":137},"rule_id",[121,1069,141],{"class":127},[121,1071,144],{"class":127},[121,1073,218],{"class":127},[121,1075,222],{"class":221},[121,1077,141],{"class":127},[121,1079,227],{"class":127},[121,1081,1082,1084,1086,1088,1090,1092],{"class":123,"line":183},[121,1083,134],{"class":127},[121,1085,386],{"class":137},[121,1087,141],{"class":127},[121,1089,144],{"class":127},[121,1091,393],{"class":172},[121,1093,227],{"class":127},[121,1095,1096,1098,1100,1102,1104],{"class":123,"line":198},[121,1097,134],{"class":127},[121,1099,403],{"class":137},[121,1101,141],{"class":127},[121,1103,144],{"class":127},[121,1105,1106],{"class":172}," 60\n",[121,1108,1109],{"class":123,"line":204},[121,1110,499],{"class":127},[102,1112,1113],{},"Headers:",[111,1115,1118],{"className":1116,"code":1117,"language":974},[972],"Content-Type: application\u002Fjson\nRetry-After: 60\n",[118,1119,1117],{"__ignoreMap":116},[106,1121,1123],{"id":1122},"examples","Examples",[787,1125,1127],{"id":1126},"basic-ip-rate-limit","Basic IP rate limit",[111,1129,1131],{"className":113,"code":1130,"language":115,"meta":116,"style":116},"{\n  \"id\": \"global-ip-limit\",\n  \"name\": \"Global IP Rate Limit\",\n  \"enabled\": true,\n  \"conditions\": [],\n  \"key\": \"req.client_ip\",\n  \"limit\": 1000,\n  \"window_seconds\": 60\n}\n",[118,1132,1133,1137,1156,1175,1187,1200,1218,1233,1245],{"__ignoreMap":116},[121,1134,1135],{"class":123,"line":124},[121,1136,128],{"class":127},[121,1138,1139,1141,1143,1145,1147,1149,1152,1154],{"class":123,"line":131},[121,1140,134],{"class":127},[121,1142,211],{"class":137},[121,1144,141],{"class":127},[121,1146,144],{"class":127},[121,1148,218],{"class":127},[121,1150,1151],{"class":221},"global-ip-limit",[121,1153,141],{"class":127},[121,1155,227],{"class":127},[121,1157,1158,1160,1162,1164,1166,1168,1171,1173],{"class":123,"line":150},[121,1159,134],{"class":127},[121,1161,235],{"class":137},[121,1163,141],{"class":127},[121,1165,144],{"class":127},[121,1167,218],{"class":127},[121,1169,1170],{"class":221},"Global IP Rate Limit",[121,1172,141],{"class":127},[121,1174,227],{"class":127},[121,1176,1177,1179,1181,1183,1185],{"class":123,"line":166},[121,1178,134],{"class":127},[121,1180,173],{"class":137},[121,1182,141],{"class":127},[121,1184,144],{"class":127},[121,1186,180],{"class":127},[121,1188,1189,1191,1193,1195,1197],{"class":123,"line":183},[121,1190,134],{"class":127},[121,1192,269],{"class":137},[121,1194,141],{"class":127},[121,1196,144],{"class":127},[121,1198,1199],{"class":127}," [],\n",[121,1201,1202,1204,1206,1208,1210,1212,1214,1216],{"class":123,"line":198},[121,1203,134],{"class":127},[121,1205,365],{"class":137},[121,1207,141],{"class":127},[121,1209,144],{"class":127},[121,1211,218],{"class":127},[121,1213,374],{"class":221},[121,1215,141],{"class":127},[121,1217,227],{"class":127},[121,1219,1220,1222,1224,1226,1228,1231],{"class":123,"line":204},[121,1221,134],{"class":127},[121,1223,386],{"class":137},[121,1225,141],{"class":127},[121,1227,144],{"class":127},[121,1229,1230],{"class":172}," 1000",[121,1232,227],{"class":127},[121,1234,1235,1237,1239,1241,1243],{"class":123,"line":230},[121,1236,134],{"class":127},[121,1238,403],{"class":137},[121,1240,141],{"class":127},[121,1242,144],{"class":127},[121,1244,1106],{"class":172},[121,1246,1247],{"class":123,"line":251},[121,1248,499],{"class":127},[787,1250,1252],{"id":1251},"api-endpoint-rate-limit","API endpoint rate limit",[111,1254,1256],{"className":113,"code":1255,"language":115,"meta":116,"style":116},"{\n  \"id\": \"api-limit\",\n  \"name\": \"API Rate Limit\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.path\", \"operator\": \"starts_with\", \"value\": \"\u002Fapi\u002F\" }\n  ],\n  \"key\": \"req.client_ip\",\n  \"limit\": 100,\n  \"window_seconds\": 60\n}\n",[118,1257,1258,1262,1280,1298,1310,1322,1375,1380,1398,1412,1424],{"__ignoreMap":116},[121,1259,1260],{"class":123,"line":124},[121,1261,128],{"class":127},[121,1263,1264,1266,1268,1270,1272,1274,1276,1278],{"class":123,"line":131},[121,1265,134],{"class":127},[121,1267,211],{"class":137},[121,1269,141],{"class":127},[121,1271,144],{"class":127},[121,1273,218],{"class":127},[121,1275,222],{"class":221},[121,1277,141],{"class":127},[121,1279,227],{"class":127},[121,1281,1282,1284,1286,1288,1290,1292,1294,1296],{"class":123,"line":150},[121,1283,134],{"class":127},[121,1285,235],{"class":137},[121,1287,141],{"class":127},[121,1289,144],{"class":127},[121,1291,218],{"class":127},[121,1293,244],{"class":221},[121,1295,141],{"class":127},[121,1297,227],{"class":127},[121,1299,1300,1302,1304,1306,1308],{"class":123,"line":166},[121,1301,134],{"class":127},[121,1303,173],{"class":137},[121,1305,141],{"class":127},[121,1307,144],{"class":127},[121,1309,180],{"class":127},[121,1311,1312,1314,1316,1318,1320],{"class":123,"line":183},[121,1313,134],{"class":127},[121,1315,269],{"class":137},[121,1317,141],{"class":127},[121,1319,144],{"class":127},[121,1321,195],{"class":127},[121,1323,1324,1327,1329,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365,1367,1369,1371,1373],{"class":123,"line":198},[121,1325,1326],{"class":127},"    {",[121,1328,218],{"class":127},[121,1330,291],{"class":156},[121,1332,141],{"class":127},[121,1334,144],{"class":127},[121,1336,218],{"class":127},[121,1338,300],{"class":221},[121,1340,141],{"class":127},[121,1342,763],{"class":127},[121,1344,218],{"class":127},[121,1346,312],{"class":156},[121,1348,141],{"class":127},[121,1350,144],{"class":127},[121,1352,218],{"class":127},[121,1354,321],{"class":221},[121,1356,141],{"class":127},[121,1358,763],{"class":127},[121,1360,218],{"class":127},[121,1362,333],{"class":156},[121,1364,141],{"class":127},[121,1366,144],{"class":127},[121,1368,218],{"class":127},[121,1370,342],{"class":221},[121,1372,141],{"class":127},[121,1374,776],{"class":127},[121,1376,1377],{"class":123,"line":204},[121,1378,1379],{"class":127},"  ],\n",[121,1381,1382,1384,1386,1388,1390,1392,1394,1396],{"class":123,"line":230},[121,1383,134],{"class":127},[121,1385,365],{"class":137},[121,1387,141],{"class":127},[121,1389,144],{"class":127},[121,1391,218],{"class":127},[121,1393,374],{"class":221},[121,1395,141],{"class":127},[121,1397,227],{"class":127},[121,1399,1400,1402,1404,1406,1408,1410],{"class":123,"line":251},[121,1401,134],{"class":127},[121,1403,386],{"class":137},[121,1405,141],{"class":127},[121,1407,144],{"class":127},[121,1409,393],{"class":172},[121,1411,227],{"class":127},[121,1413,1414,1416,1418,1420,1422],{"class":123,"line":264},[121,1415,134],{"class":127},[121,1417,403],{"class":137},[121,1419,141],{"class":127},[121,1421,144],{"class":127},[121,1423,1106],{"class":172},[121,1425,1426],{"class":123,"line":278},[121,1427,499],{"class":127},[787,1429,1431],{"id":1430},"per-api-key-rate-limit","Per-API-key rate limit",[111,1433,1435],{"className":113,"code":1434,"language":115,"meta":116,"style":116},"{\n  \"id\": \"per-key-limit\",\n  \"name\": \"Per API Key Limit\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.path\", \"operator\": \"starts_with\", \"value\": \"\u002Fapi\u002F\" }\n  ],\n  \"key\": \"req.header.X-API-Key\",\n  \"limit\": 1000,\n  \"window_seconds\": 3600\n}\n",[118,1436,1437,1441,1460,1479,1491,1503,1555,1559,1577,1591,1604],{"__ignoreMap":116},[121,1438,1439],{"class":123,"line":124},[121,1440,128],{"class":127},[121,1442,1443,1445,1447,1449,1451,1453,1456,1458],{"class":123,"line":131},[121,1444,134],{"class":127},[121,1446,211],{"class":137},[121,1448,141],{"class":127},[121,1450,144],{"class":127},[121,1452,218],{"class":127},[121,1454,1455],{"class":221},"per-key-limit",[121,1457,141],{"class":127},[121,1459,227],{"class":127},[121,1461,1462,1464,1466,1468,1470,1472,1475,1477],{"class":123,"line":150},[121,1463,134],{"class":127},[121,1465,235],{"class":137},[121,1467,141],{"class":127},[121,1469,144],{"class":127},[121,1471,218],{"class":127},[121,1473,1474],{"class":221},"Per API Key Limit",[121,1476,141],{"class":127},[121,1478,227],{"class":127},[121,1480,1481,1483,1485,1487,1489],{"class":123,"line":166},[121,1482,134],{"class":127},[121,1484,173],{"class":137},[121,1486,141],{"class":127},[121,1488,144],{"class":127},[121,1490,180],{"class":127},[121,1492,1493,1495,1497,1499,1501],{"class":123,"line":183},[121,1494,134],{"class":127},[121,1496,269],{"class":137},[121,1498,141],{"class":127},[121,1500,144],{"class":127},[121,1502,195],{"class":127},[121,1504,1505,1507,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553],{"class":123,"line":198},[121,1506,1326],{"class":127},[121,1508,218],{"class":127},[121,1510,291],{"class":156},[121,1512,141],{"class":127},[121,1514,144],{"class":127},[121,1516,218],{"class":127},[121,1518,300],{"class":221},[121,1520,141],{"class":127},[121,1522,763],{"class":127},[121,1524,218],{"class":127},[121,1526,312],{"class":156},[121,1528,141],{"class":127},[121,1530,144],{"class":127},[121,1532,218],{"class":127},[121,1534,321],{"class":221},[121,1536,141],{"class":127},[121,1538,763],{"class":127},[121,1540,218],{"class":127},[121,1542,333],{"class":156},[121,1544,141],{"class":127},[121,1546,144],{"class":127},[121,1548,218],{"class":127},[121,1550,342],{"class":221},[121,1552,141],{"class":127},[121,1554,776],{"class":127},[121,1556,1557],{"class":123,"line":204},[121,1558,1379],{"class":127},[121,1560,1561,1563,1565,1567,1569,1571,1573,1575],{"class":123,"line":230},[121,1562,134],{"class":127},[121,1564,365],{"class":137},[121,1566,141],{"class":127},[121,1568,144],{"class":127},[121,1570,218],{"class":127},[121,1572,768],{"class":221},[121,1574,141],{"class":127},[121,1576,227],{"class":127},[121,1578,1579,1581,1583,1585,1587,1589],{"class":123,"line":251},[121,1580,134],{"class":127},[121,1582,386],{"class":137},[121,1584,141],{"class":127},[121,1586,144],{"class":127},[121,1588,1230],{"class":172},[121,1590,227],{"class":127},[121,1592,1593,1595,1597,1599,1601],{"class":123,"line":264},[121,1594,134],{"class":127},[121,1596,403],{"class":137},[121,1598,141],{"class":127},[121,1600,144],{"class":127},[121,1602,1603],{"class":172}," 3600\n",[121,1605,1606],{"class":123,"line":278},[121,1607,499],{"class":127},[787,1609,1611],{"id":1610},"strict-login-rate-limit","Strict login rate limit",[111,1613,1615],{"className":113,"code":1614,"language":115,"meta":116,"style":116},"{\n  \"id\": \"login-limit\",\n  \"name\": \"Login Rate Limit\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.path\", \"operator\": \"equals\", \"value\": \"\u002Fauth\u002Flogin\" },\n    { \"left\": \"req.method\", \"operator\": \"equals\", \"value\": \"POST\" }\n  ],\n  \"key\": \"req.client_ip\",\n  \"limit\": 5,\n  \"window_seconds\": 300\n}\n",[118,1616,1617,1621,1640,1659,1671,1683,1738,1792,1796,1814,1829,1842],{"__ignoreMap":116},[121,1618,1619],{"class":123,"line":124},[121,1620,128],{"class":127},[121,1622,1623,1625,1627,1629,1631,1633,1636,1638],{"class":123,"line":131},[121,1624,134],{"class":127},[121,1626,211],{"class":137},[121,1628,141],{"class":127},[121,1630,144],{"class":127},[121,1632,218],{"class":127},[121,1634,1635],{"class":221},"login-limit",[121,1637,141],{"class":127},[121,1639,227],{"class":127},[121,1641,1642,1644,1646,1648,1650,1652,1655,1657],{"class":123,"line":150},[121,1643,134],{"class":127},[121,1645,235],{"class":137},[121,1647,141],{"class":127},[121,1649,144],{"class":127},[121,1651,218],{"class":127},[121,1653,1654],{"class":221},"Login Rate Limit",[121,1656,141],{"class":127},[121,1658,227],{"class":127},[121,1660,1661,1663,1665,1667,1669],{"class":123,"line":166},[121,1662,134],{"class":127},[121,1664,173],{"class":137},[121,1666,141],{"class":127},[121,1668,144],{"class":127},[121,1670,180],{"class":127},[121,1672,1673,1675,1677,1679,1681],{"class":123,"line":183},[121,1674,134],{"class":127},[121,1676,269],{"class":137},[121,1678,141],{"class":127},[121,1680,144],{"class":127},[121,1682,195],{"class":127},[121,1684,1685,1687,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1716,1718,1720,1722,1724,1726,1728,1730,1733,1735],{"class":123,"line":198},[121,1686,1326],{"class":127},[121,1688,218],{"class":127},[121,1690,291],{"class":156},[121,1692,141],{"class":127},[121,1694,144],{"class":127},[121,1696,218],{"class":127},[121,1698,300],{"class":221},[121,1700,141],{"class":127},[121,1702,763],{"class":127},[121,1704,218],{"class":127},[121,1706,312],{"class":156},[121,1708,141],{"class":127},[121,1710,144],{"class":127},[121,1712,218],{"class":127},[121,1714,1715],{"class":221},"equals",[121,1717,141],{"class":127},[121,1719,763],{"class":127},[121,1721,218],{"class":127},[121,1723,333],{"class":156},[121,1725,141],{"class":127},[121,1727,144],{"class":127},[121,1729,218],{"class":127},[121,1731,1732],{"class":221},"\u002Fauth\u002Flogin",[121,1734,141],{"class":127},[121,1736,1737],{"class":127}," },\n",[121,1739,1740,1742,1744,1746,1748,1750,1752,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1788,1790],{"class":123,"line":204},[121,1741,1326],{"class":127},[121,1743,218],{"class":127},[121,1745,291],{"class":156},[121,1747,141],{"class":127},[121,1749,144],{"class":127},[121,1751,218],{"class":127},[121,1753,1754],{"class":221},"req.method",[121,1756,141],{"class":127},[121,1758,763],{"class":127},[121,1760,218],{"class":127},[121,1762,312],{"class":156},[121,1764,141],{"class":127},[121,1766,144],{"class":127},[121,1768,218],{"class":127},[121,1770,1715],{"class":221},[121,1772,141],{"class":127},[121,1774,763],{"class":127},[121,1776,218],{"class":127},[121,1778,333],{"class":156},[121,1780,141],{"class":127},[121,1782,144],{"class":127},[121,1784,218],{"class":127},[121,1786,1787],{"class":221},"POST",[121,1789,141],{"class":127},[121,1791,776],{"class":127},[121,1793,1794],{"class":123,"line":230},[121,1795,1379],{"class":127},[121,1797,1798,1800,1802,1804,1806,1808,1810,1812],{"class":123,"line":251},[121,1799,134],{"class":127},[121,1801,365],{"class":137},[121,1803,141],{"class":127},[121,1805,144],{"class":127},[121,1807,218],{"class":127},[121,1809,374],{"class":221},[121,1811,141],{"class":127},[121,1813,227],{"class":127},[121,1815,1816,1818,1820,1822,1824,1827],{"class":123,"line":264},[121,1817,134],{"class":127},[121,1819,386],{"class":137},[121,1821,141],{"class":127},[121,1823,144],{"class":127},[121,1825,1826],{"class":172}," 5",[121,1828,227],{"class":127},[121,1830,1831,1833,1835,1837,1839],{"class":123,"line":278},[121,1832,134],{"class":127},[121,1834,403],{"class":137},[121,1836,141],{"class":127},[121,1838,144],{"class":127},[121,1840,1841],{"class":172}," 300\n",[121,1843,1844],{"class":123,"line":284},[121,1845,499],{"class":127},[787,1847,1849],{"id":1848},"multi-tier-rate-limiting","Multi-tier rate limiting",[111,1851,1853],{"className":113,"code":1852,"language":115,"meta":116,"style":116},"{\n  \"rules\": [\n    {\n      \"id\": \"burst-limit\",\n      \"name\": \"Burst Protection\",\n      \"enabled\": true,\n      \"conditions\": [],\n      \"key\": \"req.client_ip\",\n      \"limit\": 50,\n      \"window_seconds\": 10\n    },\n    {\n      \"id\": \"minute-limit\",\n      \"name\": \"Per-Minute Limit\",\n      \"enabled\": true,\n      \"conditions\": [],\n      \"key\": \"req.client_ip\",\n      \"limit\": 200,\n      \"window_seconds\": 60\n    },\n    {\n      \"id\": \"hourly-limit\",\n      \"name\": \"Hourly Limit\",\n      \"enabled\": true,\n      \"conditions\": [],\n      \"key\": \"req.client_ip\",\n      \"limit\": 5000,\n      \"window_seconds\": 3600\n    }\n  ]\n}\n",[118,1854,1855,1859,1871,1876,1895,1914,1926,1938,1956,1971,1984,1989,1993,2012,2031,2043,2055,2073,2088,2100,2104,2108,2127,2146,2158,2170,2188,2203,2215,2220,2226],{"__ignoreMap":116},[121,1856,1857],{"class":123,"line":124},[121,1858,128],{"class":127},[121,1860,1861,1863,1865,1867,1869],{"class":123,"line":131},[121,1862,134],{"class":127},[121,1864,188],{"class":137},[121,1866,141],{"class":127},[121,1868,144],{"class":127},[121,1870,195],{"class":127},[121,1872,1873],{"class":123,"line":150},[121,1874,1875],{"class":127},"    {\n",[121,1877,1878,1880,1882,1884,1886,1888,1891,1893],{"class":123,"line":166},[121,1879,169],{"class":127},[121,1881,211],{"class":156},[121,1883,141],{"class":127},[121,1885,144],{"class":127},[121,1887,218],{"class":127},[121,1889,1890],{"class":221},"burst-limit",[121,1892,141],{"class":127},[121,1894,227],{"class":127},[121,1896,1897,1899,1901,1903,1905,1907,1910,1912],{"class":123,"line":183},[121,1898,169],{"class":127},[121,1900,235],{"class":156},[121,1902,141],{"class":127},[121,1904,144],{"class":127},[121,1906,218],{"class":127},[121,1908,1909],{"class":221},"Burst Protection",[121,1911,141],{"class":127},[121,1913,227],{"class":127},[121,1915,1916,1918,1920,1922,1924],{"class":123,"line":198},[121,1917,169],{"class":127},[121,1919,173],{"class":156},[121,1921,141],{"class":127},[121,1923,144],{"class":127},[121,1925,180],{"class":127},[121,1927,1928,1930,1932,1934,1936],{"class":123,"line":204},[121,1929,169],{"class":127},[121,1931,269],{"class":156},[121,1933,141],{"class":127},[121,1935,144],{"class":127},[121,1937,1199],{"class":127},[121,1939,1940,1942,1944,1946,1948,1950,1952,1954],{"class":123,"line":230},[121,1941,169],{"class":127},[121,1943,365],{"class":156},[121,1945,141],{"class":127},[121,1947,144],{"class":127},[121,1949,218],{"class":127},[121,1951,374],{"class":221},[121,1953,141],{"class":127},[121,1955,227],{"class":127},[121,1957,1958,1960,1962,1964,1966,1969],{"class":123,"line":251},[121,1959,169],{"class":127},[121,1961,386],{"class":156},[121,1963,141],{"class":127},[121,1965,144],{"class":127},[121,1967,1968],{"class":172}," 50",[121,1970,227],{"class":127},[121,1972,1973,1975,1977,1979,1981],{"class":123,"line":264},[121,1974,169],{"class":127},[121,1976,403],{"class":156},[121,1978,141],{"class":127},[121,1980,144],{"class":127},[121,1982,1983],{"class":172}," 10\n",[121,1985,1986],{"class":123,"line":278},[121,1987,1988],{"class":127},"    },\n",[121,1990,1991],{"class":123,"line":284},[121,1992,1875],{"class":127},[121,1994,1995,1997,1999,2001,2003,2005,2008,2010],{"class":123,"line":307},[121,1996,169],{"class":127},[121,1998,211],{"class":156},[121,2000,141],{"class":127},[121,2002,144],{"class":127},[121,2004,218],{"class":127},[121,2006,2007],{"class":221},"minute-limit",[121,2009,141],{"class":127},[121,2011,227],{"class":127},[121,2013,2014,2016,2018,2020,2022,2024,2027,2029],{"class":123,"line":328},[121,2015,169],{"class":127},[121,2017,235],{"class":156},[121,2019,141],{"class":127},[121,2021,144],{"class":127},[121,2023,218],{"class":127},[121,2025,2026],{"class":221},"Per-Minute Limit",[121,2028,141],{"class":127},[121,2030,227],{"class":127},[121,2032,2033,2035,2037,2039,2041],{"class":123,"line":348},[121,2034,169],{"class":127},[121,2036,173],{"class":156},[121,2038,141],{"class":127},[121,2040,144],{"class":127},[121,2042,180],{"class":127},[121,2044,2045,2047,2049,2051,2053],{"class":123,"line":354},[121,2046,169],{"class":127},[121,2048,269],{"class":156},[121,2050,141],{"class":127},[121,2052,144],{"class":127},[121,2054,1199],{"class":127},[121,2056,2057,2059,2061,2063,2065,2067,2069,2071],{"class":123,"line":360},[121,2058,169],{"class":127},[121,2060,365],{"class":156},[121,2062,141],{"class":127},[121,2064,144],{"class":127},[121,2066,218],{"class":127},[121,2068,374],{"class":221},[121,2070,141],{"class":127},[121,2072,227],{"class":127},[121,2074,2075,2077,2079,2081,2083,2086],{"class":123,"line":381},[121,2076,169],{"class":127},[121,2078,386],{"class":156},[121,2080,141],{"class":127},[121,2082,144],{"class":127},[121,2084,2085],{"class":172}," 200",[121,2087,227],{"class":127},[121,2089,2090,2092,2094,2096,2098],{"class":123,"line":398},[121,2091,169],{"class":127},[121,2093,403],{"class":156},[121,2095,141],{"class":127},[121,2097,144],{"class":127},[121,2099,1106],{"class":172},[121,2101,2102],{"class":123,"line":415},[121,2103,1988],{"class":127},[121,2105,2106],{"class":123,"line":429},[121,2107,1875],{"class":127},[121,2109,2110,2112,2114,2116,2118,2120,2123,2125],{"class":123,"line":451},[121,2111,169],{"class":127},[121,2113,211],{"class":156},[121,2115,141],{"class":127},[121,2117,144],{"class":127},[121,2119,218],{"class":127},[121,2121,2122],{"class":221},"hourly-limit",[121,2124,141],{"class":127},[121,2126,227],{"class":127},[121,2128,2129,2131,2133,2135,2137,2139,2142,2144],{"class":123,"line":466},[121,2130,169],{"class":127},[121,2132,235],{"class":156},[121,2134,141],{"class":127},[121,2136,144],{"class":127},[121,2138,218],{"class":127},[121,2140,2141],{"class":221},"Hourly Limit",[121,2143,141],{"class":127},[121,2145,227],{"class":127},[121,2147,2148,2150,2152,2154,2156],{"class":123,"line":472},[121,2149,169],{"class":127},[121,2151,173],{"class":156},[121,2153,141],{"class":127},[121,2155,144],{"class":127},[121,2157,180],{"class":127},[121,2159,2160,2162,2164,2166,2168],{"class":123,"line":478},[121,2161,169],{"class":127},[121,2163,269],{"class":156},[121,2165,141],{"class":127},[121,2167,144],{"class":127},[121,2169,1199],{"class":127},[121,2171,2172,2174,2176,2178,2180,2182,2184,2186],{"class":123,"line":484},[121,2173,169],{"class":127},[121,2175,365],{"class":156},[121,2177,141],{"class":127},[121,2179,144],{"class":127},[121,2181,218],{"class":127},[121,2183,374],{"class":221},[121,2185,141],{"class":127},[121,2187,227],{"class":127},[121,2189,2190,2192,2194,2196,2198,2201],{"class":123,"line":490},[121,2191,169],{"class":127},[121,2193,386],{"class":156},[121,2195,141],{"class":127},[121,2197,144],{"class":127},[121,2199,2200],{"class":172}," 5000",[121,2202,227],{"class":127},[121,2204,2205,2207,2209,2211,2213],{"class":123,"line":496},[121,2206,169],{"class":127},[121,2208,403],{"class":156},[121,2210,141],{"class":127},[121,2212,144],{"class":127},[121,2214,1603],{"class":172},[121,2216,2218],{"class":123,"line":2217},29,[121,2219,487],{"class":127},[121,2221,2223],{"class":123,"line":2222},30,[121,2224,2225],{"class":127},"  ]\n",[121,2227,2229],{"class":123,"line":2228},31,[121,2230,499],{"class":127},[787,2232,2234],{"id":2233},"rate-limit-by-tenant","Rate limit by tenant",[111,2236,2238],{"className":113,"code":2237,"language":115,"meta":116,"style":116},"{\n  \"id\": \"tenant-limit\",\n  \"name\": \"Per-Tenant Rate Limit\",\n  \"enabled\": true,\n  \"conditions\": [\n    { \"left\": \"req.path\", \"operator\": \"starts_with\", \"value\": \"\u002Fapi\u002F\" }\n  ],\n  \"key\": \"req.header.X-Tenant-ID\",\n  \"limit\": 5000,\n  \"window_seconds\": 60\n}\n",[118,2239,2240,2244,2263,2282,2294,2306,2358,2362,2380,2394,2406],{"__ignoreMap":116},[121,2241,2242],{"class":123,"line":124},[121,2243,128],{"class":127},[121,2245,2246,2248,2250,2252,2254,2256,2259,2261],{"class":123,"line":131},[121,2247,134],{"class":127},[121,2249,211],{"class":137},[121,2251,141],{"class":127},[121,2253,144],{"class":127},[121,2255,218],{"class":127},[121,2257,2258],{"class":221},"tenant-limit",[121,2260,141],{"class":127},[121,2262,227],{"class":127},[121,2264,2265,2267,2269,2271,2273,2275,2278,2280],{"class":123,"line":150},[121,2266,134],{"class":127},[121,2268,235],{"class":137},[121,2270,141],{"class":127},[121,2272,144],{"class":127},[121,2274,218],{"class":127},[121,2276,2277],{"class":221},"Per-Tenant Rate Limit",[121,2279,141],{"class":127},[121,2281,227],{"class":127},[121,2283,2284,2286,2288,2290,2292],{"class":123,"line":166},[121,2285,134],{"class":127},[121,2287,173],{"class":137},[121,2289,141],{"class":127},[121,2291,144],{"class":127},[121,2293,180],{"class":127},[121,2295,2296,2298,2300,2302,2304],{"class":123,"line":183},[121,2297,134],{"class":127},[121,2299,269],{"class":137},[121,2301,141],{"class":127},[121,2303,144],{"class":127},[121,2305,195],{"class":127},[121,2307,2308,2310,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356],{"class":123,"line":198},[121,2309,1326],{"class":127},[121,2311,218],{"class":127},[121,2313,291],{"class":156},[121,2315,141],{"class":127},[121,2317,144],{"class":127},[121,2319,218],{"class":127},[121,2321,300],{"class":221},[121,2323,141],{"class":127},[121,2325,763],{"class":127},[121,2327,218],{"class":127},[121,2329,312],{"class":156},[121,2331,141],{"class":127},[121,2333,144],{"class":127},[121,2335,218],{"class":127},[121,2337,321],{"class":221},[121,2339,141],{"class":127},[121,2341,763],{"class":127},[121,2343,218],{"class":127},[121,2345,333],{"class":156},[121,2347,141],{"class":127},[121,2349,144],{"class":127},[121,2351,218],{"class":127},[121,2353,342],{"class":221},[121,2355,141],{"class":127},[121,2357,776],{"class":127},[121,2359,2360],{"class":123,"line":204},[121,2361,1379],{"class":127},[121,2363,2364,2366,2368,2370,2372,2374,2376,2378],{"class":123,"line":230},[121,2365,134],{"class":127},[121,2367,365],{"class":137},[121,2369,141],{"class":127},[121,2371,144],{"class":127},[121,2373,218],{"class":127},[121,2375,960],{"class":221},[121,2377,141],{"class":127},[121,2379,227],{"class":127},[121,2381,2382,2384,2386,2388,2390,2392],{"class":123,"line":251},[121,2383,134],{"class":127},[121,2385,386],{"class":137},[121,2387,141],{"class":127},[121,2389,144],{"class":127},[121,2391,2200],{"class":172},[121,2393,227],{"class":127},[121,2395,2396,2398,2400,2402,2404],{"class":123,"line":264},[121,2397,134],{"class":127},[121,2399,403],{"class":137},[121,2401,141],{"class":127},[121,2403,144],{"class":127},[121,2405,1106],{"class":172},[121,2407,2408],{"class":123,"line":278},[121,2409,499],{"class":127},[106,2411,2413],{"id":2412},"log-output","Log output",[111,2415,2417],{"className":113,"code":2416,"language":115,"meta":116,"style":116},"{\n  \"rate_limit\": {\n    \"matched\": true,\n    \"rule_id\": \"api-limit\",\n    \"blocked\": false,\n    \"remaining\": 87\n  }\n}\n",[118,2418,2419,2423,2436,2449,2467,2481,2495,2499],{"__ignoreMap":116},[121,2420,2421],{"class":123,"line":124},[121,2422,128],{"class":127},[121,2424,2425,2427,2430,2432,2434],{"class":123,"line":131},[121,2426,134],{"class":127},[121,2428,2429],{"class":137},"rate_limit",[121,2431,141],{"class":127},[121,2433,144],{"class":127},[121,2435,147],{"class":127},[121,2437,2438,2440,2443,2445,2447],{"class":123,"line":150},[121,2439,153],{"class":127},[121,2441,2442],{"class":156},"matched",[121,2444,141],{"class":127},[121,2446,144],{"class":127},[121,2448,180],{"class":127},[121,2450,2451,2453,2455,2457,2459,2461,2463,2465],{"class":123,"line":166},[121,2452,153],{"class":127},[121,2454,1067],{"class":156},[121,2456,141],{"class":127},[121,2458,144],{"class":127},[121,2460,218],{"class":127},[121,2462,222],{"class":221},[121,2464,141],{"class":127},[121,2466,227],{"class":127},[121,2468,2469,2471,2474,2476,2478],{"class":123,"line":183},[121,2470,153],{"class":127},[121,2472,2473],{"class":156},"blocked",[121,2475,141],{"class":127},[121,2477,144],{"class":127},[121,2479,2480],{"class":127}," false,\n",[121,2482,2483,2485,2488,2490,2492],{"class":123,"line":198},[121,2484,153],{"class":127},[121,2486,2487],{"class":156},"remaining",[121,2489,141],{"class":127},[121,2491,144],{"class":127},[121,2493,2494],{"class":172}," 87\n",[121,2496,2497],{"class":123,"line":204},[121,2498,493],{"class":127},[121,2500,2501],{"class":123,"line":230},[121,2502,499],{"class":127},[102,2504,2505],{},"When blocked:",[111,2507,2509],{"className":113,"code":2508,"language":115,"meta":116,"style":116},"{\n  \"rate_limit\": {\n    \"matched\": true,\n    \"rule_id\": \"api-limit\",\n    \"blocked\": true,\n    \"remaining\": 0\n  }\n}\n",[118,2510,2511,2515,2527,2539,2557,2569,2582,2586],{"__ignoreMap":116},[121,2512,2513],{"class":123,"line":124},[121,2514,128],{"class":127},[121,2516,2517,2519,2521,2523,2525],{"class":123,"line":131},[121,2518,134],{"class":127},[121,2520,2429],{"class":137},[121,2522,141],{"class":127},[121,2524,144],{"class":127},[121,2526,147],{"class":127},[121,2528,2529,2531,2533,2535,2537],{"class":123,"line":150},[121,2530,153],{"class":127},[121,2532,2442],{"class":156},[121,2534,141],{"class":127},[121,2536,144],{"class":127},[121,2538,180],{"class":127},[121,2540,2541,2543,2545,2547,2549,2551,2553,2555],{"class":123,"line":166},[121,2542,153],{"class":127},[121,2544,1067],{"class":156},[121,2546,141],{"class":127},[121,2548,144],{"class":127},[121,2550,218],{"class":127},[121,2552,222],{"class":221},[121,2554,141],{"class":127},[121,2556,227],{"class":127},[121,2558,2559,2561,2563,2565,2567],{"class":123,"line":183},[121,2560,153],{"class":127},[121,2562,2473],{"class":156},[121,2564,141],{"class":127},[121,2566,144],{"class":127},[121,2568,180],{"class":127},[121,2570,2571,2573,2575,2577,2579],{"class":123,"line":198},[121,2572,153],{"class":127},[121,2574,2487],{"class":156},[121,2576,141],{"class":127},[121,2578,144],{"class":127},[121,2580,2581],{"class":172}," 0\n",[121,2583,2584],{"class":123,"line":204},[121,2585,493],{"class":127},[121,2587,2588],{"class":123,"line":230},[121,2589,499],{"class":127},[106,2591,2593],{"id":2592},"performance","Performance",[505,2595,2596,2606],{},[508,2597,2598],{},[511,2599,2600,2603],{},[514,2601,2602],{},"Metric",[514,2604,2605],{},"Value",[527,2607,2608,2616,2624],{},[511,2609,2610,2613],{},[532,2611,2612],{},"Counter lookup",[532,2614,2615],{},"O(1) — DashMap",[511,2617,2618,2621],{},[532,2619,2620],{},"Memory per counter",[532,2622,2623],{},"~64 bytes",[511,2625,2626,2629],{},[532,2627,2628],{},"Concurrent counters",[532,2630,2631],{},"Unlimited (grows with unique keys)",[106,2633,2635],{"id":2634},"notes","Notes",[982,2637,2638,2645,2648,2651],{},[985,2639,2640,2641,2644],{},"Counters are ",[592,2642,2643],{},"in-memory only"," — they reset on gateway restart",[985,2646,2647],{},"Each gateway instance has its own counters (no distributed counting)",[985,2649,2650],{},"For distributed rate limiting, use an external store (Redis) or a shared header",[985,2652,663,2653,2655,2656,653,2658],{},[118,2654,420],{}," field is optional — defaults to ",[118,2657,444],{},[118,2659,656],{},[2661,2662,2663],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .su27w, html code.shiki .su27w{--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":116,"searchDepth":131,"depth":131,"links":2665},[2666,2667,2668,2672,2676,2677,2685,2686,2687],{"id":108,"depth":131,"text":109},{"id":502,"depth":131,"text":503},{"id":659,"depth":131,"text":660,"children":2669},[2670,2671],{"id":789,"depth":150,"text":790},{"id":841,"depth":150,"text":842},{"id":967,"depth":131,"text":968,"children":2673},[2674,2675],{"id":979,"depth":150,"text":980},{"id":1002,"depth":150,"text":1003},{"id":1012,"depth":131,"text":1013},{"id":1122,"depth":131,"text":1123,"children":2678},[2679,2680,2681,2682,2683,2684],{"id":1126,"depth":150,"text":1127},{"id":1251,"depth":150,"text":1252},{"id":1430,"depth":150,"text":1431},{"id":1610,"depth":150,"text":1611},{"id":1848,"depth":150,"text":1849},{"id":2233,"depth":150,"text":2234},{"id":2412,"depth":131,"text":2413},{"id":2592,"depth":131,"text":2593},{"id":2634,"depth":131,"text":2635},"Sliding-window request quotas per IP, header, JWT claim, or composite key.","md",null,{},{"icon":52},{"title":49,"description":2688},"HW9wXiYzqI0L6rL_Kn9xGLlLbrWTwXyxU9oiaTI-e08",[2696,2698],{"title":44,"path":45,"stem":46,"description":2697,"icon":47,"children":-1},"Allow, block, redirect, or modify requests with ordered rules evaluated against any request attribute.",{"title":54,"path":55,"stem":56,"description":2699,"icon":57,"children":-1},"Edge caching with TTL, custom keys, stale-while-revalidate, stale-if-error, and singleflight revalidation.",1791649767383]