Embedded Signing
Create signing session
POST /signing-sessions
Acuña un clientSecret que autoriza al iframe a firmar como un firmante (identificado por su correo) de un documento existente. El clientSecret se devuelve una sola vez, aquí. Requiere el scope embedded:write y honra la cabecera Idempotency-Key. livemode sale de la key, no del body: una key live exige allowedOrigins.
Cuerpo de la petición
{
"documentId": "doc_5Qr9tA3fZwLZmp3D1bCdEfG",
"signerEmail": "firmante@empresa.com",
"allowedOrigins": [
"https://app.tuempresa.com"
],
"successUrl": "https://app.tuempresa.com/firma/ok"
}
Ejemplo (cURL)
curl -X POST "https://api.allsign.io/v3/signing-sessions" \
-H "Authorization: Bearer allsign_live_sk_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-d '{
"documentId": "doc_5Qr9tA3fZwLZmp3D1bCdEfG",
"signerEmail": "firmante@empresa.com",
"allowedOrigins": ["https://app.tuempresa.com"],
"successUrl": "https://app.tuempresa.com/firma/ok"
}'
Respuestas
201 La sesión creada, con clientSecret en claro (única vez). — SigningSession
{
"object": "signing_session",
"id": "ses_3fa85f6457174562b3fc2c963f66afa6",
"livemode": true,
"status": "pending",
"clientSecret": "as_sess_3fa85f6457174562b3fc2c963f66afa6_secret_9f86d081884c7d659a2feaa0",
"document": {
"id": "doc_5Qr9tA3fZwLZmp3D1bCdEfG",
"title": "Contrato de arrendamiento 2026.pdf"
},
"signer": {
"email": "firmante@empresa.com",
"name": "Juan Pérez"
},
"expiresAt": "2026-07-12T18:04:00Z",
"createdAt": "2026-07-11T18:04:00Z"
}
Retrieve signing session
GET /signing-sessions/{session_id}
Lee el estado autoritativo del lado del servidor de una sesión — la verdad sobre si la firma se completó, no lo que reporte el iframe. Un ?expand=evidence adjunta el paquete de evidencia (PDF sellado + NOM-151 + URLs prefirmadas) cuando ya existe. Requiere embedded:write. El clientSecret no se devuelve aquí (viene null).
Parámetros
session_id path · requerido |
ID de la sesión (ses_…). |
expand query |
Pasa evidence para adjuntar el paquete de evidencia sellada. Otro valor es un 400 INVALID_EXPAND. |
Ejemplo (cURL)
curl "https://api.allsign.io/v3/signing-sessions/ses_3fa85f6457174562b3fc2c963f66afa6?expand=evidence" \
-H "Authorization: Bearer allsign_live_sk_..."
Respuestas
200 El objeto sesión, con evidencia si se pidió ?expand=evidence. — SigningSession
{
"object": "signing_session",
"id": "ses_3fa85f6457174562b3fc2c963f66afa6",
"livemode": true,
"status": "completed",
"clientSecret": null,
"document": {
"id": "doc_5Qr9tA3fZwLZmp3D1bCdEfG",
"title": "Contrato de arrendamiento 2026.pdf"
},
"signer": {
"email": "firmante@empresa.com",
"name": "Juan Pérez"
},
"signature": {
"id": "sgr_63db6fa927094f689ea7bc640194bade",
"status": "SIGNED",
"signedAt": "2026-07-11T19:02:00Z"
},
"mountedAt": "2026-07-11T18:40:00Z",
"completedAt": "2026-07-11T19:02:00Z",
"createdAt": "2026-07-11T18:04:00Z",
"expiresAt": "2026-07-12T18:04:00Z",
"evidence": {
"available": true,
"evidencePdf": {
"presignedUrl": "https://allsign-documents.s3.amazonaws.com/documentos/.../evidence.pdf?X-Amz-Signature=...",
"s3Key": "documentos/5Qr9.../pdf/evidence.pdf",
"hash": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
},
"nom151": {
"presignedUrl": "https://allsign-documents.s3.amazonaws.com/documentos/.../constancia.tsr?X-Amz-Signature=...",
"s3Key": "documentos/5Qr9.../nom151/constancia.tsr",
"data": {
"serialNumber": "12345",
"issuedAt": "2026-07-11T19:03:00Z"
}
}
}
}
Init signing session
POST /signing-sessions/{session_id}/init
Intercambia el clientSecret por un guest token fresco que arranca la firma dentro del iframe. La consume el shell de iframe de AllSign (primera parte), no tu backend. Ruta pública — no lleva Authorization: la autenticación es el clientSecret en el body. Volver a llamar init es idempotente por diseño: rota el guest token interno y da uno nuevo.
Parámetros
session_id path · requerido |
ID de la sesión (ses_…). |
Cuerpo de la petición
{
"clientSecret": "as_sess_3fa85f6457174562b3fc2c963f66afa6_secret_9f86d081884c7d659a2feaa0",
"parentOrigin": "https://app.tuempresa.com"
}
Ejemplo (cURL)
curl -X POST "https://api.allsign.io/v3/signing-sessions/ses_3fa85f6457174562b3fc2c963f66afa6/init" \
-H "Content-Type: application/json" \
-d '{
"clientSecret": "as_sess_3fa85f6457174562b3fc2c963f66afa6_secret_9f86d081884c7d659a2feaa0",
"parentOrigin": "https://app.tuempresa.com"
}'
Respuestas
200 El guest token nuevo y el contexto de la sesión para montar el iframe. — SigningSessionInit
{
"sessionId": "ses_3fa85f6457174562b3fc2c963f66afa6",
"signatureId": "sgr_63db6fa927094f689ea7bc640194bade",
"guestToken": "gt_7c9e6679742540de944be07fc1f90ae7",
"signer": {
"email": "firmante@empresa.com",
"name": "Juan Pérez"
},
"signerId": "sgr_63db6fa927094f689ea7bc640194bade",
"document": {
"id": "doc_5Qr9tA3fZwLZmp3D1bCdEfG",
"title": "Contrato de arrendamiento 2026.pdf"
},
"locale": "es",
"brandProfileId": null,
"successUrl": "https://app.tuempresa.com/firma/ok",
"cancelUrl": null,
"livemode": true
}
Get session policy
GET /signing-sessions/{session_id}/policy
Consulta pública (por id, no por el secreto) de los orígenes autorizados a embeber el iframe. La ruta de primera parte que sirve el HTML del iframe inyecta estos valores en su header Content-Security-Policy: frame-ancestors. Ruta pública — no lleva Authorization. No expone el clientSecret ni datos del documento.
Parámetros
session_id path · requerido |
ID de la sesión (ses_…). |
Ejemplo (cURL)
curl "https://api.allsign.io/v3/signing-sessions/ses_3fa85f6457174562b3fc2c963f66afa6/policy"
Respuestas
200 La política CSP (allowedOrigins + frameAncestors) de la sesión. — SigningSessionPolicy
{
"sessionId": "ses_3fa85f6457174562b3fc2c963f66afa6",
"allowedOrigins": [
"https://app.tuempresa.com"
],
"frameAncestors": "https://app.tuempresa.com http://localhost:*"
}