Obtener un documento desde una notificación de webhook
Convierte el notification_id de un webhook en el documento mismo. Este es el paso natural
después de recibir una notificación: el webhook te dice que pasó algo, esto te dice qué.
action elige qué representación obtienes, y si te la dan en bytes o en JSON:
action | Devuelve |
|---|---|
download_original_bytes | El PDF firmado original, en bytes |
download_original_document | El original, como metadatos JSON |
download_universal_bytes | El PDF universal (encapsulado), en bytes |
download_universal_document | El universal, como metadatos JSON |
download_document_bytes | El documento tal como está guardado, en bytes |
download_document | El documento tal como está guardado, como metadatos JSON |
Original y universal son dos representaciones firmadas del mismo documento: el original lleva las firmas tal como se aplicaron, el universal las envuelve en un sobre de validación a largo plazo.
Autenticación
signmage Cada petición lleva Authorization: signmage {webId}:{firma}, donde firma es el Base64 de
HMAC-SHA256(apiKey, cadenaFirmada).
Qué va dentro de cadenaFirmada depende de la petición:
| Petición | cadenaFirmada |
|---|---|
GET | La URI completa incluyendo el query string, exactamente como se envía |
POST con JSON | El cuerpo JSON, re-serializado compacto (sin espacios ni salto de línea final) |
POST multipart | El SHA-256 en Base64 del archivo, que además se manda en el header Content-SHA256 |
Dos detalles que conviene resolverlos desde el principio:
- En
GET, la URI se firma tal como se envía, así que el orden y el encoding de los parámetros importan. - En
POST, la comparación se hace contra tu JSON re-serializado en forma compacta. Manda JSON compacto y canónico para que las firmas coincidan.
Una firma que no coincide devuelve 401 con el cuerpo vacío. Como la misma respuesta cubre un
web ID desconocido, una llave inactiva y una firma que no coincide, revisa las tres cosas al
diagnosticar.
En: header
Cuerpo de la petición
application/json
Definiciones de TypeScript
Usa el tipo request body en TypeScript.
Cuerpo de la respuesta
text/plain
curl -X POST "https://example.com/developers/webhook" \ -H "Content-Type: application/json" \ -d '{ "notification_id": 84512, "action": "download_original_bytes" }'{ "name": "contrato.pdf", "signatures_count": 2, "data": "JVBERi0xLjcNCiW1tbW1…"}