The IPScope REST API (@ipscope/api) is a low-latency NestJS + Fastify service served over HTTPS (HTTP/2 and HTTP/3) from https://api.ipscope.io. Lookups resolve in sub-millisecond memory against an atomic Radix/LPM routing snapshot, with automatic live BGP, RIPEstat, and RDAP #geofeed enrichment on cache misses.
# Quick request & response explorer
Select your preferred language tab below (curl, Python, Node.js, Go, Rust, Java, .NET, Ruby, PHP). Your selection is automatically remembered across every page in the documentation.
curl -sS "https://api.ipscope.io/v1/ip/198.51.100.7" \
-H "Authorization: Bearer $IPSCOPE_KEY"Resolved IPv4/IPv6 intelligence record projected to your key’s licensedFamilies.
{
"ip": "198.51.100.7",
"ip_version": 4,
"matched_network": "198.51.100.0/24",
"geo": {
"country_code": "US",
"declared_country_code": "US",
"physical_country_code": "US",
"is_virtual_location": false,
"location_type": "physical",
"confidence": 0.94,
"subdivision": "Virginia",
"city": "Ashburn",
"postal_code": "20147",
"latitude": 39.0438,
"longitude": -77.4874,
"accuracy_radius_km": 10,
"timezone": "America/New_York"
},
"network": {
"asn": 64501,
"organization": "Example Cloud LLC"
},
"connection": {
"connection_type": "hosting",
"is_hosting": true,
"is_residential": false,
"is_mobile": false,
"is_business": false
},
"security": {
"is_vpn": true,
"is_hosting": true,
"is_tor_exit": false,
"is_proxy": false,
"anonymizer_type": "vpn",
"confidence": 0.96,
"reason_codes": [
"vpn_handshake_confirmed",
"datacenter_asn_range"
]
},
"security_extensions": {
"abuse_velocity_score": 18,
"is_known_scanner": false,
"observation_recency_hours": 12,
"anonymizer_reason": "vpn_handshake_confirmed",
"threat_level": "medium",
"abuse_velocity": "low",
"confidence": 0.96
},
"dataset_version": "2026-10-27T00:00:00Z.crawl-1793088000000",
"updated_at": "2026-10-27T00:00:00Z"
}# Service endpoints
All endpoints are versioned under /v1 and grouped into two controllers: Lookup & Telemetry (LookupController) and MMDB & Artifact Distribution (MmdbController).
# Lookup & Telemetry (`LookupController`)
| Method | Route | Scope / Auth | Metering | Description |
|---|---|---|---|---|
GET | /v1/ip/{ip} | lookup | 1 credit | Resolve any IPv4 or IPv6 address with live BGP/RIPEstat enrichment-on-miss. |
GET | /v1/ip/me | Public (None) | Free (120/min) | Proxy-aware lookup of the connecting client’s public IP (alias: /v1/public/ip). |
POST | /v1/ip/batch | batch | 1 credit / IP | Resolve 1 to 100 IPv4/IPv6 addresses pinned to a single consistent snapshot version. |
GET | /v1/networks/{prefix}/{length} | lookup | Included | Inspect canonical prefix record by split CIDR or URL-encoded /v1/networks/{cidr}. |
GET | /v1/metadata/datasets | lookup | Included | List active and previous snapshot versions, SHA-256 digests, and prefix counts. |
POST | /v1/feedback | lookup | Free | Submit a network operator or researcher geolocation/anonymizer correction report. |
GET | /v1/status | Public (None) | Free | Unauthenticated liveness probe returning active and previous snapshot versions. |
# MMDB & Artifact Distribution (`MmdbController`)
| Method | Route | Scope | Description |
|---|---|---|---|
GET | /v1/mmdb/products | lookup | Catalog of supported formats (mmdb, csv, parquet), field families, cadences, and presets. |
POST | /v1/mmdb/quote | lookup | Calculate a deterministic integer-minor-unit price quote and profileSchemaHash. |
GET | /v1/mmdb/releases | download | List compiled release manifests, artifact sizes, and SHA-256 checksums. |
POST | /v1/mmdb/releases/{id}/download-token | download | Issue a short-lived signed download token for a specific release (id or latest) and format. |
GET | /v1/mmdb/releases/{id}/checksums | download | Fetch JSON or text/plain SHA256SUMS verification manifest. |
GET | /v1/mmdb/releases/{id}/download | download | Stream .mmdb, .csv.gz, or .parquet with ETag (304), Range (206), or GCS V4 302 redirect. |
GET | /v1/mmdb/snapshots/diff | download | Compute a differential prefix update package between from_version and to_version. |
# Authentication & API key scopes
Authenticated endpoints are protected by ApiKeyGuard. Pass your API key in either the Authorization: Bearer <key> header or the x-api-key: <key> header. Keys are hashed with SHA-256 and verified in sub-millisecond memory against the hot key cache.
curl -sS "https://api.ipscope.io/v1/ip/198.51.100.7" \
-H "Authorization: Bearer ips_live_••••••••"Every API key is provisioned with explicit permission scopes (ApiKeyScope) and licensed field families (licensedFamilies). If a key lacks the required scope for a route, the API returns 403 Forbidden.
| Scope | Granted endpoints | Purpose |
|---|---|---|
lookup | /v1/ip/:ip, /v1/networks/*, /v1/metadata/datasets, /v1/feedback, /v1/mmdb/products, /v1/mmdb/quote | Real-time single IP and CIDR lookups, dataset metadata, and feedback. |
batch | POST /v1/ip/batch | High-throughput 100-IP batch enrichment requests. |
download | /v1/mmdb/releases*, /v1/mmdb/snapshots/diff | Automated CI/CD and server cron jobs pulling .mmdb, .csv.gz, and .parquet snapshots. |
admin | Administrative control plane | Internal platform and snapshot management. |
# Per-user rate limiting & headers
Rate limits are enforced per user account (rl:user:<userId>), shared across all active API keys owned by that user. Creating multiple keys for microservice isolation never multiplies burst limits or bypasses account-level rate governance.
| Response Header | Example Value | Description |
|---|---|---|
X-RateLimit-Scope | user | Indicates rate limiting is enforced at the user account boundary across all keys. |
X-RateLimit-Limit | 600 | Maximum requests permitted per 60-second window for your account tier. |
X-RateLimit-Remaining | 594 | Remaining requests allowed in the current 60-second window. |
X-RateLimit-Reset | 38 | Seconds remaining until the current rate-limit window resets. |
Retry-After | 14 | Sent on 429 Too Many Requests; number of seconds to wait before retrying. |
# Prepaid credit reservation & metering
Metered endpoints (GET /v1/ip/:ip = 1 unit, POST /v1/ip/batch = ips.length units) debit from a low-latency Valkey credit reservation chunk backed by our PostgreSQL double-entry ledger (100 micro-USD per lookup = $0.10 per 1,000 lookups).
- Atomic pre-validation: On
POST /v1/ip/batch, every IP inips[]is validated *before* credits are debited. Malformed requests (400 Bad Request) never consume credits. - Explicit
402 Payment Required: When your monthly plan allowance and prepaid wallet reservation are exhausted, metered endpoints return402 Payment Requiredrather than silently accruing surprise post-paid overage bills. - Unmetered operational endpoints:
GET /v1/status,GET /v1/ip/me,GET /v1/metadata/datasets, andPOST /v1/feedbackdo not debit lookup credits.