Contratos
Crear, configurar, enviar a firmar y consultar contratos.
Consultar el estado de cualquier contrato de la cuenta
Como GET /api/contract/status/{contractId} para contratos de otros usuarios. Requiere ADMIN_REPORT.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
blockchainStatusstringSolo si el contrato lleva sello blockchain:
pending,confirmedofailed.createdAtstring (date-time)obligatoriocreatorobjectobligatorio4 campos
_idstringobligatorioemailstringobligatoriofamilyNamestringobligatoriogivenNamestringobligatorio
documentIdnumberNúmero de documento dentro de la cuenta.
externalIdstringobligatorioEl
externalIdque enviaste al configurar el contrato.namestringobligatoriopdfstringobligatorioURL del PDF firmado. Vacío hasta que el contrato está firmado y, si lleva sello blockchain, hasta que el sello se confirma.
signatureTypestringsignedAtstringobligatorioFecha de firma, o vacío si no está firmado.
statusstringobligatorioEstado del contrato:
""(borrador),SENT_TO_FILL,SENT_TO_VALIDATE,NEGOTIATION,SENT_TO_SIGN,RECEIVED_SIGNED(firmado),FINALIZED,CANCELED,PHYSICAL_SIGNATURE,EXTERNAL_SIGNATURE.
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl "https://enterprise-stage.api.trato.io/api/admin/contract/status/{contractId}" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"blockchainStatus": "confirmed",
"createdAt": "2026-01-01T00:00:00.000Z",
"creator": {
"_id": "65f1c2a9e4b0a1b2c3d4e000",
"email": "ana@example.com",
"familyName": "García",
"givenName": "Ana"
},
"documentId": 1042,
"externalId": "CRM-2026-0042",
"name": "Contrato de prestación de servicios",
"pdf": "string",
"signatureType": "autograph",
"signedAt": "string",
"status": "RECEIVED_SIGNED"
}Listar los contratos de toda la cuenta
Como GET /api/list/contracts, pero con los contratos de todos los usuarios. Requiere API_ACCESS y ADMIN_REPORT.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Respuestas
- 200array<object>
Cabeceras de la respuesta
X-Total-DocumentsintegerNúmero total de contratos.
X-Total-PagesintegerNúmero de páginas.
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl "https://enterprise-stage.api.trato.io/api/admin/list/contracts" \
-H "apikey: $TRATO_API_KEY"Respuesta
[
{
"_id": "65f1c2a9e4b0a1b2c3d4e5f6",
"createdAt": "2026-01-01T00:00:00.000Z",
"creator": {
"_id": "65f1c2a9e4b0a1b2c3d4e000",
"email": "ana@example.com",
"familyName": "García",
"givenName": "Ana"
},
"externalId": "CRM-2026-0042",
"name": "Contrato de arrendamiento",
"participants": [
{}
],
"status": "SENT_TO_SIGN",
"template": "string"
}
]Archivar un contrato
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contract/archive/{contractId}" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"success": true
}Cancelar un contrato
No se pueden cancelar contratos firmados, finalizados o ya cancelados.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X DELETE "https://enterprise-stage.api.trato.io/api/contract/cancel/{contractId}" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"success": true
}Configurar un contrato
Cambia la configuración de un contrato en borrador. Envía solo los campos que quieras cambiar.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Cuerpo application/json
allowAttachmentsbooleanPermite a los participantes subir anexos.
blockchainTypestringRegistro en blockchain. Se ignora (queda en
none) sisignatureTypeesnoneoexternalDigitalSignature.Valores:
basic,noneexpiryEndDatestringFin de vigencia (
AAAA-MM-DD).expiryStartDatestringInicio de vigencia (
AAAA-MM-DD).expiryUndefinedbooleanEl contrato no tiene fecha de vencimiento.
externalIdstringIdentificador del contrato en tu sistema. Se devuelve en las consultas.
hasShield3AutoValidationbooleanValidación automática de Blindaje 3.
languagestringIdioma del contrato y de las notificaciones.
Valores:
es,en,pt,denamestringNombre del contrato.
negotiatebooleanPermite a los participantes negociar el contrato.
notificationTypestringCanal por el que se notifica a los participantes.
Valores:
email,sms,email-sms,email-whatsapp,whatsapp,noneownerSelfSignbooleanEl dueño del contrato también firma.
passwordbooleanProtege el contrato con una contraseña generada por TRATO.
signatureTypestringTipo de firma.
Valores:
autograph,certificate,none,externalDigitalSignature,shield2-certificatestampNombooleanSella el contrato firmado con la constancia NOM-151.
validateEsignCertificatebooleanValida el certificado de la firma electrónica avanzada (e.firma).
validationRequiredbooleanEl contrato debe validarse antes de enviarse a firmar.
webhookstringURL que recibe los eventos del contrato (ver Webhooks).
Respuestas
- 200object
Campos de la respuesta
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contract/configuration/{contractId}" \
-H "apikey: $TRATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"allowAttachments": true,
"blockchainType": "none",
"expiryEndDate": "2026-12-31",
"expiryStartDate": "2026-01-01",
"expiryUndefined": true,
"externalId": "CRM-2026-0042",
"hasShield3AutoValidation": true,
"language": "es",
"name": "Contrato de arrendamiento",
"negotiate": true,
"notificationType": "email",
"ownerSelfSign": true,
"password": true,
"signatureType": "autograph",
"stampNom": true,
"validateEsignCertificate": true,
"validationRequired": true,
"webhook": "https://example.com/trato/webhook"
}'Respuesta
{
"success": true
}Obtener los documentos firmados
PDF firmado y constancias (NOM-151 / RFC 3161) cuando el contrato está firmado. Con partial=true, PDF parcial mientras se firma.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
contractidstringobligatoriodocumentsobjectobligatorio4 campos
partial_signed_contractstringCon
?partial=true: PDF con las firmas hechas hasta ahora.signed_certificatestringConstancia (NOM-151 o RFC 3161).
signed_certificate_binstringConstancia en binario.
signed_contractstringPDF firmado.
namestringobligatorioparticipantsarray<object>3 campos
emailstringobligatorioparticipantidstringobligatoriovideostringVídeo de la firma, si se grabó.
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl "https://enterprise-stage.api.trato.io/api/contract/documents/{contractId}" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"contractid": "string",
"documents": {
"partial_signed_contract": "string",
"signed_certificate": "string",
"signed_certificate_bin": "string",
"signed_contract": "string"
},
"name": "string",
"participants": [
{
"email": "string",
"participantid": "string",
"video": "string"
}
]
}Finalizar un contrato
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contract/finalize/{contractId}" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"success": true
}Enviar a firmar
Envía el contrato a los participantes para que lo firmen.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Cuerpo application/json
onlyValidatebooleanSolo comprueba que el contrato se puede enviar, sin enviarlo.
sendNotificationsbooleanEnvía las notificaciones a los participantes. Por defecto
true.showEmailsbooleanDevuelve en la respuesta el correo de cada participante.
showSignLinksbooleanDevuelve en la respuesta los enlaces de firma de cada participante.
Respuestas
- 200object
Campos de la respuesta
contractobjectSolo con
showSignLinks.1 campo
participantsarray<object>obligatorio3 campos
emailstringSolo con
showEmails.participantidstringobligatoriosignUrlstringobligatorioEnlace de firma del participante.
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contract/send/{contractId}" \
-H "apikey: $TRATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"onlyValidate": true,
"sendNotifications": true,
"showEmails": true,
"showSignLinks": true
}'Respuesta
{
"contract": {
"participants": [
{
"email": "string",
"participantid": "string",
"signUrl": "string"
}
]
},
"success": true
}Consultar el estado de un contrato
Estado, fechas y, cuando está firmado, la URL del PDF.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
blockchainStatusstringSolo si el contrato lleva sello blockchain:
pending,confirmedofailed.createdAtstring (date-time)obligatoriocreatorobjectobligatorio4 campos
_idstringobligatorioemailstringobligatoriofamilyNamestringobligatoriogivenNamestringobligatorio
documentIdnumberNúmero de documento dentro de la cuenta.
externalIdstringobligatorioEl
externalIdque enviaste al configurar el contrato.namestringobligatoriopdfstringobligatorioURL del PDF firmado. Vacío hasta que el contrato está firmado y, si lleva sello blockchain, hasta que el sello se confirma.
signatureTypestringsignedAtstringobligatorioFecha de firma, o vacío si no está firmado.
statusstringobligatorioEstado del contrato:
""(borrador),SENT_TO_FILL,SENT_TO_VALIDATE,NEGOTIATION,SENT_TO_SIGN,RECEIVED_SIGNED(firmado),FINALIZED,CANCELED,PHYSICAL_SIGNATURE,EXTERNAL_SIGNATURE.
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl "https://enterprise-stage.api.trato.io/api/contract/status/{contractId}" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"blockchainStatus": "confirmed",
"createdAt": "2026-01-01T00:00:00.000Z",
"creator": {
"_id": "65f1c2a9e4b0a1b2c3d4e000",
"email": "ana@example.com",
"familyName": "García",
"givenName": "Ana"
},
"documentId": 1042,
"externalId": "CRM-2026-0042",
"name": "Contrato de prestación de servicios",
"pdf": "string",
"signatureType": "autograph",
"signedAt": "string",
"status": "RECEIVED_SIGNED"
}Descargar un documento firmado
Enlace estable al PDF firmado o a la constancia de un contrato firmado: redirige a una URL de descarga recién firmada.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
documentstringobligatoriosigned-contract: PDF firmado.certificate: constancia (RFC 3161 si la hay; si no, NOM-151).Valores:
signed-contract,certificate
Parámetros de consulta
redirectstringfalse: devuelve la URL en JSON en lugar de redirigir.Valores:
falseformatstringSolo con
certificate: la constancia en binario.Valores:
binary
Respuestas
- 200Con `redirect=false`.
Campos de la respuesta
expiresAtstring (date-time)obligatorioCuándo caduca
url;nullsi la URL no está firmada.urlstringobligatorioURL de descarga del archivo.
- 302Redirección a la URL de descarga (`Location`).
Cabeceras de la respuesta
LocationstringURL de descarga.
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
- 404Documento desconocido.
Petición
curl "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/documents/{document}" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"expiresAt": "2026-01-01T00:00:00.000Z",
"url": "string"
}Descargar el paquete del contrato
ZIP con el contrato y sus anexos.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200Archivo ZIP.
application/zip - 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/package" \
-H "apikey: $TRATO_API_KEY"Estampar el certificado de Blindaje 2
Para contratos en borrador con signatureType = shield2-certificate.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/stamp-shield2-certificate" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"success": true
}Marcar como firma digital externa
Para contratos en borrador con signatureType = externalDigitalSignature.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/status/external-digital-signature" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"success": true
}Marcar como firma física
Para contratos en borrador con signatureType = none que se firman en papel.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Respuestas
- 200object
Campos de la respuesta
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/status/physical-signature" \
-H "apikey: $TRATO_API_KEY"Respuesta
{
"success": true
}Validar una constancia NOM-151
Comprueba que la constancia corresponde al contrato. Máximo 150 MB. Requiere API_ACCESS y VALIDATE_NOM_151.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Parámetros de ruta
contractIdstringobligatorioID del contrato.
Cuerpo multipart/form-data
nom151fileobligatorioArchivo de la constancia.
Respuestas
- 200Resultado de la validación.
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/validate/nom151" \
-H "apikey: $TRATO_API_KEY" \
-F "nom151=@archivo.pdf"Respuesta
{}Crear un contrato
Crea un contrato en borrador a partir de una plantilla o de un documento PDF/Word. Después: configurarlo, rellenar participantes y variables, y enviarlo a firmar.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Cuerpo application/json
contractNamestringNombre del contrato. Si no se envía, se usa el de la plantilla.
documentobjectDocumento del contrato. Obligatorio cuando
sourceesdocument.2 campos
datastringobligatorioContenido del archivo en Base64. Se admite también una data URL (
data:application/pdf;base64,...).typestringobligatorioFormato del archivo. Al crear un contrato:
pdfoword. En anexos:pdfodocx.
propertiesobjectReservado. Se ignora.
sourcestringobligatorioOrigen del contrato.
template: se crea a partir de una plantilla publicada.document: se crea a partir de un PDF o Word y usa la plantillatemplateidpara los participantes y la configuración.Valores:
template,documenttemplateidstringobligatorioID de la plantilla (
GET /api/list/templates). Obligatorio con los dos orígenes.
Respuestas
- 200object
Campos de la respuesta
contractidstringobligatorioID del contrato creado.
successbooleanobligatorio
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl -X POST "https://enterprise-stage.api.trato.io/api/create/contract" \
-H "apikey: $TRATO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contractName": "Contrato de prestación de servicios - ACME",
"document": {
"data": "JVBERi0xLjcKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFI...",
"type": "pdf"
},
"properties": {},
"source": "template",
"templateid": "65f1c2a9e4b0a1b2c3d4e5f6"
}'Respuesta
{
"contractid": "65f1c2a9e4b0a1b2c3d4e5f6",
"success": true
}Listar contratos
Contratos del usuario de la credencial (de toda la cuenta con ADMIN_REPORT), paginados. El total va en las cabeceras X-Total-Pages y X-Total-Documents.
Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.
Respuestas
- 200array<object>
Cabeceras de la respuesta
X-Total-DocumentsintegerNúmero total de contratos.
X-Total-PagesintegerNúmero de páginas.
- 400Petición no válida: parámetros, contrato inexistente o en un estado que no lo permite.
- 401Credencial ausente, caducada o de otro entorno.
- 403Al usuario le falta un privilegio (p. ej. API_ACCESS).
Petición
curl "https://enterprise-stage.api.trato.io/api/list/contracts" \
-H "apikey: $TRATO_API_KEY"Respuesta
[
{
"_id": "65f1c2a9e4b0a1b2c3d4e5f6",
"createdAt": "2026-01-01T00:00:00.000Z",
"creator": {
"_id": "65f1c2a9e4b0a1b2c3d4e000",
"email": "ana@example.com",
"familyName": "García",
"givenName": "Ana"
},
"externalId": "CRM-2026-0042",
"name": "Contrato de arrendamiento",
"participants": [
{}
],
"status": "SENT_TO_SIGN",
"template": "string"
}
]