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
}
}API-key authenticated check for whether an IP address is currently listed on the LimesIndex-owned blocklist.
| ip required | string Example: 192.0.2.1 IPv4 or IPv6 address to check |
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",
- "expires_at": "2026-03-16T10: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, breakdown by type, new listings in the last 24 hours, and delistings in the last 24 hours.
required | object (BlocklistStatsResult) Blocklist statistics data |
required | object (Meta) Response metadata |
{- "data": {
- "total_active": 4523,
- "by_type": {
- "spam": 3200,
- "malware": 800,
- "phishing": 523
}, - "new_listings_24h": 92,
- "delistings_24h": 17
}, - "meta": {
- "processing_time_ms": 5
}
}Get recent listing and delisting events from the LimesIndex-owned blocklist. Results are ordered newest first and paginated with limit/offset for feed and dashboard polling.
| limit | integer [ 1 .. 100 ] Default: 50 Number of events to return. Defaults to 50 and is capped at 100. |
| offset | integer >= 0 Default: 0 Number of events to skip. |
required | object (BlocklistRecentResult) Paginated recent blocklist event result |
required | object (Meta) Response metadata |
{- "data": {
- "events": [
- {
- "ip": "192.0.2.1",
- "action": "listed",
- "type": "spam",
- "reason": "High bounce rate",
- "return_code": "127.0.0.2",
- "listed_at": "2026-04-13T08:00:00Z",
- "expires_at": "2026-04-14T08:00:00Z",
- "performed_at": "2026-04-13T08:00:00Z"
}, - {
- "ip": "198.51.100.5",
- "action": "delisted",
- "type": "malware",
- "reason": "false positive",
- "return_code": "127.0.0.4",
- "listed_at": "2026-04-12T07:45:00Z",
- "delisted_at": "2026-04-13T07:45:00Z",
- "performed_at": "2026-04-13T07:45:00Z"
}
], - "count": 2,
- "limit": 50,
- "offset": 0
}, - "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",
- "version": "DMARC1",
- "policy": "quarantine",
- "subdomain_policy": "quarantine",
- "effective_policy": "quarantine",
- "percentage": 100,
- "aggregate_report_uris": [
- "mailto:dmarc@example.com"
], - "dkim_alignment": "r",
- "spf_alignment": "r",
- "report_interval": 86400,
- "record_domain": "example.com",
- "inherited": false,
- "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
}
}API-key-protected compatibility alias for the public Header Lab route.
New anonymous clients should use /v1/public/tools/header-analyzer.
| headers required | string <= 49152 characters Raw email headers to analyze (maximum 48 KiB UTF-8 bytes at runtime) |
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
}
}API-key-protected compatibility alias for the public Domain Health
route. New anonymous clients should use
/v1/public/tools/domain-check/{domain}. The complete DNS operation has
a five-second deadline and shares the bounded resolver budget.
| 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",
- "version": "DMARC1",
- "policy": "quarantine",
- "subdomain_policy": "quarantine",
- "effective_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.
Rate-limited IP intelligence lookup for anonymous customer tools.
This is the reviewed public counterpart to /v1/ip/{ip}.
| ip required | string Example: 8.8.8.8 IPv4 or IPv6 address to look up |
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",
- "organization": "Google LLC",
- "provider": "Google",
- "country": "US",
- "rir": "ARIN",
- "connection_type": "datacenter",
- "hostname": "dns.google",
- "service_title": "Google Public DNS",
- "service_server": "scaffolding on HTTPServer2",
- "tls_organization": "Google LLC",
- "rpki_status": "valid",
- "detection": {
- "is_datacenter": true,
- "is_tor_exit": false,
- "is_proxy": false,
- "is_vpn": false,
- "is_residential": false,
- "is_mobile": false,
- "is_ai_crawler": false,
- "ai_company": "OpenAI",
- "cloud_provider": "Google Cloud"
}, - "threat": {
- "score": 0,
- "level": "low",
- "explanation": [
- "Known malicious IP range",
- "Associated with spam activity"
]
}, - "geolocation": {
- "country_code": "US",
- "country_name": "United States",
- "region": "California",
- "region_code": "CA",
- "city": "Mountain View",
- "postal_code": "94043",
- "latitude": 37.4056,
- "longitude": -122.0775,
- "accuracy_radius": 1000,
- "timezone": "America/Los_Angeles",
- "continent_code": "NA",
- "continent_name": "North America"
}, - "geo_consensus": {
- "agreement": 1,
- "primary_country": "US",
- "providers": [
- {
- "provider": "maxmind_geolite2",
- "country": "US",
- "city": "Mountain View"
}
]
}, - "geo_stability": {
- "change_count": 0,
- "level": "stable",
- "last_change": "2025-12-01T00:00:00Z"
}, - "ownership_timeline": [
- {
- "change_kind": "country",
- "previous_country": "string",
- "current_country": "string",
- "previous_asn": null,
- "current_asn": null,
- "previous_org": "string",
- "current_org": "string",
- "changed_at": "2024-09-15T12:00:00Z"
}
], - "asn_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
}
}Analyze raw email headers without an API key. The route is restricted
to the explicit ADR-021 public namespace and authoritative 60 RPM
per-client anonymous rate limit. The JSON body is capped at 64 KiB,
the headers value at 48 KiB, and IP enrichment at 20 Received hops.
| headers required | string <= 49152 characters Raw email headers to analyze (maximum 48 KiB UTF-8 bytes at runtime) |
required | object (HeaderAnalyzerResult) Email header analysis result |
required | object (Meta) Response metadata |
{- "headers": "Received: from mail.example.com..."
}{- "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",
- "delay": "1.2s",
- "asn": 15169,
- "asn_name": "Google LLC",
- "country": "US",
- "cloud_provider": "Google Cloud",
- "connection_type": "datacenter",
- "threat_score": 0
}
], - "authentication": {
- "spf_result": "pass",
- "dkim_result": "present",
- "dkim_selector": "google",
- "dkim_domain": "example.com",
- "dmarc_result": "pass",
- "dmarc_policy": "quarantine"
}, - "infrastructure": {
- "origin_ip": "198.51.100.25",
- "from_domain": "example.com",
- "x_mailer": "Postfix",
- "user_agent": "string"
}, - "anomalies": [
- "string"
]
}, - "meta": {
- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "processing_time_ms": 5,
- "cache_status": "HIT",
- "dataset_version": 1
}
}Check MX, SPF, DKIM, and DMARC posture without an API key. The route is restricted to the ADR-021 public namespace and anonymous rate limit. It accepts strict public DNS hostnames only. All DNS work is cancellation-aware, has a five-second total deadline, and shares the per-request lookup budget and process-wide concurrency bound.
| 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",
- "mx2.example.com"
], - "is_valid": true,
- "errors": [
- "string"
]
}, - "spf": {
- "raw": "v=spf1 include:_spf.google.com ~all",
- "mechanisms": [
- "include:_spf.google.com",
- "~all"
], - "all_qualifier": "~",
- "is_valid": true,
- "is_permissive": false,
- "validation_errors": [
- "string"
], - "dns_lookup_count": 3,
- "exceeds_lookups": false
}, - "dkim": [
- {
- "selector": "google",
- "found": true,
- "raw": "string",
- "key_type": "rsa",
- "key_bits": 2048,
- "service_type": "string",
- "flags": "string",
- "is_valid": true,
- "validation_errors": [
- "string"
]
}
], - "dmarc": {
- "raw": "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com",
- "version": "DMARC1",
- "policy": "quarantine",
- "subdomain_policy": "quarantine",
- "effective_policy": "quarantine",
- "percentage": 100,
- "aggregate_report_uris": [
- "mailto:dmarc@example.com"
], - "forensic_report_uris": [
- "string"
], - "dkim_alignment": "r",
- "spf_alignment": "r",
- "failure_options": "string",
- "report_interval": 86400,
- "organizational_domain": "example.com",
- "record_domain": "example.com",
- "inherited": false,
- "partial_rollout": false,
- "no_visibility": false,
- "strength_rating": "moderate",
- "is_valid": true,
- "validation_errors": [
- "string"
]
}, - "recommendations": [
- "string"
]
}, - "meta": {
- "request_id": "550e8400-e29b-41d4-a716-446655440000",
- "processing_time_ms": 5,
- "cache_status": "HIT",
- "dataset_version": 1
}
}Public, rate-limited check for whether an IP address is currently listed on the LimesIndex-owned blocklist.
Mounted on the /v1/public/* namespace per ADR-021 — never
auth-gated, even when REQUIRE_AUTH=true. It shares the authoritative
60 req/min per-client origin quota for the public namespace.
| ip required | string Example: 192.0.2.1 IPv4 or IPv6 address to check |
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",
- "expires_at": "2026-03-16T10:30:00Z"
}
}, - "meta": {
- "processing_time_ms": 3
}
}Returns the caller's public IP using the same trusted Cloudflare/nginx identity selected by the authoritative anonymous rate limiter. Caller- supplied forwarding headers from untrusted peers are ignored. 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 shares the authoritative 60 req/min per-client
origin quota for the public namespace.
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. It shares the authoritative
60 req/min per-client origin quota for the public namespace.
| 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). |