Email Reputation
The Email Reputation endpoints provide sending IP reputation scoring based on trap hits, blocklist status, telemetry signals, and behavioral analysis. Scores range from 0 (worst) to 100 (best).
Single IP Reputation
GET/v1/email/ip/{ip}/reputation
Get the full sending reputation for an IP, including contributing factors, 30-day history, and subnet context.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
ip | string | Yes | IPv4 or IPv6 address |
Response (200)
{
"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
}
}
Response Fields
Data Object
| Field | Type | Description |
|---|---|---|
ip | string | The queried IP address (normalized) |
score | integer | Reputation score (0-100) |
level | string | Human-readable level |
factors | array | Factors contributing to the score |
history | array | 30-day score history |
subnet | object | Subnet reputation context |
Factor Object
| Field | Type | Description |
|---|---|---|
name | string | Factor identifier |
impact | integer | Positive or negative impact on the score |
detail | string | Human-readable explanation |
History Point
| Field | Type | Description |
|---|---|---|
score | integer | Score at that point |
level | string | Level at that point |
computed_at | string | ISO 8601 timestamp |
Score Ranges
| Score | Level | Description |
|---|---|---|
| 80-100 | good | Healthy sender reputation |
| 50-79 | medium | Some risk signals detected |
| 20-49 | poor | Multiple negative signals |
| 0-19 | critical | Severe reputation issues |
Batch Reputation
POST/v1/email/reputation/batch
Get reputation scores for multiple IPs in a single request. Returns score and level for each IP.
Request Body
{
"ips": ["198.51.100.25", "203.0.113.50"]
}
Maximum 100 IPs per request.
Response (200)
{
"data": [
{
"ip": "198.51.100.25",
"score": 78,
"level": "good"
},
{
"ip": "203.0.113.50",
"score": 50,
"level": "neutral"
}
],
"meta": {
"processing_time_ms": 20
}
}
Limits
- Maximum 100 IPs per request
- Invalid IPs are silently skipped
- If reputation data is unavailable for an IP, defaults to score 50 / level "neutral"
Subnet Neighbors
GET/v1/email/ip/{ip}/neighbors
Analyze the /24 subnet reputation around an IP address. Shows how many neighbors are listed and the overall contamination level. Useful for understanding whether an IP is in a "bad neighborhood."
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
ip | string | Yes | IPv4 or IPv6 address |
Response (200)
{
"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
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
subnet | string | The /24 subnet in CIDR notation |
total_ips_seen | integer | Total IPs observed in this subnet |
listed_count | integer | Number of IPs currently blocklisted |
avg_reputation | integer | Average reputation score in the subnet |
worst_score | integer | Lowest reputation score in the subnet |
contamination_level | string | Overall level: clean, light, moderate, heavy |
Contamination Levels
| Level | Description |
|---|---|
| clean | No blocklisted IPs in the subnet |
| light | 1-2 listed IPs, low risk to neighbors |
| moderate | Multiple listed IPs, some risk of guilt-by-association |
| heavy | Many listed IPs, significant shared-IP risk |
Error Responses
400 Bad Request
{
"data": {
"error": "invalid IP address",
"code": "INVALID_IP"
},
"meta": {
"processing_time_ms": 0
}
}
Code Examples
cURL
# Single IP reputation
curl -X GET "https://api.limesindex.com/v1/email/ip/198.51.100.25/reputation" \
-H "X-API-Key: YOUR_API_KEY"
# Batch reputation
curl -X POST "https://api.limesindex.com/v1/email/reputation/batch" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ips": ["198.51.100.25", "203.0.113.50"]}'
# Subnet neighbors
curl -X GET "https://api.limesindex.com/v1/email/ip/198.51.100.25/neighbors" \
-H "X-API-Key: YOUR_API_KEY"
Python
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.limesindex.com"
HEADERS = {"X-API-Key": API_KEY}
# Get reputation for an IP
resp = requests.get(
f"{BASE_URL}/v1/email/ip/198.51.100.25/reputation",
headers=HEADERS
)
data = resp.json()["data"]
print(f"Score: {data['score']} ({data['level']})")
for factor in data["factors"]:
sign = "+" if factor["impact"] > 0 else ""
print(f" {sign}{factor['impact']} {factor['name']}: {factor['detail']}")
# Check subnet health
resp = requests.get(
f"{BASE_URL}/v1/email/ip/198.51.100.25/neighbors",
headers=HEADERS
)
subnet = resp.json()["data"]
print(f"Subnet: {subnet['subnet']}")
print(f"Contamination: {subnet['contamination_level']}")
print(f"Listed neighbors: {subnet['listed_count']}/{subnet['total_ips_seen']}")
Use Cases
- Pre-campaign assessment: Check your sending IPs' reputation before a campaign
- IP rotation decisions: Identify which IPs in your pool need rest or removal
- Subnet risk: Understand shared-IP contamination risk before purchasing new IPs
- Trend monitoring: Track reputation history to detect degradation early
Related Endpoints
- Blocklist - Direct blocklist status checks
- Warmup - Warm-up guidance based on reputation
- Email Domain DNS - Domain authentication analysis