[{"data":1,"prerenderedAt":1897},["ShallowReactive",2],{"navigation_docs":3,"-quayel-gateway-plugins-ip-intel":91,"-quayel-gateway-plugins-ip-intel-surround":1892},[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":39,"body":93,"description":1885,"extension":1886,"links":1887,"meta":1888,"navigation":1889,"path":40,"seo":1890,"stem":41,"__hash__":1891},"docs\u002Fquayel-gateway\u002F02.plugins\u002F1.ip-intel.md",{"type":94,"value":95,"toc":1865},"minimark",[96,101,105,110,199,202,206,460,464,470,600,604,609,663,666,671,739,743,746,801,804,808,816,820,824,901,905,1012,1016,1079,1086,1090,1144,1148,1179,1183,1186,1296,1376,1456,1544,1548,1551,1667,1675,1679,1685,1861],[97,98,100],"h1",{"id":99},"ip-intelligence-plugin","IP Intelligence Plugin",[102,103,104],"p",{},"The IP Intelligence plugin enriches every request with geolocation, ASN, and threat detection data. All data is embedded in the binary — zero external dependencies.",[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    \"ip_intel\": {\n      \"enabled\": true\n    }\n  }\n}\n","json","",[118,119,120,129,148,164,181,187,193],"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","ip_intel",[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],{"class":123,"line":183},5,[121,185,186],{"class":127},"    }\n",[121,188,190],{"class":123,"line":189},6,[121,191,192],{"class":127},"  }\n",[121,194,196],{"class":123,"line":195},7,[121,197,198],{"class":127},"}\n",[102,200,201],{},"That's it. No URLs, no storage directories, no refresh intervals. Everything is baked in.",[106,203,205],{"id":204},"what-it-provides","What it provides",[207,208,209,228],"table",{},[210,211,212],"thead",{},[213,214,215,219,222,225],"tr",{},[216,217,218],"th",{},"Field",[216,220,221],{},"Type",[216,223,224],{},"Source",[216,226,227],{},"Description",[229,230,231,248,262,276,292,306,329,345,360,375,390,405,418,431,446],"tbody",{},[213,232,233,239,242,245],{},[234,235,236],"td",{},[118,237,238],{},"country",[234,240,241],{},"string",[234,243,244],{},"DB-IP City MMDB",[234,246,247],{},"ISO 3166-1 alpha-2 country code",[213,249,250,255,257,259],{},[234,251,252],{},[118,253,254],{},"region",[234,256,241],{},[234,258,244],{},[234,260,261],{},"Region\u002Fstate code",[213,263,264,269,271,273],{},[234,265,266],{},[118,267,268],{},"city",[234,270,241],{},[234,272,244],{},[234,274,275],{},"City name",[213,277,278,283,286,289],{},[234,279,280],{},[118,281,282],{},"asn",[234,284,285],{},"number",[234,287,288],{},"DB-IP ASN MMDB",[234,290,291],{},"Autonomous System Number",[213,293,294,299,301,303],{},[234,295,296],{},[118,297,298],{},"as_org",[234,300,241],{},[234,302,288],{},[234,304,305],{},"ASN organization name",[213,307,308,313,315,318],{},[234,309,310],{},[118,311,312],{},"provider",[234,314,241],{},[234,316,317],{},"Provider ASN registry",[234,319,320,321,324,325,328],{},"Hosting\u002Fcloud provider label (e.g. ",[118,322,323],{},"\"Hostinger\"",", ",[118,326,327],{},"\"Hetzner\"",")",[213,330,331,336,339,342],{},[234,332,333],{},[118,334,335],{},"is_vpn",[234,337,338],{},"bool",[234,340,341],{},"X4BNet VPN list",[234,343,344],{},"IP belongs to a known VPN provider",[213,346,347,352,354,357],{},[234,348,349],{},[118,350,351],{},"is_tor",[234,353,338],{},[234,355,356],{},"Tor Project",[234,358,359],{},"IP is a current Tor exit node",[213,361,362,367,369,372],{},[234,363,364],{},[118,365,366],{},"is_datacenter",[234,368,338],{},[234,370,371],{},"ASN-based",[234,373,374],{},"IP's ASN is a known datacenter\u002Fhosting provider",[213,376,377,382,384,387],{},[234,378,379],{},[118,380,381],{},"is_proxy",[234,383,338],{},[234,385,386],{},"FireHOL",[234,388,389],{},"IP is a known anonymous proxy",[213,391,392,397,399,402],{},[234,393,394],{},[118,395,396],{},"is_mobile",[234,398,338],{},[234,400,401],{},"—",[234,403,404],{},"Reserved (currently null)",[213,406,407,412,414,416],{},[234,408,409],{},[118,410,411],{},"is_residential",[234,413,338],{},[234,415,401],{},[234,417,404],{},[213,419,420,425,427,429],{},[234,421,422],{},[118,423,424],{},"is_residential_proxy",[234,426,338],{},[234,428,401],{},[234,430,404],{},[213,432,433,438,440,443],{},[234,434,435],{},[118,436,437],{},"network_type",[234,439,241],{},[234,441,442],{},"Computed",[234,444,445],{},"Network classification",[213,447,448,453,455,457],{},[234,449,450],{},[118,451,452],{},"risk_score",[234,454,285],{},[234,456,442],{},[234,458,459],{},"Risk score 0-100",[106,461,463],{"id":462},"network-type-classification","Network type classification",[102,465,466,467,469],{},"The ",[118,468,437],{}," field is determined by the first matching flag:",[207,471,472,486],{},[210,473,474],{},[213,475,476,479,482],{},[216,477,478],{},"Priority",[216,480,481],{},"Condition",[216,483,484],{},[118,485,437],{},[229,487,488,503,517,531,545,559,573,587],{},[213,489,490,493,498],{},[234,491,492],{},"1",[234,494,495,497],{},[118,496,351],{}," = true",[234,499,500],{},[118,501,502],{},"\"tor\"",[213,504,505,508,512],{},[234,506,507],{},"2",[234,509,510,497],{},[118,511,335],{},[234,513,514],{},[118,515,516],{},"\"vpn\"",[213,518,519,522,526],{},[234,520,521],{},"3",[234,523,524,497],{},[118,525,366],{},[234,527,528],{},[118,529,530],{},"\"datacenter\"",[213,532,533,536,540],{},[234,534,535],{},"4",[234,537,538,497],{},[118,539,424],{},[234,541,542],{},[118,543,544],{},"\"residential_proxy\"",[213,546,547,550,554],{},[234,548,549],{},"5",[234,551,552,497],{},[118,553,381],{},[234,555,556],{},[118,557,558],{},"\"proxy\"",[213,560,561,564,568],{},[234,562,563],{},"6",[234,565,566,497],{},[118,567,396],{},[234,569,570],{},[118,571,572],{},"\"mobile\"",[213,574,575,578,582],{},[234,576,577],{},"7",[234,579,580,497],{},[118,581,411],{},[234,583,584],{},[118,585,586],{},"\"residential\"",[213,588,589,592,595],{},[234,590,591],{},"8",[234,593,594],{},"None match",[234,596,597],{},[118,598,599],{},"null",[106,601,603],{"id":602},"risk-score","Risk score",[102,605,466,606,608],{},[118,607,452],{}," is a 0-100 integer calculated from threat flags:",[207,610,611,621],{},[210,612,613],{},[213,614,615,618],{},[216,616,617],{},"Factor",[216,619,620],{},"Score Added",[229,622,623,631,639,647,655],{},[213,624,625,628],{},[234,626,627],{},"Tor exit node",[234,629,630],{},"+40",[213,632,633,636],{},[234,634,635],{},"Residential proxy",[234,637,638],{},"+30",[213,640,641,644],{},[234,642,643],{},"VPN",[234,645,646],{},"+25",[213,648,649,652],{},[234,650,651],{},"Anonymous proxy",[234,653,654],{},"+20",[213,656,657,660],{},[234,658,659],{},"Datacenter\u002Fhosting",[234,661,662],{},"+10",[102,664,665],{},"Scores are capped at 100. A clean residential IP gets 0.",[667,668,670],"h3",{"id":669},"risk-score-thresholds","Risk score thresholds",[207,672,673,683],{},[210,674,675],{},[213,676,677,680],{},[216,678,679],{},"Range",[216,681,682],{},"Interpretation",[229,684,685,693,700,708,716,723,731],{},[213,686,687,690],{},[234,688,689],{},"0",[234,691,692],{},"Clean residential IP",[213,694,695,698],{},[234,696,697],{},"10",[234,699,659],{},[213,701,702,705],{},[234,703,704],{},"20-25",[234,706,707],{},"Proxy or VPN",[213,709,710,713],{},[234,711,712],{},"35",[234,714,715],{},"VPN + datacenter",[213,717,718,721],{},[234,719,720],{},"40",[234,722,627],{},[213,724,725,728],{},[234,726,727],{},"50+",[234,729,730],{},"Multiple threat indicators",[213,732,733,736],{},[234,734,735],{},"70+",[234,737,738],{},"High risk (Tor + VPN + proxy)",[106,740,742],{"id":741},"edge-detection","Edge detection",[102,744,745],{},"The plugin detects the request edge type based on the peer IP:",[207,747,748,760],{},[210,749,750],{},[213,751,752,755,758],{},[216,753,754],{},"Edge Type",[216,756,757],{},"Detection",[216,759,227],{},[229,761,762,775,788],{},[213,763,764,769,772],{},[234,765,766],{},[118,767,768],{},"Cloudflare",[234,770,771],{},"Peer IP in Cloudflare CIDR ranges",[234,773,774],{},"Request came via Cloudflare",[213,776,777,782,785],{},[234,778,779],{},[118,780,781],{},"Proxy",[234,783,784],{},"Peer IP is private (RFC 1918)",[234,786,787],{},"Behind a reverse proxy",[213,789,790,795,798],{},[234,791,792],{},[118,793,794],{},"Direct",[234,796,797],{},"Neither of above",[234,799,800],{},"Direct connection",[102,802,803],{},"This is used to determine which IP headers to trust.",[106,805,807],{"id":806},"how-it-works","How it works",[111,809,814],{"className":810,"code":812,"language":813},[811],"language-text","Request arrives\n    │\n    ▼\n1. Check LRU cache (65,536 entries)\n    │\n    ├── Cache HIT → return cached result (~1μs)\n    │\n    └── Cache MISS → full lookup:\n        │\n        ├── 2. MMDB city lookup → country, region, city\n        ├── 3. MMDB country fallback (if city missed)\n        ├── 4. MMDB ASN lookup → asn, as_org\n        ├── 5. ASN registry lookup: provider-asns.txt → is_datacenter, provider\n        │        (fallback: hosting-asns.txt → is_datacenter)\n        ├── 6. CIDR check: vpn.txt → is_vpn\n        ├── 7. CIDR check: tor.txt → is_tor\n        ├── 8. CIDR check: proxy.txt → is_proxy\n        ├── 9. Classify network_type\n        ├── 10. Calculate risk_score\n        │\n        └── Cache result (~5μs total)\n","text",[118,815,812],{"__ignoreMap":116},[106,817,819],{"id":818},"embedded-data-sources","Embedded data sources",[667,821,823],{"id":822},"mmdb-databases-maxmind-format","MMDB databases (MaxMind format)",[207,825,826,841],{},[210,827,828],{},[213,829,830,833,836,839],{},[216,831,832],{},"File",[216,834,835],{},"Size",[216,837,838],{},"Records",[216,840,224],{},[229,842,843,866,884],{},[213,844,845,850,853,856],{},[234,846,847],{},[118,848,849],{},"dbip-city-lite.mmdb",[234,851,852],{},"122 MB",[234,854,855],{},"~2.8M networks",[234,857,858,865],{},[859,860,864],"a",{"href":861,"rel":862},"https:\u002F\u002Fdb-ip.com",[863],"nofollow","DB-IP"," CC-BY 4.0",[213,867,868,873,876,879],{},[234,869,870],{},[118,871,872],{},"dbip-asn-lite.mmdb",[234,874,875],{},"9.2 MB",[234,877,878],{},"~1.1M networks",[234,880,881,865],{},[859,882,864],{"href":861,"rel":883},[863],[213,885,886,891,894,896],{},[234,887,888],{},[118,889,890],{},"dbip-country.mmdb",[234,892,893],{},"8.0 MB",[234,895,855],{},[234,897,898,865],{},[859,899,864],{"href":861,"rel":900},[863],[667,902,904],{"id":903},"cidr-lists","CIDR lists",[207,906,907,923],{},[210,908,909],{},[213,910,911,913,915,918,920],{},[216,912,832],{},[216,914,835],{},[216,916,917],{},"Entries",[216,919,224],{},[216,921,922],{},"Refresh",[229,924,925,948,970,991],{},[213,926,927,932,935,938,945],{},[234,928,929],{},[118,930,931],{},"vpn.txt",[234,933,934],{},"177 KB",[234,936,937],{},"11,271 CIDRs",[234,939,940],{},[859,941,944],{"href":942,"rel":943},"https:\u002F\u002Fgithub.com\u002FX4BNet\u002Flists_vpn",[863],"X4BNet",[234,946,947],{},"Daily",[213,949,950,955,958,961,967],{},[234,951,952],{},[118,953,954],{},"tor.txt",[234,956,957],{},"19 KB",[234,959,960],{},"1,358 IPs",[234,962,963],{},[859,964,356],{"href":965,"rel":966},"https:\u002F\u002Fcheck.torproject.org",[863],[234,968,969],{},"Hourly",[213,971,972,977,980,983,989],{},[234,973,974],{},[118,975,976],{},"cloudflare.txt",[234,978,979],{},"336 B",[234,981,982],{},"22 CIDRs",[234,984,985],{},[859,986,768],{"href":987,"rel":988},"https:\u002F\u002Fwww.cloudflare.com\u002Fips-v4",[863],[234,990,947],{},[213,992,993,998,1001,1003,1009],{},[234,994,995],{},[118,996,997],{},"proxy.txt",[234,999,1000],{},"0 B",[234,1002,689],{},[234,1004,1005],{},[859,1006,386],{"href":1007,"rel":1008},"https:\u002F\u002Fgithub.com\u002Ffirehol\u002Fblocklist-ipsets",[863],[234,1010,1011],{},"Weekly",[667,1013,1015],{"id":1014},"asn-lists-datacenter-hosting-detection","ASN lists (datacenter \u002F hosting detection)",[207,1017,1018,1032],{},[210,1019,1020],{},[213,1021,1022,1024,1026,1028,1030],{},[216,1023,832],{},[216,1025,835],{},[216,1027,917],{},[216,1029,224],{},[216,1031,922],{},[229,1033,1034,1057],{},[213,1035,1036,1041,1044,1047,1054],{},[234,1037,1038],{},[118,1039,1040],{},"provider-asns.txt",[234,1042,1043],{},"~1.5 KB",[234,1045,1046],{},"38 ASNs",[234,1048,1049,1050,1053],{},"Versioned registry (",[118,1051,1052],{},"ASN|Label",") — add one line per provider",[234,1055,1056],{},"Manual (one-line edit)",[213,1058,1059,1064,1067,1070,1077],{},[234,1060,1061],{},[118,1062,1063],{},"hosting-asns.txt",[234,1065,1066],{},"4.3 KB",[234,1068,1069],{},"ASNs",[234,1071,1072],{},[859,1073,1076],{"href":1074,"rel":1075},"https:\u002F\u002Fgithub.com\u002Fbrianhama\u002Fbad-asn-list",[863],"brianhama\u002Fbad-asn-list",[234,1078,1011],{},[102,1080,1081,1082,1085],{},"Datacenter detection is ",[1083,1084,371],"strong",{},": the ASN MMDB resolves the client IP to its ASN (already part of the ~5 μs lookup), and these lists classify the network. No datacenter IP ranges are embedded — the ASN identifies the provider regardless of which blocks it announces.",[106,1087,1089],{"id":1088},"performance","Performance",[207,1091,1092,1102],{},[210,1093,1094],{},[213,1095,1096,1099],{},[216,1097,1098],{},"Metric",[216,1100,1101],{},"Value",[229,1103,1104,1112,1120,1128,1136],{},[213,1105,1106,1109],{},[234,1107,1108],{},"Cache hit latency",[234,1110,1111],{},"~1 μs",[213,1113,1114,1117],{},[234,1115,1116],{},"Cache miss latency",[234,1118,1119],{},"~5 μs",[213,1121,1122,1125],{},[234,1123,1124],{},"Cache size",[234,1126,1127],{},"65,536 entries",[213,1129,1130,1133],{},[234,1131,1132],{},"Cache memory",[234,1134,1135],{},"~13 MB",[213,1137,1138,1141],{},[234,1139,1140],{},"Startup time",[234,1142,1143],{},"~200 ms",[106,1145,1147],{"id":1146},"environment-variables","Environment variables",[207,1149,1150,1162],{},[210,1151,1152],{},[213,1153,1154,1157,1160],{},[216,1155,1156],{},"Variable",[216,1158,1159],{},"Default",[216,1161,227],{},[229,1163,1164],{},[213,1165,1166,1171,1176],{},[234,1167,1168],{},[118,1169,1170],{},"QUAYEL_IP_INTEL_CACHE_SIZE",[234,1172,1173],{},[118,1174,1175],{},"65536",[234,1177,1178],{},"LRU cache size for IP lookups",[106,1180,1182],{"id":1181},"using-in-firewall-rules","Using in firewall rules",[102,1184,1185],{},"IP intel fields can be used in firewall conditions:",[111,1187,1189],{"className":113,"code":1188,"language":115,"meta":116,"style":116},"{\n  \"conditions\": [\n    { \"left\": \"ip.country\", \"operator\": \"in\", \"value\": [\"US\", \"CA\"] }\n  ]\n}\n",[118,1190,1191,1195,1209,1287,1292],{"__ignoreMap":116},[121,1192,1193],{"class":123,"line":124},[121,1194,128],{"class":127},[121,1196,1197,1199,1202,1204,1206],{"class":123,"line":131},[121,1198,134],{"class":127},[121,1200,1201],{"class":137},"conditions",[121,1203,141],{"class":127},[121,1205,144],{"class":127},[121,1207,1208],{"class":127}," [\n",[121,1210,1211,1214,1217,1220,1222,1224,1226,1230,1232,1235,1237,1240,1242,1244,1246,1249,1251,1253,1255,1258,1260,1262,1265,1267,1270,1272,1274,1276,1279,1281,1284],{"class":123,"line":150},[121,1212,1213],{"class":127},"    {",[121,1215,1216],{"class":127}," \"",[121,1218,1219],{"class":156},"left",[121,1221,141],{"class":127},[121,1223,144],{"class":127},[121,1225,1216],{"class":127},[121,1227,1229],{"class":1228},"sfazB","ip.country",[121,1231,141],{"class":127},[121,1233,1234],{"class":127},",",[121,1236,1216],{"class":127},[121,1238,1239],{"class":156},"operator",[121,1241,141],{"class":127},[121,1243,144],{"class":127},[121,1245,1216],{"class":127},[121,1247,1248],{"class":1228},"in",[121,1250,141],{"class":127},[121,1252,1234],{"class":127},[121,1254,1216],{"class":127},[121,1256,1257],{"class":156},"value",[121,1259,141],{"class":127},[121,1261,144],{"class":127},[121,1263,1264],{"class":127}," [",[121,1266,141],{"class":127},[121,1268,1269],{"class":1228},"US",[121,1271,141],{"class":127},[121,1273,1234],{"class":127},[121,1275,1216],{"class":127},[121,1277,1278],{"class":1228},"CA",[121,1280,141],{"class":127},[121,1282,1283],{"class":127},"]",[121,1285,1286],{"class":127}," }\n",[121,1288,1289],{"class":123,"line":166},[121,1290,1291],{"class":127},"  ]\n",[121,1293,1294],{"class":123,"line":183},[121,1295,198],{"class":127},[111,1297,1299],{"className":113,"code":1298,"language":115,"meta":116,"style":116},"{\n  \"conditions\": [\n    { \"left\": \"ip.is_tor\", \"operator\": \"equals\", \"value\": true }\n  ]\n}\n",[118,1300,1301,1305,1317,1368,1372],{"__ignoreMap":116},[121,1302,1303],{"class":123,"line":124},[121,1304,128],{"class":127},[121,1306,1307,1309,1311,1313,1315],{"class":123,"line":131},[121,1308,134],{"class":127},[121,1310,1201],{"class":137},[121,1312,141],{"class":127},[121,1314,144],{"class":127},[121,1316,1208],{"class":127},[121,1318,1319,1321,1323,1325,1327,1329,1331,1334,1336,1338,1340,1342,1344,1346,1348,1351,1353,1355,1357,1359,1361,1363,1366],{"class":123,"line":150},[121,1320,1213],{"class":127},[121,1322,1216],{"class":127},[121,1324,1219],{"class":156},[121,1326,141],{"class":127},[121,1328,144],{"class":127},[121,1330,1216],{"class":127},[121,1332,1333],{"class":1228},"ip.is_tor",[121,1335,141],{"class":127},[121,1337,1234],{"class":127},[121,1339,1216],{"class":127},[121,1341,1239],{"class":156},[121,1343,141],{"class":127},[121,1345,144],{"class":127},[121,1347,1216],{"class":127},[121,1349,1350],{"class":1228},"equals",[121,1352,141],{"class":127},[121,1354,1234],{"class":127},[121,1356,1216],{"class":127},[121,1358,1257],{"class":156},[121,1360,141],{"class":127},[121,1362,144],{"class":127},[121,1364,1365],{"class":127}," true",[121,1367,1286],{"class":127},[121,1369,1370],{"class":123,"line":166},[121,1371,1291],{"class":127},[121,1373,1374],{"class":123,"line":183},[121,1375,198],{"class":127},[111,1377,1379],{"className":113,"code":1378,"language":115,"meta":116,"style":116},"{\n  \"conditions\": [\n    { \"left\": \"ip.risk_score\", \"operator\": \"greater_than\", \"value\": 30 }\n  ]\n}\n",[118,1380,1381,1385,1397,1448,1452],{"__ignoreMap":116},[121,1382,1383],{"class":123,"line":124},[121,1384,128],{"class":127},[121,1386,1387,1389,1391,1393,1395],{"class":123,"line":131},[121,1388,134],{"class":127},[121,1390,1201],{"class":137},[121,1392,141],{"class":127},[121,1394,144],{"class":127},[121,1396,1208],{"class":127},[121,1398,1399,1401,1403,1405,1407,1409,1411,1414,1416,1418,1420,1422,1424,1426,1428,1431,1433,1435,1437,1439,1441,1443,1446],{"class":123,"line":150},[121,1400,1213],{"class":127},[121,1402,1216],{"class":127},[121,1404,1219],{"class":156},[121,1406,141],{"class":127},[121,1408,144],{"class":127},[121,1410,1216],{"class":127},[121,1412,1413],{"class":1228},"ip.risk_score",[121,1415,141],{"class":127},[121,1417,1234],{"class":127},[121,1419,1216],{"class":127},[121,1421,1239],{"class":156},[121,1423,141],{"class":127},[121,1425,144],{"class":127},[121,1427,1216],{"class":127},[121,1429,1430],{"class":1228},"greater_than",[121,1432,141],{"class":127},[121,1434,1234],{"class":127},[121,1436,1216],{"class":127},[121,1438,1257],{"class":156},[121,1440,141],{"class":127},[121,1442,144],{"class":127},[121,1444,1445],{"class":172}," 30",[121,1447,1286],{"class":127},[121,1449,1450],{"class":123,"line":166},[121,1451,1291],{"class":127},[121,1453,1454],{"class":123,"line":183},[121,1455,198],{"class":127},[111,1457,1459],{"className":113,"code":1458,"language":115,"meta":116,"style":116},"{\n  \"conditions\": [\n    { \"left\": \"ip.asn\", \"operator\": \"in\", \"value\": [13335, 16509] }\n  ]\n}\n",[118,1460,1461,1465,1477,1536,1540],{"__ignoreMap":116},[121,1462,1463],{"class":123,"line":124},[121,1464,128],{"class":127},[121,1466,1467,1469,1471,1473,1475],{"class":123,"line":131},[121,1468,134],{"class":127},[121,1470,1201],{"class":137},[121,1472,141],{"class":127},[121,1474,144],{"class":127},[121,1476,1208],{"class":127},[121,1478,1479,1481,1483,1485,1487,1489,1491,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1527,1529,1532,1534],{"class":123,"line":150},[121,1480,1213],{"class":127},[121,1482,1216],{"class":127},[121,1484,1219],{"class":156},[121,1486,141],{"class":127},[121,1488,144],{"class":127},[121,1490,1216],{"class":127},[121,1492,1493],{"class":1228},"ip.asn",[121,1495,141],{"class":127},[121,1497,1234],{"class":127},[121,1499,1216],{"class":127},[121,1501,1239],{"class":156},[121,1503,141],{"class":127},[121,1505,144],{"class":127},[121,1507,1216],{"class":127},[121,1509,1248],{"class":1228},[121,1511,141],{"class":127},[121,1513,1234],{"class":127},[121,1515,1216],{"class":127},[121,1517,1257],{"class":156},[121,1519,141],{"class":127},[121,1521,144],{"class":127},[121,1523,1264],{"class":127},[121,1525,1526],{"class":172},"13335",[121,1528,1234],{"class":127},[121,1530,1531],{"class":172}," 16509",[121,1533,1283],{"class":127},[121,1535,1286],{"class":127},[121,1537,1538],{"class":123,"line":166},[121,1539,1291],{"class":127},[121,1541,1542],{"class":123,"line":183},[121,1543,198],{"class":127},[106,1545,1547],{"id":1546},"updating-data","Updating data",[102,1549,1550],{},"To update the embedded data:",[111,1552,1556],{"className":1553,"code":1554,"language":1555,"meta":116,"style":116},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1. Copy fresh MMDB files\ncp \u002Fpath\u002Fto\u002Fdbip-city-lite-2026-01.mmdb src\u002Fdata\u002Fdbip-city-lite.mmdb\ncp \u002Fpath\u002Fto\u002Fdbip-asn-lite-2026-01.mmdb src\u002Fdata\u002Fdbip-asn-lite.mmdb\n\n# 2. Copy fresh CIDR lists\ncp \u002Fvar\u002Flib\u002Fquayel\u002Fip-intel\u002Flua\u002F*.txt src\u002Fdata\u002F\n\n# 3. Rebuild\ncargo build --release\nstrip target\u002Frelease\u002Fquayel-gateway\n\n# 4. Deploy\nsystemctl restart quayel-gateway\n","bash",[118,1557,1558,1564,1575,1585,1591,1596,1613,1617,1623,1635,1644,1649,1655],{"__ignoreMap":116},[121,1559,1560],{"class":123,"line":124},[121,1561,1563],{"class":1562},"sHwdD","# 1. Copy fresh MMDB files\n",[121,1565,1566,1569,1572],{"class":123,"line":131},[121,1567,1568],{"class":156},"cp",[121,1570,1571],{"class":1228}," \u002Fpath\u002Fto\u002Fdbip-city-lite-2026-01.mmdb",[121,1573,1574],{"class":1228}," src\u002Fdata\u002Fdbip-city-lite.mmdb\n",[121,1576,1577,1579,1582],{"class":123,"line":150},[121,1578,1568],{"class":156},[121,1580,1581],{"class":1228}," \u002Fpath\u002Fto\u002Fdbip-asn-lite-2026-01.mmdb",[121,1583,1584],{"class":1228}," src\u002Fdata\u002Fdbip-asn-lite.mmdb\n",[121,1586,1587],{"class":123,"line":166},[121,1588,1590],{"emptyLinePlaceholder":1589},true,"\n",[121,1592,1593],{"class":123,"line":183},[121,1594,1595],{"class":1562},"# 2. Copy fresh CIDR lists\n",[121,1597,1598,1600,1603,1607,1610],{"class":123,"line":189},[121,1599,1568],{"class":156},[121,1601,1602],{"class":1228}," \u002Fvar\u002Flib\u002Fquayel\u002Fip-intel\u002Flua\u002F",[121,1604,1606],{"class":1605},"sTEyZ","*",[121,1608,1609],{"class":1228},".txt",[121,1611,1612],{"class":1228}," src\u002Fdata\u002F\n",[121,1614,1615],{"class":123,"line":195},[121,1616,1590],{"emptyLinePlaceholder":1589},[121,1618,1620],{"class":123,"line":1619},8,[121,1621,1622],{"class":1562},"# 3. Rebuild\n",[121,1624,1626,1629,1632],{"class":123,"line":1625},9,[121,1627,1628],{"class":156},"cargo",[121,1630,1631],{"class":1228}," build",[121,1633,1634],{"class":1228}," --release\n",[121,1636,1638,1641],{"class":123,"line":1637},10,[121,1639,1640],{"class":156},"strip",[121,1642,1643],{"class":1228}," target\u002Frelease\u002Fquayel-gateway\n",[121,1645,1647],{"class":123,"line":1646},11,[121,1648,1590],{"emptyLinePlaceholder":1589},[121,1650,1652],{"class":123,"line":1651},12,[121,1653,1654],{"class":1562},"# 4. Deploy\n",[121,1656,1658,1661,1664],{"class":123,"line":1657},13,[121,1659,1660],{"class":156},"systemctl",[121,1662,1663],{"class":1228}," restart",[121,1665,1666],{"class":1228}," quayel-gateway\n",[102,1668,1669,1670,1674],{},"See ",[859,1671,1673],{"href":1672},"\u002Fquayel-gateway\u002Fdata-sources#updating-embedded-data","Data Sources — Updating Embedded Data"," for the full update procedure with source URLs.",[106,1676,1678],{"id":1677},"log-output","Log output",[102,1680,1681,1682,1684],{},"Every request produces an ",[118,1683,157],{}," section in the JSONL log:",[111,1686,1688],{"className":113,"code":1687,"language":115,"meta":116,"style":116},"{\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}\n",[118,1689,1690,1694,1706,1725,1743,1757,1776,1789,1801,1814,1827,1839,1852,1856],{"__ignoreMap":116},[121,1691,1692],{"class":123,"line":124},[121,1693,128],{"class":127},[121,1695,1696,1698,1700,1702,1704],{"class":123,"line":131},[121,1697,134],{"class":127},[121,1699,157],{"class":137},[121,1701,141],{"class":127},[121,1703,144],{"class":127},[121,1705,147],{"class":127},[121,1707,1708,1710,1712,1714,1716,1718,1720,1722],{"class":123,"line":150},[121,1709,153],{"class":127},[121,1711,238],{"class":156},[121,1713,141],{"class":127},[121,1715,144],{"class":127},[121,1717,1216],{"class":127},[121,1719,1269],{"class":1228},[121,1721,141],{"class":127},[121,1723,1724],{"class":127},",\n",[121,1726,1727,1729,1731,1733,1735,1737,1739,1741],{"class":123,"line":166},[121,1728,153],{"class":127},[121,1730,254],{"class":156},[121,1732,141],{"class":127},[121,1734,144],{"class":127},[121,1736,1216],{"class":127},[121,1738,1278],{"class":1228},[121,1740,141],{"class":127},[121,1742,1724],{"class":127},[121,1744,1745,1747,1749,1751,1753,1755],{"class":123,"line":183},[121,1746,153],{"class":127},[121,1748,282],{"class":156},[121,1750,141],{"class":127},[121,1752,144],{"class":127},[121,1754,1531],{"class":172},[121,1756,1724],{"class":127},[121,1758,1759,1761,1763,1765,1767,1769,1772,1774],{"class":123,"line":189},[121,1760,153],{"class":127},[121,1762,437],{"class":156},[121,1764,141],{"class":127},[121,1766,144],{"class":127},[121,1768,1216],{"class":127},[121,1770,1771],{"class":1228},"datacenter",[121,1773,141],{"class":127},[121,1775,1724],{"class":127},[121,1777,1778,1780,1782,1784,1786],{"class":123,"line":195},[121,1779,153],{"class":127},[121,1781,335],{"class":156},[121,1783,141],{"class":127},[121,1785,144],{"class":127},[121,1787,1788],{"class":127}," false,\n",[121,1790,1791,1793,1795,1797,1799],{"class":123,"line":1619},[121,1792,153],{"class":127},[121,1794,381],{"class":156},[121,1796,141],{"class":127},[121,1798,144],{"class":127},[121,1800,1788],{"class":127},[121,1802,1803,1805,1807,1809,1811],{"class":123,"line":1625},[121,1804,153],{"class":127},[121,1806,366],{"class":156},[121,1808,141],{"class":127},[121,1810,144],{"class":127},[121,1812,1813],{"class":127}," true,\n",[121,1815,1816,1818,1820,1822,1824],{"class":123,"line":1637},[121,1817,153],{"class":127},[121,1819,396],{"class":156},[121,1821,141],{"class":127},[121,1823,144],{"class":127},[121,1825,1826],{"class":127}," null,\n",[121,1828,1829,1831,1833,1835,1837],{"class":123,"line":1646},[121,1830,153],{"class":127},[121,1832,351],{"class":156},[121,1834,141],{"class":127},[121,1836,144],{"class":127},[121,1838,1788],{"class":127},[121,1840,1841,1843,1845,1847,1849],{"class":123,"line":1651},[121,1842,153],{"class":127},[121,1844,452],{"class":156},[121,1846,141],{"class":127},[121,1848,144],{"class":127},[121,1850,1851],{"class":172}," 10\n",[121,1853,1854],{"class":123,"line":1657},[121,1855,192],{"class":127},[121,1857,1859],{"class":123,"line":1858},14,[121,1860,198],{"class":127},[1862,1863,1864],"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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":116,"searchDepth":131,"depth":131,"links":1866},[1867,1868,1869,1870,1873,1874,1875,1880,1881,1882,1883,1884],{"id":108,"depth":131,"text":109},{"id":204,"depth":131,"text":205},{"id":462,"depth":131,"text":463},{"id":602,"depth":131,"text":603,"children":1871},[1872],{"id":669,"depth":150,"text":670},{"id":741,"depth":131,"text":742},{"id":806,"depth":131,"text":807},{"id":818,"depth":131,"text":819,"children":1876},[1877,1878,1879],{"id":822,"depth":150,"text":823},{"id":903,"depth":150,"text":904},{"id":1014,"depth":150,"text":1015},{"id":1088,"depth":131,"text":1089},{"id":1146,"depth":131,"text":1147},{"id":1181,"depth":131,"text":1182},{"id":1546,"depth":131,"text":1547},{"id":1677,"depth":131,"text":1678},"Geolocation, ASN, and threat detection enrichment for every request — all data embedded in the binary.","md",null,{},{"icon":42},{"title":39,"description":1885},"GAUFrm2weXB4l3NTE5jqzyOH05yARGXXLrN4uaFMztc",[1893,1895],{"title":36,"path":32,"stem":33,"description":1894,"icon":37,"children":-1},"The plugin pipeline: IP intelligence, firewall, rate limiting, cache, load balancing, auto-SSL, and logging.",{"title":44,"path":45,"stem":46,"description":1896,"icon":47,"children":-1},"Allow, block, redirect, or modify requests with ordered rules evaluated against any request attribute.",1791649767383]