Aperçu bêta — vers la 1.0. Des problèmes ?
API & développeurs

API de Protection DDoS

Référence complète de l'API REST de Protection DDoS de Fusiora — authentification, IP protégées, profils de filtrage, listes d'IP et historique des attaques.

22 juin 202642 min lectureapiddosauthenticationprotected-ipsfilter-profilesip-listsattack-historyreference

API de protection DDoS — Présentation et authentification

L'API Fusiora DDoS Protection est un wrapper autour de l'Avoro DDoS Manager. Avec elle, vous pouvez inspecter les adresses IP protégées, consulter l'historique des attaques, attacher des profils de filtrage aux IP, gérer des listes d'IP réutilisables et configurer la protection par IP.

Avec elle, vous pouvez :

  • Inspecter les adresses IP protégées de votre compte.
  • Consulter l'historique des attaques qui ont frappé vos IP.
  • Attacher des profils de filtrage (presets + plages de protocole/port) aux IP.
  • Gérer des listes d'IP réutilisables avec des entrées WHITELIST / BLACKLIST / TRUST.
  • Configurer les paramètres de protection par IP : action par défaut, mode symétrique, ASN blocklist, country blocklist.

URL de base

Tous les endpoints sont sous :

https://dpm.fusiora.com

Envoyez chaque requête vers un chemin sous cette base, par ex. https://dpm.fusiora.com/api/attacks.

Groupes d'endpoints

L'API est organisée autour des ressources que vous gérez :

  • Protected IPs/api/ips/{ip}, /api/ip/{ip}/… — Lire & configurer la protection d'une seule IP.
  • Filter Profiles/api/filters, /api/ip/{ip}/profiles — Parcourir les presets, les attacher/détacher par plage de protocole+port.
  • IP Lists/api/iplists, /api/iplists/{id}/entries — Listes CIDR réutilisables référencées par les profils.
  • Attacks/api/attacks, /api/attacks/{id}/stats — Lire l'historique des attaques et les statistiques temporelles.

Conventions

  • Les corps de requête sont en JSON. Envoyez toujours Content-Type: application/json pour les requêtes POST, PUT et PATCH.
  • Les réponses réussies renvoient du JSON, sauf 204 No Content pour les mises à jour et suppressions sans rien à renvoyer.
  • Les erreurs renvoient du JSON avec un champ error décrivant le problème. Voir la Référence pour les codes de statut.
  • Les endpoints PATCH sous /api/ip/{ip}/... sont limités à un champ : ils lisent la config IP actuelle, ne modifient que le champ demandé et le réécrivent. Tous les autres paramètres sont préservés.

Authentification

Chaque requête doit inclure votre clé API personnelle dans l'en-tête HTTP x-api-key. Les requêtes sans clé valide sont rejetées avec 401 Unauthorized.

x-api-key: YOUR_API_KEY

C'est tout — pas de préfixe Bearer, pas de signature, pas de paramètre d'expiration.

Test rapide

Un appel réussi à /api/attacks confirme que votre clé est valide :

curl -X GET "https://dpm.fusiora.com/api/attacks" \
  -H "x-api-key: YOUR_API_KEY"

Si la clé est incorrecte ou manquante, vous obtiendrez 401 :

{ "error": "Missing or invalid API key" }

Utiliser la clé

Envoyez le même en-tête sur chaque endpoint :

# GET
curl -X GET "https://dpm.fusiora.com/api/ips/85.239.155.11" \
  -H "x-api-key: YOUR_API_KEY"

# POST with body
curl -X POST "https://dpm.fusiora.com/api/iplists" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "officevpn"}'

# PATCH with body
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/default-action" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"defaultAction": "FILTER"}'

Garder la clé secrète

  • Ne la committez jamais dans un dépôt public. Traitez-la comme un mot de passe.
  • Ne l'utilisez pas depuis du JavaScript côté client s'exécutant dans un navigateur — faites plutôt transiter les appels par votre propre backend.
  • Faites-la tourner si vous suspectez une fuite.
  • Utilisez une clé par environnement (production / staging) quand c'est possible.

Ce que la clé peut faire

La clé est liée à un compte utilisateur et à une liste fixe d'IP côté Avoro. Elle peut faire tout ce que ce compte est autorisé à faire — il n'y a pas de scopes par clé aujourd'hui.

Permissions et propriété

L'API est multi-tenant. Chaque IP et chaque liste d'IP appartient à exactement un compte, et l'API ne vous laisse jamais franchir cette frontière.

Quand vous appelez un endpoint, l'API vérifie :

  1. La clé est-elle valide ? (Non → 401)
  2. Si l'URL contient une IP — cette IP est-elle sur votre compte ? (Non → 403)
  3. Si l'URL contient un ID de liste — cette liste a-t-elle été créée par votre compte ? (Non → 404)

Pourquoi 403 pour les IP mais 404 pour les listes ?

C'est délibéré.

  • Les IP ont une forme connue (a.b.c.d). Renvoyer 403 confirme que l'IP existe quelque part, juste pas sur votre compte. C'est acceptable — les IP sont des informations publiques.
  • Les ID de listes d'IP sont des identifiants numériques internes. Renvoyer 403 pour la liste de quelqu'un d'autre permettrait aux attaquants d'énumérer les listes d'autres utilisateurs en essayant des ID en séquence. L'API renvoie donc 404 Not Found — indiscernable d'une liste qui n'a jamais existé.

Même logique pour les entrées de liste : supprimer une entrée appartenant à la liste d'un autre utilisateur renvoie 404.

Ce que vous pouvez et ne pouvez pas faire

Vous pouvez :

  • Lire n'importe quelle IP de votre compte : GET /api/ips/{ip}.
  • Lister, créer, mettre à jour, supprimer vos propres listes d'IP : /api/iplists/....
  • Ajouter / retirer des entrées dans vos propres listes : /api/iplists/{id}/entries.
  • Lire les attaques contre vos IP : GET /api/attacks (les résultats sont filtrés automatiquement sur vos IP).
  • Référencer une autre de vos propres listes comme entrée imbriquée.

Vous ne pouvez pas :

  • Toucher une IP qui n'est pas sur votre compte → 403.
  • Lire, modifier ou supprimer une liste que vous n'avez pas créée → 404.
  • Imbriquer une liste appartenant à quelqu'un d'autre dans la vôtre → 400 ("nested list not found").
  • Supprimer une entrée via une URL de liste qui ne possède pas cette entrée → 404.

Portée de l'historique des attaques

L'endpoint /api/attacks est spécial : au lieu d'échouer avec 403, il filtre silencieusement toute attaque dont l'IP de destination n'est pas sur votre compte. Un tableau vide est une réponse valide — cela rend la pagination + le filtrage sûrs à appeler depuis des tâches en arrière-plan sans vérification de propriété par attaque.

Pièges courants

  • Mauvaise clé pour le mauvais environnement. Les IP de production et de staging vivent sur des comptes différents. Mélanger les clés produit des 403 déroutants.
  • ID de listes copiés depuis le compte d'un collègue. Utilisez les vôtres.
  • Listes imbriquées auto-référentielles. Ajouter la liste 730 comme entrée dans la liste 730 renvoie 400.

Étapes suivantes

  • Protected IPs — configurer la protection d'une seule IP.
  • Filter Profiles — attacher des presets à des plages de protocole + port.
  • IP Lists — gérer des listes CIDR réutilisables.
  • Attack History — lire les enregistrements et statistiques d'attaques.
  • Reference — codes de statut, notation CIDR, types d'action.

Avec l'URL de base, l'authentification x-api-key et le modèle de propriété clairs, vous êtes prêt à explorer le reste de la documentation et à commencer à configurer la protection de vos IP.

IPs protégées

Endpoints pour inspecter et configurer la protection DDoS d'une seule IP attribuée à votre compte.

Tous les endpoints PATCH ci-dessous sont à portée de champ : ils lisent la configuration actuelle de l'IP, modifient uniquement le champ demandé et la réécrivent. Les seuils, les profils de filtre attachés et les autres réglages sont conservés.

Obtenir les détails de l'IP

Renvoie la configuration complète de l'une de vos IPs protégées.

GET /api/ips/{ip}

Paramètre de chemin

  • ip (obligatoire) — Adresse IPv4 que vous possédez (p. ex. 85.239.155.11).

Exemple

curl -X GET "https://dpm.fusiora.com/api/ips/85.239.155.11" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

{
  "ID": 1234,
  "Ipv4": "85.239.155.11",
  "Description": "Game server #1",
  "Enabled": true,
  "DefaultAction": "FILTER",
  "SymmetricMode": "FULL",
  "CountryBlockMode": 0,
  "CountryBlockList": [],
  "AsnBlockMode": 0,
  "AsnBlockList": [],
  "SynThreshold": 50000,
  "UdpThreshold": 50000
}

Des seuils de protection supplémentaires peuvent apparaître dans la réponse — ils sont en lecture seule ici. Utilisez les endpoints PATCH dédiés ci-dessous pour modifier les réglages individuels.

Erreurs : 401 clé non valide · 403 IP absente de votre compte · 500 échec en amont.

Action par défaut

L'action par défaut décide de ce qui arrive au trafic sur les ports qui n'ont pas de profil de filtre spécifique. C'est de fait la règle générale d'une IP.

PATCH /api/ip/{ip}/default-action

Corps

{ "defaultAction": "FILTER" }

Valeurs

  • ACCEPT — Protection DDoS désactivée. Seuls les ports avec un profil de filtre sont protégés. À utiliser si vous gérez vous-même la protection — rare.
  • FILTER — Protection standard sur chaque port. Valeur par défaut recommandée. Réglage normal pour les serveurs de production.
  • DROP — Rejette tout le trafic. Seuls les ports avec un filtre attaché laissent passer le trafic. Coupe-circuit : réponse aux incidents, maintenance, configurations à liste d'autorisation stricte.

Exemples

# Standard protection (recommended)
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/default-action" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"defaultAction": "FILTER"}'

# Killswitch
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/default-action" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"defaultAction": "DROP"}'

# Disable protection (accept all)
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/default-action" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"defaultAction": "ACCEPT"}'

Réponse (200 OK)

{ "success": true, "message": "Default action set to FILTER", "data": {} }

Erreurs : 400 valeur non valide · 401 clé non valide · 403 l'IP n'est pas la vôtre · 500 échec en amont.

Protection symétrique

Filtre à état qui exige que chaque connexion se comporte de manière cohérente dans les deux sens. Efficace contre le trafic usurpé, car les paquets usurpés ne reçoivent jamais de trafic de réponse correspondant.

PATCH /api/ip/{ip}/symmetric

Corps

{ "symmetricMode": "FULL" }

Valeurs

  • FULL — Impose l'inspection symétrique. Les flux asymétriques sont défiés ou rejetés. Recommandé.
  • DISABLED — N'impose pas le routage symétrique. À utiliser uniquement si votre réseau est intentionnellement asymétrique.

Exemples

# Enable (recommended)
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/symmetric" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"symmetricMode": "FULL"}'

# Disable
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/symmetric" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"symmetricMode": "DISABLED"}'

Réponse (200 OK)

{ "success": true, "message": "Symmetric mode set to FULL", "data": {} }

Erreurs : 400 valeur non valide · 401 clé non valide · 403 l'IP n'est pas la vôtre · 500 échec en amont.

Liste de blocage ASN

Filtre le trafic par ASN source (Autonomous System Number). Utile pour bloquer des réseaux abusifs ou verrouiller une IP sur l'ASN d'un fournisseur cloud précis.

La liste est plafonnée à 20 ASN par IP et fonctionne en liste noire ou liste blanche.

PATCH /api/ip/{ip}/asn-blocklist

Corps

{
  "asnBlockMode": 1,
  "asnBlockList": [12345, 67890]
}

Modes

  • 0 — Disabled — Le filtrage par ASN est désactivé. asnBlockList est ignoré.
  • 1 — Blacklist — Le trafic des ASN listés est bloqué. Tout le reste est autorisé.
  • 2 — Whitelist — Seul le trafic des ASN listés est autorisé. Tout le reste est bloqué.

Envoyez les deux champs ensemble. Les numéros d'ASN sont des entiers entre 1 et 4,294,967,295. Pas de préfixe AS — envoyez 13335, pas "AS13335". Les doublons sont dédupliqués côté serveur.

Exemples

# Block two networks
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/asn-blocklist" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"asnBlockMode": 1, "asnBlockList": [12345, 67890]}'

# Whitelist only Cloudflare (AS13335)
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/asn-blocklist" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"asnBlockMode": 2, "asnBlockList": [13335]}'

# Disable
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/asn-blocklist" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"asnBlockMode": 0, "asnBlockList": []}'

Réponse (200 OK)

{ "success": true, "message": "ASN blocklist updated", "data": {} }

Erreurs : 400 mode non valide / liste non-tableau / >20 entrées / ASN non valide · 401 clé non valide · 403 l'IP n'est pas la vôtre · 500 échec en amont.

Liste de blocage par pays

Filtre le trafic par pays source (GeoIP). La liste est plafonnée à 20 pays par IP et utilise les codes ISO 3166-1 alpha-2.

PATCH /api/ip/{ip}/country-blocklist

Corps

{
  "countryBlockMode": 1,
  "countryBlockList": ["CN", "RU", "KP"]
}

Modes

  • 0 — Disabled — Le filtrage par pays est désactivé. countryBlockList est ignoré.
  • 1 — Blacklist — Le trafic des pays listés est bloqué. Tout le reste est autorisé.
  • 2 — Whitelist — Seul le trafic des pays listés est autorisé. Tout le reste est bloqué.

Les codes ne sont pas sensibles à la casse en entrée et sont stockés en majuscules ("cz" devient "CZ"). Les doublons sont dédupliqués côté serveur.

Exemples

# Block three countries
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/country-blocklist" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"countryBlockMode": 1, "countryBlockList": ["CN", "RU", "KP"]}'

# Whitelist Czechia and Slovakia only
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/country-blocklist" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"countryBlockMode": 2, "countryBlockList": ["CZ", "SK"]}'

# Disable
curl -X PATCH "https://dpm.fusiora.com/api/ip/85.239.155.11/country-blocklist" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"countryBlockMode": 0, "countryBlockList": []}'

Réponse (200 OK)

{ "success": true, "message": "Country blocklist updated", "data": {} }

Codes pays courants

Codes ISO 3166-1 alpha-2 fréquemment utilisés :

  • CZ — Tchéquie
  • RU — Russie
  • SK — Slovaquie
  • CN — Chine
  • DE — Allemagne
  • UA — Ukraine
  • US — États-Unis
  • IN — Inde
  • GB — Royaume-Uni
  • BR — Brésil
  • FR — France
  • JP — Japon
  • PL — Pologne
  • KR — Corée du Sud
  • NL — Pays-Bas
  • AU — Australie

Erreurs : 400 mode non valide / liste non-tableau / >20 entrées / code non valide · 401 clé non valide · 403 l'IP n'est pas la vôtre · 500 échec en amont.

Combinez ces endpoints pour ajuster la protection par IP — définissez une action par défaut judicieuse, imposez l'inspection symétrique et resserrez l'accès avec des listes d'ASN et de pays selon les besoins de votre trafic.

Profils de Filtrage

Un preset de filtrage est un jeu de règles nommé préparé par Fusiora (optimisé pour FiveM, le trafic web, le DNS, etc.). Pour l'utiliser, vous l'associez à une IP en tant que profil de filtrage lié à un protocole et une plage de ports spécifiques.

Un profil est la combinaison de :

  • Un preset (le jeu de règles).
  • Un protocole (UDP, TCP, ICMP).
  • Une plage de ports de destination (minDstPortmaxDstPort, les deux inclus).

Vous pouvez associer plusieurs profils à une même IP — un par service.

Lister les presets disponibles

GET /api/filters

Aucun paramètre de chemin ni de requête.

Exemple

curl -X GET "https://dpm.fusiora.com/api/filters" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

[
  { "id": 42, "name": "GameUDP", "protocol": "UDP" },
  { "id": 43, "name": "WebTCP",  "protocol": "TCP" },
  { "id": 44, "name": "DNS",     "protocol": "UDP" }
]

Chaque entrée expose exactement ce dont vous avez besoin pour associer un profil :

  • id — à utiliser comme presetId lors de l'association.
  • name — nom d'affichage, utile pour les journaux et les tableaux de bord.
  • protocol — protocole pour lequel ce preset est conçu. Doit correspondre au protocol que vous envoyez.

Erreurs : 401 clé invalide · 500 échec en amont.

Lister les profils associés à une IP

GET /api/ip/{ip}/profiles

Exemple

curl -X GET "https://dpm.fusiora.com/api/ip/85.239.155.11/profiles" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

[
  {
    "ID": 5511,
    "PresetID": 42,
    "PresetName": "GameUDP",
    "Protocol": "UDP",
    "MinDstPort": 30120,
    "MaxDstPort": 30130,
    "Notes": "FiveM"
  }
]

Erreurs : 401 clé invalide · 403 IP non vôtre · 500 échec en amont.

Associer un profil

POST /api/ip/{ip}/profiles

Corps

{
  "presetId": 42,
  "protocol": "UDP",
  "minDstPort": 30120,
  "maxDstPort": 30130,
  "notes": "FiveM server"
}
  • presetId (obligatoire) — ID issu de GET /api/filters.
  • protocol (obligatoire) — nom du protocole, généralement UDP, TCP ou ICMP. Doit correspondre au protocole du preset.
  • minDstPort (obligatoire) — borne inférieure des ports de destination, incluse (065535).
  • maxDstPort (obligatoire) — borne supérieure, incluse (065535). Doit être >= minDstPort.
  • notes (facultatif) — note libre (chaîne, peut être vide).

Exemple — serveur de jeu FiveM

curl -X POST "https://dpm.fusiora.com/api/ip/85.239.155.11/profiles" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "presetId": 42,
    "protocol": "UDP",
    "minDstPort": 30120,
    "maxDstPort": 30130,
    "notes": "FiveM"
  }'

Réponse (200 OK)

{
  "ID": 5512,
  "PresetID": 42,
  "Protocol": "UDP",
  "MinDstPort": 30120,
  "MaxDstPort": 30130,
  "Notes": "FiveM server"
}

Conservez l'ID — vous en aurez besoin pour supprimer le profil ultérieurement.

Erreurs : 401 clé invalide · 403 IP non vôtre · 500 rejet en amont — preset invalide, profil chevauchant, protocole non concordant. Le message d'erreur inclut la raison en amont.

Supprimer un profil

DELETE /api/ip/{ip}/profiles/{profileId}

Le profil doit appartenir à l'IP indiquée dans l'URL — les profils associés à une autre IP ne peuvent pas être supprimés via ce chemin.

Exemple

curl -X DELETE "https://dpm.fusiora.com/api/ip/85.239.155.11/profiles/5512" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

{
  "success": true,
  "message": "Profile 5512 deleted from IP 85.239.155.11",
  "data": {}
}

Erreurs : 401 clé invalide · 403 IP non vôtre · 404 le profil n'appartient pas à cette IP · 500 échec en amont.

Les profils de filtrage sont le moyen d'appliquer les règles de protection de Fusiora exactement là où vous en avez besoin, service par service, sur chacune de vos IP.

Listes d'IP

Les listes d'IP sont des collections nommées et réutilisables d'adresses CIDR que vous pouvez référencer depuis les profils de protection DDoS. Au lieu de dupliquer le même ensemble d'IP dans de nombreux filtres, vous maintenez une seule liste et la mettez à jour à un seul endroit.

Pourquoi les utiliser

  • DRY. Une seule modification met à jour tous les filtres qui référencent la liste.
  • Composables. Les listes peuvent inclure d'autres listes comme entrées — construisez une hiérarchie (p. ex. partnersacme-corp + globex).
  • Expiration par entrée. Les entrées d'adresse peuvent se supprimer automatiquement après N secondes — parfait pour des bannissements à durée limitée.

Types d'action

Chaque entrée a une ipListAction. Elle décide de ce que fait la couche de protection lorsque le trafic correspond.

  • WHITELIST — Le trafic est toujours autorisé à passer, même quand d'autres règles le bloqueraient. À utiliser pour des partenaires de confiance ou des services de surveillance. Valeur par défaut si vous n'en définissez aucune.
  • BLACKLIST — Le trafic est toujours rejeté. À utiliser pour des attaquants connus ou des blocages fins où le filtrage par pays/ASN est trop large.
  • TRUST — Le trafic contourne entièrement tout le filtrage DDoS. À utiliser uniquement pour l'infrastructure interne ou les réseaux dont vous avez le contrôle total.
Soyez prudent avec TRUST. C'est un contournement, pas seulement une règle d'autorisation. À utiliser avec parcimonie.

Propriété

  • Chaque liste appartient à l'utilisateur qui l'a créée.
  • Vous ne pouvez voir, modifier ou supprimer que les listes que vous avez créées.
  • Les listes des autres utilisateurs sont signalées comme 404 Not Found — pas 403 — afin que les ID de liste ne puissent pas être énumérés.
  • Les références à des listes imbriquées doivent pointer vers une liste que vous possédez également.

Imbrication

Une liste peut contenir une autre liste comme entrée :

{ "listId": 729, "ipListAction": "BLACKLIST" }

Deux règles importantes :

  1. Pas d'auto-référence. Ajouter la liste 730 comme entrée de la liste 730 renvoie 400.
  2. Pas de références inter-utilisateurs. La liste imbriquée doit vous appartenir.

Si vous supprimez une liste qu'une autre de vos listes référençait, la référence devient inactive — la liste parente ne génère pas d'erreur, elle ne correspond simplement plus à ce que l'enfant fournissait auparavant.

Limites et quotas

  • Max. d'entrées par liste : 11,000,000, configurable via maxEntries. Valeur par défaut : 1000.
  • Format du nom de liste : uniquement 1-64 caractères alphanumériques — pas d'espaces, de tirets ni de tirets bas.
  • Description de liste : jusqu'à 500 caractères.

Créer une liste

POST /api/iplists

Corps

{
  "name": "officevpn",
  "description": "Allowed IPs for office VPN",
  "maxEntries": 1000
}
  • name (obligatoire) — 1-64 caractères alphanumériques (a-z, A-Z, 0-9). Pas d'espaces, de tirets ni de tirets bas.
  • description (facultatif) — Texte libre jusqu'à 500 caractères.
  • maxEntries (facultatif) — 11,000,000. Valeur par défaut : 1000.

Exemples

# Minimal
curl -X POST "https://dpm.fusiora.com/api/iplists" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "officevpn"}'

# Full
curl -X POST "https://dpm.fusiora.com/api/iplists" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "blockedasns", "description": "Known bad networks", "maxEntries": 5000}'

Réponse (201 Created)

{
  "ID": 730,
  "Name": "officevpn",
  "Description": "Allowed IPs for office VPN",
  "MaxEntries": 1000,
  "EntryCount": 0,
  "CreatedAt": "2026-05-13T10:00:00Z"
}

Conservez l'ID — vous en aurez besoin pour toute autre opération sur cette liste.

Lister vos listes

GET /api/iplists

Paramètres de requête

  • includeItems (facultatif) — "true" pour inclure les entrées en ligne. Omettre ou "false" pour les métadonnées uniquement.

Exemples

# Metadata only
curl -X GET "https://dpm.fusiora.com/api/iplists" \
  -H "x-api-key: YOUR_API_KEY"

# With entries
curl -X GET "https://dpm.fusiora.com/api/iplists?includeItems=true" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

[
  {
    "ID": 730,
    "Name": "officevpn",
    "Description": "Allowed IPs for office VPN",
    "MaxEntries": 1000,
    "EntryCount": 3,
    "CreatedAt": "2026-05-13T10:00:00Z",
    "UpdatedAt": "2026-05-13T10:05:00Z"
  }
]

Les listes appartenant à d'autres utilisateurs ne sont jamais renvoyées.

Obtenir une liste

GET /api/iplists/{id}

Renvoie les détails complets et les entrées d'une seule liste que vous possédez.

curl -X GET "https://dpm.fusiora.com/api/iplists/730" \
  -H "x-api-key: YOUR_API_KEY"

Renvoie 404 si la liste n'existe pas ou si vous ne la possédez pas.

Mettre à jour une liste

PUT /api/iplists/{id}

Met à jour le name, la description ou le maxEntries de la liste. Pour modifier les entrées elles-mêmes, utilisez les endpoints d'entrées ci-dessous.

Corps

{
  "name": "officevpn",
  "description": "Updated description",
  "maxEntries": 2000
}

Exemples

# Rename
curl -X PUT "https://dpm.fusiora.com/api/iplists/730" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "officevpnv2"}'

# Increase capacity
curl -X PUT "https://dpm.fusiora.com/api/iplists/730" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "officevpn", "maxEntries": 5000}'

Réponse : 204 No Content. Le corps est vide en cas de succès.

Supprimer une liste

DELETE /api/iplists/{id}

Supprime définitivement la liste et toutes ses entrées. Toute référence de profil ou de liste imbriquée devient inactive, alors vérifiez d'abord l'utilisation.

curl -X DELETE "https://dpm.fusiora.com/api/iplists/730" \
  -H "x-api-key: YOUR_API_KEY"

Réponse : 204 No Content.

Lister les entrées

GET /api/iplists/{id}/entries
curl -X GET "https://dpm.fusiora.com/api/iplists/730/entries" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

[
  {
    "ID": 4501,
    "address": "203.0.113.5/32",
    "ipListAction": "WHITELIST",
    "expireAfterSec": 0,
    "ipListID": 730
  },
  {
    "ID": 4502,
    "address": "198.51.100.0/24",
    "ipListAction": "BLACKLIST",
    "ipListID": 730
  }
]

Ajouter une entrée

POST /api/iplists/{id}/entries

Une entrée est soit une adresse (CIDR), soit une liste imbriquée (listId). Fournissez exactement un de ces champs par entrée — jamais les deux, jamais aucun.

Corps — entrée IP/CIDR

{
  "address": "203.0.113.5/32",
  "ipListAction": "WHITELIST",
  "expireAfterSec": 3600
}

Corps — référence de liste imbriquée

{
  "listId": 729,
  "ipListAction": "BLACKLIST"
}
  • address (l'un de address/listId) — Un CIDR valide. Les IP uniques doivent être /32 (IPv4) ou /128 (IPv6). Les zéros en tête sont rejetés (01.2.3.4/32 est invalide).
  • listId (l'un de address/listId) — ID d'une autre liste d'IP que vous possédez. Ne peut pas être égal à la liste parente. Ne peut pas référencer une liste que vous ne possédez pas.
  • ipListAction (facultatif) — WHITELIST, BLACKLIST ou TRUST. Valeur par défaut : WHITELIST.
  • expireAfterSec (facultatif, adresse uniquement) — Supprime l'entrée automatiquement après N secondes. Entier non négatif. Ignoré pour les entrées de liste imbriquée.

Exemples

# Allow a single IP forever
curl -X POST "https://dpm.fusiora.com/api/iplists/730/entries" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"address": "203.0.113.5/32", "ipListAction": "WHITELIST"}'

# Block a /24 subnet
curl -X POST "https://dpm.fusiora.com/api/iplists/730/entries" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"address": "198.51.100.0/24", "ipListAction": "BLACKLIST"}'

# Temporary block — auto-expires in 1 hour
curl -X POST "https://dpm.fusiora.com/api/iplists/730/entries" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"address": "192.0.2.10/32", "ipListAction": "BLACKLIST", "expireAfterSec": 3600}'

# Include another of your lists (nested)
curl -X POST "https://dpm.fusiora.com/api/iplists/730/entries" \
  -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"listId": 729, "ipListAction": "BLACKLIST"}'

Réponse (201 Created)

{
  "ID": 4503,
  "address": "203.0.113.5/32",
  "ipListAction": "WHITELIST",
  "expireAfterSec": 3600,
  "ipListID": 730
}

Supprimer une entrée

DELETE /api/iplists/{id}/entries/{entryId}

L'entrée doit appartenir à la liste nommée dans l'URL — même si vous connaissez un ID d'entrée d'une autre liste (la vôtre ou celle de quelqu'un d'autre), elle ne peut pas être supprimée via le mauvais parent.

curl -X DELETE "https://dpm.fusiora.com/api/iplists/730/entries/4503" \
  -H "x-api-key: YOUR_API_KEY"

Réponse : 204 No Content.

Erreurs courantes

  • 400 — ID de liste, format de nom, longueur de description ou plage de maxEntries invalides.
  • 400address et listId envoyés tous les deux — ou aucun. Envoyez exactement un.
  • 400address n'est pas un CIDR valide — vérifiez les zéros en tête.
  • 400ipListAction n'est pas WHITELIST / BLACKLIST / TRUST.
  • 400expireAfterSec est négatif ou n'est pas un entier.
  • 400listId est égal à l'ID de la liste parente — auto-référence.
  • 400 — La liste imbriquée référencée n'existe pas ou ne vous appartient pas.
  • 401 — Clé API manquante ou invalide.
  • 404 — La liste n'existe pas ou ne vous appartient pas — même réponse à dessein, voir Premiers pas.

Avec les listes d'IP, vous centralisez la gestion des adresses de confiance et bloquées en un seul endroit réutilisable, gardant vos profils de protection propres et cohérents.

Historique des attaques

Consultez l'historique des attaques contre vos IP protégées et récupérez les statistiques de séries temporelles de n'importe quelle attaque spécifique.

Les résultats sont automatiquement limités aux IP attribuées à votre compte — vous pouvez appeler ces endpoints librement sans craindre de divulguer les données d'autres locataires.

Obtenir l'historique des attaques

Renvoie la liste des attaques qui ont touché vos IP protégées.

GET /api/attacks

Paramètres de requête

  • page (non) — Numéro de page pour la pagination.
  • query (non) — Filtre en texte libre transmis à Avoro (par ex. type d'attaque ou IP).

Exemples

# Latest attacks (page 1)
curl -X GET "https://dpm.fusiora.com/api/attacks" \
  -H "x-api-key: YOUR_API_KEY"

# Paginated
curl -X GET "https://dpm.fusiora.com/api/attacks?page=2" \
  -H "x-api-key: YOUR_API_KEY"

# Filtered (e.g. only UDP floods)
curl -X GET "https://dpm.fusiora.com/api/attacks?query=UDP" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

[
  {
    "ID": 88123,
    "DstAddressString": "85.239.155.11",
    "Type": "UDP_FLOOD",
    "Bps": 12500000000,
    "Pps": 8500000,
    "StartedAt": "2026-05-13T09:14:22Z",
    "EndedAt": "2026-05-13T09:18:55Z"
  }
]

Chaque élément est un événement d'attaque distinct :

  • ID — Utilisez-le pour récupérer les statistiques (section suivante).
  • DstAddressString — L'IP ciblée. Toujours l'une des vôtres.
  • Type — Classification de l'attaque (par ex. UDP_FLOOD, SYN_FLOOD, …).
  • Bps — Bande passante de pointe en bits par seconde.
  • Pps — Débit de paquets de pointe en paquets par seconde.
  • StartedAt — Horodatage ISO 8601 du début de l'attaque.
  • EndedAt — Horodatage ISO 8601 de la fin de l'attaque.

Un tableau vide est une réponse parfaitement valide — cela signifie simplement qu'aucune attaque ne correspondait.

Erreurs : 401 clé non valide · 500 échec en amont (le corps inclut un debugId — citez-le dans les tickets de support).

Obtenir les statistiques d'une attaque

Renvoie des statistiques de séries temporelles — échantillons de bande passante et de débit de paquets — pour un événement d'attaque spécifique. Utilisez-les pour tracer la montée en puissance et le déclin d'une attaque.

GET /api/attacks/{id}/stats
  • id (oui) — ID numérique de l'attaque issu de GET /api/attacks.

Exemple

curl -X GET "https://dpm.fusiora.com/api/attacks/88123/stats" \
  -H "x-api-key: YOUR_API_KEY"

Réponse (200 OK)

{
  "AttackID": 88123,
  "Samples": [
    { "T": "2026-05-13T09:14:22Z", "Bps": 8000000000,  "Pps": 6500000 },
    { "T": "2026-05-13T09:14:32Z", "Bps": 12500000000, "Pps": 8500000 }
  ]
}

Chaque échantillon est une observation unique :

  • T — Horodatage ISO 8601 de l'échantillon.
  • Bps — Bande passante à ce moment-là, en bits par seconde.
  • Pps — Débit de paquets à ce moment-là, en paquets par seconde.

La cadence entre les échantillons dépend de la durée de l'attaque et de l'échantillonnage en amont — ne supposez pas d'intervalles fixes lors du tracé.

Erreurs : 401 clé non valide · 500 échec en amont.

Avec ces deux endpoints, vous pouvez reconstituer à la fois la vue d'ensemble des attaques récentes et le détail minute par minute de chacune d'elles.

Référence de l'API

Documentation de référence qui complète le reste de la documentation de l'API : les codes de statut HTTP renvoyés par l'API et la notation CIDR utilisée dans chaque entrée IP.

Codes de statut HTTP

L'API Fusiora utilise des codes de statut HTTP standard. Ci-dessous : chaque code renvoyé par l'API, quand vous le verrez et quoi faire.

Succès

  • 200 OK — Requête réussie. Le corps de la réponse contient le résultat.
  • 201 Created — Une nouvelle ressource a été créée. Renvoyé par POST /api/iplists et POST /api/iplists/{id}/entries.
  • 204 No Content — Mise à jour ou suppression réussie. Le corps de la réponse est vide — n'essayez pas de l'analyser comme du JSON.

Erreurs client

  • 400 Bad Request — Le corps ou la requête est mal formé. Le champ error décrit le problème. Corrigez la charge utile. Vérifiez les enums, les tailles de tableau et les formats de valeur (CIDR, codes pays ISO).
  • 401 Unauthorized — L'en-tête x-api-key est absent ou inconnu. Ajoutez l'en-tête. Vérifiez que la clé n'a pas d'espaces de fin ni de mauvais environnement.
  • 403 Forbidden — La clé est valide, mais l'IP dans l'URL n'est pas attribuée à votre compte. N'utilisez que les IP attribuées à votre compte.
  • 404 Not Found — La ressource n'existe pas — ou ne vous appartient pas. Les erreurs de propriété sur les listes d'IP sont signalées comme 404 par conception pour empêcher l'énumération des ID. Vérifiez que la ressource existe et que vous l'avez créée.

Erreurs serveur

  • 500 Internal Server Error — L'API Avoro en amont a échoué. Le champ error inclut des détails. Les erreurs de l'historique des attaques incluent un debugId. Réessayez avec un backoff exponentiel. Si cela persiste, contactez le support avec le debugId.
  • 502 Bad Gateway — Avoro en amont a renvoyé une réponse inattendue. Réessayez. Si cela persiste, contactez le support.

Arbre de décision rapide

Lorsque vous recevez une réponse autre qu'un succès :

  1. 400 ? Lisez le champ error — il indique l'échec de validation exact. Ne réessayez pas sans corriger la charge utile.
  2. 401 ? Ne réessayez pas — corrigez votre en-tête.
  3. 403 ? L'IP ne vous appartient pas. Vérifiez l'URL.
  4. 404 ? La ressource est absente ou ne vous appartient pas. Revérifiez l'ID.
  5. 500 / 502 ? Réessayez avec un backoff exponentiel. Contactez le support si cela persiste.

Forme de la réponse d'erreur

Toutes les erreurs partagent la même forme JSON :

{ "error": "Description of what went wrong" }

Certaines réponses 500 incluent des champs supplémentaires :

{
  "error": "Upstream API failed",
  "debugId": "abc123-xyz"
}

Citez le debugId lorsque vous contactez le support — c'est le moyen le plus rapide pour nous de retrouver votre erreur spécifique.

Notation CIDR

Chaque entrée IP dans l'API Fusiora est donnée en notation CIDR (Classless Inter-Domain Routing) : address/prefix. Le préfixe est le nombre de bits de tête que l'adresse partage.

Une seule IP est /32 pour IPv4 ou /128 pour IPv6. Il n'existe pas de format "IP nue" ; incluez toujours le préfixe.

Référence rapide IPv4

  • 1.2.3.4/321.2.3.4 uniquement — 1 adresse.
  • 192.168.1.0/24192.168.1.0192.168.1.255 — 256 adresses.
  • 10.0.0.0/1610.0.0.010.0.255.255 — 65 536 adresses.
  • 10.0.0.0/810.0.0.010.255.255.255 — ~16,7 M d'adresses.
  • 0.0.0.0/0 — Tout l'IPv4 — extrême prudence.

Référence rapide IPv6

  • 2001:db8::1/128 — Une seule adresse IPv6.
  • 2001:db8::/32 — Une allocation FAI typique — des millions de /48.
  • 2001:db8::/48 — Un seul site / client.

Règles appliquées par l'API

  • Incluez toujours le préfixe. Même les IP individuelles ont besoin de /32 ou /128. 1.2.3.4 seul est rejeté.
  • Pas de zéros en tête dans les octets. 01.2.3.4/32 est invalide. Utilisez 1.2.3.4/32.
  • IPv6 doit être de forme RFC 4291 valide. La forme abrégée compacte :: est acceptée ; les chiffres hexadécimaux en majuscules ou minuscules sont tous deux acceptés.

Modèles courants

  • Autoriser l'IP statique de votre bureau203.0.113.5/32
  • Bloquer un /24 abusif entier198.51.100.0/24
  • Autoriser toute votre plage VPC AWS10.0.0.0/16
  • Hôte IPv6 unique2001:db8::1/128

Où apparaît CIDR dans l'API

Les chaînes CIDR apparaissent dans le champ address des entrées de listes d'IP — voir Listes d'IP.

Le filtrage par pays et ASN utilise à la place des codes pays et des numéros ASN — ils n'acceptent pas le CIDR. Voir IP protégées pour cela.

Astuce mnémotechnique

Plus le numéro de préfixe est petit, plus la plage est grande :

  • /32 = 1 adresse (la plus petite possible).
  • /24 = 256 adresses (un sous-réseau "Classe C" typique).
  • /16 = 65 536 adresses.
  • /8 = ~16,7 millions d'adresses.
  • /0 = tout l'internet.

En cas de doute, utilisez une calculatrice CIDR en ligne pour vérifier votre plage.

Cet article vous a-t-il été utile ?

Soyez le premier à le noter

Nous utilisons des cookies

Nous utilisons des cookies pour améliorer votre expérience, analyser le trafic et personnaliser le contenu.