Aller au contenu

Ironfang Audit

Référence de l'API

Explorez des sites web publics de manière contrôlée, évaluez des exigences déterministes et conservez des preuves d'audit vérifiables de manière indépendante.

Démarrage rapide

Créez un site dans le portail Ironfang (en anglais), ou directement via l'API. L'ID de site renvoyé sert à ajouter des règles et à lancer des audits.

curl -X POST https://api.ironfang.uk/audit/v1/sites \
              -H "Authorization: Bearer $IRONFANG_ACCESS_TOKEN" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Acme Finance",
                "url": "https://www.example.com"
              }'

Toute l'API existe aussi sous forme de collection Postman publique, générée à partir du contrat OpenAPI. Son dossier Getting started crée un site, déclenche un audit et en suit l'état ; la première requête ne demande aucune clé.

Exécuter dans PostmanVoir la collection

Clés API

Une automatisation peut utiliser une clé API de la plateforme au lieu d'un jeton utilisateur : créez-la dans le portail avec les portées Ironfang Audit dont elle a besoin et envoyez-la comme jeton bearer. Une clé n'agit que dans l'organisation pour laquelle elle a été créée, et chaque portée correspond à une permission : audit:read, audit:run, audit:manage, audit:evidence, audit:integrations, ou audit:* pour toutes. Une clé sans portée Ironfang Audit est refusée avec 403 insufficient_scope.

Règles déterministes

Les règles conservent leur version exacte dans chaque résultat. Les bases prises en charge incluent : le texte contient ou ne contient pas, les expressions régulières, la présence et le texte d'éléments, les liens, les métadonnées, le statut HTTP, HTTPS et les en-têtes de réponse.

{
              "name": "Company number is present",
              "rule_type": "text_contains",
              "severity": "failure",
              "configuration": { "value": "12764014" }
            }

Une défaillance du robot d'exploration est un état opérationnel de la preuve, pas l'échec d'une règle de conformité.

Cycle de vie d'un audit

queueddiscoveringcapturingfinalising evidencetimestampingcompleted

Les audits sont asynchrones. Utilisez l'ID d'audit permanent renvoyé pour interroger la ressource, ou consommez les webhooks de cycle de vie signés par HMAC. Les exports S3 et la livraison des webhooks réessaient indépendamment de la finalisation des preuves.

Chaîne de preuves

Chaque manifeste de page contient les hachages de sa capture d'écran brute, du HTML, du texte visible, des en-têtes et des métadonnées réseau. Les hachages des pages deviennent des feuilles de Merkle à séparation de domaine. Ironfang Audit signe le manifeste d'audit canonique avec Ed25519 et soumet le hachage racine de l'audit, et non le contenu du site, à une autorité d'horodatage RFC 3161.

Les captures brutes restent immuables. Les tuiles de capture d'écran et les rapports sont des dérivés de présentation dont la provenance est indiquée.

POST /verify/v1/bundles

Importez un ZIP de preuves avec Content-Type: application/zip, ou vérifiez-le entièrement hors ligne avec le vérificateur en ligne de commande.

ironfang audit verify -bundle evidence.zip \
              -trusted-public-key audit-ed25519.pub \
              -tsa-ca tsa-chain.pem

Le vérificateur recalcule les hachages des artefacts, valide l'appartenance de chaque page à l'arbre de Merkle et contrôle la signature d'Ironfang Audit à l'aide d'une clé de signature approuvée de manière indépendante. Avec une AC TSA de confiance configurée, il valide aussi la réponse RFC 3161. La clé intégrée à un ZIP n'est jamais acceptée comme sa propre ancre de confiance.

Des builds pour Linux, macOS et Windows sont publiés sous licence Apache 2.0. Chaque version publiée inclut des sommes de contrôle et une provenance de build Sigstore signée.

GET /v1/sites

Liste tous les sites Ironfang Audit disponibles pour l'organisation courante.

POST /v1/sites

Enregistre un site web public et son périmètre d'exploration. La réponse contient l'ID de site permanent utilisé par les règles et les audits.

ChampTypeRemarques
urlstringObligatoire. URL publique HTTP ou HTTPS.
namestringNom affiché. Par défaut, le nom d'hôte du site.
timezonestringFuseau horaire IANA utilisé par le navigateur contrôlé. Par défaut, UTC.
crawl_policyobjectFacultatif. Hôtes autorisés, limites de pages et contrôles d'exploration.

GET /v1/sites/{siteId}

Renvoie un site et sa politique d'exploration actuelle.

GET /v1/sites/{siteId}/rules

Liste les règles déterministes versionnées configurées pour un site.

POST /v1/sites/{siteId}/rules

Crée la première version immuable d'une règle déterministe.

ChampTypeRemarques
namestringObligatoire. Nom lisible de la règle.
descriptionstringFacultatif. Explication de l'exigence.
rule_typestringObligatoire. Type d'évaluateur déterministe.
severitystringSévérité du résultat. Par défaut, failure.
configurationobjectObligatoire. Configuration utilisée par l'évaluateur choisi.

GET /v1/audits

Liste les audits de l'organisation courante. Passez site_id en paramètre de requête pour limiter la réponse à un site.

POST /v1/sites/{siteId}/audits

Met en file d'attente un audit asynchrone. Envoyez un en-tête Idempotency-Key lorsqu'un client peut réessayer la requête.

ChampTypeRemarques
trigger_typestringOrigine de l'audit. Par défaut, manual.
reasonstringFacultatif. Motif lisible de l'audit.

GET /v1/audits/{auditId}

Interroge le statut de l'audit, son état de conformité, le nombre de pages et le hachage racine des preuves.

GET /v1/audits/{auditId}/pages

Liste les observations de pages capturées, les résultats des règles et la classification des modifications.

GET /v1/audits/{auditId}/evidence

Télécharge le ZIP de preuves vérifiable de manière indépendante une fois que l'audit a atteint completed ou partial. La réponse est de type application/zip.

GET /v1/artifacts/{artifactId}

Diffuse un artefact de preuve propre au locataire, avec son type de média enregistré.

GET /verify/v1/signing-keys

Renvoie le registre public des clés de signature utilisé par le vérificateur hébergé.

GET /v1/sites/{siteId}/monitors

Liste les moniteurs d'un site : ce qui est surveillé, à quelle fréquence, et quand la prochaine exécution est prévue.

POST /v1/sites/{siteId}/monitors

Crée un moniteur. mode vaut full_site (exploration) ou url_set (les pages de urls) ; cadence vaut manual, daily, six_hourly ou hourly, dans la limite de l'offre ; anchor_minute et timezone fixent le créneau quotidien. Chaque exécution planifiée est un audit complet, avec la même chaîne de preuves qu'un audit manuel.

Champ de change_policyTypeRemarques
ignored_selectorsstring[]Zones retirées du texte comparé (bannières de cookies, compteurs). Même sous-ensemble de sélecteurs que pour les règles.
min_text_changenumberPart des lignes (de 0 à 1) qui doivent différer pour que la page soit considérée comme modifiée.
min_visual_changenumberPart des pixels échantillonnés (de 0 à 1).
ignore_numbersbooleanMasque les nombres et les dates qui changent à chaque visite.
notify_only_on_rule_changebooleanSeul un changement de résultat d'une règle compte comme significatif.

La politique façonne la comparaison et la notification, jamais l'enregistrement : la capture d'écran brute, le HTML et le texte visible sont stockés intacts, et le texte normalisé est conservé à côté en tant que dérivé.

POST /v1/monitors/{monitorId}/run

Exécute le moniteur immédiatement. /pause, /resume et /archive changent le statut ; PUT /urls remplace l'ensemble de pages ; GET /runs liste les audits produits par le moniteur.

GET /v1/page-observations/{observationId}/comparison

Ce qui a changé par rapport à la capture précédente, calculé à partir des preuves stockées selon la politique de modification de l'audit : blocs de texte normalisé avec numéros de ligne, scores textuel et visuel, changements d'URL, de titre et de statut HTTP, résultats de règles qui ont changé, ID des artefacts de capture d'écran des deux côtés, et caractère significatif ou non de la modification. Une première capture n'a pas de côté précédent et en indique la raison.

GET /v1/pages/{pageId}/observations

L'historique d'une page d'un audit à l'autre, du plus récent au plus ancien. limit jusqu'à 200 ; passez le next_cursor renvoyé pour continuer.

GET /v1/audits/{auditId}/pages?change=changed&compliance=fail

La liste des pages accepte change (new, changed, moved, unchanged), compliance (pass, fail, error), capture (captured, failed) et q (sous-chaîne de l'URL ou du titre) ; chacun est une liste séparée par des virgules. total est le nombre non filtré.

GET /v1/events

Les événements récents de l'organisation (audit.started, audit.completed, audit.partial, audit.failed, change.detected, compliance.failed, monitor.skipped, quota.threshold_reached), avec la charge utile reçue par chaque webhook. Les enveloppes de webhook portent schema_version et l'ID de l'événement comme clé d'idempotence ; un endpoint est désactivé après 20 échecs consécutifs et réactivé avec PATCH /v1/webhooks/{endpointId} (enabled, events). DELETE retire un endpoint et conserve son historique ; POST .../deliveries/{deliveryId}/retry remet une livraison en file d'attente.

GET /v1/notification-preferences

Quels événements sont envoyés par e-mail, à qui, et s'ils partent immédiatement ou dans un récapitulatif quotidien (07:00 UTC). PUT avec events, recipients et digest ; les destinataires doivent être des membres actuels de l'organisation, et une clé API peut conserver la liste mais pas la modifier. Les e-mails contiennent des chiffres et un lien vers le portail, jamais de contenu capturé. GET /v1/notifications est le journal des envois.

GET /v1/webhooks

Liste les endpoints de webhook enregistrés pour l'organisation courante.

POST /v1/webhooks

Enregistre un endpoint HTTPS public. Le secret de signature HMAC est renvoyé une seule fois, dans la réponse de création.

ChampTypeRemarques
urlstringObligatoire. Destination HTTPS publique.
eventsstring[]Par défaut, audit.completed.

GET /v1/export-destinations

Liste les destinations de preuves S3 et compatibles S3 configurées.

POST /v1/export-destinations

Crée une destination S3 chiffrée. Les champs obligatoires sont region, bucket, access_key et secret_key. Les champs facultatifs incluent endpoint, prefix, path_style, session_token et export_mode.

POST /v1/audits/{auditId}/exports

Met en file d'attente l'export d'un audit terminé vers la destination_id fournie.

GET /v1/usage

Renvoie le total des pages capturées, des audits et des crédits de capture de page consommés par l'organisation, ainsi que l'offre qui s'applique à elle (le même catalogue que /v1/plans), pour qu'un client sache à l'avance quelles fréquences et combien de sites sont autorisés.

GET /v1/plans

Renvoie le catalogue des offres : prix en pence, crédits mensuels, limite de sites, fréquence minimale, conservation hébergée en jours et ouverture ou non du paiement. Sans authentification ; ce sont les mêmes données que celles qui servent à vérifier la page des tarifs.

Erreurs

Chaque erreur renvoyée par une opération a la même forme JSON : un code stable, un message destiné aux personnes, un lien vers cette section et l'ID de la requête.

{
  "error": {
    "code": "evidence_not_final",
    "message": "the evidence bundle is available after evidence finalisation",
    "docs": "https://ironfang.uk/audit/docs#errors"
  },
  "request_id": "01a0c375-6b34-7c1e-9b52-4f0a8d3e6c17"
}

Basez votre logique sur code et le statut HTTP : le code est stable et lisible par machine, tandis que message est rédigé pour les personnes et peut changer. De nouveaux codes peuvent être ajoutés ; traitez un code inconnu selon sa classe de statut. docs renvoie vers cette section. request_id reprend l'en-tête de réponse X-Ironfang-Request-ID ; communiquez-le au support et nous retrouverons la requête exacte.

StatutCodeSignification
400invalid_json, invalid_queryLe corps n'est pas une seule valeur JSON de la forme documentée (les champs inconnus sont refusés), ou un paramètre de requête est inconnu, répété ou mal formé.
401unauthorized, invalid_api_keyAucun jeton bearer, un jeton qui ne se vérifie pas, ou une clé API révoquée ou inconnue.
403forbidden, insufficient_scopeLes portées de la clé ne couvrent pas la route, le rôle de la personne dans l'organisation ne le permet pas, ou la requête désigne une organisation dans laquelle l'identifiant ne peut pas agir. Quand une permission manque, le message la nomme.
404not_foundCe site, cette règle, cet audit, ce constat, ce moniteur, ce webhook ou cette destination d'export n'existe pas dans cette organisation. Un objet qui appartient à une autre organisation est signalé de la même manière.
409evidence_not_final, monitor_archived, rule_retired, pack_already_installedLa requête est en conflit avec l'état de l'objet : le paquet de preuves a été demandé avant que l'audit n'atteigne completed ou partial, le moniteur est archivé, la règle est retirée, ou le pack de règles est déjà installé sur le site.
410evidence_expiredLes preuves hébergées ont dépassé leur durée de conservation. Les hachages et les métadonnées de signature restent sur l'audit.
422invalid_url, unsafe_url, invalid_rule, invalid_cadence, invalid_webhook_urlLe JSON est bien formé, mais une valeur n'est pas acceptable : une URL qui n'est pas en HTTP ou HTTPS public (HTTPS uniquement pour un webhook) ou qui ne se résout pas vers un hôte routable publiquement, une règle que son évaluateur ne peut pas accepter, une fréquence inconnue. Le message indique quelle valeur et pourquoi.
422site_limit, cadence_not_in_planL'offre de l'organisation ne le permet pas : le nombre de sites de l'offre est atteint, ou la fréquence est plus élevée que ce que l'offre planifie. GET /v1/usage renvoie l'offre en vigueur.
429rate_limitedLe vérificateur hébergé limite les requêtes par adresse client. Attendez le nombre de secondes indiqué dans Retry-After avant de réessayer.
500, 503internal_error, permissions_unavailable, verifier_busyL'erreur vient de nous. Un 503 est temporaire (les permissions n'ont pas pu être vérifiées, ou le vérificateur est saturé) : réessayez sous peu. Pour un 500, communiquez le request_id.

Cette liste n'est pas exhaustive. Un 422 n'a pas de corps d'erreur : POST /verify/v1/bundles répond à un ZIP de preuves non valide par le rapport de vérification lui-même.

Interfaces pour machines

InterfaceDétails
Page produithttps://ironfang.uk/audit
Documentationhttps://ironfang.uk/audit/docs
URL de base de l'APIhttps://api.ironfang.uk/audit
Contrat OpenAPIhttps://api.ironfang.uk/audit/openapi.yaml. Le même contrat est servi en JSON à https://api.ironfang.uk/audit/openapi.json.
AuthentificationClé API de la plateforme comme jeton bearer
Erreurshttps://ironfang.uk/audit/docs#errors. Un corps JSON avec un code stable, un message, ce lien et l'identifiant de la requête.
MCPDisponible. Lire les sites, les audits, les constats, les règles et l'utilisation, et lancer un audit limité d'un site. La modification d'une règle, d'un site, d'une surveillance ou d'un constat reste dans le portail et l'API REST. Les outils sont nommés audit.*. Référence du serveur MCP ; chaque outil et chaque schéma, sans jeton, à /.well-known/ironfang-mcp.json
Découverte/apis.json, /.well-known/api-catalog et /llms.txt

Lancé sous le nom Auditwolf. Ce nom ne subsiste que dans des identifiants de compatibilité : l'alias de chemin d'API https://api.ironfang.uk/auditwolf, le préfixe de scope auditwolf: et les identifiants ci-dessous continuent de fonctionner et sont des alias des noms actuels.

  • En-têtes de webhook Auditwolf-Signature, Auditwolf-Timestamp et Auditwolf-Event-Id
  • User-Agent du robot Auditwolf-Spiderwolf/1.0
  • Préfixe par défaut des clés d'export auditwolf/
  • La valeur de produit auditwolf dans le catalogue des offres servi à /audit/v1/plans