IP Intelligence Middleware for the FP-Devicer Intelligence Suite. Developed by Gateway Corporate Solutions.
ip-devicer enriches every DeviceManager.identify() call with production IP
signals: MaxMind geolocation, ASN metadata, proxy/VPN/Tor/hosting detection,
AI-agent detection, reputation scoring, impossible-travel alerts, and device IP
history consistency.
| Step | Description |
|---|---|
| IP extraction | Resolves the best client IP from trusted headers (CF-Connecting-IP, True-Client-IP, X-Real-IP, X-Forwarded-For) or the explicit ip context field. |
| Geo + ASN enrichment | Loads MaxMind city and ASN data for country, city, subdivision, coordinates, timezone, ASN, and organization. |
| Network classification | Flags proxy, VPN, Tor, and hosting-provider ranges using bundled or configured intelligence lists. |
| AI-agent tagging | Identifies known AI-agent traffic and attaches provider metadata when matched. |
| Reputation scoring | Computes a risk score from network and behavioral factors. |
| History consistency | Compares the current IP and location against device history to detect drift and impossible travel. |
Install ip-devicer as a standalone package:
npm install ip-devicer
Install the bundled network-intelligence pair with FP-Devicer:
npm install devicer.js ip-devicer tls-devicer
Optional peer dependencies for persistent storage:
npm install better-sqlite3
npm install ioredis
npm install pg
Install the full Devicer Intelligence Suite meta-package:
npm install @gatewaycorporate/devicer-intel
import { createInMemoryAdapter, DeviceManager } from "devicer.js";
import { IpManager } from "ip-devicer";
const deviceManager = new DeviceManager(createInMemoryAdapter());
const ipManager = new IpManager({
licenseKey: process.env.DEVICER_LICENSE_KEY,
maxmindPath: "./data/GeoLite2-City.mmdb",
asnPath: "./data/GeoLite2-ASN.mmdb",
enableReputation: true,
});
deviceManager.use(ipManager);
app.post("/identify", async (req, res) => {
const result = await deviceManager.identify(req.body.fpPayload, {
ip: req.ip,
userId: req.user?.id,
headers: req.headers,
});
console.log("IP Enrichment Result:", {
deviceId: result.deviceId,
confidence: result.confidence,
ipRiskDelta: result.ipRiskDelta,
enrichment: result.ipEnrichment,
});
res.json(result);
});
Known AI-agent traffic from the conservative default catalog is attached to
ipEnrichment.agentInfo and included in the IpManager logging metadata.
| Adapter | Import | Use case |
|---|---|---|
| In-memory (default) | createIpStorage |
Dev / testing / single-process |
| SQLite | createSqliteIpStorage |
Single-process production |
| PostgreSQL | createPostgresIpStorage |
Multi-process / HA |
| Redis | createRedisIpStorage |
Distributed / low-latency |
import { createSqliteIpStorage, IpManager } from "ip-devicer";
const ipManager = new IpManager({
licenseKey: process.env.DEVICER_LICENSE_KEY,
maxmindPath: "./data/GeoLite2-City.mmdb",
asnPath: "./data/GeoLite2-ASN.mmdb",
storage: createSqliteIpStorage("./data/ip-history.db", 50),
});
To get full value from ip-devicer, configure MaxMind locally:
GeoLite2-City.mmdb and GeoLite2-ASN.mmdb../data/ or another secure path and add them to
.gitignore.If request headers include CF-Connecting-IP, True-Client-IP, or X-Real-IP,
ip-devicer prefers those values over a proxy-populated ip field. If those
headers are absent, it falls back to the explicit ip value and then the first
X-Forwarded-For address.
Reference deployments typically bundle ip-devicer and tls-devicer together
as the network-intelligence pair.
identify(payload, context)
│
├─ 'ip' post-processor (ip-devicer)
│ ├─ resolves client IP from headers/context
│ ├─ enriches geo / ASN / risk / AI-agent data
│ └─> result.ipEnrichment + result.ipRiskDelta
│
└─ 'tls' post-processor (tls-devicer, optional companion bundle)
└─> complementary JA4 / TLS consistency signals
{
ipEnrichment: {
country?: string;
countryName?: string;
city?: string;
subdivision?: string;
latitude?: number;
longitude?: number;
timezone?: string;
asn?: number;
asnOrg?: string;
isProxy: boolean;
isVpn: boolean;
isTor: boolean;
isHosting: boolean;
agentInfo?: {
isAiAgent: boolean;
aiAgentProvider?: string;
aiAgentConfidence?: number;
};
rdapInfo: {
asn?: number;
asnOrg?: string;
};
riskScore: number;
riskFactors: string[];
consistencyScore: number;
impossibleTravel: boolean;
};
ipRiskDelta?: number;
}
| Tier | Price | Devices | Capability |
|---|---|---|---|
| Free | $0 | 10,000 | Basic features only |
| Pro | $49 / mo | Unlimited | Single-server production |
| Enterprise | $299 / mo | Unlimited | Multi-server production |
Production use requires a paid license. You can obtain a dual-use key for
ip-devicer and tls-devicer through polar.sh
here.
This project uses TypeDoc and publishes documentation at gatewaycorporate.github.io/ip-devicer.
Business Source License 1.1 — see license.txt.