Receta
Lleva tu primer documento a firma
Objetivo: Un documento firmado de punta a punta en sandbox, con el aviso de cada firma y el de cierre llegando a tu servidor.
Grabado en el entorno interno de AllSign con una key de sandbox · backend 24c0469 · · test docs-checks-v3/tests/recetas/primer-documento-a-firma.receta.spec.ts
Los ejemplos usan $ALLSIGN_API_KEY. Defínela una vez con tu key de sandbox: export ALLSIGN_API_KEY="allsign_test_sk_…" (en PowerShell: $env:ALLSIGN_API_KEY="allsign_test_sk_…").
1 Registra tu endpoint de webhooks
POST /webhooks ver en la referencia
Qué haces
Primero tu endpoint: así te enteras de cada firma y del cierre sin consultar en bucle. Guarda el secreto whsec_…, que solo se muestra aquí; con él verificas cada entrega.
Qué mirar
id="whe_faed666bbdc5444693acfac1655160a6"secret="whsec_…"
2 Crea el documento con su firmante
POST /documents ver en la referencia
Qué haces
Crear no envía nada: el documento nace en draft y todavía lo puedes cambiar. signer-pending@sandbox.allsign.io es un firmante de prueba que no recibe correo y nunca firma solo: espera a que tú firmes por él.
Qué mirar en sandbox
id="doc_fdde14eeff0b4444acec4d6b10736068"status="draft"signerCount=1
3 Envíalo a firma
POST /documents/{document_id}/send ver en la referencia
Qué haces
Ahora el documento espera firmas. Desde aquí ya no se edita: si algo estaba mal, lo anulas y creas otro.
Qué mirar
status="awaiting_signatures"
En producción
Aquí AllSign le manda la invitación a tu firmante por correo o WhatsApp, y con una key live el envío consume créditos de tu saldo; en sandbox no se cobra nada.
4 Consulta a tu firmante
GET /documents/{document_id}/signers ver en la referencia
Qué haces
Cada firmante tiene su id sgr_… y su propio status. Con ese id le recuerdas, lo reasignas o, en sandbox, firmas por él.
Qué mirar
data.0.id="sgr_d64e1ca6bcf64eebac2d35da21d23c88"data.0.status="sent"
5 Firma por tu firmante (solo en sandbox)
POST /sandbox/signers/{signer_id}/sign ver en la referencia
Qué haces
En sandbox no hay nadie del otro lado: esta operación firma como si tu firmante hubiera abierto su liga, y dispara los mismos eventos que una firma real.
Qué mirar
status="signed"signedAt="2026-07-11T18:01:06.969000Z"
En producción
Aquí firma tu cliente: abre la liga del correo o del WhatsApp, revisa el documento y firma. Esta operación solo funciona en sandbox.
6 Espera el webhook signer.signed
POST tu endpoint · evento signer.signed
Qué haces
Llega en cuanto firma cada persona. Verifica la firma de la entrega antes de confiar en su contenido.
AllSign le hace POST a la URL que registraste, con el evento signer.signed. Responde 2xx rápido y, antes de confiar en el cuerpo, verifica la firma: webhook-signature es un HMAC-SHA256 de webhook-id.webhook-timestamp.cuerpo con el secreto del webhook (Webhooks).
Esta entrega llegó de verdad al receptor del test y su firma se verificó con el secreto del webhook.
Qué mirar
eventType="signer.signed"data.documentId="doc_fdde14eeff0b4444acec4d6b10736068"
7 Espera el webhook document.completed
POST tu endpoint · evento document.completed
Qué haces
Llega cuando firmó la última persona y la evidencia ya está lista para descargar. Es la señal para guardar el PDF firmado.
AllSign le hace POST a la URL que registraste, con el evento document.completed. Responde 2xx rápido y, antes de confiar en el cuerpo, verifica la firma: webhook-signature es un HMAC-SHA256 de webhook-id.webhook-timestamp.cuerpo con el secreto del webhook (Webhooks).
Esta entrega llegó de verdad al receptor del test y su firma se verificó con el secreto del webhook.
Qué mirar
eventType="document.completed"data.status="completed"
8 Confirma el estado final
GET /documents/{document_id} ver en la referencia
Qué haces
Una sola consulta, después del webhook y nunca en un bucle: el documento está completed y todas las firmas cuentan.
Qué mirar
status="completed"signedCount=1
Errores comunes de esta receta
Errores reales que el test de esta receta provocó a propósito en sandbox, sobre sus mismos pasos. Cada uno enlaza a su explicación en Errores.
IDEMPOTENCY_KEY_REQUIRED · 400 · en el paso 2 (Crea el documento con su firmante)
{
"type": "https://allsign.io/developers/docs/errors#IDEMPOTENCY_KEY_REQUIRED",
"title": "Bad Request",
"status": 400,
"detail": "POST requests that create or charge require a unique Idempotency-Key (UUID v4).",
"instance": "/v3/documents",
"code": "IDEMPOTENCY_KEY_REQUIRED",
"requestId": "req_48ab6b50c363414c8d0e41850d05d5f5"
}Grabado en el entorno interno de AllSign con una key de sandbox · backend 24c0469 · · test docs-checks-v3/tests/recetas/primer-documento-a-firma.receta.spec.ts
IDEMPOTENCY_KEY_INVALID · 400 · en el paso 2 (Crea el documento con su firmante)
{
"type": "https://allsign.io/developers/docs/errors#IDEMPOTENCY_KEY_INVALID",
"title": "Bad Request",
"status": 400,
"detail": "Idempotency-Key must be a UUID v4.",
"instance": "/v3/documents",
"code": "IDEMPOTENCY_KEY_INVALID",
"requestId": "req_e289ae908d284f7bbbdfc6abc2178d32"
}Grabado en el entorno interno de AllSign con una key de sandbox · backend 24c0469 · · test docs-checks-v3/tests/recetas/primer-documento-a-firma.receta.spec.ts
DOCUMENT_NOT_FOUND · 404 · en el paso 8 (Confirma el estado final)
{
"type": "https://allsign.io/developers/docs/errors#DOCUMENT_NOT_FOUND",
"title": "Document not found",
"status": 404,
"detail": "No document was found with that id.",
"instance": "/v3/documents/doc_dd56d81575b84eb790373c6dff92cb95",
"code": "DOCUMENT_NOT_FOUND",
"requestId": "req_c72bfc8e0f1f4fc69bcc8111e77dc52d"
}Grabado en el entorno interno de AllSign con una key de sandbox · backend 24c0469 · · test docs-checks-v3/tests/recetas/primer-documento-a-firma.receta.spec.ts
INVALID_STATE_TRANSITION · 409 · en el paso 5 (Firma por tu firmante (solo en sandbox))
{
"type": "https://allsign.io/developers/docs/errors#INVALID_STATE_TRANSITION",
"title": "Conflict",
"status": 409,
"detail": "The document has not been sent yet. Send it first with POST /v3/documents/{documentId}/send.",
"instance": "/v3/sandbox/signers/sgr_592c7816786d4e70bb676a8be0648b5b/sign",
"code": "INVALID_STATE_TRANSITION",
"requestId": "req_c1f762446ffa48c2a620e3c8297daa1f",
"reason": "never_invited"
}Grabado en el entorno interno de AllSign con una key de sandbox · backend 24c0469 · · test docs-checks-v3/tests/recetas/primer-documento-a-firma.receta.spec.ts
Siguiente
- Descarga el PDF firmado y su evidencia — El PDF firmado y el PDF de evidencia de un documento completado, con su huella sha256 para archivarlos.
- Recibe y verifica los webhooks de AllSign — Un endpoint que recibe los eventos de AllSign, comprueba que de verdad los firmó AllSign y sobrevive a sus propias caídas y a la rotación del secreto.
- Varios firmantes, uno después de otro — Un contrato que firma primero la vendedora y después el comprador, con el comprador sin poder firmar antes de su turno.