Download OpenAPI specification:Download
IP Intelligence and Registry API
LimesIndex provides comprehensive IP address intelligence including ASN information, geolocation, datacenter detection, threat scoring, and AI crawler identification.
Look up intelligence data for a single IP address. Returns ASN information, geolocation, detection flags (datacenter, VPN, proxy, Tor, AI crawler), and threat scoring.
| ip required | string Example: 8.8.8.8 IPv4 or IPv6 address to look up |
| X-Request-ID | string <uuid> Example: "550e8400-e29b-41d4-a716-446655440000" Unique identifier for the request, useful for debugging and support |
| X-RateLimit-Limit | integer Example: "1000" Maximum number of requests allowed per time window |
| X-RateLimit-Remaining | integer Example: "999" Number of requests remaining in the current time window |
| X-RateLimit-Reset | integer <int64> Example: "1704067200" Unix timestamp when the rate limit window resets |
| X-Cache-Status | string Enum: "HIT" "MISS" Example: "HIT" Cache status for the request (HIT or MISS) |
required | object (IPLookupResult) IP address intelligence data |
required | object (Meta) Response metadata |
{- "data": {
- "ip": "8.8.8.8",
- "prefix": "8.8.8.0/24",
- "asn": 15169,
- "asn_name": "Google LLC",
- "country": "US",
- "rir": "ARIN",
- "connection_type": "datacenter",
- "detection": {
- "is_datacenter": true,
- "is_tor_exit": false,
- "is_proxy": false,
- "is_vpn": false,
- "is_residential": false,
- "is_mobile": false,
- "is_ai_crawler": false,
- "cloud_provider": "Google Cloud"
}, - "threat": {
- "score": 0,
- "level": "low"
}
}, - "meta": {
- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "processing_time_ms": 5,
- "cache_status": "HIT",
- "dataset_version": 1
}
}Look up intelligence data for multiple IP addresses in a single request. Maximum batch size is 1000 IPs. Returns a map of IP addresses to their lookup results.
| ips required | Array of strings [ 1 .. 1000 ] items Array of IP addresses to look up (maximum 1000) |
| X-Request-ID | string <uuid> Example: "550e8400-e29b-41d4-a716-446655440000" Unique identifier for the request, useful for debugging and support |
| X-RateLimit-Limit | integer Example: "1000" Maximum number of requests allowed per time window |
| X-RateLimit-Remaining | integer Example: "999" Number of requests remaining in the current time window |
| X-RateLimit-Reset | integer <int64> Example: "1704067200" Unix timestamp when the rate limit window resets |
required | object Map of IP addresses to their lookup results |
required | object (Meta) Response metadata |
{- "ips": [
- "8.8.8.8",
- "1.1.1.1",
- "208.67.222.222"
]
}{- "data": {
- "8.8.8.8": {
- "ip": "8.8.8.8",
- "prefix": "8.8.8.0/24",
- "asn": 15169,
- "asn_name": "Google LLC",
- "country": "US",
- "detection": {
- "is_datacenter": true,
- "is_ai_crawler": false
}, - "threat": {
- "score": 0,
- "level": "low"
}
}, - "1.1.1.1": {
- "ip": "1.1.1.1",
- "prefix": "1.1.1.0/24",
- "asn": 13335,
- "asn_name": "Cloudflare, Inc.",
- "country": "US",
- "detection": {
- "is_datacenter": true,
- "is_ai_crawler": false
}, - "threat": {
- "score": 0,
- "level": "low"
}
}
}, - "meta": {
- "request_id": "550e8400-e29b-41d4-a716-446655440001",
- "processing_time_ms": 15,
- "dataset_version": 1
}
}Look up information for an Autonomous System Number (ASN). Returns the organization name, country, RIR, and optionally associated IP prefixes.
| asn required | integer [ 1 .. 4294967295 ] Example: 15169 Autonomous System Number to look up |
| include_prefixes | boolean Default: false Include associated IP prefixes in the response |
| prefix_limit | integer [ 1 .. 1000 ] Default: 100 Maximum number of prefixes to return (max 1000) |
| X-Request-ID | string <uuid> Example: "550e8400-e29b-41d4-a716-446655440000" Unique identifier for the request, useful for debugging and support |
| X-RateLimit-Limit | integer Example: "1000" Maximum number of requests allowed per time window |
| X-RateLimit-Remaining | integer Example: "999" Number of requests remaining in the current time window |
required | ASNInfo (object) or ASNInfoWithPrefixes (object) |
required | object (Meta) Response metadata |
{- "data": {
- "asn": 15169,
- "name": "Google LLC",
- "country": "US",
- "rir": "ARIN",
- "allocation_date": "2000-03-30"
}, - "meta": {
- "request_id": "550e8400-e29b-41d4-a716-446655440003",
- "processing_time_ms": 2
}
}Search for Autonomous System Numbers by organization name. Uses full-text search for matching.
| q required | string >= 2 characters Example: q=Google Search query (minimum 2 characters) |
| limit | integer [ 1 .. 100 ] Default: 20 Maximum number of results to return (max 100) |
| X-Request-ID | string <uuid> Example: "550e8400-e29b-41d4-a716-446655440000" Unique identifier for the request, useful for debugging and support |
required | object |
required | object (Meta) Response metadata |
{- "data": {
- "results": [
- {
- "asn": 15169,
- "name": "Google LLC",
- "country": "US",
- "rir": "ARIN"
}, - {
- "asn": 36040,
- "name": "Google Fiber Inc.",
- "country": "US",
- "rir": "ARIN"
}
], - "count": 2
}, - "meta": {
- "processing_time_ms": 5
}
}Get statistics about the ASN registry including total count and breakdown by RIR.
required | object |
required | object (Meta) Response metadata |
{- "data": {
- "total_asns": 75000,
- "by_rir": {
- "ARIN": 25000,
- "RIPE": 28000,
- "APNIC": 15000,
- "LACNIC": 5000,
- "AFRINIC": 2000
}
}, - "meta": {
- "processing_time_ms": 10
}
}Check if an IP address is currently listed on any blocklist. Optionally include listing history.
| ip required | string Example: 192.0.2.1 IPv4 or IPv6 address to check |
| history | string Default: "false" Enum: "true" "false" Include listing history when set to true |
required | object (BlocklistIPResult) Blocklist check result for a single IP |
required | object (Meta) Response metadata |
{- "data": {
- "ip": "192.0.2.1",
- "listed": true,
- "listing": {
- "type": "spam",
- "reason": "High volume spam sending detected",
- "return_code": "127.0.0.2",
- "listed_at": "2026-03-15T10:30:00Z"
}, - "history": [
- {
- "action": "listed",
- "reason": "High volume spam sending detected",
- "performed_by": "auto",
- "performed_at": "2026-03-15T10:30:00Z"
}
]
}, - "meta": {
- "processing_time_ms": 3
}
}Check multiple IP addresses against the blocklist in a single request. Maximum 100 IPs per request.
| ips required | Array of strings [ 1 .. 100 ] items Array of IP addresses to check (maximum 100) |
required | Array of objects (BlocklistBatchItem) |
required | object (Meta) Response metadata |
{- "ips": [
- "192.0.2.1",
- "198.51.100.5",
- "203.0.113.10"
]
}{- "data": [
- {
- "ip": "192.0.2.1",
- "listed": true,
- "listing": {
- "type": "spam",
- "reason": "High volume spam sending detected",
- "return_code": "127.0.0.2",
- "listed_at": "2026-03-15T10:30:00Z"
}
}, - {
- "ip": "198.51.100.5",
- "listed": false
}, - {
- "ip": "203.0.113.10",
- "listed": false
}
], - "meta": {
- "processing_time_ms": 8
}
}Get aggregate statistics about current blocklist entries, including total active listings and breakdown by type.
required | object (BlocklistStatsResult) Blocklist statistics data |
required | object (Meta) Response metadata |
{- "data": {
- "total_active": 4523,
- "by_type": {
- "spam": 3200,
- "malware": 800,
- "phishing": 523
}
}, - "meta": {
- "processing_time_ms": 5
}
}Get the most recent active blocklist entries (up to 50). Useful for monitoring new listings.
required | Array of objects (BlocklistEntry) |
required | object (Meta) Response metadata |
{- "data": [
- {
- "type": "spam",
- "reason": "High bounce rate",
- "return_code": "127.0.0.2",
- "listed_at": "2026-04-13T08:00:00Z"
}, - {
- "type": "malware",
- "reason": "Malware distribution",
- "return_code": "127.0.0.3",
- "listed_at": "2026-04-13T07:45:00Z"
}
], - "meta": {
- "processing_time_ms": 4
}
}Get the email sending reputation score for an IP address. Includes reputation factors, 30-day history, and subnet analysis. Score ranges from 0 (worst) to 100 (best).
| ip required | string Example: 198.51.100.25 IPv4 or IPv6 address to check |
required | object (ReputationResult) Full reputation data for an IP |
required | object (Meta) Response metadata |
{- "data": {
- "ip": "198.51.100.25",
- "score": 78,
- "level": "good",
- "factors": [
- {
- "name": "volume_consistency",
- "impact": 10,
- "detail": "Consistent sending volume over 30 days"
}, - {
- "name": "blocklist_free",
- "impact": 15,
- "detail": "No active blocklist entries"
}, - {
- "name": "complaint_rate",
- "impact": -5,
- "detail": "Complaint rate slightly above threshold"
}
], - "history": [
- {
- "score": 75,
- "level": "good",
- "computed_at": "2026-04-12T00:00:00Z"
}, - {
- "score": 72,
- "level": "good",
- "computed_at": "2026-04-11T00:00:00Z"
}
], - "subnet": {
- "subnet": "198.51.100.0/24",
- "total_ips_seen": 12,
- "listed_count": 1,
- "avg_reputation": 65,
- "worst_score": 30,
- "contamination_level": "light"
}
}, - "meta": {
- "processing_time_ms": 12
}
}Get reputation scores for multiple IP addresses in a single request. Maximum 100 IPs per request. Returns score and level for each IP.
| ips required | Array of strings [ 1 .. 100 ] items Array of IP addresses (maximum 100) |
required | Array of objects (ReputationBatchItem) |
required | object (Meta) Response metadata |
{- "ips": [
- "198.51.100.25",
- "203.0.113.50"
]
}{- "data": [
- {
- "ip": "198.51.100.25",
- "score": 78,
- "level": "good"
}, - {
- "ip": "203.0.113.50",
- "score": 50,
- "level": "neutral"
}
], - "meta": {
- "processing_time_ms": 20
}
}Analyze the /24 subnet reputation around an IP address. Shows how many IPs in the neighborhood are listed and the overall contamination level.
| ip required | string Example: 198.51.100.25 IPv4 or IPv6 address to analyze subnet for |
required | object (SubnetReputationSummary) Subnet reputation analysis for a /24 |
required | object (Meta) Response metadata |
{- "data": {
- "subnet": "198.51.100.0/24",
- "total_ips_seen": 12,
- "listed_count": 1,
- "avg_reputation": 65,
- "worst_score": 30,
- "contamination_level": "light"
}, - "meta": {
- "processing_time_ms": 8
}
}Validate email authentication DNS records (SPF, DKIM, DMARC) for a domain. Returns a domain authentication score (0-100), letter grade, individual record details, and actionable recommendations.
| domain required | string Example: example.com Domain name to check |
| selectors | string Example: selectors=google,selector1,default Comma-separated DKIM selectors to check (defaults to common selectors) |
required | object (DomainDNSResult) Domain DNS authentication analysis |
required | object (Meta) Response metadata |
{- "data": {
- "domain": "example.com",
- "domain_auth_score": 85,
- "grade": "B",
- "mx": {
- "records": [
- "mx1.example.com",
- "mx2.example.com"
], - "is_valid": true
}, - "spf": {
- "raw": "v=spf1 include:_spf.google.com ~all",
- "mechanisms": [
- "include:_spf.google.com",
- "~all"
], - "all_qualifier": "~",
- "is_valid": true,
- "is_permissive": false,
- "dns_lookup_count": 3,
- "exceeds_lookups": false
}, - "dkim": [
- {
- "selector": "google",
- "found": true,
- "key_type": "rsa",
- "key_bits": 2048,
- "is_valid": true
}
], - "dmarc": {
- "raw": "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com",
- "policy": "quarantine",
- "subdomain_policy": "quarantine",
- "percentage": 100,
- "aggregate_report_uris": [
- "mailto:dmarc@example.com"
], - "dkim_alignment": "r",
- "spf_alignment": "r",
- "strength_rating": "moderate",
- "is_valid": true
}, - "recommendations": [
- "Consider upgrading DMARC policy from quarantine to reject for maximum protection"
]
}, - "meta": {
- "processing_time_ms": 450
}
}Ingest email sending telemetry observations from partner systems. Accepts bounce rates, complaint rates, and volume metrics. Maximum 100 observations per request. Timestamps must be within the last 48 hours.
Requires authentication.
required | Array of objects (TelemetryObservation) [ 1 .. 100 ] items Array of observations (maximum 100) | ||||||||||
Array ([ 1 .. 100 ] items)
| |||||||||||
required | object (TelemetryIngestResult) Telemetry ingestion result |
required | object (Meta) Response metadata |
{- "observations": [
- {
- "ip": "198.51.100.25",
- "bounce_rate": 0.03,
- "complaint_rate": 0.001,
- "volume_24h": 5000,
- "observed_at": "2026-04-13T10:00:00Z"
}, - {
- "ip": "203.0.113.50",
- "bounce_rate": 0.15,
- "complaint_rate": 0.005,
- "volume_24h": 800,
- "observed_at": "2026-04-13T10:00:00Z"
}
]
}{- "data": {
- "accepted": 2,
- "rejected": 0
}, - "meta": {
- "processing_time_ms": 15
}
}Get warm-up advisor information for an IP address. Returns the current warm-up status, recommended daily volume, and guidance on whether to pause sending.
| ip required | string Example: 198.51.100.25 IPv4 or IPv6 address to check warm-up status |
required | object (WarmupResult) Warm-up advisor data |
required | object (Meta) Response metadata |
{- "data": {
- "ip": "198.51.100.25",
- "status": "warming",
- "days_sending": 14,
- "reputation_score": 72,
- "recommended_daily_volume": 200,
- "auto_pause_recommended": false,
- "next_milestone": "2026-04-28",
- "next_milestone_volume": 500
}, - "meta": {
- "processing_time_ms": 10
}
}Classify a set of IP addresses into pool tiers based on their reputation, warm-up status, and blocklist state. Maximum 50 IPs per request. Returns tier assignments and recommendations for each IP.
| ips required | Array of strings [ 1 .. 50 ] items Array of IP addresses to classify (maximum 50) |
required | Array of objects (PoolClassifyItem) |
required | object (Meta) Response metadata |
{- "ips": [
- "198.51.100.25",
- "203.0.113.50",
- "192.0.2.100"
]
}{- "data": [
- {
- "ip": "198.51.100.25",
- "tier": "seasoned",
- "reputation_score": 78,
- "warmup_status": "warm",
- "listed": false,
- "recommendation": "IP has good reputation and is past warm-up — ready for the main sending pool"
}, - {
- "ip": "203.0.113.50",
- "tier": "probation",
- "reputation_score": 45,
- "warmup_status": "warming",
- "listed": false,
- "recommendation": "IP needs more warm-up time and reputation building before joining the main pool"
}, - {
- "ip": "192.0.2.100",
- "tier": "suspend",
- "reputation_score": 20,
- "warmup_status": "damaged",
- "listed": true,
- "recommendation": "IP is blocklisted or reputation is critically low — remove from sending pool"
}
], - "meta": {
- "processing_time_ms": 35
}
}Analyze raw email headers to extract the received chain, authentication results, and sending infrastructure details. Each hop IP is enriched with ASN, country, and threat data from LimesIndex.
| headers required | string Raw email headers to analyze |
required | object (HeaderAnalyzerResult) Email header analysis result |
required | object (Meta) Response metadata |
{- "headers": "Received: from mail.example.com (198.51.100.25) by mx.google.com...\nAuthentication-Results: mx.google.com; spf=pass..."
}{- "data": {
- "received_chain": [
- {
- "from_host": "mail.example.com",
- "from_ip": "198.51.100.25",
- "by_host": "mx.google.com",
- "protocol": "ESMTPS",
- "timestamp": "2026-04-13T10:00:00Z",
- "asn": 15169,
- "asn_name": "Google LLC",
- "country": "US"
}
], - "authentication": {
- "spf_result": "pass",
- "dkim_result": "present",
- "dkim_selector": "google",
- "dkim_domain": "example.com"
}, - "infrastructure": {
- "origin_ip": "198.51.100.25",
- "from_domain": "example.com",
- "x_mailer": "Postfix"
}, - "anomalies": [ ]
}, - "meta": {
- "processing_time_ms": 25
}
}Quick public tool to check a domain's email authentication health. Returns a grade (A-F), score, and actionable recommendations. Similar to the DNS endpoint but designed as a free public tool without requiring authentication.
| domain required | string Example: example.com Domain name to check |
required | object (DomainCheckResult) Domain health check result (public tool) |
required | object (Meta) Response metadata |
{- "data": {
- "domain": "example.com",
- "grade": "B",
- "score": 80,
- "mx": {
- "records": [
- "mx1.example.com"
], - "is_valid": true
}, - "spf": {
- "raw": "v=spf1 include:_spf.google.com ~all",
- "is_valid": true,
- "is_permissive": false
}, - "dkim": [
- {
- "selector": "google",
- "found": true,
- "is_valid": true,
- "key_bits": 2048
}
], - "dmarc": {
- "raw": "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com",
- "policy": "quarantine",
- "is_valid": true,
- "strength_rating": "moderate"
}, - "recommendations": [
- "Consider upgrading DMARC policy from quarantine to reject for maximum protection"
]
}, - "meta": {
- "processing_time_ms": 500
}
}Anonymous, rate-limited endpoints under /v1/public/*. Per ADR-021 these
bypass API-key auth even when REQUIRE_AUTH=true and are subject to a
60 req/min per-IP anonymous quota.
Returns the caller's public IP as seen by the edge/origin, extracted
from X-Forwarded-For (first value), falling back to X-Real-IP,
then the TCP remote address. When the IP service is configured, the
response also includes ASN, ASN name, country, and organization.
This endpoint is part of the /v1/public/* anonymous namespace (see
ADR-021) and never requires authentication, even when
REQUIRE_AUTH=true. It is rate-limited on the anonymous quota
(RATE_LIMIT_ANON, default 60 req/min per IP).
Used by the Diagnose page's "Check my IP" button.
| X-Request-ID | string <uuid> Example: "550e8400-e29b-41d4-a716-446655440000" Unique identifier for the request, useful for debugging and support |
| X-RateLimit-Limit | integer Example: "1000" Maximum number of requests allowed per time window |
| X-RateLimit-Remaining | integer Example: "999" Number of requests remaining in the current time window |
| X-RateLimit-Reset | integer <int64> Example: "1704067200" Unix timestamp when the rate limit window resets |
required | object |
required | object (Meta) Response metadata |
{- "data": {
- "ip": "203.0.113.5",
- "asn": 15169,
- "asn_name": "GOOGLE",
- "country": "US",
- "organization": "Google LLC"
}, - "meta": {
- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "processing_time_ms": 3,
- "cache_status": "HIT",
- "dataset_version": 42
}
}Public, unauthenticated ASN lookup used by the free /tools/asn
ASN Health page. Returns the same ASNInfo payload as the
authenticated /v1/asn/{asn} endpoint, including the cross-reference
reputation summary (UCEprotect L1/L2/L3, Spamhaus DROP/EDROP) so
anonymous visitors can check whether an ASN is safe to lease IPs from.
Mounted on the /v1/public/* namespace per ADR-021 — never
auth-gated, even when REQUIRE_AUTH=true. Rate-limited on the
anonymous quota (RATE_LIMIT_ANON, default 60 req/min per IP).
| asn required | integer [ 1 .. 4294967295 ] Example: 20473 Autonomous System Number to look up |
| X-Request-ID | string <uuid> Example: "550e8400-e29b-41d4-a716-446655440000" Unique identifier for the request, useful for debugging and support |
| X-RateLimit-Limit | integer Example: "1000" Maximum number of requests allowed per time window |
| X-RateLimit-Remaining | integer Example: "999" Number of requests remaining in the current time window |
| X-RateLimit-Reset | integer <int64> Example: "1704067200" Unix timestamp when the rate limit window resets |
required | ASNInfo (object) or ASNInfoWithPrefixes (object) |
required | object (Meta) Response metadata |
{- "data": {
- "asn": 15169,
- "name": "Google LLC",
- "country": "US",
- "rir": "ARIN",
- "allocation_date": "2000-03-30",
- "reputation": {
- "uce_level1": false,
- "uce_level2": false,
- "uce_level3": true,
- "spamhaus_drop": false,
- "spamhaus_edrop": false,
- "sources": [
- "uceprotect_l3"
], - "last_checked": "2026-04-14T12:34:56Z"
}
}, - "meta": {
- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "processing_time_ms": 5,
- "cache_status": "HIT",
- "dataset_version": 1
}
}Retrieve API cache statistics and dataset information including cache size, dataset version, and feature availability.
| X-Request-ID | string <uuid> Example: "550e8400-e29b-41d4-a716-446655440000" Unique identifier for the request, useful for debugging and support |
required | object (Stats) API and dataset statistics |
required | object (Meta) Response metadata |
{- "data": {
- "size": 1000,
- "version": 1,
- "geo_enabled": true,
- "redis_enabled": false
}, - "meta": {
- "processing_time_ms": 0,
- "dataset_version": 1
}
}Returns the current active dataset version. This endpoint is used by edge workers to coordinate cache keys without requiring manual configuration.
| X-Dataset-Version | integer Dataset version number |
required | object |
required | object (Meta) Response metadata |
{- "data": {
- "version": 42
}, - "meta": {
- "processing_time_ms": 0,
- "dataset_version": 42
}
}Phase 9 Threat Feeds — bulk-downloadable, subscription-gated feeds of Tor exits, AI crawlers, VPN/proxy ranges, datacenter IPs, and trap-confirmed bad actors. Each feed is available in csv, json, plain and bind formats and is re-generated by a CronJob worker.
CX-091 — Returns the Phase 9 Threat Feeds catalog. Every registered
feed is listed with its title, description, tier, license, latest
row count, generated_at timestamp and per-format download URLs.
The entitled flag tells the caller whether their API key's tier
allows downloading the feed; premium feeds return entitled=false
for free-tier keys alongside an upgrade_url in the envelope.
object | |||||||
| |||||||
{- "data": {
- "user_tier": "free",
- "upgrade_url": "string",
- "feeds": [
- {
- "name": "string",
- "title": "string",
- "description": "string",
- "tier": "free",
- "license": "string",
- "entitled": true,
- "row_count": 0,
- "generated_at": "2019-08-24T14:15:22Z",
- "sha256": "string",
- "formats": [
- "csv"
], - "download_url": {
- "property1": "string",
- "property2": "string"
}, - "notes": "string"
}
]
}
}Returns the JSON manifest for the latest snapshot of a feed, including row count, sha256 over the plain format, and the canonical file names for each format. Premium feeds require an upgraded tier.
| feed required | string Feed name (e.g. tor_exits, ai_crawlers, trap_confirmed) |
Streams the latest snapshot for a feed in the requested format. The
Content-Disposition header is set to attachment with a
feed-date-format filename. The handler honours
If-Modified-Since against the manifest's generated_at timestamp
and returns 304 for unchanged snapshots. X-Feed-SHA256 and
X-Feed-Row-Count response headers match the manifest.
CX-904 added four firewall-ready formats (nginx, caddy,
iptables, cloudflare) that emit drop-in rule snippets for the
four most common edge blocking surfaces. These formats power the
public AI Crawler Firewall page at /tools/ai-firewall.
The optional brand query parameter is only valid for the
ai_crawlers feed. It filters rows to a single AI vendor
(e.g. gptbot, claudebot, perplexitybot) before encoding so
operators can ship a per-vendor rule file. The X-Feed-Brand
response header echoes the applied filter.
| feed required | string |
| format required | string Enum: "csv" "json" "plain" "bind" "nginx" "caddy" "iptables" "cloudflare" |
| brand | string Example: brand=gptbot Filter the ai_crawlers feed to a single AI vendor (case-insensitive). Returns 400 if supplied for any other feed. |
| X-Feed-SHA256 | string |
| X-Feed-Row-Count | integer |
| X-Feed-Brand | string Echoes the brand filter when one was applied (CX-904). |