Aller au contenu

API CrashMire

Le crash-test dans votre chaîne de livraison.

Chaque fois que le prompt, les outils ou le modèle de votre agent changent, votre CI lance son crash-test et bloque la mise en production en cas de régression. Crédits prépayés, verdict automatique, résultats dans un format ouvert.

Acheter des crash-tests Démarrer en 3 appels

Comment ça marche

  1. Achetez des crash-tests

    Paiement en ligne, facture automatique. Chaque crédit vaut un crash-test complet : six familles d'attaques, plusieurs modèles, plusieurs essais par scénario.

  2. Créez votre clé

    Dans votre espace client. Elle n'est affichée qu'une fois ; nous n'en gardons que l'empreinte. Vous pouvez la remplacer ou la retirer à tout moment.

  3. Lancez depuis votre code

    Décrivez l'agent (ou collez l'export de sa configuration), récupérez le verdict, puis re-testez-le à chaque modification. Le rapport arrive aussi par e-mail.

Tarifs

Le prix du crash-test complet en ligne, en crédits prépayés. Un crédit n'est consommé que si le crash-test démarre ; s'il échoue de notre côté, il vous est rendu.

Paiement par carte via Stripe. Vos crédits sont ajoutés dès le paiement ; la clé se crée dans votre espace client.

Démarrer en 3 appels

Tous les appels se font en HTTPS, la clé dans l'en-tête Authorization. Les réponses sont en JSON.

1. Lancer le crash-test d'un agent

curl -X POST https://crashmire.com/api/v1/tests \
  -H "Authorization: Bearer $CRASHMIRE_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: first-test-001" \
  -d '{
    "description": "Assistant du service client d'une boutique en ligne. Il consulte les commandes, rembourse jusqu'à 50 € sans validation, ne communique jamais les données d'un autre client.",
    "locale": "fr",
    "reference": "v1.4.0",
    "webhook_url": "https://example.com/hooks/crashmire"
  }'
# → 202 {"id": "ct_3f9a…", "status": "building", "status_url": "…", "credits_left": 4}

Vous pouvez joindre l'export de l'agent dans le champ config (n8n, Flowise, Dify, Make, OpenAI Assistant, liste d'outils MCP) : l'agent reconstruit colle alors à ses vraies consignes et à ses vrais outils.

2. Lire le verdict

curl -H "Authorization: Bearer $CRASHMIRE_KEY" "https://crashmire.com/api/v1/tests/ct_3f9a…?fail_on=high"
# building → running → done
# → {"status": "done", "verdict": "fail", "by_severity": {"critical": 0, "high": 1, …},
#    "findings": [ … ], "new": [ … ], "report_url": "…", "results": { "format": "crashmire-results/1", … }}

3. Le re-tester après chaque modification

curl -X POST https://crashmire.com/api/v1/tests/ct_3f9a…/retest \
  -H "Authorization: Bearer $CRASHMIRE_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: $GIT_SHA" -d '{"reference": "'$GIT_SHA'"}'

Le re-test rejoue les mêmes scénarios sur le même agent et le compare au dernier résultat : le champ new liste les failles apparues depuis. C'est ce qui bloque une mise en production.

Dans votre CI

Un script de 60 lignes (curl et jq) lance le re-test, attend le verdict et renvoie le code de sortie : 0 si rien n'a régressé, 1 sinon. Le même commit relancé ne consomme qu'un crédit.

Télécharger crashmire-ci.sh

Copiez-le dans votre dépôt plutôt que de le télécharger à chaque exécution, et vérifiez son empreinte : sha256 047dcfbad40d784c9e6412672643104f1f6f1feb4fb1b2c07126bd25abb2841b

GitHub Actions

# .github/workflows/crashmire.yml
name: CrashMire crash test
on:
  push:
    paths: ["prompts/**", "agent/**"]   # when the prompt, the tools or the model change
jobs:
  crash-test:
    runs-on: ubuntu-latest
    timeout-minutes: 100
    steps:
      - uses: actions/checkout@v4
      - name: Crash-test the agent
        env:
          CRASHMIRE_KEY: ${{ secrets.CRASHMIRE_KEY }}
        run: ./ci/crashmire-ci.sh ct_3f9a… new

GitLab CI

crashmire:
  stage: test
  image: alpine:3.20
  before_script: [apk add --no-cache bash curl jq]
  script: [./ci/crashmire-ci.sh ct_3f9a… new]
  rules:
    - changes: ["prompts/**", "agent/**"]
  # CRASHMIRE_KEY: a masked, protected CI/CD variable

Vos agents tournent sous n8n ? Le modèle de workflow est sur la page Re-test automatique

Référence

Authorization: Bearer cmk_… sur chaque appel. Une clé dans l'adresse (?key=) est refusée : elle finirait dans des journaux.

AppelCe qu'il fait
GET /api/v1/accountCrédits restants, limites, crash-tests en cours.
POST /api/v1/testsLance le crash-test d'un nouvel agent. Consomme un crédit. Réponse 202 avec son id (ct_…).
GET /api/v1/testsLes derniers crash-tests du compte (limit=1 à 50).
GET /api/v1/tests/{id}L'état ; une fois terminé : le verdict (selon fail_on), les failles, ce qui est nouveau ou corrigé, le lien du rapport et les résultats au format ouvert.
POST /api/v1/tests/{id}/retestRe-teste le même agent et compare avec son dernier résultat. Consomme un crédit.

Champs de lancement

  • description — obligatoire, 40 à 8 000 caractères : ce que fait l'agent, ses outils, ses limites.
  • config — facultatif : l'export de l'agent (objet JSON ou texte), 400 ko au plus.
  • locale — fr ou en : la langue du rapport (en par défaut).
  • reference — facultatif, 80 caractères : un commit, une version ; renvoyé tel quel.
  • webhook_url — facultatif : une adresse https publique, appelée à la fin (signée).
  • Idempotency-Key — en-tête facultatif, recommandé : la même requête envoyée deux fois ne lance qu'un crash-test.

États

  • building — l'agent est reconstruit à partir de sa description.
  • running — le crash-test tourne (de quelques minutes à une heure selon l'agent).
  • in_review — un contrôle qualité a demandé une relecture humaine avant l'envoi (en général sous un jour ouvré).
  • done — terminé : verdict et résultats disponibles.
  • failed — le crash-test n'a pas pu aboutir de notre côté ; le crédit est rendu.

Seuil du verdict (fail_on)

  • new — échec si une faille absente du test précédent apparaît (par défaut).
  • high — échec dès une faille élevée ou critique.
  • critical — échec dès une faille critique.
  • any — échec dès qu'une faille existe.

Erreurs

401 bad_keyclé absente ou invalide. Après 20 essais ratés en une heure, l'adresse est bloquée.
402 no_creditsplus de crédit : rachetez un pack.
403 suspendedcompte suspendu : écrivez-nous.
404 unknown_testcet id n'existe pas sur votre compte.
409 already_runningun crash-test de cet agent n'est pas terminé ; la réponse indique lequel.
413 too_largerequête de plus de 450 ko.
415 json_onlyenvoyez du JSON (Content-Type: application/json).
422 invalid_descriptionun champ ne convient pas ; le message dit lequel.
429 rate_limitedtrop d'appels : 60 par minute, 5 crash-tests en cours et 20 lancements par 24 h au plus (Retry-After indique quand réessayer).
503 api_closedAPI en maintenance : vos crédits ne bougent pas.

Webhooks

Si vous donnez webhook_url, nous y envoyons un POST JSON quand le crash-test se termine (done, failed ou in_review), signé avec le secret de votre espace client : en-tête CrashMire-Signature: t=<horodatage>,v1=<HMAC-SHA256 de « t.corps »>. Vérifiez la signature avant de lire le corps.

# Python: check the signature before trusting the body
import hmac, hashlib, time

def verify(body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    if abs(time.time() - int(parts["t"])) > 300:      # older than 5 minutes: replay
        return False
    expected = hmac.new(secret.encode(), parts["t"].encode() + b"." + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])

# verify(request.body, request.headers["CrashMire-Signature"], "whsec_…")

Nous n'appelons que des adresses https publiques (vérifiées à chaque envoi), sans suivre de redirection, en 5 secondes au plus ; une réponse autre que 2xx est réessayée trois fois. En cas de doute, l'appel GET reste la source de vérité.

Sécurité

  • La clé n'est affichée qu'une fois ; nous n'en gardons que l'empreinte SHA-256. Remplacez-la ou retirez-la en un clic depuis votre espace client.
  • Chaque crédit est débité en une seule opération en base : deux appels simultanés ne peuvent pas dépenser le même crédit.
  • Limites par compte : 5 crash-tests en cours, 20 lancements par 24 heures, 60 appels par minute. Une clé volée ne peut pas vider vos crédits d'un coup ; nous relevons la limite sur demande.
  • Les adresses qui multiplient les clés invalides sont bloquées automatiquement.
  • HTTPS seulement, clé dans l'en-tête seulement, aucune donnée en cache (Cache-Control: no-store).
  • Les webhooks sont signés, horodatés, et ne partent que vers des adresses publiques : jamais vers votre réseau interne ni le nôtre.
  • Le crash-test se joue sur des outils simulés : rien n'est exécuté chez vous ni chez vos clients.
  • Chaque lancement et chaque rapport sont visibles par nous ; nous pouvons suspendre un compte en cas d'abus.

Ce que l'API ne renvoie jamais

Nos scénarios, nos messages d'attaque, nos prompts et notre façon de juger restent chez nous. L'API renvoie des verdicts, des fréquences, des niveaux de gravité et des références (OWASP, AI Act), jamais le contenu des attaques.

Les résultats suivent le format ouvert crashmire-results/1.

Un agent qui change souvent mérite un crash-test à chaque changement.

Acheter des crash-tests