ProofSnap ProofSnap

Documentación de la API de ProofSnap

La API de ProofSnap abre cualquier URL en un navegador que se ejecuta en los servidores de ProofSnap y devuelve un paquete de pruebas sellado: captura de pantalla, HTML, metadatos, PDF probatorio y un manifiesto SHA-256 firmado con RSA-4096 y anclado con OpenTimestamps. URL base: https://api.getproofsnap.com/v1. Autentícate con una clave de API (token Bearer). Última actualización: octubre de 2026.

Los ejemplos siguientes leen la URL base de una variable de shell: export PROOFSNAP_API_BASE=https://api.getproofsnap.com/v1

Primeros pasos

  1. 1

    Crea una clave de API (API key)

    Inicia sesión en el panel, abre Desarrolladores y después Claves de API, y crea una clave. Solo se muestra una vez, así que guárdala en un lugar seguro. Las claves empiezan por ps_live_ o ps_test_.

  2. 2

    Solicita tu primera captura

    Envía la clave como token Bearer. La llamada devuelve 202 al instante con un capture_id y 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

    Obtén el resultado

    Consulta GET /captures/{capture_id} hasta que status sea completed o failed. Una captura completada incluye package_url (un enlace prefirmado al ZIP, válido hasta 24 horas) y manifest_hash. Para obtener un enlace nuevo, vuelve a solicitar la captura. En lugar de consultar periódicamente, indica en options.webhook_url un endpoint HTTPS para recibir un evento capture.completed o capture.failed firmado con HMAC-SHA256.

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

    Verifica el paquete

    POST /captures/{capture_id}/verify vuelve a comprobar cada hash SHA-256 declarado y la firma RSA-4096 del manifiesto con los archivos almacenados, y devuelve match, modified o invalid. Además, cualquiera puede ejecutar sin conexión los scripts de la carpeta verification/ del paquete, o buscar el SHA-256 de manifest.json en el Registro de emisión público con GET /ledger/{hash}. Ninguna de las dos opciones requiere clave de API.

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

Autenticación

Envía la clave de API en la cabecera Authorization: Bearer ps_live_.... Las claves empiezan por ps_live_ o ps_test_. Una clave de producción crea capturas facturables; una clave de prueba crea paquetes de evaluación completos, con marca de agua y sin facturar. En una cuenta sin facturación vinculada, una clave de producción funciona como una clave de prueba. Si falta la clave, la API devuelve 401 MISSING_API_KEY; una clave desconocida o revocada devuelve 401 INVALID_API_KEY. Las claves del plan Website Archive son de solo lectura (403 PLAN_API_READ_ONLY). Tres rutas no necesitan clave: GET /health, GET /ledger/{hash} y GET /matter-verify.

Una cuenta nueva empieza en el sandbox con 50 capturas de prueba gratuitas. El uso en modo de prueba está limitado a 200 unidades por cuenta y día UTC (429 TEST_MODE_DAILY_LIMIT), los paquetes llevan la marca de agua «TEST - NOT FOR LEGAL USE» e include_eidas requiere una clave de producción (403 EIDAS_REQUIRES_LIVE_KEY).

Webhooks

Indica options.webhook_url en cada solicitud o crea suscripciones de webhook de cuenta con POST /webhook-subscriptions. Las entregas siguen el formato Standard Webhooks e incluyen las cabeceras webhook-id, webhook-timestamp y webhook-signature (v1, seguido de un HMAC-SHA256 calculado sobre el ID, la marca de tiempo y el cuerpo con un secreto whsec_). Tipos de evento: capture.completed, capture.failed, capture.anchor_confirmed, certify.completed, certify.failed, redaction.completed, redaction.failed, monitor.change_detected y schedule.paused. capture.anchor_confirmed y schedule.paused solo se envían a las suscripciones de cuenta. Además, cada evento se conserva durante 30 días en GET /events. Una entrega agota el tiempo de espera a los 10 segundos y se reintenta pasados 5 minutos, 30 minutos, 2 horas, 8 horas y 24 horas. Cuando renuevas el secreto, durante 24 horas las entregas se firman tanto con el secreto antiguo como con el nuevo.

Las entregas a un webhook_url indicado en la solicitud se firman con el secreto de firma del webhook asociado a la clave de API que hizo la solicitud. Ese secreto se muestra una sola vez, al crear la clave en la sección Desarrolladores del panel. Una suscripción tiene su propio secreto, que se devuelve una sola vez al crearla. Verifica la firma sobre el cuerpo sin procesar antes de analizarlo, rechaza cualquier webhook-timestamp que difiera en más de 5 minutos de la hora de tu servidor y procesa cada webhook-id una sola vez. Cualquier biblioteca de Standard Webhooks hace estas comprobaciones por ti.

Límites de frecuencia y errores

Las solicitudes facturables (POST /captures, /captures/batch, /compare, /captures/{capture_id}/redact y /certify-hash, además de verificaciones, retenciones legales, trabajos de exportación e importaciones) se limitan por cuenta en ventanas fijas de 60 segundos, compartidas entre todas las claves de API de la cuenta y su sesión del panel. Un lote o una certificación de varios hashes consume una unidad por URL o por hash. Unidades por ventana: sandbox 10, Developer 60, Startup 120, Growth 300, Legal Solo 60, Legal Company 120, Website Archive 60, Archive only 30. Las respuestas de estas rutas incluyen las cabeceras RateLimit-Policy y RateLimit, además de las cabeceras heredadas X-RateLimit-*; una respuesta 429 incluye también Retry-After.

Las capturas en producción computan en la cuota mensual del plan (402 QUOTA_EXCEEDED); las solicitudes de una cuenta con pagos de la suscripción pendientes devuelven 402 PAYMENT_REQUIRED. Cada cuenta solo puede ejecutar a la vez un número limitado de capturas (429 CONCURRENT_CAPTURE_LIMIT). Envía una cabecera Idempotency-Key para que un reintento en las 24 horas siguientes devuelva el resultado original con Idempotent-Replay: true en lugar de crear una segunda captura. Los errores se devuelven en JSON con error.code, error.message y, cuando procede, error.details; si contactas con soporte, indica el valor de la cabecera de respuesta X-Request-ID. La lista completa de códigos está en la referencia más abajo.

Endpoints de un vistazo

  • Capturas: POST /captures, POST /captures/batch (de 2 a 50 URL), GET /captures, GET /captures/hosts, GET /captures/{capture_id}, PATCH y DELETE /captures/{capture_id}, POST /captures/{capture_id}/verify
  • Revisión: POST /captures/{capture_id}/redact, POST /compare, POST /certify-hash (hasta 100 hashes)
  • Automatización: /scheduled-captures (con /runs), /webhook-subscriptions, GET /webhook-events/{capture_id}, GET /events, GET /captures/events
  • Ámbito legal: /matters (asuntos: sellado, exportación, uso compartido), POST /legal-holds, /imports, /captures/export-jobs
  • Cuenta y rutas públicas: GET /whoami, GET /health, GET /ledger/{hash}, GET /matter-verify

Referencia completa

Todos los endpoints con sus parámetros, respuestas y esquemas, generados a partir de la especificación OpenAPI 3. Descarga la especificación como openapi.json (en inglés, para generadores de código) u openapi-es.json (descripciones en español). No hay SDK oficial: genera un cliente con cualquier generador de OpenAPI 3 y verifica los webhooks con cualquier biblioteca de Standard Webhooks.