[{"data":1,"prerenderedAt":3290},["ShallowReactive",2],{"navigation_docs":3,"-quayel-gateway-api-reference":91,"-quayel-gateway-api-reference-surround":3289},[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":93,"body":94,"description":3281,"extension":3282,"links":3283,"meta":3284,"navigation":90,"path":3285,"seo":3286,"stem":3287,"__hash__":3288},"docs\u002Fquayel-gateway\u002F09.api-reference.md","API Reference",{"type":95,"value":96,"toc":3244},"minimark",[97,102,106,135,139,142,147,220,224,230,283,289,292,299,303,463,467,736,740,841,846,1054,1058,1287,1291,1383,1387,1459,1463,1471,1475,1479,1577,1582,1616,1620,1662,1666,1670,1700,1706,1710,1757,1761,1770,1819,1823,1870,1874,1958,1962,1969,1990,1997,2006,2009,2016,2020,2202,2206,2209,2215,2219,2285,2289,2292,2298,2301,3179,3183,3240],[98,99,101],"h1",{"id":100},"api-reference-upstream-headers-variables-integration","API Reference — Upstream Headers, Variables & Integration",[103,104,105],"p",{},"The Quayel Gateway enriches every request with IP intelligence, security decisions, and metadata. This data is available through:",[107,108,109,117,123,129],"ol",{},[110,111,112,116],"li",{},[113,114,115],"strong",{},"Upstream request headers"," — forwarded to your backend servers",[110,118,119,122],{},[113,120,121],{},"Condition paths"," — used in firewall, rate limit, cache, and LB rules",[110,124,125,128],{},[113,126,127],{},"JSONL log fields"," — recorded in access logs",[110,130,131,134],{},[113,132,133],{},"Response headers"," — sent back to clients",[136,137,115],"h2",{"id":138},"upstream-request-headers",[103,140,141],{},"These headers are automatically added to requests forwarded to backend servers.",[143,144,146],"h3",{"id":145},"standard-proxy-headers","Standard proxy headers",[148,149,150,166],"table",{},[151,152,153],"thead",{},[154,155,156,160,163],"tr",{},[157,158,159],"th",{},"Header",[157,161,162],{},"Value",[157,164,165],{},"Description",[167,168,169,186,205],"tbody",{},[154,170,171,178,183],{},[172,173,174],"td",{},[175,176,177],"code",{},"X-Forwarded-For",[172,179,180],{},[175,181,182],{},"client_ip",[172,184,185],{},"Client IP appended to existing chain",[154,187,188,193,202],{},[172,189,190],{},[175,191,192],{},"X-Forwarded-Proto",[172,194,195,198,199],{},[175,196,197],{},"http"," \u002F ",[175,200,201],{},"https",[172,203,204],{},"Original request scheme",[154,206,207,212,217],{},[172,208,209],{},[175,210,211],{},"X-Forwarded-Host",[172,213,214],{},[175,215,216],{},"host",[172,218,219],{},"Original request host",[143,221,223],{"id":222},"client-ip-resolution","Client IP resolution",[103,225,226,227,229],{},"The gateway resolves the real client IP based on the ",[175,228,182],{}," configuration:",[148,231,232,245],{},[151,233,234],{},[154,235,236,242],{},[157,237,238,239],{},"Config ",[175,240,241],{},"source",[157,243,244],{},"Behavior",[167,246,247,257,271],{},[154,248,249,254],{},[172,250,251],{},[175,252,253],{},"peer_ip",[172,255,256],{},"Uses direct TCP connection IP",[154,258,259,264],{},[172,260,261],{},[175,262,263],{},"header",[172,265,266,267,270],{},"Reads IP from specified header (e.g., ",[175,268,269],{},"CF-Connecting-IP",")",[154,272,273,278],{},[172,274,275],{},[175,276,277],{},"header_index",[172,279,280,281,270],{},"Reads IP from Nth entry in comma-separated header (e.g., ",[175,282,177],{},[103,284,285,286,288],{},"The resolved ",[175,287,182],{}," is used for all IP intel lookups and rate limiting.",[136,290,121],{"id":291},"condition-paths",[103,293,294,295,298],{},"These paths can be used in the ",[175,296,297],{},"left"," field of any condition (firewall, rate limiting, cache, load balancer).",[143,300,302],{"id":301},"request-fields","Request fields",[148,304,305,320],{},[151,306,307],{},[154,308,309,312,315,317],{},[157,310,311],{},"Path",[157,313,314],{},"Type",[157,316,165],{},[157,318,319],{},"Example Value",[167,321,322,343,363,383,403,423,443],{},[154,323,324,332,335,338],{},[172,325,326,198,329],{},[175,327,328],{},"req.host",[175,330,331],{},"http.host",[172,333,334],{},"string",[172,336,337],{},"Host header",[172,339,340],{},[175,341,342],{},"\"api.example.com\"",[154,344,345,353,355,358],{},[172,346,347,198,350],{},[175,348,349],{},"req.path",[175,351,352],{},"http.path",[172,354,334],{},[172,356,357],{},"Request path + query",[172,359,360],{},[175,361,362],{},"\"\u002Fapi\u002Fv1\u002Fusers?page=1\"",[154,364,365,373,375,378],{},[172,366,367,198,370],{},[175,368,369],{},"req.method",[175,371,372],{},"http.method",[172,374,334],{},[172,376,377],{},"HTTP method",[172,379,380],{},[175,381,382],{},"\"GET\"",[154,384,385,393,395,398],{},[172,386,387,198,390],{},[175,388,389],{},"req.scheme",[175,391,392],{},"http.scheme",[172,394,334],{},[172,396,397],{},"Request scheme",[172,399,400],{},[175,401,402],{},"\"https\"",[154,404,405,413,415,418],{},[172,406,407,198,410],{},[175,408,409],{},"req.ip",[175,411,412],{},"http.ip",[172,414,334],{},[172,416,417],{},"Resolved client IP",[172,419,420],{},[175,421,422],{},"\"203.0.113.50\"",[154,424,425,433,435,438],{},[172,426,427,198,430],{},[175,428,429],{},"req.peer_ip",[175,431,432],{},"http.peer_ip",[172,434,334],{},[172,436,437],{},"Direct connection IP",[172,439,440],{},[175,441,442],{},"\"10.0.0.1\"",[154,444,445,453,455,458],{},[172,446,447,198,450],{},[175,448,449],{},"req.user_agent",[175,451,452],{},"http.user_agent",[172,454,334],{},[172,456,457],{},"User-Agent header",[172,459,460],{},[175,461,462],{},"\"Mozilla\u002F5.0 ...\"",[143,464,466],{"id":465},"ip-intelligence-fields","IP intelligence fields",[148,468,469,481],{},[151,470,471],{},[154,472,473,475,477,479],{},[157,474,311],{},[157,476,314],{},[157,478,165],{},[157,480,319],{},[167,482,483,500,517,534,552,569,586,604,621,637,653,670,686,702,719],{},[154,484,485,490,492,495],{},[172,486,487],{},[175,488,489],{},"ip.country",[172,491,334],{},[172,493,494],{},"ISO 3166-1 alpha-2 country code",[172,496,497],{},[175,498,499],{},"\"US\"",[154,501,502,507,509,512],{},[172,503,504],{},[175,505,506],{},"ip.region",[172,508,334],{},[172,510,511],{},"Region\u002Fstate code",[172,513,514],{},[175,515,516],{},"\"CA\"",[154,518,519,524,526,529],{},[172,520,521],{},[175,522,523],{},"ip.city",[172,525,334],{},[172,527,528],{},"City name",[172,530,531],{},[175,532,533],{},"\"San Francisco\"",[154,535,536,541,544,547],{},[172,537,538],{},[175,539,540],{},"ip.asn",[172,542,543],{},"number",[172,545,546],{},"Autonomous System Number",[172,548,549],{},[175,550,551],{},"16509",[154,553,554,559,561,564],{},[172,555,556],{},[175,557,558],{},"ip.as_org",[172,560,334],{},[172,562,563],{},"ASN organization name",[172,565,566],{},[175,567,568],{},"\"AMAZON-02\"",[154,570,571,576,578,581],{},[172,572,573],{},[175,574,575],{},"ip.provider",[172,577,334],{},[172,579,580],{},"Hosting\u002Fcloud provider label",[172,582,583],{},[175,584,585],{},"\"Amazon AWS\"",[154,587,588,593,596,599],{},[172,589,590],{},[175,591,592],{},"ip.is_vpn",[172,594,595],{},"bool",[172,597,598],{},"IP is a known VPN provider",[172,600,601],{},[175,602,603],{},"true",[154,605,606,611,613,616],{},[172,607,608],{},[175,609,610],{},"ip.is_tor",[172,612,595],{},[172,614,615],{},"IP is a Tor exit node",[172,617,618],{},[175,619,620],{},"false",[154,622,623,628,630,633],{},[172,624,625],{},[175,626,627],{},"ip.is_datacenter",[172,629,595],{},[172,631,632],{},"IP is from datacenter\u002Fhosting",[172,634,635],{},[175,636,603],{},[154,638,639,644,646,649],{},[172,640,641],{},[175,642,643],{},"ip.is_proxy",[172,645,595],{},[172,647,648],{},"IP is a known anonymous proxy",[172,650,651],{},[175,652,620],{},[154,654,655,660,662,665],{},[172,656,657],{},[175,658,659],{},"ip.is_mobile",[172,661,595],{},[172,663,664],{},"IP is from a mobile network",[172,666,667],{},[175,668,669],{},"null",[154,671,672,677,679,682],{},[172,673,674],{},[175,675,676],{},"ip.is_residential",[172,678,595],{},[172,680,681],{},"IP is residential",[172,683,684],{},[175,685,669],{},[154,687,688,693,695,698],{},[172,689,690],{},[175,691,692],{},"ip.is_residential_proxy",[172,694,595],{},[172,696,697],{},"IP is a residential proxy",[172,699,700],{},[175,701,669],{},[154,703,704,709,711,714],{},[172,705,706],{},[175,707,708],{},"ip.network_type",[172,710,334],{},[172,712,713],{},"Network type classification",[172,715,716],{},[175,717,718],{},"\"datacenter\"",[154,720,721,726,728,731],{},[172,722,723],{},[175,724,725],{},"ip.risk_score",[172,727,543],{},[172,729,730],{},"Risk score (0-100)",[172,732,733],{},[175,734,735],{},"10",[143,737,739],{"id":738},"header-query-and-cookie-access","Header, query, and cookie access",[148,741,742,753],{},[151,743,744],{},[154,745,746,749,751],{},[157,747,748],{},"Path Pattern",[157,750,314],{},[157,752,165],{},[167,754,755,767,778,795,807,818,830],{},[154,756,757,762,764],{},[172,758,759],{},[175,760,761],{},"req.header.\u003Cname>",[172,763,334],{},[172,765,766],{},"Request header value",[154,768,769,774,776],{},[172,770,771],{},[175,772,773],{},"http.header.\u003Cname>",[172,775,334],{},[172,777,766],{},[154,779,780,785,788],{},[172,781,782],{},[175,783,784],{},"req.header.\u003Cname>.jwt.\u003Cclaim.path>",[172,786,787],{},"any",[172,789,790,791,794],{},"Decode JWT from header (strips ",[175,792,793],{},"Bearer ","), navigate dotted claim path",[154,796,797,802,804],{},[172,798,799],{},[175,800,801],{},"req.query.\u003Cname>",[172,803,334],{},[172,805,806],{},"Query parameter value",[154,808,809,814,816],{},[172,810,811],{},[175,812,813],{},"http.query.\u003Cname>",[172,815,334],{},[172,817,806],{},[154,819,820,825,827],{},[172,821,822],{},[175,823,824],{},"req.cookie.\u003Cname>",[172,826,334],{},[172,828,829],{},"Cookie value",[154,831,832,837,839],{},[172,833,834],{},[175,835,836],{},"http.cookie.\u003Cname>",[172,838,334],{},[172,840,829],{},[103,842,843],{},[113,844,845],{},"Examples:",[847,848,853],"pre",{"className":849,"code":850,"language":851,"meta":852,"style":852},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"left\": \"req.header.X-API-Key\", \"operator\": \"exists\" }\n{ \"left\": \"req.header.authorization.jwt.data.role\", \"operator\": \"equals\", \"value\": \"admin\" }\n{ \"left\": \"req.query.page\", \"operator\": \"greater_than\", \"value\": 1 }\n{ \"left\": \"req.cookie.Session-ID\", \"operator\": \"exists\" }\n","json","",[175,854,855,906,963,1016],{"__ignoreMap":852},[856,857,860,864,867,870,873,876,878,882,884,887,889,892,894,896,898,901,903],"span",{"class":858,"line":859},"line",1,[856,861,863],{"class":862},"sMK4o","{",[856,865,866],{"class":862}," \"",[856,868,297],{"class":869},"spNyl",[856,871,872],{"class":862},"\"",[856,874,875],{"class":862},":",[856,877,866],{"class":862},[856,879,881],{"class":880},"sfazB","req.header.X-API-Key",[856,883,872],{"class":862},[856,885,886],{"class":862},",",[856,888,866],{"class":862},[856,890,891],{"class":869},"operator",[856,893,872],{"class":862},[856,895,875],{"class":862},[856,897,866],{"class":862},[856,899,900],{"class":880},"exists",[856,902,872],{"class":862},[856,904,905],{"class":862}," }\n",[856,907,909,911,913,915,917,919,921,924,926,928,930,932,934,936,938,941,943,945,947,950,952,954,956,959,961],{"class":858,"line":908},2,[856,910,863],{"class":862},[856,912,866],{"class":862},[856,914,297],{"class":869},[856,916,872],{"class":862},[856,918,875],{"class":862},[856,920,866],{"class":862},[856,922,923],{"class":880},"req.header.authorization.jwt.data.role",[856,925,872],{"class":862},[856,927,886],{"class":862},[856,929,866],{"class":862},[856,931,891],{"class":869},[856,933,872],{"class":862},[856,935,875],{"class":862},[856,937,866],{"class":862},[856,939,940],{"class":880},"equals",[856,942,872],{"class":862},[856,944,886],{"class":862},[856,946,866],{"class":862},[856,948,949],{"class":869},"value",[856,951,872],{"class":862},[856,953,875],{"class":862},[856,955,866],{"class":862},[856,957,958],{"class":880},"admin",[856,960,872],{"class":862},[856,962,905],{"class":862},[856,964,966,968,970,972,974,976,978,981,983,985,987,989,991,993,995,998,1000,1002,1004,1006,1008,1010,1014],{"class":858,"line":965},3,[856,967,863],{"class":862},[856,969,866],{"class":862},[856,971,297],{"class":869},[856,973,872],{"class":862},[856,975,875],{"class":862},[856,977,866],{"class":862},[856,979,980],{"class":880},"req.query.page",[856,982,872],{"class":862},[856,984,886],{"class":862},[856,986,866],{"class":862},[856,988,891],{"class":869},[856,990,872],{"class":862},[856,992,875],{"class":862},[856,994,866],{"class":862},[856,996,997],{"class":880},"greater_than",[856,999,872],{"class":862},[856,1001,886],{"class":862},[856,1003,866],{"class":862},[856,1005,949],{"class":869},[856,1007,872],{"class":862},[856,1009,875],{"class":862},[856,1011,1013],{"class":1012},"sbssI"," 1",[856,1015,905],{"class":862},[856,1017,1019,1021,1023,1025,1027,1029,1031,1034,1036,1038,1040,1042,1044,1046,1048,1050,1052],{"class":858,"line":1018},4,[856,1020,863],{"class":862},[856,1022,866],{"class":862},[856,1024,297],{"class":869},[856,1026,872],{"class":862},[856,1028,875],{"class":862},[856,1030,866],{"class":862},[856,1032,1033],{"class":880},"req.cookie.Session-ID",[856,1035,872],{"class":862},[856,1037,886],{"class":862},[856,1039,866],{"class":862},[856,1041,891],{"class":869},[856,1043,872],{"class":862},[856,1045,875],{"class":862},[856,1047,866],{"class":862},[856,1049,900],{"class":880},[856,1051,872],{"class":862},[856,1053,905],{"class":862},[136,1055,1057],{"id":1056},"operators-reference","Operators reference",[148,1059,1060,1075],{},[151,1061,1062],{},[154,1063,1064,1067,1069,1072],{},[157,1065,1066],{},"Operator",[157,1068,165],{},[157,1070,1071],{},"Left Type",[157,1073,1074],{},"Value Type",[167,1076,1077,1090,1104,1118,1132,1146,1160,1174,1188,1203,1217,1230,1244,1258,1272],{},[154,1078,1079,1083,1086,1088],{},[172,1080,1081],{},[175,1082,940],{},[172,1084,1085],{},"Exact match",[172,1087,787],{},[172,1089,787],{},[154,1091,1092,1097,1100,1102],{},[172,1093,1094],{},[175,1095,1096],{},"not_equals",[172,1098,1099],{},"Not equal",[172,1101,787],{},[172,1103,787],{},[154,1105,1106,1111,1114,1116],{},[172,1107,1108],{},[175,1109,1110],{},"contains",[172,1112,1113],{},"String contains",[172,1115,334],{},[172,1117,334],{},[154,1119,1120,1125,1128,1130],{},[172,1121,1122],{},[175,1123,1124],{},"not_contains",[172,1126,1127],{},"String does not contain",[172,1129,334],{},[172,1131,334],{},[154,1133,1134,1139,1142,1144],{},[172,1135,1136],{},[175,1137,1138],{},"starts_with",[172,1140,1141],{},"String prefix match",[172,1143,334],{},[172,1145,334],{},[154,1147,1148,1153,1156,1158],{},[172,1149,1150],{},[175,1151,1152],{},"ends_with",[172,1154,1155],{},"String suffix match",[172,1157,334],{},[172,1159,334],{},[154,1161,1162,1166,1169,1171],{},[172,1163,1164],{},[175,1165,900],{},[172,1167,1168],{},"Value is not null",[172,1170,787],{},[172,1172,1173],{},"—",[154,1175,1176,1181,1184,1186],{},[172,1177,1178],{},[175,1179,1180],{},"not_exists",[172,1182,1183],{},"Value is null",[172,1185,787],{},[172,1187,1173],{},[154,1189,1190,1195,1198,1200],{},[172,1191,1192],{},[175,1193,1194],{},"in",[172,1196,1197],{},"Value is in array",[172,1199,787],{},[172,1201,1202],{},"array",[154,1204,1205,1210,1213,1215],{},[172,1206,1207],{},[175,1208,1209],{},"not_in",[172,1211,1212],{},"Value is not in array",[172,1214,787],{},[172,1216,1202],{},[154,1218,1219,1223,1226,1228],{},[172,1220,1221],{},[175,1222,997],{},[172,1224,1225],{},"Numeric >",[172,1227,543],{},[172,1229,543],{},[154,1231,1232,1237,1240,1242],{},[172,1233,1234],{},[175,1235,1236],{},"greater_than_or_equal",[172,1238,1239],{},"Numeric >=",[172,1241,543],{},[172,1243,543],{},[154,1245,1246,1251,1254,1256],{},[172,1247,1248],{},[175,1249,1250],{},"less_than",[172,1252,1253],{},"Numeric \u003C",[172,1255,543],{},[172,1257,543],{},[154,1259,1260,1265,1268,1270],{},[172,1261,1262],{},[175,1263,1264],{},"less_than_or_equal",[172,1266,1267],{},"Numeric \u003C=",[172,1269,543],{},[172,1271,543],{},[154,1273,1274,1279,1282,1284],{},[172,1275,1276],{},[175,1277,1278],{},"regex",[172,1280,1281],{},"Regular expression",[172,1283,334],{},[172,1285,1286],{},"string (regex)",[136,1288,1290],{"id":1289},"firewall-actions","Firewall actions",[148,1292,1293,1305],{},[151,1294,1295],{},[154,1296,1297,1300,1302],{},[157,1298,1299],{},"Action Type",[157,1301,165],{},[157,1303,1304],{},"Extra Fields",[167,1306,1307,1323,1335,1353,1369],{},[154,1308,1309,1314,1317],{},[172,1310,1311],{},[175,1312,1313],{},"block",[172,1315,1316],{},"Return error response",[172,1318,1319,1322],{},[175,1320,1321],{},"status"," (default: 403)",[154,1324,1325,1330,1333],{},[172,1326,1327],{},[175,1328,1329],{},"allow",[172,1331,1332],{},"Continue pipeline (skip remaining firewall rules)",[172,1334,1173],{},[154,1336,1337,1342,1345],{},[172,1338,1339],{},[175,1340,1341],{},"redirect",[172,1343,1344],{},"Return redirect response",[172,1346,1347,1349,1350],{},[175,1348,1321],{}," (default: 302), ",[175,1351,1352],{},"location",[154,1354,1355,1360,1363],{},[172,1356,1357],{},[175,1358,1359],{},"set_request_header",[172,1361,1362],{},"Modify request headers before forwarding",[172,1364,1365,1368],{},[175,1366,1367],{},"headers"," (map)",[154,1370,1371,1376,1379],{},[172,1372,1373],{},[175,1374,1375],{},"set_response_header",[172,1377,1378],{},"Modify response headers (reserved)",[172,1380,1381,1368],{},[175,1382,1367],{},[143,1384,1386],{"id":1385},"block-response-body","Block response body",[847,1388,1390],{"className":849,"code":1389,"language":851,"meta":852,"style":852},"{\n  \"error\": \"blocked\",\n  \"status\": 403,\n  \"rule_id\": \"block-tor\"\n}\n",[175,1391,1392,1397,1419,1434,1453],{"__ignoreMap":852},[856,1393,1394],{"class":858,"line":859},[856,1395,1396],{"class":862},"{\n",[856,1398,1399,1402,1405,1407,1409,1411,1414,1416],{"class":858,"line":908},[856,1400,1401],{"class":862},"  \"",[856,1403,1404],{"class":869},"error",[856,1406,872],{"class":862},[856,1408,875],{"class":862},[856,1410,866],{"class":862},[856,1412,1413],{"class":880},"blocked",[856,1415,872],{"class":862},[856,1417,1418],{"class":862},",\n",[856,1420,1421,1423,1425,1427,1429,1432],{"class":858,"line":965},[856,1422,1401],{"class":862},[856,1424,1321],{"class":869},[856,1426,872],{"class":862},[856,1428,875],{"class":862},[856,1430,1431],{"class":1012}," 403",[856,1433,1418],{"class":862},[856,1435,1436,1438,1441,1443,1445,1447,1450],{"class":858,"line":1018},[856,1437,1401],{"class":862},[856,1439,1440],{"class":869},"rule_id",[856,1442,872],{"class":862},[856,1444,875],{"class":862},[856,1446,866],{"class":862},[856,1448,1449],{"class":880},"block-tor",[856,1451,1452],{"class":862},"\"\n",[856,1454,1456],{"class":858,"line":1455},5,[856,1457,1458],{"class":862},"}\n",[143,1460,1462],{"id":1461},"redirect-response","Redirect response",[847,1464,1469],{"className":1465,"code":1467,"language":1468},[1466],"language-text","HTTP\u002F1.1 302 Found\nLocation: https:\u002F\u002Fexample.com\u002Fblocked\nContent-Length: 0\n","text",[175,1470,1467],{"__ignoreMap":852},[136,1472,1474],{"id":1473},"rate-limiting","Rate limiting",[143,1476,1478],{"id":1477},"blocked-response-body","Blocked response body",[847,1480,1482],{"className":849,"code":1481,"language":851,"meta":852,"style":852},"{\n  \"error\": \"rate_limited\",\n  \"status\": 429,\n  \"rule_id\": \"api-limit\",\n  \"limit\": 100,\n  \"window_seconds\": 60\n}\n",[175,1483,1484,1488,1507,1522,1541,1557,1572],{"__ignoreMap":852},[856,1485,1486],{"class":858,"line":859},[856,1487,1396],{"class":862},[856,1489,1490,1492,1494,1496,1498,1500,1503,1505],{"class":858,"line":908},[856,1491,1401],{"class":862},[856,1493,1404],{"class":869},[856,1495,872],{"class":862},[856,1497,875],{"class":862},[856,1499,866],{"class":862},[856,1501,1502],{"class":880},"rate_limited",[856,1504,872],{"class":862},[856,1506,1418],{"class":862},[856,1508,1509,1511,1513,1515,1517,1520],{"class":858,"line":965},[856,1510,1401],{"class":862},[856,1512,1321],{"class":869},[856,1514,872],{"class":862},[856,1516,875],{"class":862},[856,1518,1519],{"class":1012}," 429",[856,1521,1418],{"class":862},[856,1523,1524,1526,1528,1530,1532,1534,1537,1539],{"class":858,"line":1018},[856,1525,1401],{"class":862},[856,1527,1440],{"class":869},[856,1529,872],{"class":862},[856,1531,875],{"class":862},[856,1533,866],{"class":862},[856,1535,1536],{"class":880},"api-limit",[856,1538,872],{"class":862},[856,1540,1418],{"class":862},[856,1542,1543,1545,1548,1550,1552,1555],{"class":858,"line":1455},[856,1544,1401],{"class":862},[856,1546,1547],{"class":869},"limit",[856,1549,872],{"class":862},[856,1551,875],{"class":862},[856,1553,1554],{"class":1012}," 100",[856,1556,1418],{"class":862},[856,1558,1560,1562,1565,1567,1569],{"class":858,"line":1559},6,[856,1561,1401],{"class":862},[856,1563,1564],{"class":869},"window_seconds",[856,1566,872],{"class":862},[856,1568,875],{"class":862},[856,1570,1571],{"class":1012}," 60\n",[856,1573,1575],{"class":858,"line":1574},7,[856,1576,1458],{"class":862},[103,1578,1579],{},[113,1580,1581],{},"Response headers:",[148,1583,1584,1592],{},[151,1585,1586],{},[154,1587,1588,1590],{},[157,1589,159],{},[157,1591,162],{},[167,1593,1594,1606],{},[154,1595,1596,1601],{},[172,1597,1598],{},[175,1599,1600],{},"Content-Type",[172,1602,1603],{},[175,1604,1605],{},"application\u002Fjson",[154,1607,1608,1613],{},[172,1609,1610],{},[175,1611,1612],{},"Retry-After",[172,1614,1615],{},"Window seconds",[143,1617,1619],{"id":1618},"rate-limit-keys","Rate limit keys",[148,1621,1622,1631],{},[151,1623,1624],{},[154,1625,1626,1629],{},[157,1627,1628],{},"Key",[157,1630,165],{},[167,1632,1633,1642,1650],{},[154,1634,1635,1640],{},[172,1636,1637],{},[175,1638,1639],{},"req.client_ip",[172,1641,417],{},[154,1643,1644,1648],{},[172,1645,1646],{},[175,1647,429],{},[172,1649,437],{},[154,1651,1652,1656],{},[172,1653,1654],{},[175,1655,761],{},[172,1657,1658,1659,270],{},"Header value (e.g., ",[175,1660,1661],{},"X-API-Key",[136,1663,1665],{"id":1664},"load-balancer","Load balancer",[143,1667,1669],{"id":1668},"no-healthy-upstream-response","No healthy upstream response",[847,1671,1673],{"className":849,"code":1672,"language":851,"meta":852,"style":852},"{\n  \"error\": \"no_healthy_upstream\"\n}\n",[175,1674,1675,1679,1696],{"__ignoreMap":852},[856,1676,1677],{"class":858,"line":859},[856,1678,1396],{"class":862},[856,1680,1681,1683,1685,1687,1689,1691,1694],{"class":858,"line":908},[856,1682,1401],{"class":862},[856,1684,1404],{"class":869},[856,1686,872],{"class":862},[856,1688,875],{"class":862},[856,1690,866],{"class":862},[856,1692,1693],{"class":880},"no_healthy_upstream",[856,1695,1452],{"class":862},[856,1697,1698],{"class":858,"line":965},[856,1699,1458],{"class":862},[103,1701,1702,1703],{},"Status: ",[175,1704,1705],{},"503 Service Unavailable",[143,1707,1709],{"id":1708},"upstream-headers-added","Upstream headers added",[148,1711,1712,1720],{},[151,1713,1714],{},[154,1715,1716,1718],{},[157,1717,159],{},[157,1719,162],{},[167,1721,1722,1731,1744],{},[154,1723,1724,1728],{},[172,1725,1726],{},[175,1727,177],{},[172,1729,1730],{},"Client IP (appended to chain)",[154,1732,1733,1737],{},[172,1734,1735],{},[175,1736,192],{},[172,1738,1739,1740,198,1742,270],{},"Original scheme (",[175,1741,197],{},[175,1743,201],{},[154,1745,1746,1750],{},[172,1747,1748],{},[175,1749,211],{},[172,1751,1752,1753,1756],{},"Original ",[175,1754,1755],{},"Host"," header",[143,1758,1760],{"id":1759},"tls-sni-behavior","TLS \u002F SNI behavior",[103,1762,1763,1764,1767,1768,875],{},"When target ",[175,1765,1766],{},"protocol"," is ",[175,1769,201],{},[148,1771,1772,1782],{},[151,1773,1774],{},[154,1775,1776,1779],{},[157,1777,1778],{},"Scenario",[157,1780,1781],{},"SNI used",[167,1783,1784,1795,1803,1811],{},[154,1785,1786,1792],{},[172,1787,1788,1791],{},[175,1789,1790],{},"tls.sni"," configured",[172,1793,1794],{},"Uses configured SNI",[154,1796,1797,1800],{},[172,1798,1799],{},"Target is IP + visitor has Host header",[172,1801,1802],{},"Uses visitor's Host",[154,1804,1805,1808],{},[172,1806,1807],{},"Target is IP + no Host header",[172,1809,1810],{},"Uses target IP as SNI",[154,1812,1813,1816],{},[172,1814,1815],{},"Target is hostname",[172,1817,1818],{},"Uses target hostname",[136,1820,1822],{"id":1821},"cache-response-headers","Cache response headers",[148,1824,1825,1835],{},[151,1826,1827],{},[154,1828,1829,1831,1833],{},[157,1830,159],{},[157,1832,162],{},[157,1834,165],{},[167,1836,1837],{},[154,1838,1839,1844,1867],{},[172,1840,1841],{},[175,1842,1843],{},"Quayel-Cache-Status",[172,1845,1846,198,1849,198,1852,198,1855,198,1858,198,1861,198,1864],{},[175,1847,1848],{},"NONE",[175,1850,1851],{},"HIT",[175,1853,1854],{},"MISS",[175,1856,1857],{},"EXPIRED",[175,1859,1860],{},"BYPASS",[175,1862,1863],{},"STALE",[175,1865,1866],{},"REVALIDATING",[172,1868,1869],{},"Cache status",[143,1871,1873],{"id":1872},"cache-status-values","Cache status values",[148,1875,1876,1884],{},[151,1877,1878],{},[154,1879,1880,1882],{},[157,1881,162],{},[157,1883,165],{},[167,1885,1886,1895,1904,1913,1922,1931,1940,1949],{},[154,1887,1888,1892],{},[172,1889,1890],{},[175,1891,1848],{},[172,1893,1894],{},"No cache rule matched",[154,1896,1897,1901],{},[172,1898,1899],{},[175,1900,1851],{},[172,1902,1903],{},"Response served from fresh cache",[154,1905,1906,1910],{},[172,1907,1908],{},[175,1909,1854],{},[172,1911,1912],{},"Cache miss, fetched from upstream",[154,1914,1915,1919],{},[172,1916,1917],{},[175,1918,1857],{},[172,1920,1921],{},"(Reserved)",[154,1923,1924,1928],{},[172,1925,1926],{},[175,1927,1860],{},[172,1929,1930],{},"Cache bypassed by rule",[154,1932,1933,1938],{},[172,1934,1935],{},[175,1936,1937],{},"DYNAMIC",[172,1939,1921],{},[154,1941,1942,1946],{},[172,1943,1944],{},[175,1945,1863],{},[172,1947,1948],{},"Served stale data (lock race fallback — another request was already revalidating)",[154,1950,1951,1955],{},[172,1952,1953],{},[175,1954,1866],{},[172,1956,1957],{},"Served stale data while another request refreshes the cache (or this request is the one refreshing)",[143,1959,1961],{"id":1960},"cache-revalidation","Cache revalidation",[103,1963,1964,1965,1968],{},"When a cached entry becomes stale, the gateway uses ",[113,1966,1967],{},"singleflight revalidation"," via per-key locks:",[1970,1971,1972,1978,1987],"ul",{},[110,1973,1974,1977],{},[113,1975,1976],{},"First request"," that finds stale data acquires the lock and goes to origin like a normal cache miss",[110,1979,1980,1983,1984],{},[113,1981,1982],{},"Concurrent requests"," see the lock is held and serve stale cached data with ",[175,1985,1986],{},"Quayel-Cache-Status: REVALIDATING",[110,1988,1989],{},"When the first request completes, the lock releases and subsequent requests see fresh cache data",[103,1991,1992,1993,1996],{},"This prevents ",[113,1994,1995],{},"cache stampedes"," — only one request per key goes to origin, regardless of how many concurrent requests arrive.",[103,1998,1999,2000,2005],{},"See ",[2001,2002,2004],"a",{"href":2003},"\u002Fquayel-gateway\u002Fplugins\u002Fcache#singleflight-revalidation","Cache plugin — Singleflight revalidation"," for detailed flow diagrams.",[136,2007,127],{"id":2008},"jsonl-log-fields",[103,2010,1999,2011,2015],{},[2001,2012,2014],{"href":2013},"\u002Fquayel-gateway\u002Flogging","Logging"," for the complete log format.",[143,2017,2019],{"id":2018},"key-fields-for-monitoring","Key fields for monitoring",[148,2021,2022,2033],{},[151,2023,2024],{},[154,2025,2026,2029,2031],{},[157,2027,2028],{},"Field",[157,2030,311],{},[157,2032,165],{},[167,2034,2035,2048,2061,2073,2085,2098,2111,2124,2137,2150,2163,2176,2189],{},[154,2036,2037,2040,2045],{},[172,2038,2039],{},"Client IP",[172,2041,2042],{},[175,2043,2044],{},".client_ip",[172,2046,2047],{},"Resolved real client IP",[154,2049,2050,2053,2058],{},[172,2051,2052],{},"Country",[172,2054,2055],{},[175,2056,2057],{},".ip_intel.country",[172,2059,2060],{},"GeoIP country code",[154,2062,2063,2066,2071],{},[172,2064,2065],{},"ASN",[172,2067,2068],{},[175,2069,2070],{},".ip_intel.asn",[172,2072,546],{},[154,2074,2075,2078,2083],{},[172,2076,2077],{},"Provider",[172,2079,2080],{},[175,2081,2082],{},".ip_intel.provider",[172,2084,580],{},[154,2086,2087,2090,2095],{},[172,2088,2089],{},"VPN",[172,2091,2092],{},[175,2093,2094],{},".ip_intel.is_vpn",[172,2096,2097],{},"VPN detection",[154,2099,2100,2103,2108],{},[172,2101,2102],{},"Tor",[172,2104,2105],{},[175,2106,2107],{},".ip_intel.is_tor",[172,2109,2110],{},"Tor exit detection",[154,2112,2113,2116,2121],{},[172,2114,2115],{},"Datacenter",[172,2117,2118],{},[175,2119,2120],{},".ip_intel.is_datacenter",[172,2122,2123],{},"Datacenter detection",[154,2125,2126,2129,2134],{},[172,2127,2128],{},"Risk Score",[172,2130,2131],{},[175,2132,2133],{},".ip_intel.risk_score",[172,2135,2136],{},"0-100 risk score",[154,2138,2139,2142,2147],{},[172,2140,2141],{},"Firewall Match",[172,2143,2144],{},[175,2145,2146],{},".firewall.matched",[172,2148,2149],{},"Any firewall rule matched",[154,2151,2152,2155,2160],{},[172,2153,2154],{},"Rate Limited",[172,2156,2157],{},[175,2158,2159],{},".rate_limit.blocked",[172,2161,2162],{},"Request was rate limited",[154,2164,2165,2168,2173],{},[172,2166,2167],{},"Cache Status",[172,2169,2170],{},[175,2171,2172],{},".cache.status",[172,2174,2175],{},"HIT\u002FMISS\u002FREVALIDATING\u002FSTALE\u002FBYPASS\u002FNONE",[154,2177,2178,2181,2186],{},[172,2179,2180],{},"LB Target",[172,2182,2183],{},[175,2184,2185],{},".load_balancer.target",[172,2187,2188],{},"Selected upstream",[154,2190,2191,2194,2199],{},[172,2192,2193],{},"Total Time",[172,2195,2196],{},[175,2197,2198],{},".timings_us.total_us",[172,2200,2201],{},"Total processing time (μs)",[136,2203,2205],{"id":2204},"plugin-pipeline-order","Plugin pipeline order",[103,2207,2208],{},"Plugins execute in this fixed order:",[847,2210,2213],{"className":2211,"code":2212,"language":1468},[1466],"1. IP Intelligence     (always runs)\n2. Firewall            (can short-circuit)\n3. Rate Limiting       (can short-circuit)\n4. Load Balancer       (can short-circuit — selects upstream target)\n5. Cache               (can short-circuit — uses upstream target for revalidation)\n6. Logging             (always runs)\n",[175,2214,2212],{"__ignoreMap":852},[143,2216,2218],{"id":2217},"short-circuit-behavior","Short-circuit behavior",[148,2220,2221,2234],{},[151,2222,2223],{},[154,2224,2225,2228,2231],{},[157,2226,2227],{},"Plugin",[157,2229,2230],{},"Can Short-circuit?",[157,2232,2233],{},"When?",[167,2235,2236,2247,2257,2267,2276],{},[154,2237,2238,2241,2244],{},[172,2239,2240],{},"IP Intel",[172,2242,2243],{},"No",[172,2245,2246],{},"Always continues",[154,2248,2249,2251,2254],{},[172,2250,44],{},[172,2252,2253],{},"Yes",[172,2255,2256],{},"Block, redirect, or set-header action",[154,2258,2259,2262,2264],{},[172,2260,2261],{},"Rate Limit",[172,2263,2253],{},[172,2265,2266],{},"Limit exceeded → 429",[154,2268,2269,2271,2273],{},[172,2270,54],{},[172,2272,2253],{},[172,2274,2275],{},"Cache HIT → serve cached response; REVALIDATING\u002FSTALE → serve stale cached data",[154,2277,2278,2280,2282],{},[172,2279,59],{},[172,2281,2253],{},[172,2283,2284],{},"No healthy upstream → 503",[136,2286,2288],{"id":2287},"example-complete-backend-integration","Example: complete backend integration",[103,2290,2291],{},"When your backend receives a request through Quayel, it gets:",[847,2293,2296],{"className":2294,"code":2295,"language":1468},[1466],"GET \u002Fapi\u002Fv1\u002Fusers HTTP\u002F1.1\nHost: api.example.com\nX-Forwarded-For: 203.0.113.50\nX-Forwarded-Proto: https\nX-Forwarded-Host: api.example.com\nUser-Agent: Mozilla\u002F5.0 ...\n",[175,2297,2295],{"__ignoreMap":852},[103,2299,2300],{},"The access log records:",[847,2302,2304],{"className":849,"code":2303,"language":851,"meta":852,"style":852},"{\n  \"timestamp\": \"2026-10-05T17:48:56.973054084+00:00\",\n  \"gateway_id\": \"gw-prod-01\",\n  \"request_id\": \"c30dc8f2-7e2d-474b-979f-23ec1eb2e244\",\n  \"client_ip\": \"203.0.113.50\",\n  \"peer_ip\": \"203.0.113.50\",\n  \"client_ip_source\": \"X-Forwarded-For\",\n  \"method\": \"GET\",\n  \"scheme\": \"https\",\n  \"host\": \"api.example.com\",\n  \"path\": \"\u002Fapi\u002Fv1\u002Fusers\",\n  \"response_status\": 200,\n  \"ip_intel\": {\n    \"country\": \"US\",\n    \"region\": \"CA\",\n    \"asn\": 16509,\n    \"network_type\": \"datacenter\",\n    \"is_vpn\": false,\n    \"is_proxy\": false,\n    \"is_datacenter\": true,\n    \"is_mobile\": null,\n    \"is_tor\": false,\n    \"risk_score\": 10\n  },\n  \"firewall\": {\n    \"matched\": false,\n    \"rule_id\": null,\n    \"action\": null\n  },\n  \"rate_limit\": {\n    \"matched\": false,\n    \"rule_id\": null,\n    \"blocked\": false,\n    \"remaining\": null\n  },\n  \"cache\": {\n    \"rule_id\": null,\n    \"status\": \"NONE\",\n    \"key_hash\": null\n  },\n  \"load_balancer\": {\n    \"lb_id\": \"default\",\n    \"algorithm\": \"RoundRobin\",\n    \"target_id\": \"backend-1\",\n    \"target\": \"10.0.0.1\"\n  },\n  \"termination_phase\": null,\n  \"timings_us\": {\n    \"ip_intel_us\": 42,\n    \"firewall_us\": 3,\n    \"rate_limit_us\": 0,\n    \"cache_lookup_us\": null,\n    \"load_balancer_us\": 7,\n    \"upstream_connect_us\": null,\n    \"upstream_ttfb_us\": null,\n    \"total_us\": 1091\n  }\n}\n",[175,2305,2306,2310,2330,2350,2370,2389,2407,2426,2447,2467,2487,2508,2525,2540,2563,2584,2601,2622,2637,2651,2666,2681,2695,2710,2716,2730,2744,2757,2772,2777,2791,2804,2817,2830,2844,2849,2863,2876,2895,2909,2914,2928,2949,2970,2991,3010,3015,3029,3043,3060,3077,3094,3108,3125,3139,3153,3168,3174],{"__ignoreMap":852},[856,2307,2308],{"class":858,"line":859},[856,2309,1396],{"class":862},[856,2311,2312,2314,2317,2319,2321,2323,2326,2328],{"class":858,"line":908},[856,2313,1401],{"class":862},[856,2315,2316],{"class":869},"timestamp",[856,2318,872],{"class":862},[856,2320,875],{"class":862},[856,2322,866],{"class":862},[856,2324,2325],{"class":880},"2026-10-05T17:48:56.973054084+00:00",[856,2327,872],{"class":862},[856,2329,1418],{"class":862},[856,2331,2332,2334,2337,2339,2341,2343,2346,2348],{"class":858,"line":965},[856,2333,1401],{"class":862},[856,2335,2336],{"class":869},"gateway_id",[856,2338,872],{"class":862},[856,2340,875],{"class":862},[856,2342,866],{"class":862},[856,2344,2345],{"class":880},"gw-prod-01",[856,2347,872],{"class":862},[856,2349,1418],{"class":862},[856,2351,2352,2354,2357,2359,2361,2363,2366,2368],{"class":858,"line":1018},[856,2353,1401],{"class":862},[856,2355,2356],{"class":869},"request_id",[856,2358,872],{"class":862},[856,2360,875],{"class":862},[856,2362,866],{"class":862},[856,2364,2365],{"class":880},"c30dc8f2-7e2d-474b-979f-23ec1eb2e244",[856,2367,872],{"class":862},[856,2369,1418],{"class":862},[856,2371,2372,2374,2376,2378,2380,2382,2385,2387],{"class":858,"line":1455},[856,2373,1401],{"class":862},[856,2375,182],{"class":869},[856,2377,872],{"class":862},[856,2379,875],{"class":862},[856,2381,866],{"class":862},[856,2383,2384],{"class":880},"203.0.113.50",[856,2386,872],{"class":862},[856,2388,1418],{"class":862},[856,2390,2391,2393,2395,2397,2399,2401,2403,2405],{"class":858,"line":1559},[856,2392,1401],{"class":862},[856,2394,253],{"class":869},[856,2396,872],{"class":862},[856,2398,875],{"class":862},[856,2400,866],{"class":862},[856,2402,2384],{"class":880},[856,2404,872],{"class":862},[856,2406,1418],{"class":862},[856,2408,2409,2411,2414,2416,2418,2420,2422,2424],{"class":858,"line":1574},[856,2410,1401],{"class":862},[856,2412,2413],{"class":869},"client_ip_source",[856,2415,872],{"class":862},[856,2417,875],{"class":862},[856,2419,866],{"class":862},[856,2421,177],{"class":880},[856,2423,872],{"class":862},[856,2425,1418],{"class":862},[856,2427,2429,2431,2434,2436,2438,2440,2443,2445],{"class":858,"line":2428},8,[856,2430,1401],{"class":862},[856,2432,2433],{"class":869},"method",[856,2435,872],{"class":862},[856,2437,875],{"class":862},[856,2439,866],{"class":862},[856,2441,2442],{"class":880},"GET",[856,2444,872],{"class":862},[856,2446,1418],{"class":862},[856,2448,2450,2452,2455,2457,2459,2461,2463,2465],{"class":858,"line":2449},9,[856,2451,1401],{"class":862},[856,2453,2454],{"class":869},"scheme",[856,2456,872],{"class":862},[856,2458,875],{"class":862},[856,2460,866],{"class":862},[856,2462,201],{"class":880},[856,2464,872],{"class":862},[856,2466,1418],{"class":862},[856,2468,2470,2472,2474,2476,2478,2480,2483,2485],{"class":858,"line":2469},10,[856,2471,1401],{"class":862},[856,2473,216],{"class":869},[856,2475,872],{"class":862},[856,2477,875],{"class":862},[856,2479,866],{"class":862},[856,2481,2482],{"class":880},"api.example.com",[856,2484,872],{"class":862},[856,2486,1418],{"class":862},[856,2488,2490,2492,2495,2497,2499,2501,2504,2506],{"class":858,"line":2489},11,[856,2491,1401],{"class":862},[856,2493,2494],{"class":869},"path",[856,2496,872],{"class":862},[856,2498,875],{"class":862},[856,2500,866],{"class":862},[856,2502,2503],{"class":880},"\u002Fapi\u002Fv1\u002Fusers",[856,2505,872],{"class":862},[856,2507,1418],{"class":862},[856,2509,2511,2513,2516,2518,2520,2523],{"class":858,"line":2510},12,[856,2512,1401],{"class":862},[856,2514,2515],{"class":869},"response_status",[856,2517,872],{"class":862},[856,2519,875],{"class":862},[856,2521,2522],{"class":1012}," 200",[856,2524,1418],{"class":862},[856,2526,2528,2530,2533,2535,2537],{"class":858,"line":2527},13,[856,2529,1401],{"class":862},[856,2531,2532],{"class":869},"ip_intel",[856,2534,872],{"class":862},[856,2536,875],{"class":862},[856,2538,2539],{"class":862}," {\n",[856,2541,2543,2546,2550,2552,2554,2556,2559,2561],{"class":858,"line":2542},14,[856,2544,2545],{"class":862},"    \"",[856,2547,2549],{"class":2548},"sBMFI","country",[856,2551,872],{"class":862},[856,2553,875],{"class":862},[856,2555,866],{"class":862},[856,2557,2558],{"class":880},"US",[856,2560,872],{"class":862},[856,2562,1418],{"class":862},[856,2564,2566,2568,2571,2573,2575,2577,2580,2582],{"class":858,"line":2565},15,[856,2567,2545],{"class":862},[856,2569,2570],{"class":2548},"region",[856,2572,872],{"class":862},[856,2574,875],{"class":862},[856,2576,866],{"class":862},[856,2578,2579],{"class":880},"CA",[856,2581,872],{"class":862},[856,2583,1418],{"class":862},[856,2585,2587,2589,2592,2594,2596,2599],{"class":858,"line":2586},16,[856,2588,2545],{"class":862},[856,2590,2591],{"class":2548},"asn",[856,2593,872],{"class":862},[856,2595,875],{"class":862},[856,2597,2598],{"class":1012}," 16509",[856,2600,1418],{"class":862},[856,2602,2604,2606,2609,2611,2613,2615,2618,2620],{"class":858,"line":2603},17,[856,2605,2545],{"class":862},[856,2607,2608],{"class":2548},"network_type",[856,2610,872],{"class":862},[856,2612,875],{"class":862},[856,2614,866],{"class":862},[856,2616,2617],{"class":880},"datacenter",[856,2619,872],{"class":862},[856,2621,1418],{"class":862},[856,2623,2625,2627,2630,2632,2634],{"class":858,"line":2624},18,[856,2626,2545],{"class":862},[856,2628,2629],{"class":2548},"is_vpn",[856,2631,872],{"class":862},[856,2633,875],{"class":862},[856,2635,2636],{"class":862}," false,\n",[856,2638,2640,2642,2645,2647,2649],{"class":858,"line":2639},19,[856,2641,2545],{"class":862},[856,2643,2644],{"class":2548},"is_proxy",[856,2646,872],{"class":862},[856,2648,875],{"class":862},[856,2650,2636],{"class":862},[856,2652,2654,2656,2659,2661,2663],{"class":858,"line":2653},20,[856,2655,2545],{"class":862},[856,2657,2658],{"class":2548},"is_datacenter",[856,2660,872],{"class":862},[856,2662,875],{"class":862},[856,2664,2665],{"class":862}," true,\n",[856,2667,2669,2671,2674,2676,2678],{"class":858,"line":2668},21,[856,2670,2545],{"class":862},[856,2672,2673],{"class":2548},"is_mobile",[856,2675,872],{"class":862},[856,2677,875],{"class":862},[856,2679,2680],{"class":862}," null,\n",[856,2682,2684,2686,2689,2691,2693],{"class":858,"line":2683},22,[856,2685,2545],{"class":862},[856,2687,2688],{"class":2548},"is_tor",[856,2690,872],{"class":862},[856,2692,875],{"class":862},[856,2694,2636],{"class":862},[856,2696,2698,2700,2703,2705,2707],{"class":858,"line":2697},23,[856,2699,2545],{"class":862},[856,2701,2702],{"class":2548},"risk_score",[856,2704,872],{"class":862},[856,2706,875],{"class":862},[856,2708,2709],{"class":1012}," 10\n",[856,2711,2713],{"class":858,"line":2712},24,[856,2714,2715],{"class":862},"  },\n",[856,2717,2719,2721,2724,2726,2728],{"class":858,"line":2718},25,[856,2720,1401],{"class":862},[856,2722,2723],{"class":869},"firewall",[856,2725,872],{"class":862},[856,2727,875],{"class":862},[856,2729,2539],{"class":862},[856,2731,2733,2735,2738,2740,2742],{"class":858,"line":2732},26,[856,2734,2545],{"class":862},[856,2736,2737],{"class":2548},"matched",[856,2739,872],{"class":862},[856,2741,875],{"class":862},[856,2743,2636],{"class":862},[856,2745,2747,2749,2751,2753,2755],{"class":858,"line":2746},27,[856,2748,2545],{"class":862},[856,2750,1440],{"class":2548},[856,2752,872],{"class":862},[856,2754,875],{"class":862},[856,2756,2680],{"class":862},[856,2758,2760,2762,2765,2767,2769],{"class":858,"line":2759},28,[856,2761,2545],{"class":862},[856,2763,2764],{"class":2548},"action",[856,2766,872],{"class":862},[856,2768,875],{"class":862},[856,2770,2771],{"class":862}," null\n",[856,2773,2775],{"class":858,"line":2774},29,[856,2776,2715],{"class":862},[856,2778,2780,2782,2785,2787,2789],{"class":858,"line":2779},30,[856,2781,1401],{"class":862},[856,2783,2784],{"class":869},"rate_limit",[856,2786,872],{"class":862},[856,2788,875],{"class":862},[856,2790,2539],{"class":862},[856,2792,2794,2796,2798,2800,2802],{"class":858,"line":2793},31,[856,2795,2545],{"class":862},[856,2797,2737],{"class":2548},[856,2799,872],{"class":862},[856,2801,875],{"class":862},[856,2803,2636],{"class":862},[856,2805,2807,2809,2811,2813,2815],{"class":858,"line":2806},32,[856,2808,2545],{"class":862},[856,2810,1440],{"class":2548},[856,2812,872],{"class":862},[856,2814,875],{"class":862},[856,2816,2680],{"class":862},[856,2818,2820,2822,2824,2826,2828],{"class":858,"line":2819},33,[856,2821,2545],{"class":862},[856,2823,1413],{"class":2548},[856,2825,872],{"class":862},[856,2827,875],{"class":862},[856,2829,2636],{"class":862},[856,2831,2833,2835,2838,2840,2842],{"class":858,"line":2832},34,[856,2834,2545],{"class":862},[856,2836,2837],{"class":2548},"remaining",[856,2839,872],{"class":862},[856,2841,875],{"class":862},[856,2843,2771],{"class":862},[856,2845,2847],{"class":858,"line":2846},35,[856,2848,2715],{"class":862},[856,2850,2852,2854,2857,2859,2861],{"class":858,"line":2851},36,[856,2853,1401],{"class":862},[856,2855,2856],{"class":869},"cache",[856,2858,872],{"class":862},[856,2860,875],{"class":862},[856,2862,2539],{"class":862},[856,2864,2866,2868,2870,2872,2874],{"class":858,"line":2865},37,[856,2867,2545],{"class":862},[856,2869,1440],{"class":2548},[856,2871,872],{"class":862},[856,2873,875],{"class":862},[856,2875,2680],{"class":862},[856,2877,2879,2881,2883,2885,2887,2889,2891,2893],{"class":858,"line":2878},38,[856,2880,2545],{"class":862},[856,2882,1321],{"class":2548},[856,2884,872],{"class":862},[856,2886,875],{"class":862},[856,2888,866],{"class":862},[856,2890,1848],{"class":880},[856,2892,872],{"class":862},[856,2894,1418],{"class":862},[856,2896,2898,2900,2903,2905,2907],{"class":858,"line":2897},39,[856,2899,2545],{"class":862},[856,2901,2902],{"class":2548},"key_hash",[856,2904,872],{"class":862},[856,2906,875],{"class":862},[856,2908,2771],{"class":862},[856,2910,2912],{"class":858,"line":2911},40,[856,2913,2715],{"class":862},[856,2915,2917,2919,2922,2924,2926],{"class":858,"line":2916},41,[856,2918,1401],{"class":862},[856,2920,2921],{"class":869},"load_balancer",[856,2923,872],{"class":862},[856,2925,875],{"class":862},[856,2927,2539],{"class":862},[856,2929,2931,2933,2936,2938,2940,2942,2945,2947],{"class":858,"line":2930},42,[856,2932,2545],{"class":862},[856,2934,2935],{"class":2548},"lb_id",[856,2937,872],{"class":862},[856,2939,875],{"class":862},[856,2941,866],{"class":862},[856,2943,2944],{"class":880},"default",[856,2946,872],{"class":862},[856,2948,1418],{"class":862},[856,2950,2952,2954,2957,2959,2961,2963,2966,2968],{"class":858,"line":2951},43,[856,2953,2545],{"class":862},[856,2955,2956],{"class":2548},"algorithm",[856,2958,872],{"class":862},[856,2960,875],{"class":862},[856,2962,866],{"class":862},[856,2964,2965],{"class":880},"RoundRobin",[856,2967,872],{"class":862},[856,2969,1418],{"class":862},[856,2971,2973,2975,2978,2980,2982,2984,2987,2989],{"class":858,"line":2972},44,[856,2974,2545],{"class":862},[856,2976,2977],{"class":2548},"target_id",[856,2979,872],{"class":862},[856,2981,875],{"class":862},[856,2983,866],{"class":862},[856,2985,2986],{"class":880},"backend-1",[856,2988,872],{"class":862},[856,2990,1418],{"class":862},[856,2992,2994,2996,2999,3001,3003,3005,3008],{"class":858,"line":2993},45,[856,2995,2545],{"class":862},[856,2997,2998],{"class":2548},"target",[856,3000,872],{"class":862},[856,3002,875],{"class":862},[856,3004,866],{"class":862},[856,3006,3007],{"class":880},"10.0.0.1",[856,3009,1452],{"class":862},[856,3011,3013],{"class":858,"line":3012},46,[856,3014,2715],{"class":862},[856,3016,3018,3020,3023,3025,3027],{"class":858,"line":3017},47,[856,3019,1401],{"class":862},[856,3021,3022],{"class":869},"termination_phase",[856,3024,872],{"class":862},[856,3026,875],{"class":862},[856,3028,2680],{"class":862},[856,3030,3032,3034,3037,3039,3041],{"class":858,"line":3031},48,[856,3033,1401],{"class":862},[856,3035,3036],{"class":869},"timings_us",[856,3038,872],{"class":862},[856,3040,875],{"class":862},[856,3042,2539],{"class":862},[856,3044,3046,3048,3051,3053,3055,3058],{"class":858,"line":3045},49,[856,3047,2545],{"class":862},[856,3049,3050],{"class":2548},"ip_intel_us",[856,3052,872],{"class":862},[856,3054,875],{"class":862},[856,3056,3057],{"class":1012}," 42",[856,3059,1418],{"class":862},[856,3061,3063,3065,3068,3070,3072,3075],{"class":858,"line":3062},50,[856,3064,2545],{"class":862},[856,3066,3067],{"class":2548},"firewall_us",[856,3069,872],{"class":862},[856,3071,875],{"class":862},[856,3073,3074],{"class":1012}," 3",[856,3076,1418],{"class":862},[856,3078,3080,3082,3085,3087,3089,3092],{"class":858,"line":3079},51,[856,3081,2545],{"class":862},[856,3083,3084],{"class":2548},"rate_limit_us",[856,3086,872],{"class":862},[856,3088,875],{"class":862},[856,3090,3091],{"class":1012}," 0",[856,3093,1418],{"class":862},[856,3095,3097,3099,3102,3104,3106],{"class":858,"line":3096},52,[856,3098,2545],{"class":862},[856,3100,3101],{"class":2548},"cache_lookup_us",[856,3103,872],{"class":862},[856,3105,875],{"class":862},[856,3107,2680],{"class":862},[856,3109,3111,3113,3116,3118,3120,3123],{"class":858,"line":3110},53,[856,3112,2545],{"class":862},[856,3114,3115],{"class":2548},"load_balancer_us",[856,3117,872],{"class":862},[856,3119,875],{"class":862},[856,3121,3122],{"class":1012}," 7",[856,3124,1418],{"class":862},[856,3126,3128,3130,3133,3135,3137],{"class":858,"line":3127},54,[856,3129,2545],{"class":862},[856,3131,3132],{"class":2548},"upstream_connect_us",[856,3134,872],{"class":862},[856,3136,875],{"class":862},[856,3138,2680],{"class":862},[856,3140,3142,3144,3147,3149,3151],{"class":858,"line":3141},55,[856,3143,2545],{"class":862},[856,3145,3146],{"class":2548},"upstream_ttfb_us",[856,3148,872],{"class":862},[856,3150,875],{"class":862},[856,3152,2680],{"class":862},[856,3154,3156,3158,3161,3163,3165],{"class":858,"line":3155},56,[856,3157,2545],{"class":862},[856,3159,3160],{"class":2548},"total_us",[856,3162,872],{"class":862},[856,3164,875],{"class":862},[856,3166,3167],{"class":1012}," 1091\n",[856,3169,3171],{"class":858,"line":3170},57,[856,3172,3173],{"class":862},"  }\n",[856,3175,3177],{"class":858,"line":3176},58,[856,3178,1458],{"class":862},[136,3180,3182],{"id":3181},"environment-variables","Environment variables",[148,3184,3185,3197],{},[151,3186,3187],{},[154,3188,3189,3192,3195],{},[157,3190,3191],{},"Variable",[157,3193,3194],{},"Default",[157,3196,165],{},[167,3198,3199,3225],{},[154,3200,3201,3206,3211],{},[172,3202,3203],{},[175,3204,3205],{},"RUST_LOG",[172,3207,3208],{},[175,3209,3210],{},"info",[172,3212,3213,3214,3217,3218,3217,3220,3217,3223,270],{},"Log level (",[175,3215,3216],{},"debug",", ",[175,3219,3210],{},[175,3221,3222],{},"warn",[175,3224,1404],{},[154,3226,3227,3232,3237],{},[172,3228,3229],{},[175,3230,3231],{},"QUAYEL_IP_INTEL_CACHE_SIZE",[172,3233,3234],{},[175,3235,3236],{},"65536",[172,3238,3239],{},"LRU cache size for IP lookups",[3241,3242,3243],"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":852,"searchDepth":908,"depth":908,"links":3245},[3246,3250,3255,3256,3260,3264,3269,3273,3276,3279,3280],{"id":138,"depth":908,"text":115,"children":3247},[3248,3249],{"id":145,"depth":965,"text":146},{"id":222,"depth":965,"text":223},{"id":291,"depth":908,"text":121,"children":3251},[3252,3253,3254],{"id":301,"depth":965,"text":302},{"id":465,"depth":965,"text":466},{"id":738,"depth":965,"text":739},{"id":1056,"depth":908,"text":1057},{"id":1289,"depth":908,"text":1290,"children":3257},[3258,3259],{"id":1385,"depth":965,"text":1386},{"id":1461,"depth":965,"text":1462},{"id":1473,"depth":908,"text":1474,"children":3261},[3262,3263],{"id":1477,"depth":965,"text":1478},{"id":1618,"depth":965,"text":1619},{"id":1664,"depth":908,"text":1665,"children":3265},[3266,3267,3268],{"id":1668,"depth":965,"text":1669},{"id":1708,"depth":965,"text":1709},{"id":1759,"depth":965,"text":1760},{"id":1821,"depth":908,"text":1822,"children":3270},[3271,3272],{"id":1872,"depth":965,"text":1873},{"id":1960,"depth":965,"text":1961},{"id":2008,"depth":908,"text":127,"children":3274},[3275],{"id":2018,"depth":965,"text":2019},{"id":2204,"depth":908,"text":2205,"children":3277},[3278],{"id":2217,"depth":965,"text":2218},{"id":2287,"depth":908,"text":2288},{"id":3181,"depth":908,"text":3182},"Upstream headers, condition paths, operators, response bodies, and backend integration.","md",null,{},"\u002Fquayel-gateway\u002Fapi-reference",{"title":93,"description":3281},"quayel-gateway\u002F09.api-reference","oKNm7lULWYk16fV3wUsyYAzZkE53ceilriG7raWcqpE",[3283,3283],1791649769641]