Contratos

Crear, configurar, enviar a firmar y consultar contratos.

GET/api/admin/contract/status/{contractId}

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

  • contractIdstringobligatorio

    ID del contrato.

Respuestas

  • 200object
    Campos de la respuesta
    • blockchainStatusstring

      Solo si el contrato lleva sello blockchain: pending, confirmed o failed.

    • createdAtstring (date-time)obligatorio
    • creatorobjectobligatorio
      4 campos
      • _idstringobligatorio
      • emailstringobligatorio
      • familyNamestringobligatorio
      • givenNamestringobligatorio
    • documentIdnumber

      Número de documento dentro de la cuenta.

    • externalIdstringobligatorio

      El externalId que enviaste al configurar el contrato.

    • namestringobligatorio
    • pdfstringobligatorio

      URL del PDF firmado. Vacío hasta que el contrato está firmado y, si lleva sello blockchain, hasta que el sello se confirma.

    • signatureTypestring
    • signedAtstringobligatorio

      Fecha de firma, o vacío si no está firmado.

    • statusstringobligatorio

      Estado 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

GET
/api/admin/contract/status/{contractId}
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"
}
GET/api/admin/list/contracts

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-Documentsinteger

      Número total de contratos.

    • X-Total-Pagesinteger

      Nú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

GET
/api/admin/list/contracts
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"
  }
]
POST/api/contract/archive/{contractId}

Archivar un contrato

Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.

Parámetros de ruta

  • contractIdstringobligatorio

    ID 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

POST
/api/contract/archive/{contractId}
curl -X POST "https://enterprise-stage.api.trato.io/api/contract/archive/{contractId}" \
  -H "apikey: $TRATO_API_KEY"

Respuesta

{
  "success": true
}
DELETE/api/contract/cancel/{contractId}

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

  • contractIdstringobligatorio

    ID 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

DELETE
/api/contract/cancel/{contractId}
curl -X DELETE "https://enterprise-stage.api.trato.io/api/contract/cancel/{contractId}" \
  -H "apikey: $TRATO_API_KEY"

Respuesta

{
  "success": true
}
POST/api/contract/configuration/{contractId}

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

  • contractIdstringobligatorio

    ID del contrato.

Cuerpo application/json

  • allowAttachmentsboolean

    Permite a los participantes subir anexos.

  • blockchainTypestring

    Registro en blockchain. Se ignora (queda en none) si signatureType es none o externalDigitalSignature.

    Valores: basic, none

  • expiryEndDatestring

    Fin de vigencia (AAAA-MM-DD).

  • expiryStartDatestring

    Inicio de vigencia (AAAA-MM-DD).

  • expiryUndefinedboolean

    El contrato no tiene fecha de vencimiento.

  • externalIdstring

    Identificador del contrato en tu sistema. Se devuelve en las consultas.

  • hasShield3AutoValidationboolean

    Validación automática de Blindaje 3.

  • languagestring

    Idioma del contrato y de las notificaciones.

    Valores: es, en, pt, de

  • namestring

    Nombre del contrato.

  • negotiateboolean

    Permite a los participantes negociar el contrato.

  • notificationTypestring

    Canal por el que se notifica a los participantes.

    Valores: email, sms, email-sms, email-whatsapp, whatsapp, none

  • ownerSelfSignboolean

    El dueño del contrato también firma.

  • passwordboolean

    Protege el contrato con una contraseña generada por TRATO.

  • signatureTypestring

    Tipo de firma.

    Valores: autograph, certificate, none, externalDigitalSignature, shield2-certificate

  • stampNomboolean

    Sella el contrato firmado con la constancia NOM-151.

  • validateEsignCertificateboolean

    Valida el certificado de la firma electrónica avanzada (e.firma).

  • validationRequiredboolean

    El contrato debe validarse antes de enviarse a firmar.

  • webhookstring

    URL 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

POST
/api/contract/configuration/{contractId}
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
}
GET/api/contract/documents/{contractId}

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

  • contractIdstringobligatorio

    ID del contrato.

Respuestas

  • 200object
    Campos de la respuesta
    • contractidstringobligatorio
    • documentsobjectobligatorio
      4 campos
      • partial_signed_contractstring

        Con ?partial=true: PDF con las firmas hechas hasta ahora.

      • signed_certificatestring

        Constancia (NOM-151 o RFC 3161).

      • signed_certificate_binstring

        Constancia en binario.

      • signed_contractstring

        PDF firmado.

    • namestringobligatorio
    • participantsarray<object>
      3 campos
      • emailstringobligatorio
      • participantidstringobligatorio
      • videostring

        Ví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

GET
/api/contract/documents/{contractId}
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"
    }
  ]
}
POST/api/contract/finalize/{contractId}

Finalizar un contrato

Autenticación. Cabecera apikey con tu API key, o Authorization: Bearer con un token.

Parámetros de ruta

  • contractIdstringobligatorio

    ID 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

POST
/api/contract/finalize/{contractId}
curl -X POST "https://enterprise-stage.api.trato.io/api/contract/finalize/{contractId}" \
  -H "apikey: $TRATO_API_KEY"

Respuesta

{
  "success": true
}
POST/api/contract/send/{contractId}

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

  • contractIdstringobligatorio

    ID del contrato.

Cuerpo application/json

  • onlyValidateboolean

    Solo comprueba que el contrato se puede enviar, sin enviarlo.

  • sendNotificationsboolean

    Envía las notificaciones a los participantes. Por defecto true.

  • showEmailsboolean

    Devuelve en la respuesta el correo de cada participante.

  • showSignLinksboolean

    Devuelve en la respuesta los enlaces de firma de cada participante.

Respuestas

  • 200object
    Campos de la respuesta
    • contractobject

      Solo con showSignLinks.

      1 campo
      • participantsarray<object>obligatorio
        3 campos
        • emailstring

          Solo con showEmails.

        • participantidstringobligatorio
        • signUrlstringobligatorio

          Enlace 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

POST
/api/contract/send/{contractId}
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
}
GET/api/contract/status/{contractId}

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

  • contractIdstringobligatorio

    ID del contrato.

Respuestas

  • 200object
    Campos de la respuesta
    • blockchainStatusstring

      Solo si el contrato lleva sello blockchain: pending, confirmed o failed.

    • createdAtstring (date-time)obligatorio
    • creatorobjectobligatorio
      4 campos
      • _idstringobligatorio
      • emailstringobligatorio
      • familyNamestringobligatorio
      • givenNamestringobligatorio
    • documentIdnumber

      Número de documento dentro de la cuenta.

    • externalIdstringobligatorio

      El externalId que enviaste al configurar el contrato.

    • namestringobligatorio
    • pdfstringobligatorio

      URL del PDF firmado. Vacío hasta que el contrato está firmado y, si lleva sello blockchain, hasta que el sello se confirma.

    • signatureTypestring
    • signedAtstringobligatorio

      Fecha de firma, o vacío si no está firmado.

    • statusstringobligatorio

      Estado 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

GET
/api/contract/status/{contractId}
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"
}
GET/api/contracts/{contractId}/documents/{document}

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

  • contractIdstringobligatorio

    ID del contrato.

  • documentstringobligatorio

    signed-contract: PDF firmado. certificate: constancia (RFC 3161 si la hay; si no, NOM-151).

    Valores: signed-contract, certificate

Parámetros de consulta

  • redirectstring

    false: devuelve la URL en JSON en lugar de redirigir.

    Valores: false

  • formatstring

    Solo con certificate: la constancia en binario.

    Valores: binary

Respuestas

  • 200Con `redirect=false`.
    Campos de la respuesta
    • expiresAtstring (date-time)obligatorio

      Cuándo caduca url; null si la URL no está firmada.

    • urlstringobligatorio

      URL de descarga del archivo.

  • 302Redirección a la URL de descarga (`Location`).
    Cabeceras de la respuesta
    • Locationstring

      URL 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

GET
/api/contracts/{contractId}/documents/{document}
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"
}
GET/api/contracts/{contractId}/package

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

  • contractIdstringobligatorio

    ID 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

GET
/api/contracts/{contractId}/package
curl "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/package" \
  -H "apikey: $TRATO_API_KEY"
POST/api/contracts/{contractId}/stamp-shield2-certificate

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

  • contractIdstringobligatorio

    ID 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

POST
/api/contracts/{contractId}/stamp-shield2-certificate
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/stamp-shield2-certificate" \
  -H "apikey: $TRATO_API_KEY"

Respuesta

{
  "success": true
}
POST/api/contracts/{contractId}/status/external-digital-signature

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

  • contractIdstringobligatorio

    ID 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

POST
/api/contracts/{contractId}/status/external-digital-signature
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/status/external-digital-signature" \
  -H "apikey: $TRATO_API_KEY"

Respuesta

{
  "success": true
}
POST/api/contracts/{contractId}/status/physical-signature

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

  • contractIdstringobligatorio

    ID 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

POST
/api/contracts/{contractId}/status/physical-signature
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/status/physical-signature" \
  -H "apikey: $TRATO_API_KEY"

Respuesta

{
  "success": true
}
POST/api/contracts/{contractId}/validate/nom151

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

  • contractIdstringobligatorio

    ID del contrato.

Cuerpo multipart/form-data

  • nom151fileobligatorio

    Archivo 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

POST
/api/contracts/{contractId}/validate/nom151
curl -X POST "https://enterprise-stage.api.trato.io/api/contracts/{contractId}/validate/nom151" \
  -H "apikey: $TRATO_API_KEY" \
  -F "nom151=@archivo.pdf"

Respuesta

{}
POST/api/create/contract

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

  • contractNamestring

    Nombre del contrato. Si no se envía, se usa el de la plantilla.

  • documentobject

    Documento del contrato. Obligatorio cuando source es document.

    2 campos
    • datastringobligatorio

      Contenido del archivo en Base64. Se admite también una data URL (data:application/pdf;base64,...).

    • typestringobligatorio

      Formato del archivo. Al crear un contrato: pdf o word. En anexos: pdf o docx.

  • propertiesobject

    Reservado. Se ignora.

  • sourcestringobligatorio

    Origen del contrato. template: se crea a partir de una plantilla publicada. document: se crea a partir de un PDF o Word y usa la plantilla templateid para los participantes y la configuración.

    Valores: template, document

  • templateidstringobligatorio

    ID de la plantilla (GET /api/list/templates). Obligatorio con los dos orígenes.

Respuestas

  • 200object
    Campos de la respuesta
    • contractidstringobligatorio

      ID 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

POST
/api/create/contract
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
}
GET/api/list/contracts

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-Documentsinteger

      Número total de contratos.

    • X-Total-Pagesinteger

      Nú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

GET
/api/list/contracts
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"
  }
]