Ce changelog décrit les endpoints REST livrés avec le module EASM (Attack Surface Management). Une nouvelle famille d'endpoints (montés directement sous /api/auth/) remplace progressivement les endpoints historiques asm/*, avec des données plus riches et plus cohérentes. Les endpoints asm/* restent disponibles pendant la période de transition.
URL de base : https://dashboard.cloud.patrowl.io/api/auth/
Authentification : chaque requête nécessite un jeton API dans l'en-tête Authorization :
Authorization: Token <your-API-token>
Portée : sauf mention contraire, chaque ressource EASM est restreinte aux assets que vous pouvez voir. Tous les endpoints de liste/détail/export acceptent les mêmes paramètres de filtrage de base :
Paramètre | Type | Description |
| integer | Restreint les résultats à l'une de vos organisations. Par défaut : toutes les organisations dont vous êtes membre. |
| string | Liste d'IDs d'Asset séparés par des virgules. Restreint les résultats aux ressources possédées via ces assets. |
| string | Liste de protections séparées par des virgules (ex. |
| integer | Restreint les résultats aux assets ayant ce réglage de plage horaire. |
| string | Liste d'IDs d'équipe séparés par des virgules (Technologies et Technology detections uniquement). Restreint aux assets appartenant à ces équipes. |
La plupart des endpoints de liste sont paginés par numéro de page (count/next/previous/results) ; les CVE sont paginées par curseur (next/previous/results, avec un paramètre cursor). Chaque ressource expose un endpoint GET .../export (basé sur les filtres) et POST .../export (liste explicite d'IDs) retournant un fichier CSV (ou JSON, via export_format=json).
1. Domains
Domaines (et sous-domaines) découverts sur votre surface d'attaque, avec les données WHOIS et les enregistrements DNS.
1.1 List Domains
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Paginé par numéro de page (count/next/previous/results).
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs de Domain séparés par des virgules. |
| string | No | Recherche insensible à la casse sur le nom de domaine. |
| boolean | No |
|
| integer | No | Uniquement les sous-domaines directs de ce Domain ID. |
| integer | No | Uniquement les sous-domaines directs du Domain possédé par cet Asset ID. |
| integer | No | Uniquement les sous-domaines appartenant à ce Domain ID apex. |
| integer | No | Uniquement les Domains résolvant actuellement vers cet IPv4 ID (résolution vue au cours des 90 derniers jours). |
| string | No |
|
| integer | No | Pagination. |
Example request
GET /api/auth/domains?org_id=1&is_top_domain=true Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 42, "value": "example.com", "top_domain": null, "parent_domain": null, "www_domain": 43, "registrar": ["Example Registrar Inc."], "registrar_id": 292, "registrar_url": ["https://www.example-registrar.com"], "registrar_status": ["clientTransferProhibited"], "registrant_name": ["REDACTED FOR PRIVACY"], "registrant_country": ["FR"], "registrant_state_province": ["Ile-de-France"], "dnsrecords": [ { "record_type": "A", "value": "203.0.113.10" }, { "record_type": "MX", "value": "mail.example.com" } ], "creation_dates": ["1997-08-14T04:00:00Z"], "updated_dates": ["2025-08-10T09:12:00Z"], "expiration_dates": ["2026-08-14T04:00:00Z"], "name_servers": ["ns1.example.com", "ns2.example.com"], "whois_text": "Domain Name: EXAMPLE.COM\n...", "created_at": "2025-01-10T09:00:00Z", "updated_at": "2025-08-10T09:12:00Z" } ] }top_domain, parent_domain et www_domain sont des IDs de Domain (ou null). dnsrecords est une liste aplatie construite à partir de la résolution DNS brute ; registrar*/registrant*/creation_dates/updated_dates/expiration_dates/name_servers sont des tableaux car le WHOIS peut renvoyer plusieurs valeurs par champ.
Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
1.2 Get a Domain by ID
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Même forme de réponse qu'un élément de la liste ci-dessus.
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | Domain introuvable ou non accessible. |
1.3 Export Domains
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
GET exporte tous les Domains correspondant aux filtres de liste ci-dessus (y compris parent_asset_id/parent_domain_id pour exporter les sous-domaines, ou ipv4_id pour exporter les Domains résolvant vers une IPv4). POST n'exporte que les IDs donnés.
Query parameters : identiques à List, plus export_format (csv par défaut, ou json).
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs de Domain à exporter. Au moins un. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
404 | Un ou plusieurs IDs demandés ne sont pas accessibles. |
2. IPv4 addresses
Adresses IPv4 possédées par vos assets, ainsi que les adresses contextualisées (IPs tierces vers lesquelles vos domaines résolvent, que vous ne possédez pas).
2.1 List IPv4 addresses
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Inclut à la fois les adresses que vous possédez et les IPs contextualisées vers lesquelles vos domaines résolvent. Filtrez sur is_owned pour ne garder que les adresses que vous possédez.
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs d'IPv4 séparés par des virgules. |
| string | No | Recherche texte sur la valeur de l'IP. |
| string | No | Adresse IPv4 exacte. |
| string | No | Type d'IP : |
| boolean | No | Uniquement les IPs présentes sur une liste de blocage. |
| integer | No | Filtre par ID d'ASN. |
| boolean | No |
|
| integer | No | Uniquement les IPs résolues depuis le Domain possédé par cet Asset ID. |
| string | No |
|
Example request
GET /api/auth/ipv4s?org_id=1&is_owned=true Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 501, "value": "203.0.113.10", "asn": 64500, "type": "static", "in_blocklist": false, "blocklists": [], "provider": { "cdn": null, "cloud": "AWS", "saas": null, "waf": null }, "created_at": "2026-01-05T09:00:00Z", "updated_at": "2026-08-14T07:12:00Z" } ] }asn est l'ID numérique de l'ASN (utilisez GET /api/auth/asns/{asn} pour en obtenir le détail), pas le numéro d'AS lui-même.
Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
2.2 Retrieve an IPv4 address
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | IPv4 introuvable ou non accessible. |
2.3 Export IPv4 addresses
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
GET — mêmes filtres que List, plus export_format. POST — liste explicite d'IDs.
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs d'IPv4 à exporter. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
404 | POST : un ou plusieurs |
3. Resolutions
Les liens entre un Domain et les adresses IPv4 vers lesquelles il résout.
Fenêtre de visibilité : GET /api/auth/resolutions ne renvoie que les résolutions observées au cours des 90 derniers jours. Une résolution devenue obsolète au-delà de cette fenêtre n'est plus renvoyée par l'API (bien que l'enregistrement soit conservé en interne). Dans cette fenêtre de 90 jours, le champ resolves indique si la résolution est toujours considérée comme actuelle (revue au cours des 15 derniers jours) — voir ci-dessous.
3.1 List resolutions
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs de résolution séparés par des virgules. |
| string | No | Recherche texte sur la valeur du domaine ou de l'IPv4. |
| integer | No | Filtre par ID de Domain. |
| integer | No | Filtre par ID d'IPv4. |
| string | No | Valeur exacte du domaine (insensible à la casse). |
| string | No | Adresse IPv4 exacte. |
| boolean | No |
|
| datetime | No | Première observation le/après ou le/avant cette date. |
| datetime | No | Dernière observation le/après ou le/avant cette date. |
| string | No |
|
Example request
GET /api/auth/resolutions?org_id=1&resolves=true Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 9001, "domain": { "id": 12, "value": "www.acme.example" }, "ipv4": { "id": 501, "value": "203.0.113.10", "type": "static" }, "first_resolved_at": "2026-01-05T09:00:00Z", "last_resolved_at": "2026-09-20T03:00:00Z", "resolves": true, "created_at": "2026-01-05T09:00:00Z", "updated_at": "2026-09-20T03:00:00Z" } ] }Il n'y a pas de champ state sur cette ressource : la fraîcheur est exprimée uniquement via resolves et l'horodatage last_resolved_at.
Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
3.2 Retrieve a resolution
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | Resolution introuvable, non accessible, ou en dehors de la fenêtre de visibilité de 90 jours. |
3.3 Export resolutions
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
GET — mêmes filtres que List, plus export_format. POST — liste explicite d'IDs.
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs de résolution à exporter. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
404 | POST : un ou plusieurs |
4. ASNs
Systèmes autonomes (ASN) associés aux adresses IPv4 de vos assets.
4.1 List ASNs
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs d'ASN séparés par des virgules. |
| string | No | Recherche texte sur le numéro, la description, le CIDR ou le registre. |
| string | No | Numéro d'ASN, brut ( |
| string | No | Correspondance partielle (contient) sur le bloc CIDR. |
| string | No | Registre exact (ex. |
| string | No | Code pays exact, insensible à la casse. |
| string | No |
|
Example request
GET /api/auth/asns?org_id=1&country_code=FR Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 77, "number": "AS64500", "cidr": "203.0.113.0/24", "registry": "RIPE", "description": "ACME-NET", "country_code": "FR", "ipv4_count": 12, "created_at": "2026-01-05T09:00:00Z", "updated_at": "2026-08-14T07:12:00Z" } ] }number est une chaîne lisible préfixée par AS (ex. "AS64500"), pas un simple entier. ipv4_count est le nombre d'adresses IPv4 visibles par l'appelant appartenant à cet ASN.
Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
4.2 Retrieve an ASN
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | ASN introuvable ou non accessible. |
4.3 Export ASNs
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
GET — mêmes filtres que List, plus export_format. POST — liste explicite d'IDs.
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs d'ASN à exporter. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
404 | POST : un ou plusieurs |
5. Services
Services réseau (ports ouverts) détectés sur les assets scannés.
5.1 List Services
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Paginé par numéro de page. Le texte de la bannière n'est servi que par la route de détail ; la liste n'en indique que la présence via has_banner.
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs de Service séparés par des virgules. |
| string | No | Recherche dans le nom du service, le texte de la bannière et le numéro de port. |
| integer | No | Uniquement les Services exposant ce WebServer ID. |
| boolean | No | Uniquement les Services avec (ou sans) certificat TLS. |
| string | No | Liste d'IDs de Certificate séparés par des virgules. |
| string | No | Liste d'IDs de Technology séparés par des virgules, détectées sur le service. |
| string | No | Type d'asset sous-jacent (Domain, IPv4, ...). |
| string | No |
|
| string | No |
|
| string | No | Liste de valeurs de disponibilité d'asset séparées par des virgules. |
| boolean | No | Uniquement les services utilisant TLS. |
| integer | No | Numéro de port exact. |
| string | No |
|
Example request
GET /api/auth/services?org_id=1&state=open&protocol=tcp Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 501, "value": "203.0.113.10", "asset_type": "ipv4", "name": "https", "protocol": "tcp", "port_number": 443, "state": "open", "is_ssl": true, "has_banner": true, "certificate": { "id": 88, "serial_number": "0A1B2C3D4E5F", "is_expired": false, "is_mismatched": false, "is_selfsigned": false }, "webservers": [ { "id": 77, "url": "https://example.com/", "server": "nginx", "title": "Example Domain", "path": "/", "jarm": "27d27d27d29d27d1dc27d27d27d27d..." } ], "last_seen": "2026-09-20T06:00:00Z", "created_at": "2025-01-10T09:00:00Z", "updated_at": "2026-09-20T06:00:00Z" } ] }Un state à closed signifie que le Service n'a pas été réobservé au cours des 14 derniers jours (ou est confirmé fermé d'une autre manière).
Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
5.2 Get a Service by ID
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Mêmes champs que l'élément de liste, plus le texte complet de la banner.
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | Service introuvable ou non accessible. |
5.3 Export Services
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
GET n'exporte que les Services ouverts, selon les filtres de liste. POST exporte la liste explicite d'IDs quel que soit l'état. Les deux incluent le texte complet de la banner.
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
404 | Un ou plusieurs IDs demandés ne sont pas accessibles. |
6. Web servers
Serveurs web détectés sur les services exposés par vos assets.
6.1 List Web servers
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs de Web server séparés par des virgules. |
| string | No | Recherche texte sur la valeur de l'asset, l'URL, le titre, le chemin et le serveur. |
| string | No | Valeur exacte de l'asset (insensible à la casse). |
| string | No | URL exacte (insensible à la casse). |
| string | No | Filtre exact sur l'en-tête serveur. |
| string | No | Filtre exact sur le titre de la page. |
| string | No | Filtre exact sur l'empreinte JARM. |
| integer | No | Filtre exact sur le code de statut HTTP renvoyé. |
| integer | No | Filtre sur l'ID du Service associé. |
| boolean | No | Filtre selon que le Service sous-jacent utilise SSL. |
| string | No | Filtre sur l'état du Service sous-jacent ( |
| integer | No | Restreint aux Web servers appartenant à cet Asset. |
| string | No |
|
Example request
GET /api/auth/webservers?org_id=1&is_ssl=true Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 42, "value": "www.acme.example", "service": { "id": 100, "port_number": 443, "protocol": "tcp", "is_ssl": true, "state": "open" }, "url": "https://www.acme.example/", "server": "nginx/1.25.3", "path": "/", "title": "Acme — Home", "response_time": 0.183, "status_code": 200, "content_length": 15234, "content_type": "text/html; charset=utf-8", "jarm": "27d3ed3ed0003ed1dc42d43d00041d4689e...", "favicon_hash": "-1179287843", "created_at": "2026-02-20T10:00:00Z", "updated_at": "2026-08-14T07:12:00Z" } ] }Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
6.2 Retrieve a Web server
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | Web server introuvable ou non accessible. |
6.3 Export Web servers
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
GET exporte selon les mêmes filtres que List, plus export_format. POST exporte une liste explicite d'IDs.
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs de Web server à exporter. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
404 | POST : un ou plusieurs |
7. Certificates
Certificats TLS détectés sur les services de vos assets. Un Certificate est unique par numéro de série et n'est renvoyé qu'une seule fois, quel que soit le nombre de Services qui le présentent. Chaque ligne porte la matière première du certificat.
7.1 List Certificates
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs de Certificate séparés par des virgules. |
| string | No | Recherche dans le numéro de série, le texte brut du certificat et la valeur des assets qui le présentent. |
| string | No | Correspondance exacte sur le numéro de série (insensible aux deux-points et à la casse). |
| boolean | No | Filtre les certificats expirés / non expirés. |
| boolean | No | Filtre les certificats dont le nom ne correspond pas au domaine. |
| boolean | No | Filtre les certificats auto-signés. |
| string | No | Correspondance exacte (insensible à la casse) sur la valeur d'un asset présentant le certificat. |
| integer | No | Filtre par le port d'un service présentant le certificat. |
| string | No |
|
Example request
GET /api/auth/certificates?is_expired=false&sorted_by=-created_at Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 42, "serial_number": "0A:1B:2C:3D:4E:5F", "services": [ { "id": 501, "value": "app.example.com", "asset_type": "domain", "protocol": "tcp", "port_number": 443 } ], "is_expired": false, "is_mismatched": false, "is_selfsigned": false, "created_at": "2026-08-01T09:00:00Z", "updated_at": "2026-09-10T09:00:00Z", "data_text": "Certificate:\n Data:\n Version: 3 ...", "data_pem": "-----BEGIN CERTIFICATE-----\nMIIC...\n-----END CERTIFICATE-----", "data_parsed": { "subject": { "CN": "app.example.com" }, "issuer": { "CN": "Let's Encrypt" }, "not_before": "2026-08-01T00:00:00Z", "not_after": "2026-10-30T00:00:00Z" } } ] }Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
7.2 Retrieve a Certificate
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
404 | Certificate introuvable ou non accessible. |
7.3 Export Certificates
GET exporte selon les mêmes filtres que List ; POST n'exporte que les IDs donnés. Les champs bruts du certificat (data_text, data_pem, data_parsed) sont exclus de l'export.
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs de Certificate à exporter. Au moins un. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
404 | Un ou plusieurs |
8. Vendors
Le catalogue des éditeurs des technologies détectées sur vos assets (un catalogue global, non restreint par organisation ni par asset).
8.1 List Vendors
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| string | No | Liste d'IDs de Vendor séparés par des virgules. |
| string | No | Recherche insensible à la casse sur le nom de l'éditeur. |
| string | No |
|
Example request
GET /api/auth/vendors?search=microsoft&sorted_by=-products_count Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 7, "name": "Microsoft", "products_count": 12, "created_at": "2026-08-01T09:00:00Z", "updated_at": "2026-09-10T09:00:00Z" } ] }products_count est le nombre de Products référencés pour cet éditeur.
Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
8.2 Retrieve a Vendor
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
404 | Vendor introuvable. |
8.3 Export Vendors
GET exporte selon les mêmes filtres que List ; POST n'exporte que les IDs donnés.
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs de Vendor à exporter. Au moins un. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
404 | Un ou plusieurs |
9. Products
Le catalogue des produits (application, système d'exploitation, matériel) appartenant à un Vendor, utilisé pour identifier les technologies détectées sur vos assets (un catalogue global, non restreint par organisation ni par asset).
9.1 List Products
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| string | No | Liste d'IDs de Product séparés par des virgules. |
| string | No | Recherche insensible à la casse sur le nom du produit ou celui de son éditeur. |
| string | No | Liste d'IDs de Vendor séparés par des virgules. Restreint aux produits de ces éditeurs. |
| string | No | Type de produit : |
| string | No |
|
Example request
GET /api/auth/products?type=operating_system&vendor=7 Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 101, "vendor": { "id": 7, "name": "Microsoft" }, "name": "Windows Server", "type": "operating_system", "partial_cpe": "cpe:2.3:o:microsoft:windows_server", "created_at": "2026-08-01T09:00:00Z", "updated_at": "2026-09-10T09:00:00Z" } ] }Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
9.2 Retrieve a Product
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
404 | Product introuvable. |
9.3 Export Products
GET exporte selon les mêmes filtres que List ; POST n'exporte que les IDs donnés.
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs de Product à exporter. Au moins un. |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes membre d'aucune organisation. |
404 | Un ou plusieurs |
10. Technologies
Technologies (produits logiciels/matériels et versions) détectées sur vos assets. Une ligne par combinaison produit/version distincte — voir §11 pour la vue par détection (quel asset, quel service, quand).
10.1 List Technologies
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs de Product séparés par des virgules. |
| string | No | Liste d'IDs de Vendor séparés par des virgules. |
| string | No | Correspondance de sous-chaîne insensible à la casse sur la version détectée. |
| string | No | Catégorie de produit (voir la ressource Products). |
| boolean | No | Uniquement les Technologies ayant au moins une détection marquée comme pertinente/non pertinente. |
| string | No | Uniquement les Technologies ayant une détection de cette source : |
| string | No | Correspond au nom du produit, au nom de l'éditeur ou à la version (termes séparés par des espaces, ET entre les mots). |
| integer | No | Uniquement les Technologies détectées sur cet Asset ID. |
| string | No |
|
Example request
GET /api/auth/technologies?org_id=1&product_ids=12 Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 900, "product": { "id": 12, "name": "nginx", "vendor": { "id": 4, "name": "F5, Inc." } }, "version": "1.25.3", "partial_cpe": "cpe:2.3:a:f5:nginx:1.25.3", "created_at": "2025-01-10T09:00:00Z", "updated_at": "2026-09-20T06:00:00Z" } ] }Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
10.2 Get a Technology by ID
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | Technology introuvable ou non accessible. |
10.3 Retrieve aggregates for a list of Technologies
Renvoie le nombre d'assets, le nombre de CVE et la date de dernière observation pour un lot d'IDs de Technology — utile pour construire une vue de synthèse sans une requête par Technology.
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters : mêmes paramètres de portée que List (org_id, asset_ids, protections, outside_business_hours, teams).
Request body (JSON)
Field | Type | Required | Description |
| array of integers | Yes | IDs de Technology pour lesquels calculer les compteurs. Au moins un, max 500. |
Example request
POST /api/auth/technologies/aggregates?org_id=1 Authorization: Token <your-API-token> Content-Type: application/json Accept: application/json { "ids": [900, 901] }Example response 200 OK
{ "counts": [ { "id": 900, "assets": 12, "cves": 3, "last_seen_at": "2026-09-20T06:00:00Z" }, { "id": 901, "assets": 0, "cves": 0, "last_seen_at": null } ] }Possible status codes
Code | Description |
200 | Succès. |
400 | Payload invalide ( |
401 | Non autorisé. |
10.4 Export Technologies
GET exporte selon les mêmes filtres que List ; POST n'exporte que les IDs donnés.
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
404 | Un ou plusieurs IDs demandés ne sont pas accessibles. |
11. Technology Detections — nouveau
Nouvelle ressource. Là où le §10 (Technologies) vous donne une ligne par combinaison produit/version distincte, cette ressource vous donne chaque détection individuelle : sur quel asset, quel service, quel scanner, et quand. Utilisez-la pour répondre à « où exactement cette technologie tourne-t-elle » plutôt qu'à « cette technologie est-elle présente ».
Cycle de vie automatique : une détection automatique (source autre que CUSTOM) qui n'a pas été réobservée depuis 14 jours est automatiquement marquée is_relevant: false — à l'image du comportement de fermeture automatique des Services décrit au §5. Les détections que vous avez ajoutées manuellement (source: "custom") ne sont jamais rétrogradées automatiquement de cette façon, et une détection sur un asset qui n'est plus scanné est laissée telle quelle plutôt que d'être supposée obsolète.
11.1 List Technology detections
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Query parameters
Parameter | Type | Required | Description |
| — | No | Voir les paramètres de portée de base ci-dessus. |
| string | No | Liste d'IDs de Technology detection séparés par des virgules. |
| string | No | Liste d'IDs de Technology séparés par des virgules. |
| string | No | Liste d'IDs de Product séparés par des virgules. |
| string | No | Liste d'IDs de Vendor séparés par des virgules. |
| string | No | Liste d'IDs de Service séparés par des virgules. |
| string | No | Correspondance de sous-chaîne insensible à la casse sur la version détectée. |
| boolean | No | Uniquement les détections marquées comme pertinentes (ou non pertinentes). |
| string | No | Uniquement les détections de cette source : |
| string | No | Correspond à la valeur de l'asset, au nom de l'éditeur, au nom du produit, à la version ou au nom du service (termes séparés par des espaces, ET entre les mots). |
| datetime | No | Première observation le/après ou le/avant cette date. |
| datetime | No | Dernière observation le/après ou le/avant cette date. |
| string | No |
|
Example request
GET /api/auth/technology-detections?org_id=1&technology_ids=900 Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "count": 1, "next": null, "previous": null, "results": [ { "id": 5001, "value": "203.0.113.10", "asset_type": "ipv4", "technology": { "id": 900, "product": { "id": 12, "name": "nginx", "vendor": { "id": 4, "name": "F5, Inc." } }, "version": "1.25.3", "partial_cpe": "cpe:2.3:a:f5:nginx:1.25.3", "created_at": "2025-01-10T09:00:00Z", "updated_at": "2026-09-20T06:00:00Z" }, "service": { "id": 501, "name": "https", "protocol": "tcp", "port_number": 443 }, "source": "auto", "confidence": 90, "is_relevant": true, "first_seen_at": "2026-01-10T09:00:00Z", "last_seen_at": "2026-09-20T06:00:00Z", "created_at": "2026-01-10T09:00:00Z", "updated_at": "2026-09-20T06:00:00Z" } ] }Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
11.2 Get a Technology detection by ID
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | Technology detection introuvable ou non accessible. |
11.3 Export Technology detections
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
GET exporte selon les mêmes filtres que List, plus export_format. POST exporte une liste explicite d'IDs.
Request body (JSON, POST only)
Field | Type | Required | Description |
| array of integers | Yes | IDs de Technology detection à exporter. Au moins un. |
Colonnes exportées : value, vendor, product, version, cves (nombre de CVE), service_name, service_protocol, service_port_number, is_relevant, first_seen_at, last_seen_at.
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
403 | Vous n'êtes pas membre de l'organisation demandée. |
404 | POST : un ou plusieurs |
12. CVEs
Le catalogue des CVE croisé avec les Technologies détectées sur vos assets.
12.1 List CVEs
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Paginé par curseur (pas par numéro de page) : utilisez le paramètre de requête cursor renvoyé dans la réponse pour récupérer la page suivante.
Query parameters
Parameter | Type | Required | Description |
| date | No | Restreint aux CVE publiées le/après ou le/avant (inclus) cette date. |
| string | No | Liste de sévérités séparées par des virgules : |
| string | No | Correspondance de sous-chaîne sur l'identifiant de la CVE. |
| boolean | No | Indicateurs de threat intelligence. |
| string | No | Liste d'IDs de Technology séparés par des virgules. |
| string | No | Liste d'IDs de Product séparés par des virgules. |
| string | No | Liste d'IDs de Vendor séparés par des virgules. |
| integer | No | Uniquement les CVE affectant des Technologies détectées sur cet Asset ID. |
| boolean | No | Uniquement les CVE affectant au moins une Technology détectée sur vos assets. |
| string | No | Combiné avec |
| string | No | Liste d'IDs d'équipe séparés par des virgules. Appliqué uniquement quand |
| integer | No | Appliqué uniquement quand |
| string | No |
|
| string / integer | No | Pagination par curseur. |
Example request
GET /api/auth/cves?severity=critical,high&is_kev=true Authorization: Token <your-API-token> Accept: application/json
Example response 200 OK
{ "next": "https://dashboard.cloud.patrowl.io/api/auth/cves?cursor=cD0yMDI2LTA5LTIw", "previous": null, "results": [ { "id": 55123, "identifier": "CVE-2026-12345", "published_at": "2026-09-15T00:00:00Z", "description": "A stack buffer overflow in ...", "severity": "critical", "cvss": { "score": 9.8, "version": 3 }, "threat_info": { "is_exploitable": true, "is_in_the_news": false, "is_in_the_wild": true, "is_kev": true }, "technologies": [ { "id": 900, "product": "nginx", "version": "1.25.3", "vendor": "F5, Inc.", "partial_cpe": "cpe:2.3:a:f5:nginx:1.25.3" } ], "references": ["https://nvd.nist.gov/vuln/detail/CVE-2026-12345"] } ] }cvss indique le score et la version majeure du CVSS (2, 3 ou 4, sous forme d'entier) de la version CVSS la plus élevée disposant d'un score (v4 > v3 > v2) ; null si aucun score n'est disponible.
Possible status codes
Code | Description |
200 | Succès. Page vide si les filtres ne correspondent à rien. |
401 | Non autorisé. |
12.2 Retrieve a CVE by identifier
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
{identifier} est l'identifiant de la CVE lui-même (ex. CVE-2026-12345), pas un ID numérique.
Example response 200 OK — mêmes champs de base que la liste, plus cwe, cwe_name, exploits (chacun avec reference, notes, trust_level, tlp_level, source, availability, type, maturity, relevancy_level, published_at, modified_at), les vecteurs/scores CVSS par version (cvss2_vector, cvss2_score, cvss3_vector, cvss3_score, cvss4_vector, cvss4_score), epss_score, epss_percentile, hears_score, created_at, updated_at.
Possible status codes
Code | Description |
200 | Succès. |
401 | Non autorisé. |
404 | CVE introuvable. |
12.3 Count CVEs
GET /api/auth/cves/count — renvoie {"count": <int>} pour les CVE correspondant aux mêmes filtres que List. Permission : Membre de l'organisation.
12.4 Count CVEs by severity
GET /api/auth/cves/by-severity — renvoie les comptes regroupés par sévérité pour les CVE correspondant aux filtres de List :
{ "info": 0, "low": 12, "medium": 34, "high": 9, "critical": 2 }12.5 Exploitability statistics
GET /api/auth/cves/statistics — compte, parmi les CVE correspondant aux filtres de List, celles potentiellement exploitables et celles qui sont des Known Exploited Vulnerabilities (KEV), chacune avec un total et un compte sur la dernière semaine :
{ "potentially_exploitable": { "total": 15, "since_last_week": 2 }, "kev": { "total": 3, "since_last_week": 0 } }12.6 Count CVEs by qualification
GET /api/auth/cves/by-qualification?org_id=1&related_to_org_assets=false — répartit le compte entre les CVE propres à votre organisation et l'ensemble du catalogue, plus le nombre potentiellement exploitables :
{ "my_cve": 8, "all": 128340, "potentially_exploitable": 15 }12.7 Related assets count
POST /api/auth/cves/related-assets-count?org_id=1 avec le corps {"ids": [55123, 55124]} — renvoie, pour chaque CVE ID demandé, le nombre de vos assets affectés :
{ "counts": [{ "id": 55123, "count": 4 }, { "id": 55124, "count": 0 }] }Possible status codes (les quatre endpoints ci-dessus)
Code | Description |
200 | Succès. |
400 | Payload ou paramètres de requête invalides. |
401 | Non autorisé. |
12.8 Export CVEs — mis à jour
Item | Value |
Method |
|
URL |
|
Permission | Membre de l'organisation |
Mêmes filtres que List, plus export_format (csv par défaut, ou json). Corps de la requête POST : {"ids": [...]}.
La forme de l'export diffère désormais selon le format :
Colonnes CSV :
identifier,severity,cvss2_score,cvss3_score,cvss4_score,published_at,is_exploitable,is_in_the_news,is_in_the_wild,is_kev. Chaque version de CVSS a désormais sa propre colonne, au lieu d'une seule colonnecvss3_score.Colonnes JSON (
export_format=json) :identifier,severity,cvss,published_at,is_exploitable,is_in_the_news,is_in_the_wild,is_kev.cvssreflète l'objet{score, version}du payload de la liste (la version CVSS la plus élevée disponible) au lieu de trois colonnes de score à plat.
Note pour les intégrations existantes : si vous analysez l'export CSV, la colonne cvss3_score est désormais rejointe par cvss2_score et cvss4_score — passez d'un parsing basé sur la position des colonnes à un parsing basé sur le nom des colonnes si ce n'est pas déjà le cas.
Possible status codes
Code | Description |
200 | Fichier renvoyé. |
400 |
|
401 | Non autorisé. |
13. Asset service & topology aggregates — considérablement enrichi
Un moyen léger d'obtenir, pour un lot d'assets, un ensemble d'indicateurs de synthèse EASM sans lister chaque enregistrement Domain/IPv4/Service sous-jacent. La forme de la réponse de cet endpoint s'est considérablement étoffée : en plus du résumé des services ouverts, il renvoie désormais aussi des agrégats de topologie/DNS (domaines résolvants, sous-domaines liés, IPs résolues) et des informations de regroupement par sous-réseau.
Item | Value |
Method |
|
URL |
|
Permission | Utilisateur authentifié (la visibilité des assets s'applique par asset) |
Request body (JSON)
Field | Type | Required | Description |
| array of integers | Yes | IDs d'Asset pour lesquels calculer les agrégats. Au moins un, max 500. |
| object (string → string) | No | Les mêmes paramètres de requête que ceux acceptés par l'endpoint de liste des Assets (ex. |
Example request
POST /api/auth/assets/aggregates Authorization: Token <your-API-token> Content-Type: application/json Accept: application/json { "asset_ids": [100, 101], "filters": { "availability": "available" } }Example response 200 OK
{ "aggregates": { "100": { "open_service_count": 3, "top_service": { "name": "https", "port_number": 443 }, "resolving_domains": { "count": 2, "top": { "id": 55, "value": "www.acme.example", "protection": { "status": "easm", "availability": "available" }, "outside_business_hours": 0 } }, "related_subdomains": null, "resolved_ips": null, "subnet": { "group_id": 9, "cidr": "203.0.113.0/24", "count": 14 } }, "101": { "open_service_count": 0, "top_service": null, "resolving_domains": null, "related_subdomains": { "count": 5, "top": { "id": 61, "value": "blog.acme.example", "protection": { "status": "unprotected", "availability": "available" }, "outside_business_hours": 0 } }, "resolved_ips": { "count": 1, "top": { "ownership": "contextualized", "id": null, "value": "198.51.100.7", "protection": null, "outside_business_hours": null } }, "subnet": null } } }Champs, par asset demandé :
Field | Description |
| Nombre de Services ouverts sur l'asset. |
| Le Service ouvert avec le port le plus bas ( |
| Assets IP uniquement. Nombre et dernier vu des assets de type domaine résolvant actuellement vers cette IP (résolution vue au cours des 15 derniers jours). |
| Assets de type domaine uniquement. Nombre et premier (par ordre alphabétique) des assets de type domaine qui sont des enfants directs de ce domaine. |
| Assets de type domaine uniquement. Nombre et dernière résolution des adresses IPv4 (possédées ou contextualisées) vers lesquelles ce domaine résout. |
| Assets IP uniquement. Le groupe de sous-réseau le plus spécifique auquel appartient cette IP ( |
Chaque agrégat de topologie (resolving_domains, related_subdomains, resolved_ips) suit la forme {count, top}, où top est :
id,value,protection: {status, availability},outside_business_hours— pourresolving_domains/related_subdomains(toujours un Asset réel) ;les mêmes champs plus
ownership("owned"ou"contextualized") pourresolved_ips— une entrée"contextualized"(une IP résolue que vous ne possédez pas) porteid,protectionetoutside_business_hoursànull, puisqu'aucun Asset ne se trouve derrière.
Possible status codes
Code | Description |
200 | Succès. |
400 | Payload invalide ( |
401 | Non autorisé. |
14. Breaking changes
Ces changements affectent les intégrations existantes et nécessitent une action si vous dépendez des endpoints ou champs ci-dessous.
14.1 POST /api/auth/assets/{id}/ supprimé
La route de mise à jour d'un asset n'accepte plus POST. Utilisez PATCH /api/auth/assets/{id}/ pour mettre à jour un asset existant ; les corps de requête/réponse sont par ailleurs inchangés. GET /api/auth/assets/{id}/ (détail) n'est pas affecté.
14.2 Tableau assets et champ is_owned supprimés des ressources EASM
Les ressources suivantes ne renvoient plus de tableau assets (la liste des assets pouvant voir l'enregistrement) ni de champ is_owned (indiquant si l'enregistrement appartient à votre organisation) dans leurs payloads : Domains, IPv4 addresses, Services, Web servers, Certificates, Resolutions. Ces données inter-organisations ont été retirées des réponses EASM. Si vous utilisiez is_owned pour distinguer vos propres assets des assets tiers/contextuels, utilisez plutôt le filtre d'appartenance spécifique à la ressource lorsqu'il existe (ex. is_owned en tant que paramètre de requête sur GET /api/auth/ipv4s fonctionne toujours — seul le champ de réponse a été supprimé).
14.3 Champ state supprimé des Resolutions
easm.Resolution n'expose plus de champ state, et le filtre ?state=, l'option de tri correspondante ainsi que la colonne d'export ont tous été supprimés. Ce champ ne renvoyait de toute façon jamais que active et n'apportait pas d'information utile. Utilisez à la place le nouveau champ booléen resolves (true si la résolution a été observée au cours des 15 derniers jours). Notez également la fenêtre de visibilité de 90 jours décrite au §3 : les résolutions non réobservées dans cette fenêtre cessent complètement d'être renvoyées par l'API.
14.4 Domain.expiration_date renommé en expiration_dates
Le champ d'expiration WHOIS sur GET /api/auth/domains s'appelle désormais expiration_dates (au pluriel, cohérent avec les autres champs tableaux WHOIS creation_dates/updated_dates). Mettez à jour toute intégration lisant expiration_date.
14.5 Colonnes de l'export CSV des CVE modifiées
L'export CSV de GET/POST /api/auth/cves/export comporte désormais trois colonnes de score CVSS (cvss2_score, cvss3_score, cvss4_score) au lieu d'une seule (cvss3_score) — voir §12.8. Si vous analysez ce CSV par position de colonne plutôt que par nom d'en-tête, il s'agit d'un changement cassant.
15. Common error response format
Les erreurs de validation et de permission sont généralement renvoyées sous forme d'un corps JSON :
{ "detail": "Human-readable description of the error." }ou, pour les erreurs de validation spécifiques à un champ :
{ "<field_name>": "Human-readable description of the error." }Codes de statut HTTP utilisés dans ce document :
Code | Usage |
200 | Succès (y compris les exports). |
400 | Requête invalide (paramètres ou corps invalides/manquants). |
401 | Non autorisé (jeton manquant/invalide). |
403 | Interdit (vous n'êtes pas membre de l'organisation demandée). |
404 | Introuvable (la ressource n'existe pas, ou est en dehors de votre périmètre visible). |
16. Summary table
Resource | List | Retrieve | Export (GET/POST) |
Domains |
|
|
|
IPv4 addresses |
|
|
|
Resolutions |
|
|
|
ASNs |
|
|
|
Services |
|
|
|
Web servers |
|
|
|
Certificates |
|
|
|
Vendors |
|
|
|
Products |
|
|
|
Technologies |
|
|
|
Technology detections (nouveau) |
|
|
|
CVEs |
|
|
|
Asset aggregates | — | — |
|
Supprimé : POST /api/auth/assets/{id}/ (utilisez PATCH à la place, voir §14.1).
Nouveautés de cette version : la ressource Technology detections (§11) ; les champs resolving_domains, related_subdomains, resolved_ips et subnet sur POST /api/auth/assets/aggregates (§13) ; les colonnes CVSS par version sur l'export CSV des CVE (§12.8).
