API Reference
Referencia completa de todos los Endpoints de la REST API v2 de ReportedIP con ejemplos de código en cURL, PHP, Python y JavaScript.
1,000 checks · 50 reports ·
Contributor 5,000 / 200 ·
Professional 25,000 / 1,000 ·
Business 100,000 / 5,000 por licencia ·
Enterprise unlimited.
Las cuotas del nivel «Business» varían en función del número de licencias (x2–x20); por ejemplo, x5 = 500,000 / 25,000.
Consulta la sección de precios para ver la comparación completa de los niveles.
https://reportedip.com/wp-json/reportedip/v2/
X-Key encabezado. Los Endpoints públicos no requieren autenticación, pero están sujetos a Rate Limits. Las claves, los niveles, los Rate Limits y los códigos de error se explican detalladamente en la página «Autenticación y Rate Limits».
- Comprobar cuota:
GET /check(+1) yPOST /bulk-check(+N, uno por cada IP válida). - Informar de la cuota:
POST /report(+1) yPOST /bulk-report(+N, uno por informe enviado). - Sin cuota:
GET /blacklist,/blacklist-categories,/blacklist-stats,/reports/{ip},/trends,/statistics,/verify-key— se trata de funciones con límites por niveles, no de llamadas contadas. - Límite de IP públicas: 100 solicitudes al día por IP de origen, compartidas entre todas las llamadas no autenticadas (
/check-public,/stats-public,/search-public,/categories). Envía unX-Keyencabezado para cambiar a la ruta de cuota de API Key.
Endpoints públicos
Estos endpoints están disponibles sin autenticación. Límite de 100 solicitudes al día por dirección IP.
Comprueba la reputación de una dirección IP sin necesidad de autenticación. Devuelve el Confidence Score de abuso, el número total de denuncias, las Threat Categories y la fecha de la última denuncia. Se contabiliza como +1 en el límite diario de la Public API por dirección IP (compartido con los demás Endpoints sin autenticación).
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| ip | string | Yes | — | Dirección IPv4 o IPv6 que se desea comprobar |
| verbose | boolean | No | false | Incluye en la respuesta un desglose detallado de los niveles de confianza |
Examples
curl "https://reportedip.com/wp-json/reportedip/v2/check-public?ip=1.2.3.4"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/check-public?ip=1.2.3.4'
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/check-public',
params={'ip': '1.2.3.4'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/check-public?ip=1.2.3.4'
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"ip": "1.2.3.4",
"abuseConfidencePercentage": 87,
"totalReports": 42,
"lastReportedAt": "2026-03-09T14:22:31Z",
"categories": [18, 21, 22],
"countryCode": "CN",
"isp": "China Telecom"
}
}
Obtén estadísticas públicas ampliadas con desgloses por categorías, los principales tipos de amenazas y datos históricos. Se contabiliza como +1 en el límite diario de la Public API por dirección IP.
Examples
curl "https://reportedip.com/wp-json/reportedip/v2/stats-public"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/stats-public'
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/stats-public'
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/stats-public'
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"totalIPs": 158432,
"totalReports": 892741,
"last24h": {
"newIPs": 342,
"newReports": 1847
},
"last7d": {
"newIPs": 2156,
"newReports": 12493
},
"categoryBreakdown": [
{"id": 18, "name": "Brute-Force", "count": 45231},
{"id": 21, "name": "Web App Attack", "count": 32198},
{"id": 22, "name": "SSH", "count": 28764},
{"id": 15, "name": "Port Scan", "count": 18432}
],
"topCountries": [
{"code": "CN", "count": 42156},
{"code": "US", "count": 18743},
{"code": "RU", "count": 15892}
]
}
}
Realiza búsquedas en la base de datos de reputación pública por dirección IP parcial, código de país o ASN. Resulta útil para la barra de búsqueda pública de ReportedIP.com. Se contabiliza como +1 en el límite diario de la Public API por dirección IP.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | Yes | — | Consulta de búsqueda: dirección IP completa o parcial, código de país (p. ej., «CN») o ASN. |
| limit | int | No | 20 | Número de resultados (máx. 50). |
Examples
curl "https://reportedip.com/wp-json/reportedip/v2/search-public?q=1.2.3"
Response
{
"meta": {"success": true, "code": 200},
"data": {
"query": "1.2.3",
"results": [
{"ip": "1.2.3.4", "abuseConfidencePercentage": 87, "totalReports": 42, "countryCode": "CN"},
{"ip": "1.2.3.5", "abuseConfidencePercentage": 65, "totalReports": 12, "countryCode": "CN"}
]
}
}
Obtén la lista de las 58 Threat Categories predefinidas que se utilizan para clasificar los informes de IP. Cada categoría incluye su ID, nombre, descripción y nivel de gravedad. Si se realiza la llamada sin una API Key, se cuenta como +1 para el límite diario de la Public API por IP; si se incluye el encabezado X-Key, no se cuenta para ninguna cuota diaria.
Examples
curl "https://reportedip.com/wp-json/reportedip/v2/categories"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/categories'
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/categories'
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/categories'
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": [
{
"id": 1,
"name": "DNS Compromise",
"description": "Compromised DNS server or DNS hijacking",
"severity_level": 8
},
{
"id": 18,
"name": "Brute-Force",
"description": "Login brute-force attempts",
"severity_level": 7
},
{
"id": 21,
"name": "Web App Attack",
"description": "Web application attacks (SQLi, XSS, etc.)",
"severity_level": 9
}
]
}
Endpoints autenticados
Estos endpoints requieren una API Key válida enviada a través del X-Key encabezado. Obtén tu API Key desde el Dashboard.
Realiza una comprobación completa de la reputación de la IP con datos detallados. Proporciona información exhaustiva sobre amenazas, incluyendo un desglose por nivel de confianza, el historial de informes e información sobre el proveedor de servicios de Internet (ISP). Se descuenta +1 de tu cuota diaria de comprobaciones.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| ip | string | Yes | — | Dirección IPv4 o IPv6 que se desea comprobar |
| verbose | boolean | No | false | Incluir un desglose detallado del Confidence Score |
| include_reports | boolean | No | false | Incluir los detalles del informe individual en la respuesta |
Examples
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/check?ip=1.2.3.4&verbose=true"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/check?ip=1.2.3.4&verbose=true',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/check',
params={'ip': '1.2.3.4', 'verbose': 'true'},
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/check?ip=1.2.3.4&verbose=true',
{
headers: { 'X-Key': 'YOUR_API_KEY' }
}
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"ip": "1.2.3.4",
"abuseConfidencePercentage": 87,
"totalReports": 42,
"lastReportedAt": "2026-03-09T14:22:31Z",
"categories": [18, 21, 22],
"countryCode": "CN",
"isp": "China Telecom",
"isWhitelisted": false,
"confidenceBreakdown": {
"reportScore": 24.0,
"diversityScore": 12.0,
"recencyWeight": 13.5,
"severityWeight": 12.3,
"honeypotBonus": 25.0,
"maxConfidence": 100,
"constraintReasons": []
},
"debugInfo": {
"reportCount": 42,
"uniqueReporters": 8,
"honeypotReportsCount": 5,
"effectiveReportCount": 47,
"timeDampeningFactor": 0.92
}
}
}
Denuncia una dirección IP maliciosa a la comunidad. La denuncia se sumará a los datos existentes para actualizar el Confidence Score de la IP. Las denuncias realizadas por el mismo usuario sobre la misma IP en un plazo de 5 minutos se agrupan automáticamente. Solo se descontará +1 de tu cuota diaria de Reports, nunca de la cuota de comprobaciones.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| ip | string | Yes | — | Dirección IPv4 o IPv6 que se debe comunicar |
| categories | array | Yes | — | Matriz de identificadores de Threat Categories (p. ej., [18, 21]) |
| comment | string | No | — | Comentario opcional en el que se describe la actividad maliciosa observada |
Examples
curl -X POST \
-H "X-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ip": "1.2.3.4", "categories": [18, 21], "comment": "SSH brute force"}' \
"https://reportedip.com/wp-json/reportedip/v2/report"
$response = wp_remote_post(
'https://reportedip.com/wp-json/reportedip/v2/report',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
'Content-Type' => 'application/json',
),
'body' => wp_json_encode(array(
'ip' => '1.2.3.4',
'categories' => array(18, 21),
'comment' => 'SSH brute force',
)),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.post(
'https://reportedip.com/wp-json/reportedip/v2/report',
json={
'ip': '1.2.3.4',
'categories': [18, 21],
'comment': 'SSH brute force'
},
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/report',
{
method: 'POST',
headers: {
'X-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
ip: '1.2.3.4',
categories: [18, 21],
comment: 'SSH brute force'
})
}
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "Report submitted successfully"
},
"data": {
"reportId": 58234,
"ip": "1.2.3.4",
"categories": [18, 21],
"abuseConfidencePercentage": 89
}
}
Comprueba tu API Key y consulta los datos de tu cuenta, como el rol de usuario, los permisos, los Rate Limits y las estadísticas de uso actuales. No se descuenta de ninguna cuota diaria.
Examples
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/verify-key"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/verify-key',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/verify-key',
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/verify-key',
{
headers: { 'X-Key': 'YOUR_API_KEY' }
}
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"valid": true,
"role": "reportedip_professional",
"permissions": {
"check": true,
"report": true,
"bulk_check": true,
"bulk_report": false,
"reports_detail": true,
"trends": true
},
"rateLimits": {
"checksPerDay": 25000,
"reportsPerDay": 1000
},
"usage": {
"checksToday": 1247,
"reportsToday": 38
}
}
}
Estadísticas públicas para todo el servicio: total de direcciones IP registradas, total de Reports, Reports enviados hoy y API Keys activas. No se requiere API Key; la limitación de frecuencia se aplica por dirección IP, al igual que en los demás Endpoints públicos. No se contabiliza en ninguna cuota diaria. Las cifras de tu uso personal y tu cuota se encuentran en el https://reportedip.com/dashboard/">Dashboard.
Examples
curl "https://reportedip.com/wp-json/reportedip/v2/statistics"
Response
{
"meta": {"success": true, "code": 200},
"data": {
"total_ips": 181402,
"total_reports": 2643918,
"reports_today": 10457,
"active_api_keys": 312
}
}
Endpoints de la Blacklist
Accede a la Blacklist de direcciones IP gestionada por la comunidad, cuya puntuación se calcula automáticamente a partir de Reports en tiempo real. Disponible en formatos JSON, texto sin formato y CSV para su integración con cortafuegos.
Obtén la lista negra de direcciones IP en diversos formatos. Permite filtrar por nivel de confianza y Threat Category; combina ambos criterios para crear Blacklists específicas para cada servicio (SSH, correo, web, FTP). Las listas se regeneran en el servidor cada 15 minutos; el Endpoint devuelve un ETag y respeta el cabezal If-None-Match, por lo que las listas que no han sufrido cambios responden con un 304 Not Modified. No cuenta para ninguna cuota diaria: función restringida por nivel (Contributor y superiores).
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| format | string | No | json | Formato de respuesta: json, txt o csv |
| source | string | No | dynamic | Fuente de la Blacklist: dinámica (por defecto): la Blacklist gestionada por la comunidad y puntuada automáticamente. Los demás valores están reservados para uso interno. |
| confidence | integer | No | 75 | Porcentaje mínimo de confianza en el abuso (0-100). Alias: confidenceMinimum. Recomendado para el bloqueo automático: 90 |
| category | string | No | — | Uno o varios identificadores de Threat Categories, separados por comas (por ejemplo, 22,18 para una lista de bloqueo de SSH). Catálogo completo mediante GET /categories |
| limit | integer | No | 10000 | Número máximo de entradas que se van a devolver. Mantén el valor por defecto; si se introducen valores más pequeños, la lista se truncará. |
Examples
# JSON format
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90"
# Plain text (one IP per line, for firewall rules)
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90&format=txt&limit=10000"
# Service-specific list: SSH attackers only (categories 22 + 18)
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90&format=txt&limit=10000&category=22,18"
# Conditional request: returns 304 Not Modified if the list is unchanged
curl -H "X-Key: YOUR_API_KEY" \
-H 'If-None-Match: W/"2438413-90-2f6c8ad881b6"' \
"https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90&format=txt&limit=10000"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/blacklist',
params={
'confidence': 90,
'format': 'txt',
'limit': 10000,
'category': '22,18'
},
headers={'X-Key': 'YOUR_API_KEY'}
)
ips = response.text.splitlines()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/blacklist?confidence=90',
{
headers: { 'X-Key': 'YOUR_API_KEY' }
}
);
const data = await response.json();
Response
{
"meta": {
"generatedAt": "2026-07-21T17:43:13+00:00",
"confidence": "90",
"confidenceMinimum": "90",
"count": 4821,
"format": "reportapi_v2"
},
"data": [
{
"ip": "1.2.3.4",
"ipAddress": "1.2.3.4",
"abuseConfidencePercentage": 100,
"lastReportedAt": "2026-07-21T14:22:31+00:00"
},
{
"ip": "5.6.7.8",
"ipAddress": "5.6.7.8",
"abuseConfidencePercentage": 95,
"lastReportedAt": "2026-07-21T13:45:12+00:00"
}
]
}
Recupera todas las categorías de la Blacklist disponibles que se utilizan para clasificar las entradas. No se descuenta de ninguna cuota diaria.
Examples
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/blacklist-categories"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/blacklist-categories',
array('headers' => array('X-Key' => 'YOUR_API_KEY'))
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/blacklist-categories',
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/blacklist-categories',
{ headers: { 'X-Key': 'YOUR_API_KEY' } }
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": [
{
"id": 1,
"name": "Botnet",
"slug": "botnet",
"description": "Known botnet command and control or participant"
},
{
"id": 2,
"name": "Brute-Force",
"slug": "brute-force",
"description": "Credential brute-force attacks"
},
{
"id": 3,
"name": "Spam",
"slug": "spam",
"description": "Spam sources"
}
]
}
Obtiene estadísticas sobre la Blacklist, incluyendo recuentos totales y distribución por nivel de confianza y categoría. No se contabiliza en ninguna cuota diaria.
Examples
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/blacklist-stats"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/blacklist-stats',
array('headers' => array('X-Key' => 'YOUR_API_KEY'))
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/blacklist-stats',
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/blacklist-stats',
{ headers: { 'X-Key': 'YOUR_API_KEY' } }
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"total": 12483,
"community": 12483,
"byConfidence": {
"90-100": 4821,
"75-89": 3247,
"50-74": 2891,
"25-49": 1524
},
"byCategory": [
{"name": "Brute-Force", "count": 5432},
{"name": "Web App Attack", "count": 3218},
{"name": "SSH", "count": 2847},
{"name": "Port Scan", "count": 986}
]
}
}
Endpoints avanzados
Advanced Endpoints for users who require Professional or Enterprise API Keys.
Recupera todos los informes individuales correspondientes a una dirección IP concreta. Devuelve los detalles de los informes paginados, incluyendo la información del autor, las categorías y las marcas de tiempo. No se contabiliza en ninguna cuota diaria; es una función restringida por nivel de suscripción (Professional y superiores).
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| ip | string | Yes | — | Dirección IPv4 o IPv6 (en la ruta de la URL) |
| page | integer | No | 1 | Número de página para la paginación |
| per_page | integer | No | 25 | Reports por página |
Examples
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/reports/1.2.3.4?page=1&per_page=25"
$ip = '1.2.3.4';
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/reports/' . $ip . '?page=1',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
ip = '1.2.3.4'
response = requests.get(
f'https://reportedip.com/wp-json/reportedip/v2/reports/{ip}',
params={'page': 1, 'per_page': 25},
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const ip = '1.2.3.4';
const response = await fetch(
`https://reportedip.com/wp-json/reportedip/v2/reports/${ip}?page=1&per_page=25`,
{
headers: { 'X-Key': 'YOUR_API_KEY' }
}
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"ip": "1.2.3.4",
"reports": [
{
"id": 58234,
"categories": [18, 21],
"comment": "SSH brute force with 500+ attempts",
"reportedAt": "2026-03-09T14:22:31Z",
"reporterRole": "honeypot",
"aggregationCount": 12
},
{
"id": 58102,
"categories": [22],
"comment": "Port scanning on TCP 22, 80, 443, 8080",
"reportedAt": "2026-03-09T10:15:00Z",
"reporterRole": "contributor",
"aggregationCount": 0
}
],
"total": 42,
"page": 1,
"per_page": 25,
"total_pages": 2
}
}
Recupera datos de tendencias y series temporales que muestran los patrones de ataque durante un periodo de tiempo determinado. Útil para Dashboards y análisis. No se contabiliza en ninguna cuota diaria: función sujeta a niveles de suscripción (Professional y superiores).
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| period | string | No | 7d | Periodo de tiempo: 24 h, 7 días o 30 días |
| category | integer | No | — | Filtrar por ID de Threat Category |
Examples
curl -H "X-Key: YOUR_API_KEY" \
"https://reportedip.com/wp-json/reportedip/v2/trends?period=7d"
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/trends?period=7d',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/trends',
params={'period': '7d'},
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/trends?period=7d',
{
headers: { 'X-Key': 'YOUR_API_KEY' }
}
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"period": "7d",
"timeSeries": [
{"date": "2026-03-03", "reports": 1842, "newIPs": 312},
{"date": "2026-03-04", "reports": 2104, "newIPs": 356},
{"date": "2026-03-05", "reports": 1956, "newIPs": 298},
{"date": "2026-03-06", "reports": 2347, "newIPs": 401},
{"date": "2026-03-07", "reports": 1893, "newIPs": 287},
{"date": "2026-03-08", "reports": 2156, "newIPs": 342},
{"date": "2026-03-09", "reports": 1847, "newIPs": 318}
],
"topCategories": [
{"id": 18, "name": "Brute-Force", "count": 5432},
{"id": 21, "name": "Web App Attack", "count": 3218},
{"id": 22, "name": "SSH", "count": 2847}
]
}
}
Comprueba la reputación de varias direcciones IP en una sola solicitud. Admite hasta 1.000 direcciones IP por solicitud. Se deducen +N de tu cuota diaria de comprobaciones, donde N es el número de direcciones IP válidas de la solicitud. Si la solicitud superara la cuota restante, el servidor devuelve un código de estado HTTP 429 y el contador no se incrementa.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| ips | array | Yes | — | Conjunto de direcciones IPv4/IPv6 (máximo 1.000) |
Examples
curl -X POST \
-H "X-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ips": ["1.2.3.4", "5.6.7.8", "9.10.11.12"]}' \
"https://reportedip.com/wp-json/reportedip/v2/bulk-check"
$response = wp_remote_post(
'https://reportedip.com/wp-json/reportedip/v2/bulk-check',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
'Content-Type' => 'application/json',
),
'body' => wp_json_encode(array(
'ips' => array('1.2.3.4', '5.6.7.8', '9.10.11.12'),
)),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
response = requests.post(
'https://reportedip.com/wp-json/reportedip/v2/bulk-check',
json={
'ips': ['1.2.3.4', '5.6.7.8', '9.10.11.12']
},
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/bulk-check',
{
method: 'POST',
headers: {
'X-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
ips: ['1.2.3.4', '5.6.7.8', '9.10.11.12']
})
}
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "OK"
},
"data": {
"results": [
{
"ip": "1.2.3.4",
"abuseConfidencePercentage": 87,
"totalReports": 42,
"lastReportedAt": "2026-03-09T14:22:31Z",
"categories": [18, 21, 22]
},
{
"ip": "5.6.7.8",
"abuseConfidencePercentage": 0,
"totalReports": 0,
"lastReportedAt": null,
"categories": []
},
{
"ip": "9.10.11.12",
"abuseConfidencePercentage": 45,
"totalReports": 3,
"lastReportedAt": "2026-03-07T09:30:00Z",
"categories": [15]
}
],
"checked": 3
}
}
Envía varios informes de IP en una sola solicitud utilizando datos en formato CSV. Diseñado para sistemas automatizados y Honeypots que necesitan notificar grandes volúmenes de actividad maliciosa. Se deduce +N de tu cuota diaria de informes, donde N es el número de informes enviados. Nunca se deduce de la cuota de comprobación.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| csv | string | Yes | — | Datos en formato CSV con las columnas: IP, Categorías, Comentario (un informe por línea) |
Examples
curl -X POST \
-H "X-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"csv": "1.2.3.4,18|21,SSH brute force\n5.6.7.8,22,Port scanning\n9.10.11.12,15|18,Distributed attack"}' \
"https://reportedip.com/wp-json/reportedip/v2/bulk-report"
$csv = "1.2.3.4,18|21,SSH brute force\n";
$csv .= "5.6.7.8,22,Port scanning\n";
$csv .= "9.10.11.12,15|18,Distributed attack";
$response = wp_remote_post(
'https://reportedip.com/wp-json/reportedip/v2/bulk-report',
array(
'headers' => array(
'X-Key' => 'YOUR_API_KEY',
'Content-Type' => 'application/json',
),
'body' => wp_json_encode(array(
'csv' => $csv,
)),
)
);
$data = json_decode(wp_remote_retrieve_body($response), true);
import requests
csv_data = """1.2.3.4,18|21,SSH brute force
5.6.7.8,22,Port scanning
9.10.11.12,15|18,Distributed attack"""
response = requests.post(
'https://reportedip.com/wp-json/reportedip/v2/bulk-report',
json={'csv': csv_data},
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const csvData = [
'1.2.3.4,18|21,SSH brute force',
'5.6.7.8,22,Port scanning',
'9.10.11.12,15|18,Distributed attack'
].join('\n');
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/bulk-report',
{
method: 'POST',
headers: {
'X-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ csv: csvData })
}
);
const data = await response.json();
Response
{
"meta": {
"success": true,
"code": 200,
"message": "Bulk report processed"
},
"data": {
"success_count": 3,
"error_count": 0,
"errors": []
}
}
Endpoints de retransmisión de 2FA
Entrega gestionada de 2FA para el plugin de WordPress ReportedIP Hive. Los niveles PRO+ pueden poner en cola los correos electrónicos y SMS de autenticación a través de este relé; el servicio consume primero la cuota mensual incluida y, una vez alcanzado el límite incluido, recurre al saldo del paquete de prepago.
not eligible ·
Professional 500 mails · 25 SMS ·
Business 2,500 mails · 75 SMS ·
Enterprise fair-use unlimited.
Los planes PRO y Business pueden recargar mediante paquetes de prepago
(hive_mail_bundle_1000/5000/25000, hive_sms_bundle_50/200/500).
bundle_balance»:
un reembolso de Stripe (charge.refunded) de un paquete consumido anteriormente
reduce el saldo y puede hacer que este pase a ser negativo. Mientras el saldo sea
negativo y se haya agotado la cuota incluida, los envíos fallarán con un error HTTP
402 cap_reached_buy_bundle hasta que se adquiera un nuevo paquete.
Devuelve la cuota mensual inclusiva más el saldo del paquete prepagado tanto para el reenvío de correo electrónico como de SMS. El Dashboard del complemento Hive lo utiliza para mostrar las barras de consumo y las indicaciones sobre los paquetes.
Examples
curl -H 'X-Key: YOUR_API_KEY' \
https://reportedip.com/wp-json/reportedip/v2/relay-quota
$response = wp_remote_get(
'https://reportedip.com/wp-json/reportedip/v2/relay-quota',
array( 'headers' => array( 'X-Key' => 'YOUR_API_KEY' ) )
);
$data = json_decode( wp_remote_retrieve_body( $response ), true );
import requests
response = requests.get(
'https://reportedip.com/wp-json/reportedip/v2/relay-quota',
headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/relay-quota',
{ headers: { 'X-Key': 'YOUR_API_KEY' } }
);
const data = await response.json();
Response
{
"tier": "professional",
"role": "reportedip_professional",
"mail": {
"sent": 18,
"queued": 0,
"queued_total": 18,
"failed": 0,
"limit": 500,
"inclusive_limit": 500,
"inclusive_used": 18,
"inclusive_available": 482,
"bundle_balance": 1000,
"bundle_eligible": true,
"period_start": "2026-05-01T00:00:00Z",
"period_end": "2026-05-31T23:59:59Z"
},
"sms": {
"sent": 3,
"queued": 0,
"queued_total": 3,
"failed": 0,
"limit": 25,
"inclusive_limit": 25,
"inclusive_used": 3,
"inclusive_available": 22,
"bundle_balance": 50,
"bundle_eligible": true,
"period_start": "2026-05-01T00:00:00Z",
"period_end": "2026-05-31T23:59:59Z"
},
"mail_bundle_balance": 1000,
"sms_bundle_balance": 50
}
Pone en cola un correo con autenticación de dos factores (2FA) transaccional a través del relé verificado mediante SPF/DKIM/DMARC. Consume una plaza de la cuota mensual de correo incluida; una vez agotada, consume un crédito de `mail_bundle_balance`. Devuelve un código de estado HTTP 402 cuando ambos están vacíos.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| recipient | string | Yes | — | Dirección de correo electrónico del destinatario |
| subject | string | Yes | — | Asunto del correo electrónico |
| body_html | string | No | '' | Cuerpo del correo en HTML |
| body_text | string | No | '' | Cuerpo en texto sin formato / alternativa |
| reply_to | string | No | '' | Dirección de respuesta — correo electrónico sin formato o RFC 5322 Display Name <email@host> |
| headers | array | No | [] | Encabezados de correo adicionales |
| site_url | string | No | '' | URL del sitio de origen (utilizada para los límites diarios por sitio y los registros de auditoría) |
Examples
curl -X POST \
-H 'X-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"recipient":"user@example.com","subject":"Your 2FA code","body_html":"<p>Code: 123456</p>","body_text":"Code: 123456"}' \
https://reportedip.com/wp-json/reportedip/v2/relay-mail
$response = wp_remote_post(
'https://reportedip.com/wp-json/reportedip/v2/relay-mail',
array(
'headers' => array( 'X-Key' => 'YOUR_API_KEY', 'Content-Type' => 'application/json' ),
'body' => wp_json_encode( array(
'recipient' => 'user@example.com',
'subject' => 'Your 2FA code',
'body_html' => '<p>Code: 123456</p>',
'body_text' => 'Code: 123456',
) ),
)
);
import requests
response = requests.post(
'https://reportedip.com/wp-json/reportedip/v2/relay-mail',
headers={'X-Key': 'YOUR_API_KEY'},
json={
'recipient': 'user@example.com',
'subject': 'Your 2FA code',
'body_html': '<p>Code: 123456</p>',
'body_text': 'Code: 123456',
},
)
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/relay-mail',
{
method: 'POST',
headers: { 'X-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({
recipient: 'user@example.com',
subject: 'Your 2FA code',
body_html: '<p>Code: 123456</p>',
body_text: 'Code: 123456',
}),
}
);
Response
{
"ok": true,
"queue_id": 48217,
"remaining_quota": {
"sent": 18,
"queued": 1,
"queued_total": 19,
"failed": 0,
"limit": 500,
"inclusive_limit": 500,
"inclusive_used": 19,
"inclusive_available": 481,
"bundle_balance": 1000,
"bundle_eligible": true,
"period_start": "2026-05-01T00:00:00Z",
"period_end": "2026-05-31T23:59:59Z"
}
}
Envía un SMS de autenticación de dos factores (2FA) a través del relé gestionado a nivel mundial. El cuerpo del mensaje se genera en el servidor a partir de una plantilla registrada (p. ej., 2fa_login), de modo que el código real nunca aparece en los registros del cliente. Se devuelve un código HTTP 402 cuando se agotan tanto la cuota incluida como el paquete de prepago; un código HTTP 422 country_not_supported cuando el país de destino no esté disponible por motivos operativos o de coste; código HTTP 429 cuando se alcance el límite diario antifraude por destinatario o por sitio web.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| recipient_phone | string | Yes | — | Número de teléfono del destinatario en formato E.164 (p. ej., +49170...) |
| template_code | string | No | '' | Identificador de plantilla del lado del servidor, p. ej. 2fa_login. Cuando se establece, el mensaje se genera en el lado del servidor y message se ignora |
| template_vars | object | No | {} | Variables de la plantilla: { code, expiry_min, lang? } |
| message | string | No | '' | Texto sin procesar del mensaje: se utiliza únicamente cuando no template_code se especifique. Uno de message o template_code es obligatorio (en caso contrario, se devuelve el código HTTP 422) |
| site_url | string | No | '' | URL del sitio de origen (utilizada para los límites diarios por sitio y los registros de auditoría) |
Examples
curl -X POST \
-H 'X-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"recipient_phone":"+491701234567","template_code":"2fa_login","template_vars":{"code":"123456","expiry_min":5,"lang":"de"}}' \
https://reportedip.com/wp-json/reportedip/v2/relay-sms
$response = wp_remote_post(
'https://reportedip.com/wp-json/reportedip/v2/relay-sms',
array(
'headers' => array( 'X-Key' => 'YOUR_API_KEY', 'Content-Type' => 'application/json' ),
'body' => wp_json_encode( array(
'recipient_phone' => '+491701234567',
'template_code' => '2fa_login',
'template_vars' => array( 'code' => '123456', 'expiry_min' => 5, 'lang' => 'de' ),
) ),
)
);
import requests
response = requests.post(
'https://reportedip.com/wp-json/reportedip/v2/relay-sms',
headers={'X-Key': 'YOUR_API_KEY'},
json={
'recipient_phone': '+491701234567',
'template_code': '2fa_login',
'template_vars': {'code': '123456', 'expiry_min': 5, 'lang': 'de'},
},
)
const response = await fetch(
'https://reportedip.com/wp-json/reportedip/v2/relay-sms',
{
method: 'POST',
headers: { 'X-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({
recipient_phone: '+491701234567',
template_code: '2fa_login',
template_vars: { code: '123456', expiry_min: 5, lang: 'de' },
}),
}
);
Response
{
"ok": true,
"queue_id": 901,
"remaining_quota": {
"sent": 3,
"queued": 1,
"queued_total": 4,
"failed": 0,
"limit": 25,
"inclusive_limit": 25,
"inclusive_used": 4,
"inclusive_available": 21,
"bundle_balance": 50,
"bundle_eligible": true,
"period_start": "2026-05-01T00:00:00Z",
"period_end": "2026-05-31T23:59:59Z"
}
}
Respuestas de error para los endpoints de retransmisión
| Estado | Código | Significado |
|---|---|---|
401 | missing_api_key / invalid_api_key | Falta el X-Key encabezado falta, tiene un formato incorrecto o hace referencia a una clave desactivada. |
403 | tier_forbidden | El nivel de acceso del solicitante (Free / Contributor) no cumple los requisitos para el envío por retransmisión. |
402 | cap_reached_buy_bundle | Se ha alcanzado el límite mensual incluido y el saldo del paquete de prepago está agotado o es negativo tras un reembolso. Compra un paquete en el Dashboard para reanudar el servicio. |
402 | monthly_cap_reached | Se ha alcanzado el límite mensual incluido en un nivel sin derecho a paquetes. |
429 | recipient_backoff / site_daily_cap | Limitación antifraude. El retry-after encabezado indica cuánto tiempo hay que esperar. |
Última actualización: · Mantenido por el equipo de ReportedIP