Copiar página

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.

Para: integrador · nivel inicial · 10 min · Necesitas: API key de sandbox (allsign_test_sk_…) · Un PDF: contrato.pdf · Un endpoint HTTPS para webhooks

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)

Crear sin Idempotency-Key. Qué significa y qué hacer

Respuesta · 400 · IDEMPOTENCY_KEY_REQUIRED
{
  "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)

Crear con una Idempotency-Key que no es UUID v4. Qué significa y qué hacer

Respuesta · 400 · IDEMPOTENCY_KEY_INVALID
{
  "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)

Consultar un documento que no existe o es de otra cuenta. Qué significa y qué hacer

Respuesta · 404 · DOCUMENT_NOT_FOUND
{
  "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))

Firmar en sandbox un documento que todavía no envías. Qué significa y qué hacer

Respuesta · 409 · INVALID_STATE_TRANSITION
{
  "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