ProofSnap ProofSnap Doc API

Documentation de l'API ProofSnap

L'API ProofSnap charge n'importe quelle URL dans un navigateur exécuté sur ses serveurs et renvoie un paquet de preuves scellé : capture d'écran, HTML, métadonnées, PDF de preuve et manifeste SHA-256 signé en RSA-4096, ancré avec OpenTimestamps. URL de base : https://api.getproofsnap.com/v1. Authentification par clé API, transmise comme jeton Bearer. Mise à jour : octobre 2026.

Les exemples ci-dessous lisent l'URL de base dans une variable shell : export PROOFSNAP_API_BASE=https://api.getproofsnap.com/v1

Premiers pas

  1. 1

    Créer une clé API

    Connectez-vous au tableau de bord, ouvrez « Développeurs », puis « Clés API », et créez une clé. Elle ne s'affiche qu'une seule fois : conservez-la en lieu sûr. Les clés commencent par ps_live_ ou ps_test_.

  2. 2

    Lancer votre première capture

    Transmettez la clé comme jeton Bearer. L'appel renvoie immédiatement le code 202 avec un capture_id et status: "processing".

    curl -X POST "$PROOFSNAP_API_BASE/captures" \
      -H "Authorization: Bearer ps_live_..." \
      -H "Content-Type: application/json" \
      -d '{"url": "https://example.com"}'
  3. 3

    Récupérer le résultat

    Interrogez GET /captures/{capture_id} jusqu'à ce que status vaille completed ou failed. Une capture terminée contient package_url (un lien ZIP présigné, valable jusqu'à 24 heures) et manifest_hash. Pour obtenir un nouveau lien, récupérez de nouveau la capture. Plutôt que d'interroger l'API en boucle, vous pouvez renseigner dans options.webhook_url l'URL d'un endpoint HTTPS pour recevoir un événement signé (HMAC-SHA256) capture.completed ou capture.failed.

    curl "$PROOFSNAP_API_BASE/captures/cap_..." \
      -H "Authorization: Bearer ps_live_..."
  4. 4

    Vérifier le paquet

    POST /captures/{capture_id}/verify recontrôle chaque empreinte SHA-256 déclarée et la signature RSA-4096 du manifeste à partir des fichiers stockés, puis renvoie match, modified ou invalid. N'importe qui peut aussi exécuter hors ligne les scripts du dossier verification/ du paquet, ou rechercher l'empreinte SHA-256 de manifest.json dans le registre d'émission public avec GET /ledger/{hash}. Aucune de ces deux méthodes ne nécessite de clé API.

    curl -X POST "$PROOFSNAP_API_BASE/captures/cap_.../verify" \
      -H "Authorization: Bearer ps_live_..."

Authentification

Envoyez la clé API dans l'en-tête Authorization: Bearer ps_live_.... Les clés commencent par ps_live_ ou ps_test_. Une clé de production crée des captures facturables ; une clé de test crée des paquets d'évaluation complets, filigranés et non facturés. Sur un compte sans facturation associée, une clé de production fonctionne comme une clé de test. En l'absence de clé, l'API renvoie 401 MISSING_API_KEY ; une clé inconnue ou révoquée entraîne une erreur 401 INVALID_API_KEY. Les clés du forfait Website Archive sont en lecture seule (403 PLAN_API_READ_ONLY). Trois routes ne demandent aucune clé : GET /health, GET /ledger/{hash} et GET /matter-verify.

Un nouveau compte démarre avec le forfait Sandbox avec 50 captures d'essai gratuites. L'usage en mode test est limité à 200 unités par compte et par jour UTC (429 TEST_MODE_DAILY_LIMIT), les paquets portent le filigrane « TEST - NOT FOR LEGAL USE » et include_eidas exige une clé de production (403 EIDAS_REQUIRES_LIVE_KEY).

Webhooks

Définissez options.webhook_url requête par requête, ou créez des abonnements webhook au niveau du compte avec POST /webhook-subscriptions. Les envois suivent le format Standard Webhooks : les en-têtes webhook-id, webhook-timestamp et webhook-signature (v1, suivi d'un HMAC-SHA256 calculé sur l'identifiant, l'horodatage et le corps avec un secret whsec_). Types d'événements : capture.completed, capture.failed, capture.anchor_confirmed, certify.completed, certify.failed, redaction.completed, redaction.failed, monitor.change_detected et schedule.paused. capture.anchor_confirmed et schedule.paused ne sont envoyés qu'aux abonnements au niveau du compte. Chaque événement reste également consultable pendant 30 jours via GET /events. Chaque tentative d'envoi est abandonnée au bout de 10 secondes ; un envoi en échec est retenté après 5 minutes, 30 minutes, 2 heures, 8 heures et 24 heures. Lorsque vous renouvelez le secret de signature, l'ancien et le nouveau secret signent tous deux les envois pendant 24 heures.

Les envois vers une webhook_url définie dans la requête sont signés avec le secret de signature du webhook associé à la clé API qui a émis la requête. Ce secret ne s'affiche qu'une fois, lorsque vous créez la clé dans la section « Développeurs » du tableau de bord. Un abonnement possède son propre secret, renvoyé une seule fois à sa création. Vérifiez la signature sur le corps brut avant de l'analyser, rejetez tout webhook-timestamp qui s'écarte de plus de 5 minutes de l'heure de votre serveur et ne traitez chaque webhook-id qu'une seule fois. Toute bibliothèque Standard Webhooks s'en charge pour vous.

Limites de débit et erreurs

Les requêtes facturables (POST /captures, /captures/batch, /compare, /captures/{capture_id}/redact et /certify-hash, ainsi que les vérifications, les conservations pour litige, les tâches d'export et les imports) sont limitées par compte sur des fenêtres fixes de 60 secondes, partagées entre toutes les clés API du compte et la session du tableau de bord. Un lot ou une certification de plusieurs empreintes consomme une unité par URL ou par empreinte. Unités par fenêtre : Sandbox 10, Developer 60, Startup 120, Growth 300, Legal Solo 60, Legal Company 120, Website Archive 60, Archive only 30. Les réponses de ces routes contiennent les en-têtes RateLimit-Policy et RateLimit, ainsi que les anciens en-têtes X-RateLimit-* ; une réponse 429 inclut en outre Retry-After.

Les captures en production sont décomptées du quota mensuel du forfait (402 QUOTA_EXCEEDED) ; les requêtes d'un compte dont l'abonnement présente un impayé reçoivent une erreur 402 PAYMENT_REQUIRED. Chaque compte ne peut exécuter qu'un nombre limité de captures simultanées (429 CONCURRENT_CAPTURE_LIMIT). Envoyez un en-tête Idempotency-Key pour qu'une nouvelle tentative dans les 24 heures renvoie le résultat d'origine avec Idempotent-Replay: true au lieu de créer une seconde capture. Les erreurs sont renvoyées en JSON avec error.code, error.message et, le cas échéant, error.details ; indiquez la valeur de l'en-tête de réponse X-Request-ID lorsque vous contactez le support. La liste complète des codes figure dans la référence ci-dessous.

Endpoints en bref

  • Captures : POST /captures, POST /captures/batch (2 à 50 URL), GET /captures, GET /captures/hosts, GET /captures/{capture_id}, PATCH et DELETE /captures/{capture_id}, POST /captures/{capture_id}/verify
  • Analyse : POST /captures/{capture_id}/redact, POST /compare, POST /certify-hash (jusqu'à 100 empreintes)
  • Automatisation : /scheduled-captures (avec /runs), /webhook-subscriptions, GET /webhook-events/{capture_id}, GET /events, GET /captures/events
  • Juridique : /matters (scellement, export, partage), POST /legal-holds, /imports, /captures/export-jobs
  • Compte et routes publiques : GET /whoami, GET /health, GET /ledger/{hash}, GET /matter-verify

Référence complète

Tous les endpoints avec leurs paramètres, réponses et schémas, générés à partir de la spécification OpenAPI 3. Téléchargez la spécification : openapi.json (en anglais, pour les générateurs de code) ou openapi-fr.json (descriptions en français). Il n'existe pas de SDK officiel : générez un client avec n'importe quel générateur OpenAPI 3 et vérifiez les webhooks avec n'importe quelle bibliothèque Standard Webhooks.