Skip to main contentSkip to footer

API Reference

Référence complète de tous les Endpoints de la REST API v2 de ReportedIP, avec des exemples de code en cURL, PHP, Python et JavaScript.

Quotas quotidiens par niveau : Gratuit 1,000 checks · 50 reports · Contributor 5,000 / 200 · Professional 25,000 / 1,000 · Business 100,000 / 5,000 par licence · Enterprise unlimited. Les quotas « Business » évoluent en fonction du nombre de licences (x2 à x20), par exemple x5 = 500,000 / 25,000. Consultez la page Tarifs pour une comparaison complète des niveaux.
Base URL https://reportedip.com/wp-json/reportedip/v2/
Authentification : les endpoints authentifiés nécessitent une API Key envoyée via l’ X-Key en-tête. Les Endpoints publics ne nécessitent pas d’authentification mais sont soumis à des Rate Limits. Les clés, les niveaux de service, les Rate Limits et les codes d’erreur sont expliqués en détail sur la page Authentification et Rate Limits.
Comment les quotas sont comptabilisés (depuis la v2.5.1) : chaque Endpoint ne compte au maximum qu’une fois par jour, jamais les deux.
  • Vérification du quota : GET /check (+1) et POST /bulk-check (+N, un par adresse IP valide).
  • Rapport de quota : POST /report (+1) et POST /bulk-report (+N, un par rapport soumis).
  • Aucun des deux quotas : GET /blacklist, /blacklist-categories, /blacklist-stats, /reports/{ip}, /trends, /statistics, /verify-key — il s’agit de fonctionnalités soumises à des paliers d’accès, et non d’appels facturés à l’unité.
  • Limite d’adresses IP publiques : 100 requêtes par jour par adresse IP source, réparties entre tous les appels non authentifiés (/check-public, /stats-public, /search-public, /categories). Envoyez un X-Key en-tête pour basculer vers le chemin de quota par API Key à la place.

Public Endpoints

Ces endpoints sont accessibles sans authentification. Limitation de débit à 100 requêtes par jour et par adresse IP.

GET /check-public — Vérification de l'adresse IP publique

Public

Vérifie la réputation d'une adresse IP sans authentification. Renvoie le Confidence Score en matière d'abus, le nombre total de signalements, les Threat Categories et la date du dernier signalement. Compte pour +1 dans la limite quotidienne de la Public API par adresse IP (partagée avec les autres Endpoints non authentifiés).

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 Adresse IPv4 ou IPv6 à vérifier
verbose boolean No false Veuillez inclure dans votre réponse une ventilation détaillée des niveaux de confiance

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 — Statistiques publiques détaillées

Public

Consultez des statistiques publiques détaillées, avec une ventilation par catégorie, les principaux types de menaces et des données historiques. Cela compte pour +1 dans le cadre de la limite quotidienne de la Public API par adresse 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 — Recherche d'adresses IP publiques

Public

Effectuez une recherche dans la base de données publique de réputation à l'aide d'une adresse IP partielle, d'un code pays ou d'un ASN. Cette fonctionnalité est utile pour la barre de recherche accessible au public sur reportedip.com. Elle compte pour +1 dans le cadre de la limite quotidienne de la Public API par adresse 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 Critères de recherche : adresse IP complète ou partielle, code de pays (par exemple « CN ») ou ASN.
limit int No 20 Nombre de résultats (50 au maximum).

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

Récupérer la liste des 58 Threat Categories prédéfinies utilisées pour classer les rapports IP. Chaque catégorie comprend son identifiant, son nom, sa description et son niveau de gravité. L'appel de cette API compte pour +1 dans le quota quotidien de la Public API par adresse IP lorsqu'il est effectué sans API Key ; avec un en-tête X-Key, il n'est pas pris en compte dans aucun quota quotidien.

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 authentifiés

Ces endpoints nécessitent une API Key valide envoyée via l’ X-Key en-tête. Récupérez votre API Key depuis le Dashboard.

GET /check — Vérification complète de l'adresse IP

API Key

Effectuez une vérification complète de la réputation IP avec des données détaillées. Cette opération fournit des informations complètes sur les menaces, notamment une ventilation par niveau de confiance, l'historique des rapports et des informations sur le FAI. Elle est facturée +1 sur votre quota quotidien de vérifications.

Parameters

Name Type Required Default Description
ip string Yes Adresse IPv4 ou IPv6 à vérifier
verbose boolean No false Inclure une ventilation détaillée des Confidence Scores
include_reports boolean No false Inclure les détails du rapport individuel dans la réponse

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 — Signaler une adresse IP

API Key

Signalez une adresse IP malveillante à la communauté. Ce signalement sera ajouté aux données existantes afin de mettre à jour le Confidence Score d'abus de cette adresse IP. Les Reports émis par un même utilisateur pour la même adresse IP dans un délai de 5 minutes sont automatiquement regroupés. Cela impute uniquement +1 à votre quota quotidien de Reports — jamais à votre quota de vérifications.

Parameters

Name Type Required Default Description
ip string Yes Adresse IPv4 ou IPv6 à signaler
categories array Yes Tableau d'identifiants de Threat Categories (par exemple : [18, 21])
comment string No Commentaire facultatif décrivant l'activité malveillante observée

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 — Vérifier la API Key

API Key

Vérifiez votre API Key et récupérez les informations relatives à votre compte, notamment le rôle de l'utilisateur, les autorisations, les Rate Limits et les statistiques d'utilisation actuelles. Cette opération n'est pas prise en compte dans le quota quotidien.

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 — Statistiques sur les services

Public

Statistiques publiques, à l'échelle du service : nombre total d'adresses IP suivies, nombre total de Reports, Reports envoyés aujourd'hui et API Keys actives. Aucune API Key n'est requise — le débit est limité par adresse IP, comme pour les autres Endpoints publics. N'est pas pris en compte dans le quota quotidien. Vos chiffres d'utilisation et de quota personnels se trouvent dans le 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

Accédez à la Blacklist d’adresses IP alimentée par la communauté, dont la notation est calculée automatiquement à partir de Reports en temps réel. Disponible aux formats JSON, texte brut et CSV pour l’intégration à un pare-feu.

GET /blacklist — Télécharger Blacklist

API Key

Récupérez la Blacklist d'adresses IP dans différents formats. Prend en charge le filtrage par niveau de confiance et par Threat Category — combinez les deux pour créer des Blacklists spécifiques à chaque service (SSH, messagerie, Web, FTP). Les listes sont régénérées côté serveur toutes les 15 minutes ; l'Endpoint renvoie un ETag et respecte l'entête If-None-Match, de sorte que les listes inchangées renvoient un code d'état 304 Not Modified. N'est pas pris en compte dans le quota quotidien — fonctionnalité accessible selon le niveau d'abonnement (Contributor et supérieur).

Parameters

Name Type Required Default Description
format string No json Format de réponse : json, txt ou csv
source string No dynamic Source de la Blacklist : dynamique (par défaut) — Blacklist gérée par la communauté et notée automatiquement. Les autres valeurs sont réservées à un usage interne.
confidence integer No 75 Pourcentage minimal de confiance en cas d'abus (0-100). Alias : confidenceMinimum. Valeur recommandée pour le blocage automatique : 90
category string No Un ou plusieurs identifiants de Threat Category, séparés par des virgules (par exemple, 22,18 pour une liste de blocage SSH). Catalogue complet via GET /categories
limit integer No 10000 Nombre maximal d'entrées à renvoyer. Conservez la valeur par défaut — des valeurs inférieures entraîneront la troncature de la liste.

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 — Catégories de la Blacklist

API Key

Récupère toutes les catégories de Blacklist disponibles utilisées pour classer les entrées. N'est pas pris en compte dans le quota quotidien.

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 — Statistiques sur la Blacklist

API Key

Récupérer des statistiques sur la Blacklist, notamment le nombre total d'entrées et leur répartition par niveau de confiance et par catégorie. Cette opération n'est pas comptabilisée dans le quota quotidien.

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 avancés

Points de terminaison avancés destinés aux utilisateurs expérimentés. Nécessitent des API Keys des niveaux « Professional » ou « Enterprise ».

GET /reports/{ip} — Reports relatifs à la propriété intellectuelle

Professional+

Récupère tous les rapports individuels associés à une adresse IP spécifique. Renvoie les détails des rapports sous forme paginée, notamment les informations sur l'auteur, les catégories et les horodatages. N'est pas pris en compte dans le quota quotidien — fonctionnalité soumise à des restrictions par niveau (à partir de la formule Professional).

Parameters

Name Type Required Default Description
ip string Yes Adresse IPv4 ou IPv6 (dans le chemin d'accès de l'URL)
page integer No 1 Numéro de page pour la pagination
per_page integer No 25 Reports par page

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+

Récupère des données de tendance et des séries chronologiques illustrant les schémas d'attaques sur une période donnée. Utile pour les Dashboards et les analyses. N'est pas comptabilisé dans le quota quotidien — fonctionnalité soumise à des restrictions selon le niveau d'abonnement (Professional et supérieurs).

Parameters

Name Type Required Default Description
period string No 7d Période : 24 h, 7 j ou 30 j
category integer No Filtrer par identifiant 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 — Vérification groupée d'adresses IP

Professional+

Vérifiez la réputation de plusieurs adresses IP en une seule requête. Accepte jusqu’à 1 000 adresses IP par requête. Décompte +N de votre quota quotidien de vérifications, où N correspond au nombre d’adresses IP valides dans la requête. Si la requête venait à dépasser le quota restant, le serveur renvoie un code HTTP 429 et le compteur n’est pas incrémenté.

Parameters

Name Type Required Default Description
ips array Yes Tableau d'adresses IPv4/IPv6 (1 000 au maximum)

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

Envoyez plusieurs rapports IP en une seule requête à l'aide de données au format CSV. Conçu pour les systèmes automatisés et les Honeypots qui doivent signaler d'importants volumes d'activités malveillantes. Ce service est facturé à raison de +N par rapport à votre quota quotidien de rapports, où N correspond au nombre de rapports envoyés. Il n'est jamais pris en compte dans le quota de vérification.

Parameters

Name Type Required Default Description
csv string Yes Données au format CSV comportant les colonnes suivantes : IP, Catégories, Commentaire (un rapport par ligne)

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 relais 2FA

Distribution gérée de l'authentification à deux facteurs (2FA) pour le plugin WordPress ReportedIP Hive. Les abonnements PRO+ peuvent mettre en file d'attente les e-mails et SMS d'authentification via ce relais ; le service utilise d'abord le quota mensuel inclus, puis recourt au solde du forfait prépayé une fois ce plafond atteint.

Quota mensuel inclus : Free / Contributor not eligible · Professional 500 mails · 25 SMS · Business 2,500 mails · 75 SMS · Enterprise fair-use unlimited. Les abonnements PRO et Business peuvent être rechargés via des forfaits prépayés (hive_mail_bundle_1000/5000/25000, hive_sms_bundle_50/200/500).
Protection contre les remboursements — « bundle_balance » est signé : un remboursement Stripe (charge.refunded) sur un forfait précédemment utilisé réduit le solde et peut le faire passer en dessous de zéro. Tant que le solde est négatif et que le quota inclus est épuisé, les envois échouent avec le statut HTTP 402 cap_reached_buy_bundle jusqu’à ce qu’un nouveau forfait soit acheté.

GET /relay-quota — État des quotas de relais

API Key

Renvoie le quota mensuel inclus ainsi que le solde du forfait prépayé pour le relais de messagerie et de SMS Relay. Utilisé par le Dashboard du plugin Hive pour afficher les barres d'utilisation et les informations sur les forfaits.

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 — Envoyer un e-mail de 2FA

PRO / Business / Enterprise

Met en file d'attente un e-mail à authentification à deux facteurs (2FA) transactionnel via le relais vérifié par SPF/DKIM/DMARC. Consomme un emplacement du quota mensuel d'e-mails inclus ; une fois celui-ci épuisé, un crédit est prélevé sur `mail_bundle_balance`. Renvoie un code HTTP 402 lorsque les deux sont vides.

Parameters

Name Type Required Default Description
recipient string Yes Adresse e-mail du destinataire
subject string Yes Objet de l'e-mail
body_html string No '' Corps du message au format HTML
body_text string No '' Corps en texte brut / solution de secours
reply_to string No '' Adresse de réponse — e-mail au format brut ou RFC 5322 Display Name <email@host>
headers array No [] En-têtes de courrier supplémentaires
site_url string No '' URL du site d'origine (utilisée pour les plafonds quotidiens par site et les journaux d'audit)

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 — Envoyer un SMS de 2FA

PRO / Business / Enterprise

Envoie un SMS d'authentification 2FA via le relais mondial géré. Le corps du message est généré côté serveur à partir d'un modèle enregistré (par exemple 2fa_login), de sorte que le code proprement dit n’apparaît jamais dans les journaux du client. Code HTTP 402 lorsque le quota inclusif et le forfait prépayé sont tous deux épuisés ; code HTTP 422 country_not_supported lorsque le pays de destination n’est pas disponible pour des raisons de coût ou d’exploitation ; une réponse HTTP 429 lorsque la limite anti-fraude par destinataire ou par site et par jour est atteinte.

Parameters

Name Type Required Default Description
recipient_phone string Yes Numéro de téléphone du destinataire au format E.164 (par exemple : +49170...)
template_code string No '' Identifiant du modèle côté serveur, par exemple 2fa_login. Lorsqu’il est défini, le message est généré côté serveur et message est ignoré
template_vars object No {} Variables du modèle : { code, expiry_min, lang? }
message string No '' Texte brut du message — utilisé uniquement lorsqu’aucun template_code n'est pas fourni. L'une des valeurs suivantes : message ou template_code est obligatoire (HTTP 422 dans le cas contraire)
site_url string No '' URL du site d'origine (utilisée pour les plafonds quotidiens par site et les journaux d'audit)

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"
  }
}

Réponses d’erreur pour les endpoints de relais

StatutCodeSignification
401missing_api_key / invalid_api_keyL' X-Key en-tête est manquant, mal formé ou fait référence à une clé désactivée.
403tier_forbiddenLe niveau d'accès de l'appelant (Free tier / Contributor) ne lui permet pas de bénéficier de la livraison par relais.
402cap_reached_buy_bundleLe plafond mensuel inclus a été atteint et le solde du forfait prépayé est nul ou négatif suite à un remboursement. Achetez un forfait dans le Dashboard pour reprendre l'envoi.
402monthly_cap_reachedLe plafond mensuel inclus a été atteint pour un niveau ne donnant pas droit à un forfait.
429recipient_backoff / site_daily_capLimitation anti-fraude. L’ retry-after en-tête indique le délai d'attente.

Dernière mise à jour: · Maintenu par l’équipe ReportedIP

Security Focused
Conforme au RGPD
Made in Germany
Retour aux docs