Démarrage rapide
- Obtenez l’accès bêta auprès de TechAtelier.
- Créez une clé depuis votre espace développeur privé.
- Stockez-la dans un gestionnaire de secrets côté serveur.
- 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"}'
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éthode | URL | Rôle |
|---|---|---|
POST | https://infra.techatelier.fr/api/v1/scans | Créer une analyse |
GET | https://infra.techatelier.fr/api/v1/scans | Lister l’historique |
GET | https://infra.techatelier.fr/api/v1/scans/{scan_id} | Consulter une analyse |
POST | https://infra.techatelier.fr/api/v1/scans/{scan_id}/webhook | Relancer 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.
| Offre | Analyses mensuelles | Prix mensuel |
|---|---|---|
| API Free | 100 | 0 € |
| API Starter | 1 000 | 19 € |
| API Pro | 5 000 | 49 € |
| API Entreprise | Sur mesure | Sur 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ête | Signification |
|---|---|
X-RateLimit-Limit | Quota mensuel partagé du compte |
X-RateLimit-Remaining | Analyses restantes pour le compte |
X-RateLimit-Reset | Réinitialisation au format ISO 8601, en UTC |
Erreurs
{
"error": {
"code": "invalid_domain",
"message": "Le domaine fourni est invalide.",
"request_id": "req_0123456789abcdef"
}
}
| Statut | Code | Action conseillée |
|---|---|---|
| 400 | invalid_json | Corriger le JSON envoyé. |
| 401 | unauthorized | Vérifier la clé, sa révocation et sa permission. |
| 409 | idempotency_conflict | Utiliser une nouvelle clé pour une requête différente. |
| 409 | webhook_not_configured | Associer un webhook_url lors de la création. |
| 409 | scan_not_finished | Attendre l’état completed ou failed. |
| 422 | invalid_request | Ajouter le champ domain. |
| 422 | invalid_domain | Corriger le domaine ou l’URL. |
| 429 | quota_exceeded | Attendre la date indiquée par X-RateLimit-Reset. |
| 503 | scan_failed | Réessayer avec un délai progressif et transmettre le request_id si l’erreur persiste. |
| 503 | webhook_retry_failed | Consulter 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.