API PARTENAIRE · VERSION 1

Intégrer une analyse InfraCheck

L’API TechAtelier place chaque analyse dans une file persistante et permet d’en suivre l’état jusqu’au résultat JSON stable. La bêta est ouverte progressivement à des comptes partenaires autorisés.

Démarrage rapide

  1. Obtenez l’accès bêta auprès de TechAtelier.
  2. Créez une clé depuis votre espace développeur privé.
  3. Stockez-la dans un gestionnaire de secrets côté serveur.
  4. Appelez l’endpoint avec l’en-tête Bearer.
curl -X POST https://infra.techatelier.fr/api/v1/scans \
  -H "Authorization: Bearer $TECHATELIER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: scan-example-fr-001" \
  -d '{"domain":"example.fr","webhook_url":"https://example.fr/webhooks/techatelier"}'
Clé confidentielle

Une clé commence par ta_live_ et n’est affichée qu’à sa création. Ne l’intégrez jamais dans une application mobile ou du JavaScript envoyé au navigateur.

Endpoints

MéthodeURLRôle
POSThttps://infra.techatelier.fr/api/v1/scansCréer une analyse
GEThttps://infra.techatelier.fr/api/v1/scansLister l’historique
GEThttps://infra.techatelier.fr/api/v1/scans/{scan_id}Consulter une analyse
POSThttps://infra.techatelier.fr/api/v1/scans/{scan_id}/webhookRelancer le webhook

Le corps JSON accepte un seul champ requis : domain, sous la forme d’un nom de domaine ou d’une URL à analyser.

{"domain":"https://example.fr"}

Réponse et suivi

Le statut 202 Accepted confirme la mise en file. Utilisez ensuite status_url jusqu’à obtenir l’état completed ou failed.

{
  "request_id": "req_0123456789abcdef",
  "data": {
    "id": "scan_0123456789abcdef0123456789abcdef",
    "status": "queued",
    "domain": "example.fr",
    "created_at": "2026-09-13T20:00:00+00:00",
    "status_url": "/api/v1/scans/scan_0123456789abcdef0123456789abcdef"
  }
}
curl https://infra.techatelier.fr/api/v1/scans/scan_0123456789abcdef0123456789abcdef \
  -H "Authorization: Bearer $TECHATELIER_API_KEY"

Lorsque l’état vaut completed, le champ data.result contient le contrat d’analyse v1 complet. Une tâche failed expose un code et un message d’erreur sans détail interne.

Historique paginé

GET /api/v1/scans retourne uniquement les analyses créées avec la même clé. Utilisez limit (1 à 100), le filtre facultatif status et transmettez next_cursor dans le paramètre cursor pour obtenir la page suivante.

curl "https://infra.techatelier.fr/api/v1/scans?status=completed&limit=20" \
  -H "Authorization: Bearer $TECHATELIER_API_KEY"

Les consultations de liste et de détail ne consomment pas le quota mensuel d’analyses.

Webhooks signés

Ajoutez le champ facultatif webhook_url lors de la création d’un scan. TechAtelier place alors un événement scan.completed ou scan.failed dans une file persistante. Un premier envoi est effectué immédiatement, puis jusqu’à quatre reprises sont espacées après 1, 5, 15 et 60 minutes.

{
  "domain": "example.fr",
  "webhook_url": "https://example.fr/webhooks/techatelier"
}

Le détail d’un scan expose webhook.attempt_count, webhook.attempted_at, webhook.delivered_at, webhook.last_status_code et webhook.last_error pour diagnostiquer la dernière livraison. Le tableau webhook.deliveries conserve les dix livraisons automatiques ou manuelles les plus récentes, leur état et leur prochaine tentative.

curl -X POST https://infra.techatelier.fr/api/v1/scans/{scan_id}/webhook \
  -H "Authorization: Bearer $TECHATELIER_API_KEY"

Cette relance réutilise le résultat existant : elle ne relance pas l’analyse et ne consomme pas le quota. Elle est disponible uniquement pour un scan terminé auquel un webhook a été associé.

Vérifiez X-TechAtelier-Signature en calculant HMAC-SHA256(timestamp + "." + corps_brut, SHA256(clé_API)). L’en-tête contient v1=<signature hexadécimale> et le timestamp se trouve dans X-TechAtelier-Timestamp. Refusez les timestamps anciens et comparez les signatures en temps constant.

Relancer sans créer de doublon

Envoyez une valeur unique dans l’en-tête Idempotency-Key pour chaque nouvelle analyse. Si une coupure vous oblige à répéter exactement la même requête, réutilisez cette valeur : l’API retourne le scan déjà créé avec Idempotent-Replayed: true, sans consommer une seconde fois le quota. Une même clé réutilisée avec un domaine ou un webhook différent retourne 409 idempotency_conflict.

Offres et quotas

API Free inclut 100 analyses par mois. API Starter porte ce quota à 1 000 analyses pour 19 € par mois et API Pro à 5 000 analyses pour 49 € par mois. Les volumes supérieurs sont proposés sur devis. L’activation des offres payantes est réalisée sur demande pendant la phase d’ouverture.

OffreAnalyses mensuellesPrix mensuel
API Free1000 €
API Starter1 00019 €
API Pro5 00049 €
API EntrepriseSur mesureSur devis

Seule la création effective d’un nouveau scan est comptabilisée ; les requêtes invalides, les lectures, les relances de webhook et les répétitions idempotentes ne consomment pas le quota. Comparer les offres API.

Ces en-têtes accompagnent les nouvelles créations authentifiées :

En-têteSignification
X-RateLimit-LimitQuota mensuel partagé du compte
X-RateLimit-RemainingAnalyses restantes pour le compte
X-RateLimit-ResetRéinitialisation au format ISO 8601, en UTC

Erreurs

{
  "error": {
    "code": "invalid_domain",
    "message": "Le domaine fourni est invalide.",
    "request_id": "req_0123456789abcdef"
  }
}
StatutCodeAction conseillée
400invalid_jsonCorriger le JSON envoyé.
401unauthorizedVérifier la clé, sa révocation et sa permission.
409idempotency_conflictUtiliser une nouvelle clé pour une requête différente.
409webhook_not_configuredAssocier un webhook_url lors de la création.
409scan_not_finishedAttendre l’état completed ou failed.
422invalid_requestAjouter le champ domain.
422invalid_domainCorriger le domaine ou l’URL.
429quota_exceededAttendre la date indiquée par X-RateLimit-Reset.
503scan_failedRéessayer avec un délai progressif et transmettre le request_id si l’erreur persiste.
503webhook_retry_failedConsulter webhook.last_error puis corriger l’endpoint destinataire.

Exemple Node.js

const response = await fetch("https://infra.techatelier.fr/api/v1/scans", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.TECHATELIER_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": crypto.randomUUID()
  },
  body: JSON.stringify({ domain: "example.fr" })
});

const accepted = await response.json();
if (!response.ok) throw new Error(`${accepted.error.code}: ${accepted.error.message}`);

let scan;
do {
  await new Promise(resolve => setTimeout(resolve, 2000));
  const status = await fetch(`https://infra.techatelier.fr${accepted.data.status_url}`, {
    headers: {Authorization: `Bearer ${process.env.TECHATELIER_API_KEY}`}
  });
  scan = await status.json();
} while (["queued", "processing"].includes(scan.data.status));

if (scan.data.status === "failed") throw new Error(scan.data.error.message);
console.log(scan.data.result.score);

Versionnement

La version majeure figure dans l’URL. TechAtelier peut ajouter des champs optionnels à une réponse v1. La suppression d’un champ ou un changement incompatible nécessitera une nouvelle version majeure.

Accès à la bêta

L’accès est activé compte par compte. Chaque partenaire peut créer jusqu’à cinq clés actives, suivre leur consommation et les révoquer immédiatement dans l’espace développeur. Pour proposer une intégration, contactez contact@techatelier.fr.

Documentation v1 mise à jour le 14 septembre 2026.