Skip to main contentSkip to footer

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.

Cuotas diarias por nivel: Free 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.
Base URL https://reportedip.com/wp-json/reportedip/v2/
Autenticación: los Endpoints autenticados requieren una API Key enviada a través del 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».
Cómo se contabilizan las cuotas (desde la v2.5.1): Cada Endpoint consume como máximo un contador diario, nunca ambos.
  • Comprobar cuota: GET /check (+1) y POST /bulk-check (+N, uno por cada IP válida).
  • Informar de la cuota: POST /report (+1) y POST /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 un X-Key encabezado 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.

GET /check-public — Comprobación de la dirección IP pública

Public

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).

Public limit: 100 requests/day per source IP, shared across all unauthenticated endpoints. Send an X-Key header to switch to the API-key quota path.

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
curl "https://reportedip.com/wp-json/reportedip/v2/check-public?ip=1.2.3.4"
php
$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);
python
import requests

response = requests.get(
    'https://reportedip.com/wp-json/reportedip/v2/check-public',
    params={'ip': '1.2.3.4'}
)
data = response.json()
javascript
const response = await fetch(
    'https://reportedip.com/wp-json/reportedip/v2/check-public?ip=1.2.3.4'
);
const data = await response.json();

Response

200 OK
json
{
  "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"
  }
}

GET /stats-public — Estadísticas públicas detalladas

Public

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.

Public limit: 100 requests/day per source IP, shared across all unauthenticated endpoints.

Examples

curl
curl "https://reportedip.com/wp-json/reportedip/v2/stats-public"
php
$response = wp_remote_get(
    'https://reportedip.com/wp-json/reportedip/v2/stats-public'
);
$data = json_decode(wp_remote_retrieve_body($response), true);
python
import requests

response = requests.get(
    'https://reportedip.com/wp-json/reportedip/v2/stats-public'
)
data = response.json()
javascript
const response = await fetch(
    'https://reportedip.com/wp-json/reportedip/v2/stats-public'
);
const data = await response.json();

Response

200 OK
json
{
  "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}
    ]
  }
}

GET /search-public — Búsqueda de direcciones IP públicas

Public

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.

Public limit: 100 requests/day per source IP, shared across all unauthenticated endpoints. Results are capped at 50 entries per call.

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
curl "https://reportedip.com/wp-json/reportedip/v2/search-public?q=1.2.3"

Response

200 OK
json
{
  "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"}
    ]
  }
}

GET /categories — Threat Categories

Public

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.

Public limit: 100 requests/day per source IP, shared across all unauthenticated endpoints. Send an X-Key header to bypass the public limit (no per-call quota when authenticated).

Examples

curl
curl "https://reportedip.com/wp-json/reportedip/v2/categories"
php
$response = wp_remote_get(
    'https://reportedip.com/wp-json/reportedip/v2/categories'
);
$data = json_decode(wp_remote_retrieve_body($response), true);
python
import requests

response = requests.get(
    'https://reportedip.com/wp-json/reportedip/v2/categories'
)
data = response.json()
javascript
const response = await fetch(
    'https://reportedip.com/wp-json/reportedip/v2/categories'
);
const data = await response.json();

Response

200 OK
json
{
  "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.

GET /check — Comprobación completa de la dirección IP

API Key

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
curl -H "X-Key: YOUR_API_KEY" \
     "https://reportedip.com/wp-json/reportedip/v2/check?ip=1.2.3.4&verbose=true"
php
$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);
python
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()
javascript
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

200 OK
json
{
  "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
    }
  }
}

POST /report — Denunciar una dirección IP

API Key

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
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"
php
$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);
python
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()
javascript
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

200 OK
json
{
  "meta": {
    "success": true,
    "code": 200,
    "message": "Report submitted successfully"
  },
  "data": {
    "reportId": 58234,
    "ip": "1.2.3.4",
    "categories": [18, 21],
    "abuseConfidencePercentage": 89
  }
}

GET /verify-key — Verificar la API Key

API Key

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
curl -H "X-Key: YOUR_API_KEY" \
     "https://reportedip.com/wp-json/reportedip/v2/verify-key"
php
$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);
python
import requests

response = requests.get(
    'https://reportedip.com/wp-json/reportedip/v2/verify-key',
    headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
javascript
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

200 OK
json
{
  "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
    }
  }
}

GET /statistics — Estadísticas del servicio

Public

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
curl "https://reportedip.com/wp-json/reportedip/v2/statistics"

Response

200 OK
json
{
  "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.

GET /blacklist — Consigue Blacklist

API Key

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

curl
# 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"
php
$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);
python
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()
javascript
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

200 OK
json
{
  "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"
    }
  ]
}

GET /blacklist-categories — Categorías de la Blacklist

API Key

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
curl -H "X-Key: YOUR_API_KEY" \
     "https://reportedip.com/wp-json/reportedip/v2/blacklist-categories"
php
$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);
python
import requests

response = requests.get(
    'https://reportedip.com/wp-json/reportedip/v2/blacklist-categories',
    headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
javascript
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

200 OK
json
{
  "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"
    }
  ]
}

GET /blacklist-stats — Estadísticas de la Blacklist

API Key

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
curl -H "X-Key: YOUR_API_KEY" \
     "https://reportedip.com/wp-json/reportedip/v2/blacklist-stats"
php
$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);
python
import requests

response = requests.get(
    'https://reportedip.com/wp-json/reportedip/v2/blacklist-stats',
    headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
javascript
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

200 OK
json
{
  "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.

GET /reports/{ip} — Reports sobre la propiedad intelectual

Professional+

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
curl -H "X-Key: YOUR_API_KEY" \
     "https://reportedip.com/wp-json/reportedip/v2/reports/1.2.3.4?page=1&per_page=25"
php
$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);
python
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()
javascript
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

200 OK
json
{
  "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
  }
}
Professional+

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
curl -H "X-Key: YOUR_API_KEY" \
     "https://reportedip.com/wp-json/reportedip/v2/trends?period=7d"
php
$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);
python
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()
javascript
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

200 OK
json
{
  "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}
    ]
  }
}

POST /bulk-check — Comprobación masiva de direcciones IP

Professional+

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
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"
php
$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);
python
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()
javascript
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

200 OK
json
{
  "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
  }
}

POST /bulk-report — Bulk Report

Enterprise

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
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"
php
$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);
python
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()
javascript
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

200 OK
json
{
  "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.

Cuota mensual incluida: Free / Contributor 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).
Protección contra reembolsos — Se ha firmado el «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.

GET /relay-quota — Estado de las cuotas de relevos

API Key

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
curl -H 'X-Key: YOUR_API_KEY' \
     https://reportedip.com/wp-json/reportedip/v2/relay-quota
php
$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 );
python
import requests

response = requests.get(
    'https://reportedip.com/wp-json/reportedip/v2/relay-quota',
    headers={'X-Key': 'YOUR_API_KEY'}
)
data = response.json()
javascript
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

200 OK
json
{
  "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
}

POST /relay-mail — Enviar correo electrónico de 2FA

PRO / Business / Enterprise

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
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
php
$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',
        ) ),
    )
);
python
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',
    },
)
javascript
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

200 OK
json
{
  "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"
  }
}

POST /relay-sms — Enviar SMS de 2FA

PRO / Business / Enterprise

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
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
php
$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' ),
        ) ),
    )
);
python
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'},
    },
)
javascript
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

200 OK
json
{
  "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

EstadoCódigoSignificado
401missing_api_key / invalid_api_keyFalta el X-Key encabezado falta, tiene un formato incorrecto o hace referencia a una clave desactivada.
403tier_forbiddenEl nivel de acceso del solicitante (Free / Contributor) no cumple los requisitos para el envío por retransmisión.
402cap_reached_buy_bundleSe 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.
402monthly_cap_reachedSe ha alcanzado el límite mensual incluido en un nivel sin derecho a paquetes.
429recipient_backoff / site_daily_capLimitación antifraude. El retry-after encabezado indica cuánto tiempo hay que esperar.

Última actualización: · Mantenido por el equipo de ReportedIP

Security Focused
Conforme al RGPD
Made in Germany
Volver a la documentación