Firma Electronica (SIGNA)
JAAK Signa API — Documentación
Versión: 1.0.0
Contacto técnico: [email protected]
Licencia: Propietaria — https://jaak.ai
Tabla de Contenidos
- Introducción
- Ambientes y URLs base
- Autenticación
- Tipos de Firma
- Manejo de Errores
- Paginación
- Módulos de la API
- 7.1 Auth — Autenticación
- 7.2 Templates — Plantillas
- 7.3 Folders — Carpetas
- 7.4 Submissions — Envíos para Firma
- 7.5 Sign — Firma Pública (por Slug)
- 7.6 Submitters — Firmantes de un Envío
- 7.7 Companies — Empresas
- 7.8 Signers — Directorio de Firmantes
- 7.9 Contacts — Contactos
- 7.10 Certificates — Certificados Digitales
- 7.11 Storage — Almacenamiento
- 7.12 Dashboard — Estadísticas
- 7.13 Quotas — Cuotas y Suscripciones
- 7.14 Audit — Auditoría y Compliance
- 7.15 KYC Verifications — Verificaciones de Identidad
- 7.16 Settings — Configuración
- 7.17 Webhooks
- Modelos de Datos
- Flujo Completo de Firma
- Glosario
1. Introducción
JAAK Signa es una API REST para gestión de firma digital de documentos. Permite crear plantillas de documentos, enviarlos a firmantes, y gestionar el proceso completo de firma electrónica — desde la firma simple hasta firma biométrica o con FIEL.
Internamente, el sistema traduce las peticiones HTTP a servicios gRPC. Como cliente, solo necesitas trabajar con los endpoints REST descritos en esta documentación.
¿Qué puedes hacer con esta API?
- Subir documentos PDF y convertirlos en plantillas reutilizables
- Enviar documentos a uno o varios firmantes por correo electrónico
- Gestionar el proceso de firma (seguimiento, cancelación, reenvíos)
- Descargar documentos firmados con su audit trail
- Administrar un directorio de firmantes y empresas
- Gestionar certificados digitales (FIEL, PSC)
- Consultar estadísticas y reportes de compliance
2. Ambientes y URLs base
| Ambiente | URL base | Uso |
|---|---|---|
| SANDBOX | https://api.sandbox.jaak.ai | Pruebas de integración |
| Production | https://services.jaak.ai | Ambiente productivo |
Todos los endpoints descritos en este documento se agregan a la URL base. Por ejemplo:
POST https://api.sandbox.jaak.ai/api/v1/sign-in
3. Autenticación
La mayoría de los endpoints requieren un Bearer Token JWT en el header de cada petición.
Header requerido
Authorization: Bearer <access_token>
Obtener un token
Llama al endpoint de login con tus credenciales:
POST /api/v1/sign-in
Content-Type: application/json
{
"email": "[email protected]",
"password": "tu_password"
}Respuesta exitosa (200):
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
"expires_in": 3600,
"user": { ... }
}Renovar el token
Cuando el access_token expire, usa el refresh_token para obtener uno nuevo sin volver a iniciar sesión:
POST /api/v1/refresh-token
Content-Type: application/json
{
"refresh_token": "eyJhbGciOiJIUzI1NiIs..."
}Endpoints públicos (sin autenticación)
Los siguientes endpoints no requieren Bearer Token, ya que son usados por los firmantes desde su navegador:
GET/POST /api/v1/sign/{slug}— Página de firmaPOST /api/v1/sign/{slug}/reject— Rechazar firmaGET /api/v1/submitters/{slug}— Datos del firmantePOST /api/v1/submitters/send-otp— Enviar OTPPOST /api/v1/submitters/verify-otp— Verificar OTPPOST /api/v1/submitters/exchange-code— Intercambiar código de invitación
4. Tipos de Firma
JAAK Signa soporta cinco modalidades de firma:
| Tipo | Descripción | Nivel de seguridad |
|---|---|---|
simple | Firma electrónica básica. El firmante dibuja o acepta la firma en pantalla. | Básico |
advanced | Firma con código OTP enviado al correo del firmante para validar identidad. | Medio |
biometric | Firma con verificación de identidad KYC (selfie + documento de identidad). | Alto |
El tipo de firma se define al crear la plantilla y aplica a todos los envíos basados en ella.
5. Manejo de Errores
Todos los errores retornan un objeto JSON con la siguiente estructura:
{
"error": "Descripción del error"
}Códigos de respuesta comunes
| Código | Significado |
|---|---|
200 | Operación exitosa |
201 | Recurso creado exitosamente |
204 | Operación exitosa sin contenido de respuesta |
400 | Solicitud inválida — revisa los campos enviados |
401 | No autenticado — token ausente, inválido o expirado |
404 | Recurso no encontrado |
501 | Endpoint no implementado vía REST (usar gRPC) |
6. Paginación
Los listados usan dos esquemas de paginación según el endpoint:
Paginación por offset (page/limit)
GET /api/v1/submissions?page=2&limit=20
La respuesta incluye un objeto pagination:
{
"data": [...],
"pagination": {
"page": 2,
"limit": 20,
"total": 150,
"has_more": true
}
}Paginación por cursor (after/before)
Usada principalmente en /api/v1/templates:
GET /api/v1/templates?limit=10&after=45
after: ID del último elemento de la página anterior (siguiente página)before: ID del primer elemento de la página actual (página anterior)
7. Módulos de la API
7.1 Auth — Autenticación
Gestión de sesiones de usuario.
POST /api/v1/sign-in — Iniciar sesión
POST /api/v1/sign-in — Iniciar sesiónBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
email | string | Sí | Correo del usuario |
password | string | Sí | Contraseña |
Respuesta: Token de acceso y refresh token.
POST /api/v1/sign-out — Cerrar sesión
POST /api/v1/sign-out — Cerrar sesiónInvalida el refresh token activo. Requiere autenticación.
Body: Vacío.
POST /api/v1/refresh-token — Renovar token
POST /api/v1/refresh-token — Renovar tokenBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
refresh_token | string | Sí | Token de refresh vigente |
7.2 Templates — Plantillas
Las plantillas son documentos PDF base con campos configurados para capturar firmas y datos de los firmantes. Son la base para crear envíos.
GET /api/v1/templates — Listar plantillas
GET /api/v1/templates — Listar plantillasQuery params:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
limit | integer | 10 | Número de resultados |
after | integer | — | Cursor para página siguiente (ID) |
before | integer | — | Cursor para página anterior (ID) |
archived | boolean | false | Incluir plantillas archivadas |
folder | string | — | Filtrar por nombre de carpeta |
q | string | — | Búsqueda por texto en el nombre |
POST /api/v1/templates — Crear plantilla desde PDF
POST /api/v1/templates — Crear plantilla desde PDFBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Nombre descriptivo de la plantilla |
folder_name | string | No | Carpeta donde guardarla |
signature_type | string | No | simple (default), advanced, biometric |
documents | array | Sí | Array de documentos PDF |
Cada documento en el array documents:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Nombre del documento |
file | string | Sí | Contenido del PDF en base64 |
Ejemplo:
{
"name": "Contrato de Servicios",
"folder_name": "Contratos 2025",
"signature_type": "advanced",
"documents": [
{
"name": "Contrato Principal",
"file": "JVBERi0xLjQKJ..."
}
]
}GET /api/v1/templates/{id} — Obtener plantilla por ID
GET /api/v1/templates/{id} — Obtener plantilla por IDPUT /api/v1/templates/{id} — Actualizar plantilla
PUT /api/v1/templates/{id} — Actualizar plantillaBody:
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nuevo nombre |
folder_name | string | Mover a otra carpeta |
signature_type | string | Cambiar tipo de firma |
fields | array | Campos del formulario de la plantilla |
DELETE /api/v1/templates/{id} — Eliminar plantilla
DELETE /api/v1/templates/{id} — Eliminar plantillaRealiza un soft-delete (la plantilla no se borra físicamente, se marca como eliminada). Retorna 204 No Content.
POST /api/v1/templates/{id}/clone — Clonar plantilla
POST /api/v1/templates/{id}/clone — Clonar plantillaCrea una copia de la plantilla identificada por {id} en el path.
Body (opcional):
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nombre para la copia |
folder_name | string | Carpeta donde colocar la copia |
POST /api/v1/templates/clone — Clonar plantilla (ID en body)
POST /api/v1/templates/clone — Clonar plantilla (ID en body)Alternativa al endpoint anterior, enviando el ID en el cuerpo.
Body:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
template_id | integer | Sí | ID de la plantilla a clonar |
name | string | No | Nombre para la copia |
folder_name | string | No | Carpeta destino |
7.3 Folders — Carpetas
Las carpetas permiten organizar las plantillas.
GET /api/v1/templates/folders — Listar carpetas
GET /api/v1/templates/folders — Listar carpetasPOST /api/v1/templates/folders — Crear carpeta
POST /api/v1/templates/folders — Crear carpetaBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Nombre de la carpeta |
GET /api/v1/templates/folders/{id} — Obtener carpeta
GET /api/v1/templates/folders/{id} — Obtener carpetaPUT /api/v1/templates/folders/{id} — Actualizar carpeta
PUT /api/v1/templates/folders/{id} — Actualizar carpetaBody: { "name": "Nuevo nombre" }
DELETE /api/v1/templates/folders/{id} — Eliminar carpeta
DELETE /api/v1/templates/folders/{id} — Eliminar carpeta7.4 Submissions — Envíos para Firma
Un submission es una instancia de una plantilla enviada a firmantes específicos. Representa el proceso de firma completo para un documento.
Estados de un envío
| Estado | Descripción |
|---|---|
pending | Creado, aún no iniciado por ningún firmante |
in_progress | Al menos un firmante ha abierto el documento |
completed | Todos los firmantes han completado la firma |
declined | Algún firmante rechazó el documento |
expired | Venció el plazo para firmar |
cancelled | Cancelado manualmente por el creador |
GET /api/v1/submissions — Listar envíos
GET /api/v1/submissions — Listar envíosQuery params:
| Parámetro | Tipo | Descripción |
|---|---|---|
page | integer | Número de página (default: 1) |
limit | integer | Resultados por página (default: 10) |
template_id | integer | Filtrar por plantilla específica |
status | string | Filtrar por estado del envío |
signature_type | string | Filtrar por tipo de firma |
start_date | string | Fecha inicio (ISO 8601, ej: 2025-01-01T00:00:00Z) |
end_date | string | Fecha fin (ISO 8601) |
q | string | Búsqueda por texto |
POST /api/v1/submissions — Crear envío
POST /api/v1/submissions — Crear envíoBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
template_id | integer | Sí | ID de la plantilla base |
submitters | array | Sí | Lista de firmantes |
message | string | No | Mensaje personalizado para los firmantes |
expires_in_days | integer | No | Días antes de que expire (default: 30) |
send_emails | boolean | No | Enviar invitaciones por email (default: true) |
Cada objeto en submitters:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
email | string | Sí | Correo del firmante |
name | string | Sí | Nombre del firmante |
role | string | No | Rol del firmante en el documento |
phone | string | No | Teléfono (útil para OTP por SMS) |
Ejemplo:
{
"template_id": 12,
"submitters": [
{
"email": "[email protected]",
"name": "Juan Pérez",
"role": "Contratante"
},
{
"email": "[email protected]",
"name": "Depto. Legal",
"role": "Testigo"
}
],
"message": "Por favor firma el contrato antes del viernes.",
"expires_in_days": 7,
"send_emails": true
}GET /api/v1/submissions/{id} — Obtener envío por ID
GET /api/v1/submissions/{id} — Obtener envío por IDPATCH /api/v1/submissions/{id} — Actualizar envío
PATCH /api/v1/submissions/{id} — Actualizar envíoPermite actualizar el company_id asociado al envío.
Body: { "company_id": 5 }
PUT /api/v1/submissions/{id}/cancel — Cancelar envío
PUT /api/v1/submissions/{id}/cancel — Cancelar envíoCancela el envío y notifica a los firmantes pendientes.
Body (opcional):
| Campo | Tipo | Descripción |
|---|---|---|
reason | string | Motivo de la cancelación |
GET /api/v1/submissions/{id}/download — Descargar documento firmado
GET /api/v1/submissions/{id}/download — Descargar documento firmadoRetorna el PDF firmado con todas las firmas aplicadas. Respuesta en application/pdf.
GET /api/v1/submissions/{id}/audit-trail — Obtener trail de auditoría
GET /api/v1/submissions/{id}/audit-trail — Obtener trail de auditoríaRetorna el historial completo de eventos del envío (quién abrió, firmó, rechazó, en qué fecha y hora).
GET /api/v1/submissions/{id}/verify-integrity — Verificar integridad del documento
GET /api/v1/submissions/{id}/verify-integrity — Verificar integridad del documentoVerifica que el documento no haya sido alterado desde su firma.
7.5 Sign — Firma Pública (por Slug)
Estos endpoints son usados por la interfaz de firma que ve el firmante. No requieren autenticación Bearer, pero operan con el slug único asignado a cada firmante.
GET /api/v1/sign/{slug} — Obtener plantilla para firma
GET /api/v1/sign/{slug} — Obtener plantilla para firmaRetorna la plantilla y sus campos para renderizar la página de firma. El slug identifica al firmante dentro del envío.
POST /api/v1/sign/{slug} — Enviar firma
POST /api/v1/sign/{slug} — Enviar firmaEl firmante completa y envía su firma.
Body:
| Campo | Tipo | Descripción |
|---|---|---|
signature_data | string | Imagen de la firma en base64 |
field_values | object | Par clave-valor con los campos completados del form |
Ejemplo:
{
"signature_data": "iVBORw0KGgoAAAANS...",
"field_values": {
"nombre_completo": "Juan Pérez",
"fecha": "2025-03-11"
}
}POST /api/v1/sign/{slug}/reject — Rechazar firma
POST /api/v1/sign/{slug}/reject — Rechazar firmaEl firmante declina firmar el documento. No requiere body.
7.6 Submitters — Firmantes de un Envío
Un submitter es la instancia de un firmante dentro de un envío específico.
Estados de un submitter
| Estado | Descripción |
|---|---|
pending | Invitación enviada, no ha abierto el link |
opened | Abrió el documento pero no ha firmado aún |
completed | Firmó exitosamente |
declined | Rechazó firmar |
GET /api/v1/submitters/{slug} — Obtener firmante por slug
GET /api/v1/submitters/{slug} — Obtener firmante por slugEndpoint público. Retorna información del firmante y el estado de su proceso.
PATCH /api/v1/submitters/{slug}/status — Actualizar estado de firmante
PATCH /api/v1/submitters/{slug}/status — Actualizar estado de firmanteBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
status | string | Sí | opened, pending, completed, declined |
kyc_flow_type | string | No | Tipo de flujo KYC a utilizar |
POST /api/v1/submitters/exchange-code — Intercambiar código de invitación
POST /api/v1/submitters/exchange-code — Intercambiar código de invitaciónCuando el firmante accede mediante un código (en lugar de link directo), este endpoint intercambia el código por un sessionId.
Body:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
slug | string | Sí | Identificador único del firmante |
code | string | Sí | Código de invitación recibido |
Respuesta:
{
"sessionId": "abc123",
"expiresAt": "2025-03-11T18:00:00Z"
}POST /api/v1/submitters/send-otp — Enviar código OTP
POST /api/v1/submitters/send-otp — Enviar código OTPPara firmas de tipo advanced. Envía un código de 6 dígitos al correo del firmante.
Header requerido: X-Session-JTI: <sessionId>
Body: { "slug": "abc123xyz" }
POST /api/v1/submitters/verify-otp — Verificar código OTP
POST /api/v1/submitters/verify-otp — Verificar código OTPValida el OTP ingresado por el firmante y eleva sus permisos para poder firmar.
Header requerido: X-Session-JTI: <sessionId>
Body:
| Campo | Tipo | Descripción |
|---|---|---|
slug | string | Identificador del firmante |
otp | string | Código de 6 dígitos recibido por correo |
POST /api/v1/submitters/{id}/resend-email — Reenviar email de invitación
POST /api/v1/submitters/{id}/resend-email — Reenviar email de invitaciónPermite reenviar el correo de firma a un firmante, opcionalmente a un nuevo email.
Body (todo opcional):
| Campo | Tipo | Descripción |
|---|---|---|
new_email | string | Nuevo correo destino (si cambió) |
custom_subject | string | Asunto personalizado del correo |
custom_body | string | Cuerpo personalizado del correo |
POST /api/v1/submitters/{slug}/face-image — Subir imagen facial (KYC)
POST /api/v1/submitters/{slug}/face-image — Subir imagen facial (KYC)Para firmas biométricas. Sube la imagen del rostro capturada durante la verificación.
Body:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
image_data | string | Sí | Imagen del rostro en base64 |
filename | string | No | Nombre del archivo |
DELETE /api/v1/submitters/{slug}/face-image — Eliminar imagen facial
DELETE /api/v1/submitters/{slug}/face-image — Eliminar imagen facialElimina la imagen facial previamente subida.
GET /api/v1/submitters/{slug}/face-image-url — Obtener URL de imagen facial
GET /api/v1/submitters/{slug}/face-image-url — Obtener URL de imagen facialRetorna la URL donde está almacenada la imagen facial.
7.7 Companies — Empresas
Gestión del directorio de empresas clientes (B2B).
GET /api/v1/companies — Listar empresas
GET /api/v1/companies — Listar empresasQuery params:
| Parámetro | Tipo | Descripción |
|---|---|---|
page | integer | Página (default: 1) |
limit | integer | Resultados por página (default: 20) |
search | string | Búsqueda por nombre |
sort_by | string | name, created_at, updated_at |
sort_order | string | asc o desc |
POST /api/v1/companies — Crear empresa
POST /api/v1/companies — Crear empresaBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Nombre de la empresa |
tax_id | string | No | RFC o identificador fiscal |
email | string | No | Correo de contacto |
phone | string | No | Teléfono |
address | string | No | Dirección |
city | string | No | Ciudad |
state | string | No | Estado |
country | string | No | País |
postal_code | string | No | Código postal |
sector | string | No | Sector o giro empresarial |
website | string | No | Sitio web |
notes | string | No | Notas internas |
GET /api/v1/companies/{id} — Obtener empresa
GET /api/v1/companies/{id} — Obtener empresaPUT /api/v1/companies/{id} — Actualizar empresa
PUT /api/v1/companies/{id} — Actualizar empresaDELETE /api/v1/companies/{id} — Eliminar empresa
DELETE /api/v1/companies/{id} — Eliminar empresaGET /api/v1/companies/{id}/submissions — Listar envíos de una empresa
GET /api/v1/companies/{id}/submissions — Listar envíos de una empresaQuery params: page, limit, status
GET /api/v1/companies/{id}/activity — Feed de actividad de empresa
GET /api/v1/companies/{id}/activity — Feed de actividad de empresaRetorna los últimos eventos relacionados con la empresa.
Query params: limit (default: 20)
GET /api/v1/companies/{id}/signers — Listar firmantes de una empresa
GET /api/v1/companies/{id}/signers — Listar firmantes de una empresaPOST /api/v1/companies/{id}/signers — Crear firmante asociado a una empresa
POST /api/v1/companies/{id}/signers — Crear firmante asociado a una empresaVer campos en la sección de Signers.
7.8 Signers — Directorio de Firmantes
El address book de firmantes del tenant. Permite tener un registro reutilizable de personas que firman documentos frecuentemente.
GET /api/v1/signers — Listar firmantes
GET /api/v1/signers — Listar firmantesQuery params:
| Parámetro | Tipo | Descripción |
|---|---|---|
page | integer | Página |
limit | integer | Resultados por página |
search | string | Búsqueda por nombre o email |
kyc_status | string | pending, verified, failed |
company_id | string | Filtrar por empresa |
POST /api/v1/signers — Crear firmante
POST /api/v1/signers — Crear firmanteBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
email | string | Sí | Correo electrónico del firmante |
firstName | string | Sí | Nombre(s) |
lastName | string | No | Apellidos |
phone | string | No | Teléfono |
dateOfBirth | string | No | Fecha de nacimiento (YYYY-MM-DD) |
nationality | string | No | Nacionalidad |
documentType | string | No | Tipo de documento (INE, pasaporte…) |
documentNumber | string | No | Número de documento |
address | object | No | Dirección completa |
role | string | No | Rol del firmante en la organización |
companyId | string | No | ID de empresa a la que pertenece |
tags | string | No | Etiquetas para clasificación |
notes | string | No | Notas internas |
El objeto address contiene: street, city, state, postalCode, country.
GET /api/v1/signers/{id} — Obtener firmante
GET /api/v1/signers/{id} — Obtener firmantePUT /api/v1/signers/{id} — Actualizar firmante
PUT /api/v1/signers/{id} — Actualizar firmanteDELETE /api/v1/signers/{id} — Eliminar firmante
DELETE /api/v1/signers/{id} — Eliminar firmantePATCH /api/v1/signers/{id}/status — Actualizar estado de firmante
PATCH /api/v1/signers/{id}/status — Actualizar estado de firmanteBody: { "status": "active" } o { "status": "archived" }
GET /api/v1/signers/{id}/submissions — Envíos de un firmante
GET /api/v1/signers/{id}/submissions — Envíos de un firmanteQuery params: page, limit, status
GET /api/v1/signers/{id}/kyc-sessions — Listar sesiones KYC del firmante
GET /api/v1/signers/{id}/kyc-sessions — Listar sesiones KYC del firmantePOST /api/v1/signers/{id}/kyc-sessions — Crear sesión KYC
POST /api/v1/signers/{id}/kyc-sessions — Crear sesión KYCBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
session_id | string | Sí | ID de sesión del proveedor KYC |
provider | string | No | Nombre del proveedor KYC |
PUT /api/v1/signers/{id}/kyc-sessions/{session_id} — Actualizar sesión KYC
PUT /api/v1/signers/{id}/kyc-sessions/{session_id} — Actualizar sesión KYCBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
status | string | Sí | Nuevo estado de la sesión |
fail_reason | string | No | Motivo de falla (si aplica) |
7.9 Contacts — Contactos
Los contactos son derivados de los firmantes y representan entidades de menor granularidad.
GET /api/v1/contacts — Listar contactos
GET /api/v1/contacts — Listar contactosGET /api/v1/contacts/{id} — Obtener contacto
GET /api/v1/contacts/{id} — Obtener contactoPUT /api/v1/contacts/{id} — Actualizar contacto
PUT /api/v1/contacts/{id} — Actualizar contactoDELETE /api/v1/contacts/{id} — Eliminar contacto
DELETE /api/v1/contacts/{id} — Eliminar contacto7.10 Certificates — Certificados Digitales
Gestión de certificados digitales usados para firma con FIEL o PSC.
GET /api/v1/certificates — Listar certificados
GET /api/v1/certificates — Listar certificadosQuery params:
| Parámetro | Tipo | Descripción |
|---|---|---|
page_size | integer | Resultados por página (default: 10) |
page | integer | Número de página (default: 1) |
user_id | string | Filtrar por usuario |
POST /api/v1/certificates — Almacenar certificado
POST /api/v1/certificates — Almacenar certificadoBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
user_id | string | Sí | ID del usuario dueño del certificado |
certificate_data | string | Sí | Certificado en base64 |
private_key | string | Sí | Llave privada en base64 |
certificate_type | string | No | fiel o psc |
alias | string | No | Nombre identificador del certificado |
metadata | object | No | Información adicional |
GET /api/v1/certificates/{id} — Obtener certificado
GET /api/v1/certificates/{id} — Obtener certificadoDELETE /api/v1/certificates/{id} — Revocar certificado
DELETE /api/v1/certificates/{id} — Revocar certificadoRetorna 204 No Content.
POST /api/v1/certificates/validate — Validar certificado
POST /api/v1/certificates/validate — Validar certificadoBody:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
certificate_data | string | Sí | Certificado a validar |
check_revocation | boolean | No | Verificar si está revocado |
check_expiration | boolean | No | Verificar si está vigente |
GET /api/v1/certificates/psc/submission/{submission_id} — Certificado PSC de un envío
GET /api/v1/certificates/psc/submission/{submission_id} — Certificado PSC de un envíoObtiene el certificado PSC asociado a un envío completado.
7.11 Storage — Almacenamiento
Gestión de archivos y documentos almacenados.
Nota: La subida de archivos (
POST /api/v1/storage/files) no está implementada vía REST. Para subir archivos usa el canal gRPC streaming directo.
GET /api/v1/storage/files — Listar archivos
GET /api/v1/storage/files — Listar archivosQuery params:
| Parámetro | Tipo | Descripción |
|---|---|---|
limit | integer | Límite de resultados (def. 10) |
offset | integer | Desplazamiento (def. 0) |
GET /api/v1/storage/files/{id} — Obtener metadata de archivo
GET /api/v1/storage/files/{id} — Obtener metadata de archivo{id} es un UUID v4.
DELETE /api/v1/storage/files/{id} — Eliminar archivo
DELETE /api/v1/storage/files/{id} — Eliminar archivoRetorna 204 No Content.
GET /api/v1/storage/files/{id}/signed-url — Obtener URL firmada temporal
GET /api/v1/storage/files/{id}/signed-url — Obtener URL firmada temporalGenera una URL de acceso temporal al archivo.
Query params:
| Parámetro | Tipo | Descripción |
|---|---|---|
expiration | integer | Segundos de vigencia (default: 3600) |
Respuesta:
{
"url": "https://storage.jaak.ai/files/abc123?token=...",
"expires_at": "2025-03-11T13:00:00Z"
}GET /api/v1/storage/files/{id}/download — Descargar archivo
GET /api/v1/storage/files/{id}/download — Descargar archivoQuery params:
| Parámetro | Tipo | Descripción |
|---|---|---|
inline | boolean | true = visualizar en browser, false = descargar (default: false) |
GET /api/v1/storage/files/{id}/preview — Preview del documento
GET /api/v1/storage/files/{id}/preview — Preview del documentoRetorna una imagen PNG de la primera página del documento. Útil para mostrar miniaturas.
POST /api/v1/storage/download-with-audit — Descargar con audit trail
POST /api/v1/storage/download-with-audit — Descargar con audit trailGenera un PDF que incluye el documento firmado más el trail de auditoría adjunto.
Body:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
document_uuid | string | Sí | UUID del documento |
submission_id | integer | No | ID del envío |
document_name | string | No | Nombre del documento |
slug | string | No | Slug del envío |
status | string | No | Estado del envío |
signature_type | string | No | Tipo de firma |
created_at | string | No | Fecha de creación |
completed_at | string | No | Fecha de finalización |
verification_hash | string | No | Hash de verificación de integridad |
certificate_id | string | No | ID del certificado PSC |
events | array | No | Eventos del audit trail |
Cada objeto en events contiene: type, timestamp, actor, actor_email, description.
GET /api/v1/storage/submissions/{id}/document-with-audit — Ver documento con audit trail
GET /api/v1/storage/submissions/{id}/document-with-audit — Ver documento con audit trailQuery params:
| Parámetro | Tipo | Descripción |
|---|---|---|
inline | boolean | true = visualizar en browser (default: false) |
7.12 Dashboard — Estadísticas
GET /api/v1/dashboard/stats — Estadísticas generales
GET /api/v1/dashboard/stats — Estadísticas generalesRetorna métricas globales del dashboard (totales, tasas de completado, etc.).
GET /api/v1/dashboard/pending — Envíos pendientes
GET /api/v1/dashboard/pending — Envíos pendientesLista los envíos que aún no han sido completados.
GET /api/v1/stats/submissions — Estadísticas de envíos
GET /api/v1/stats/submissions — Estadísticas de envíosEstadísticas detalladas sobre el historial de envíos.
7.13 Quotas — Cuotas y Suscripciones
GET /api/v1/quotas/status — Estado actual de cuotas
GET /api/v1/quotas/status — Estado actual de cuotasRetorna cuánto del plan disponible se ha consumido.
GET /api/v1/quotas/subscription — Detalles de la suscripción activa
GET /api/v1/quotas/subscription — Detalles de la suscripción activaGET /api/v1/quotas/plans — Listar planes disponibles
GET /api/v1/quotas/plans — Listar planes disponiblesGET /api/v1/quotas/plans/{identifier} — Obtener plan específico
GET /api/v1/quotas/plans/{identifier} — Obtener plan específico{identifier} puede ser el ID o slug del plan.
POST /api/v1/quotas/check — Verificar si hay cuota disponible
POST /api/v1/quotas/check — Verificar si hay cuota disponibleVerifica si se puede ejecutar una operación antes de intentarla.
Body:
| Campo | Tipo | Descripción |
|---|---|---|
feature | string | Funcionalidad a verificar (ej: submissions) |
quantity | integer | Cantidad que se desea usar |
7.14 Audit — Auditoría y Compliance
GET /api/v1/audit/compliance-report — Generar reporte de compliance
GET /api/v1/audit/compliance-report — Generar reporte de complianceGenera un reporte de cumplimiento normativo del tenant.
GET /api/v1/audit/search — Buscar eventos de auditoría
GET /api/v1/audit/search — Buscar eventos de auditoríaPermite consultar el log de eventos del sistema para auditorías.
7.15 KYC Verifications — Verificaciones de Identidad
Gestión de sesiones de verificación KYC asociadas a firmantes biométricos.
GET /api/v1/kyc-verifications — Listar verificaciones
GET /api/v1/kyc-verifications — Listar verificacionesPOST /api/v1/kyc-verifications — Crear verificación
POST /api/v1/kyc-verifications — Crear verificaciónGET /api/v1/kyc-verifications/{id} — Obtener verificación por ID
GET /api/v1/kyc-verifications/{id} — Obtener verificación por IDGET /api/v1/kyc-verifications/slug/{slug} — Obtener verificación por slug
GET /api/v1/kyc-verifications/slug/{slug} — Obtener verificación por slugEndpoint público (sin autenticación). Usado durante el flujo de verificación del firmante.
7.16 Settings — Configuración
GET /api/v1/settings/profile — Obtener perfil de usuario
GET /api/v1/settings/profile — Obtener perfil de usuarioPUT /api/v1/settings/profile — Actualizar perfil de usuario
PUT /api/v1/settings/profile — Actualizar perfil de usuarioGET /api/v1/settings/company — Obtener configuración de empresa
GET /api/v1/settings/company — Obtener configuración de empresaPUT /api/v1/settings/company — Actualizar configuración de empresa
PUT /api/v1/settings/company — Actualizar configuración de empresa7.17 Webhooks
Endpoints para recibir notificaciones de terceros. No requieren autenticación Bearer.
POST /api/v1/webhooks/kyc — Webhook de proveedor KYC
POST /api/v1/webhooks/kyc — Webhook de proveedor KYCRecibe notificaciones del proveedor KYC cuando una verificación cambia de estado.
8. Modelos de Datos
AuthResponse
{
"access_token": "string",
"refresh_token": "string",
"expires_in": 3600,
"user": {}
}TemplateResponse
{
"id": 1,
"name": "Contrato de Servicios",
"folder_name": "Contratos 2025",
"signature_type": "advanced",
"status": "active",
"fields": [],
"documents": [],
"submission_count": 15,
"created_at": "2025-01-10T09:00:00Z",
"updated_at": "2025-03-01T14:30:00Z"
}SubmissionResponse
{
"id": 101,
"slug": "sub_abc123",
"template": { ... },
"status": "in_progress",
"signature_type": "advanced",
"submitters": [
{
"id": 201,
"slug": "sbm_xyz789",
"email": "[email protected]",
"name": "Juan Pérez",
"role": "Contratante",
"status": "opened",
"sent_at": "2025-03-10T10:00:00Z",
"opened_at": "2025-03-10T11:30:00Z",
"completed_at": null
}
],
"combined_document_url": "https://...",
"psc_constancia_url": null,
"psc_certificate_id": null,
"created_at": "2025-03-10T09:55:00Z",
"completed_at": null
}Pagination
{
"page": 1,
"limit": 10,
"total": 250,
"has_more": true
}Error
{
"error": "Descripción del error"
}9. Flujo Completo de Firma
A continuación se describe el flujo típico de extremo a extremo para enviar un documento a firma:
1. Autenticación
POST /api/v1/sign-in
→ Obtienes access_token
2. Crear plantilla (una sola vez por tipo de documento)
POST /api/v1/templates
→ Obtienes template_id
3. Crear envío (cada vez que necesites firmas)
POST /api/v1/submissions
Body: { template_id, submitters: [{ email, name }] }
→ Se envía email automático a cada firmante
→ Obtienes submission_id y por cada firmante un slug
4. El firmante recibe el email con su link único
Link contiene el slug personal del firmante
5. El firmante abre la página de firma
GET /api/v1/sign/{slug} (sin auth)
[Si es firma advanced]
POST /api/v1/submitters/send-otp (envía OTP al correo)
POST /api/v1/submitters/verify-otp (el firmante ingresa el código)
[Si es firma biometric]
POST /api/v1/submitters/{slug}/face-image (sube selfie en base64)
6. El firmante envía la firma
POST /api/v1/sign/{slug}
Body: { signature_data, field_values }
7. Cuando todos firman, el envío pasa a status "completed"
8. Descargar el documento firmado
GET /api/v1/submissions/{id}/download
→ PDF firmado con todas las firmas
9. (Opcional) Descargar con audit trail
GET /api/v1/storage/submissions/{id}/document-with-audit
→ PDF + registro completo de eventos
10. Glosario
| Término | Definición |
|---|---|
| Submission | Instancia de un documento enviado a uno o más firmantes para su firma. |
| Submitter | Firmante asignado a un envío específico. Tiene un slug único para acceder a su página de firma. |
| Signer | Registro en el directorio de personas que pueden ser invitadas a firmar (address book). |
| Template | Documento PDF base con campos configurados, reutilizable para múltiples envíos. |
| Slug | Identificador único alfanumérico asignado a un submitter o envío para acceso público. |
| FIEL | Firma Electrónica Avanzada del SAT (México). Requiere certificado .cer y llave .key. |
| PSC | Prestador de Servicios de Certificación. Entidad autorizada para emitir firmas con validez legal máxima. |
| OTP | One-Time Password. Código de un solo uso de 6 dígitos enviado por correo para verificar identidad. |
| KYC | Know Your Customer. Proceso de verificación de identidad mediante selfie y documento oficial. |
| Audit Trail | Registro cronológico de todos los eventos de un envío (apertura, firma, rechazo, etc.). |
| Base64 | Codificación estándar para transmitir archivos binarios (PDFs, imágenes) como texto en JSON. |
| Soft-delete | Eliminación lógica: el registro se marca como eliminado pero no se borra físicamente de la BD. |
| JWT | JSON Web Token. Formato estándar del token de autenticación. |
| Bearer Token | Esquema de autenticación HTTP donde el token se envía en el header Authorization. |
| gRPC | Protocolo de comunicación de alto rendimiento usado internamente por JAAK Signa. |
Documentación generada para JAAK Signa API v1.0.0 — [email protected]
Updated 3 days ago
