ProofSnap ProofSnap

ProofSnap API-documentatie

De ProofSnap API opent elke URL in een browser op de servers van ProofSnap en levert een verzegeld bewijspakket: screenshot, HTML, metadata, een PDF-bewijsrapport en een manifest met SHA-256-hashes. Het manifest wordt ondertekend met RSA-4096 en de hash ervan wordt via OpenTimestamps ingediend voor verankering in Bitcoin. Basis-URL: https://api.getproofsnap.com/v1. Authenticatie: een API-sleutel als Bearer-token. Bijgewerkt op 24 oktober 2026.

De voorbeelden hieronder lezen de basis-URL uit een omgevingsvariabele: export PROOFSNAP_API_BASE=https://api.getproofsnap.com/v1

Aan de slag

  1. 1

    Maak een API-sleutel aan

    Meld u aan in het dashboard, open ‘Ontwikkelaars’, daarna ‘API-sleutels’, en klik op ‘+ Nieuwe sleutel’. De sleutel wordt maar één keer getoond; bewaar hem dus meteen op een veilige plek. Sleutels beginnen met ps_live_ of ps_test_. Opent u het dashboard voor het eerst? De handleiding ‘Eerste stappen met het ProofSnap Dashboard’ leidt u door de registratie, de keuze van een abonnement en uw eerste vastlegging. Meer uitleg vindt u in de handleidingen voor het dashboard.

  2. 2

    Start uw eerste vastlegging

    Geef de sleutel mee als Bearer-token. De API antwoordt direct met 202 en geeft capture_id en status: "processing" terug.

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

    Haal het resultaat op

    Poll GET /captures/{capture_id} tot status de waarde completed of failed heeft. Een voltooide vastlegging bevat package_url (een vooraf ondertekende link naar het ZIP-bestand, maximaal 24 uur geldig) en manifest_hash. Een nieuwe link krijgt u door de vastlegging opnieuw op te halen. In plaats van te pollen kunt u in options.webhook_url een HTTPS-endpoint opgeven dat een met HMAC-SHA256 ondertekende gebeurtenis capture.completed of capture.failed ontvangt.

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

    Verifieer het pakket

    POST /captures/{capture_id}/verify vergelijkt elke opgegeven SHA-256-hash opnieuw met de opgeslagen bestanden, controleert de RSA-4096-handtekening van het manifest en antwoordt met match, modified of invalid. Iedereen kan ook offline de scripts in de map verification/ van het pakket uitvoeren, of de SHA-256-hash van manifest.json opzoeken in het openbare register van uitgegeven pakketten via GET /ledger/{hash}. Voor geen van beide is een API-sleutel nodig.

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

Authenticatie

Stuur uw API-sleutel (API key) mee in de header Authorization: Bearer ps_live_.... Sleutels beginnen met ps_live_ of ps_test_. Een live sleutel maakt betaalde vastleggingen, een testsleutel volledige pakketten met watermerk waarvoor u niet betaalt. Is er aan het account geen facturering gekoppeld, dan werkt een live sleutel als testsleutel. Ontbreekt de sleutel, dan antwoordt de API met 401 MISSING_API_KEY, bij een onbekende of ingetrokken sleutel met 401 INVALID_API_KEY. Sleutels van het abonnement Website Archive zijn alleen-lezen (403 PLAN_API_READ_ONLY). Drie routes vragen geen sleutel: GET /health, GET /ledger/{hash} en GET /matter-verify.

Een nieuw account begint in de sandbox met 50 gratis testvastleggingen. Testgebruik is beperkt tot 200 eenheden per account per UTC-dag (429 TEST_MODE_DAILY_LIMIT), pakketten dragen het watermerk ‘TEST - NOT FOR LEGAL USE’ (in de Nederlandse PDF ‘TEST - NIET VOOR JURIDISCH GEBRUIK’) en include_eidas vereist een live sleutel (403 EIDAS_REQUIRES_LIVE_KEY).

Webhooks

Geef options.webhook_url per verzoek mee, of maak via POST /webhook-subscriptions webhookabonnementen voor het hele account aan. Webhooks volgen de specificatie Standard Webhooks, met de headers webhook-id, webhook-timestamp en webhook-signature (v1, gevolgd door een HMAC-SHA256 over id, tijdstempel en body met het secret whsec_). Gebeurtenistypen: capture.completed, capture.failed, capture.anchor_confirmed, certify.completed, certify.failed, redaction.completed, redaction.failed, monitor.change_detected en schedule.paused. De gebeurtenissen capture.anchor_confirmed en schedule.paused gaan alleen naar abonnementen voor het hele account. Elke gebeurtenis is daarnaast 30 dagen op te halen via GET /events. Een afleverpoging heeft een time-out van 10 seconden, en mislukte pogingen worden herhaald na 5 minuten, 30 minuten, 2 uur, 8 uur en 24 uur. Gedurende 24 uur na het aanmaken van een nieuw secret worden webhooks met zowel het oude als het nieuwe secret ondertekend.

Webhooks naar een webhook_url uit een verzoek worden ondertekend met het secret van de API-sleutel waarmee dat verzoek is verstuurd. Dit webhook-secret wordt maar één keer getoond, wanneer u de sleutel aanmaakt in het onderdeel ‘Ontwikkelaars’ van het dashboard. Een webhookabonnement heeft een eigen secret, dat alleen bij het aanmaken wordt teruggegeven. Controleer de handtekening op de onbewerkte body voordat u die parseert. Weiger elke webhook waarvan webhook-timestamp meer dan 5 minuten afwijkt van de tijd van uw server. Verwerk elke webhook-id maar één keer. Elke Standard Webhooks-bibliotheek doet dit voor u.

Rate limits en fouten

Betaalde verzoeken (POST /captures, /captures/batch, /compare, /captures/{capture_id}/redact en /certify-hash, en daarnaast verzoeken voor verificatie, legal holds, exporttaken en imports) zijn per account beperkt in vaste vensters van 60 seconden; alle API-sleutels van het account en de dashboardsessie ervan delen hetzelfde venster. Een batch of een certificering van meerdere hashes telt als één eenheid per URL of hash. Eenheden per venster: sandbox 10, Developer 60, Startup 120, Growth 300, Legal Solo 60, Legal Company 120, Website Archive 60, Archive only 30. Antwoorden op deze routes bevatten de headers RateLimit-Policy en RateLimit plus de oudere headers X-RateLimit-*, en een 429-antwoord bevat bovendien Retry-After.

Live vastleggingen tellen mee voor het maandelijkse quotum van het abonnement (402 QUOTA_EXCEEDED), en zolang de betaling van het abonnement achterstallig is, beantwoordt de API de verzoeken van het account met 402 PAYMENT_REQUIRED. Per account kan maar een beperkt aantal vastleggingen tegelijk worden verwerkt (429 CONCURRENT_CAPTURE_LIMIT). Stuurt u een header Idempotency-Key mee, dan levert een herhaald verzoek binnen 24 uur het oorspronkelijke resultaat op met Idempotent-Replay: true, in plaats van een tweede vastlegging. Fouten komen terug als JSON-object met error.code, error.message en waar nodig error.details. Vermeld bij contact met ons supportteam de waarde van de antwoordheader X-Request-ID. De volledige lijst met codes staat in de documentatie hieronder.

Endpoints in het kort

  • Vastleggingen: POST /captures, POST /captures/batch (2 tot 50 URL's), GET /captures, GET /captures/hosts, GET /captures/{capture_id}, PATCH en DELETE /captures/{capture_id}, POST /captures/{capture_id}/verify
  • Weglakken, vergelijken en certificeren: POST /captures/{capture_id}/redact, POST /compare, POST /certify-hash (tot 100 hashes)
  • Automatisering: /scheduled-captures (geplande vastleggingen met de uitvoeringsgeschiedenis /runs), /webhook-subscriptions, GET /webhook-events/{capture_id}, GET /events, GET /captures/events
  • Juridische functies: /matters (zaken: verzegelen, exporteren, delen), POST /legal-holds (legal holds), /imports, /captures/export-jobs
  • Account en openbare routes: GET /whoami, GET /health, GET /ledger/{hash}, GET /matter-verify

Volledige documentatie

Alle endpoints met parameters, antwoorden en schema's, gegenereerd uit de OpenAPI 3-specificatie. U kunt de specificatie downloaden als openapi.json (Engels, voor codegeneratoren) of openapi-nl.json (beschrijvingen in het Nederlands). Wilt u een endpoint uitproberen zonder code te schrijven, fork dan de ProofSnap API-collectie in Postman. Er is geen officiële SDK: genereer een client met een OpenAPI 3-generator naar keuze en verifieer webhooks met een Standard Webhooks-bibliotheek.