> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firmalo.com.mx/llms.txt
> Use this file to discover all available pages before exploring further.

# Listar los documentos creados por un usuario de la organización

> Devuelve una página de documentos creados por el usuario indicado. Admite la misma paginación y filtros por estatus y fechas que el listado de la organización.



## OpenAPI

````yaml https://signature.api.staging.data-lo.online/api/v1/integration/docs-json get /api/v1/integration/users/{userId}/documents
openapi: 3.0.0
info:
  title: Firmalo Integration API
  description: >-
    API para que tu sistema cree documentos PDF con su flujo de firmas, consulte
    su estado y gestione el acceso de los firmantes en Firmalo.


    **Autenticación.** Todas las rutas usan la API key de tu organización en el
    header `X-API-Key`, con formato `fma_live_<publicId>_<secret>`. Pégala en
    «Authorize» para probar desde esta página. Ejemplo (no es una llave real):


    `X-API-Key:
    fma_live_0123456789abcdef_EjemploNoRealEjemploNoRealEjemploNoReal1234`


    **Idempotencia.** `POST /integration/documents` exige `Idempotency-Key`:
    repetir la petición con la misma clave y el mismo contenido devuelve el
    documento original, sin crear ni cobrar otro. Ejemplo:


    `Idempotency-Key: erp-contrato-2026-000184`


    **Errores.** Todos tienen la forma `{ "success": false, "error": { "code",
    "message", "details" } }`, con un `code` estable para decidir qué hacer sin
    depender del texto.
  version: '1.0'
servers: []
security:
  - integration-api-key: []
tags:
  - name: Integration Documents
    description: Documentos, firmantes y accesos de firma de tu organización
paths:
  /api/v1/integration/users/{userId}/documents:
    get:
      tags:
        - Integration Documents
      summary: Listar los documentos creados por un usuario de la organización
      description: >-
        Devuelve una página de documentos creados por el usuario indicado.
        Admite la misma paginación y filtros por estatus y fechas que el listado
        de la organización.
      operationId: IntegrationDocumentsController_listUserDocuments
      parameters:
        - name: userId
          required: true
          in: path
          description: '`users.id` del creador'
          schema:
            format: uuid
            example: 9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d
            type: string
        - name: statuses
          required: false
          in: query
          description: >-
            Uno o varios estatus del documento. Repetible
            (`?statuses=pending&statuses=signed`) o separado por comas.
          schema:
            type: array
            items:
              type: string
              enum:
                - CREATED
                - PENDING_APPROVAL
                - PENDING_SIGNATURE
                - SIGNED
                - REJECTED
                - EXPIRED
                - CANCELLATION_PENDING
                - CANCELLED
        - name: createdFrom
          required: false
          in: query
          description: Creados desde (ISO 8601)
          schema:
            example: '2026-01-01'
            type: string
        - name: createdTo
          required: false
          in: query
          description: Creados hasta (ISO 8601)
          schema:
            example: '2026-12-31'
            type: string
        - name: signedFrom
          required: false
          in: query
          description: Firmados desde (ISO 8601)
          schema:
            example: '2026-01-01'
            type: string
        - name: signedTo
          required: false
          in: query
          description: Firmados hasta (ISO 8601)
          schema:
            example: '2026-12-31'
            type: string
        - name: sortBy
          required: false
          in: query
          description: Campo por el que se ordena. Lista cerrada, no un nombre de columna.
          schema:
            default: createdAt
            enum:
              - createdAt
              - signedAt
              - fileName
              - status
            type: string
        - name: sortDirection
          required: false
          in: query
          schema:
            default: DESC
            enum:
              - ASC
              - DESC
            type: string
        - name: page
          required: false
          in: query
          description: Página
          schema:
            minimum: 1
            default: 1
            type: number
        - name: limit
          required: false
          in: query
          description: Resultados por página
          schema:
            minimum: 1
            maximum: 100
            default: 25
            type: number
      responses:
        '200':
          description: Página de documentos del usuario
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationDocumentsPageResponse'
              example:
                success: true
                message: Documentos del usuario obtenidos correctamente
                data:
                  items:
                    - id: 7d1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b
                      fileName: contrato.pdf
                      status: PENDING_SIGNATURE
                      signatureType: SIMPLE
                      createdAt: '2026-10-26T12:00:00.000Z'
                      signedAt: null
                  pagination:
                    page: 1
                    limit: 25
                    total: 1
                    totalPages: 1
        '400':
          description: >-
            `INTEGRATION_TENANT_OVERRIDE_NOT_ALLOWED`: la petición trae
            `organizationId`, `taxId`, `userId`, `accountId`, `createdBy`,
            `createdByUserId`, `permissionIds`, `X-Account-Id` o
            `X-Organization-Id` (la organización y el autor salen de la llave).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationErrorResponseDto'
              examples:
                tenantOverride:
                  summary: Campo de organización o autor no permitido
                  value:
                    success: false
                    error:
                      code: INTEGRATION_TENANT_OVERRIDE_NOT_ALLOWED
                      message: >-
                        La organización, la cuenta y el autor salen de la API
                        key; no se aceptan: organizationId
        '401':
          description: >-
            `API_KEY_INVALID` (falta, formato incorrecto, secreto que no
            coincide o llave revocada) o `API_KEY_EXPIRED`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationErrorResponseDto'
              examples:
                invalid:
                  summary: Llave ausente, inválida o revocada
                  value:
                    success: false
                    error:
                      code: API_KEY_INVALID
                      message: API key inválida o revocada
                expired:
                  summary: Llave vencida
                  value:
                    success: false
                    error:
                      code: API_KEY_EXPIRED
                      message: La API key venció. Genera una nueva desde Integraciones.
        '403':
          description: >-
            `API_KEY_PERMISSION_DENIED` (la llave no está autorizada para la
            operación), `API_KEY_ORGANIZATION_INACTIVE` o
            `API_KEY_ACTOR_INACTIVE` (quien emitió la llave ya no es miembro
            activo). Puede devolver `INTEGRATION_SCOPE_DENIED` si la llave no
            tiene acceso a los documentos solicitados.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationErrorResponseDto'
              examples:
                permissionDenied:
                  summary: Operación no autorizada
                  value:
                    success: false
                    error:
                      code: API_KEY_PERMISSION_DENIED
                      message: La API key no está autorizada para esta operación
                organizationInactive:
                  summary: Organización desactivada
                  value:
                    success: false
                    error:
                      code: API_KEY_ORGANIZATION_INACTIVE
                      message: La organización de esta API key está desactivada
                scopeDenied:
                  summary: Alcance insuficiente
                  value:
                    success: false
                    error:
                      code: INTEGRATION_SCOPE_DENIED
                      message: >-
                        La API key sólo puede consultar los documentos de su
                        propio usuario
        '404':
          description: >-
            `INTEGRATION_USER_NOT_FOUND`: el usuario no es miembro activo de la
            organización de la llave (o el id no es un UUID)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationErrorResponseDto'
              examples:
                userNotFound:
                  summary: Usuario fuera de la organización
                  value:
                    success: false
                    error:
                      code: INTEGRATION_USER_NOT_FOUND
                      message: El usuario no existe en la organización
        '422':
          description: >-
            `INVALID_REQUEST`: algún filtro es inválido (`page`, `limit` mayor
            que 100, estatus o fechas).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationErrorResponseDto'
              examples:
                invalidRequest:
                  summary: Campos inválidos
                  value:
                    success: false
                    error:
                      code: INVALID_REQUEST
                      message: La petición tiene campos inválidos.
                      details:
                        errors:
                          - limit must not be greater than 100
      security:
        - integration-api-key: []
components:
  schemas:
    IntegrationDocumentsPageResponse:
      type: object
      properties:
        success:
          type: boolean
          example: true
          description: Indica si la operación fue exitosa
        message:
          type: string
          example: Operación realizada con éxito
          description: Mensaje descriptivo del resultado de la operación
          enum:
            - Operación realizada con éxito
            - Recurso creado correctamente
            - Recurso no encontrado
            - Datos de entrada inválidos
            - No autorizado para realizar esta acción
            - El firmante no está asociado al recurso
            - El recurso ya existe
            - Error interno del servidor
        data:
          description: Datos de la respuesta
          allOf:
            - $ref: '#/components/schemas/IntegrationDocumentsPage'
      required:
        - success
        - message
        - data
    IntegrationErrorResponseDto:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          $ref: '#/components/schemas/IntegrationErrorData'
      required:
        - success
        - error
    IntegrationDocumentsPage:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/IntegrationDocumentData'
        pagination:
          $ref: '#/components/schemas/IntegrationDocumentsPagination'
      required:
        - items
        - pagination
    IntegrationErrorData:
      type: object
      properties:
        code:
          type: string
          example: DUPLICATE_PARTICIPANT_EMAIL
          description: >-
            Código estable del error (p. ej. `PARTICIPANTS_REQUIRED`,
            `SIGNER_REQUIRED`, `MAX_PARTICIPANTS_EXCEEDED`,
            `INVALID_PARTICIPANT_ROLE`, `INVALID_PARTICIPANT_EMAIL`,
            `DUPLICATE_PARTICIPANT_EMAIL`, `SIGNER_SIGNATURE_POSITION_REQUIRED`,
            `WITNESS_SIGNATURE_POSITION_NOT_ALLOWED`, `INVALID_SIGNING_ORDER`,
            `DUPLICATE_SIGNING_ORDER`, `INVALID_SIGNATURE_POSITION`,
            `SIGNATURE_POSITION_PAGE_OUT_OF_RANGE`,
            `SIGNATURE_POSITION_OVERLAP`, `API_KEY_INVALID`, `INTERNAL_ERROR`)
        message:
          type: string
          example: Un colaborador sólo puede participar una vez en el documento.
        details:
          type: object
          example:
            field: participants[2].email
            email: ana@correo.com
          description: >-
            Datos del error: `field` con la ruta del campo afectado cuando
            aplica, y los valores que lo explican (`limit`, `received`, `page`,
            `totalPages`…).
      required:
        - code
        - message
    IntegrationDocumentData:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 7d1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b
        fileName:
          type: string
          example: contrato.pdf
        status:
          type: string
          enum:
            - CREATED
            - PENDING_APPROVAL
            - PENDING_SIGNATURE
            - SIGNED
            - REJECTED
            - EXPIRED
            - CANCELLATION_PENDING
            - CANCELLED
          example: PENDING_SIGNATURE
        signatureType:
          type: string
          enum:
            - SIMPLE
            - FIEL
            - BIOMETRIC
          nullable: true
          example: SIMPLE
          description: >-
            `FIEL` es la firma avanzada; `null` en documentos antiguos sin un
            tipo único
        createdAt:
          format: date-time
          type: string
          example: '2026-10-26T12:00:00.000Z'
        signedAt:
          format: date-time
          type: string
          nullable: true
          example: null
          description: >-
            Momento en que la última firma cerró el documento; `null` mientras
            tanto
      required:
        - id
        - fileName
        - status
        - signatureType
        - createdAt
        - signedAt
    IntegrationDocumentsPagination:
      type: object
      properties:
        page:
          type: number
          example: 1
        limit:
          type: number
          example: 25
          description: Tamaño de página aplicado (máximo 100)
        total:
          type: number
          example: 42
        totalPages:
          type: number
          example: 2
      required:
        - page
        - limit
        - total
        - totalPages
  securitySchemes:
    integration-api-key:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        API key de tu organización, con formato `fma_live_<publicId>_<secret>`.
        Se emite (y se rota o revoca) desde **Integraciones** en Firmalo; el
        secreto completo sólo se muestra al emitirla.


        Ejemplo (no es una llave real):
        `fma_live_0123456789abcdef_EjemploNoRealEjemploNoRealEjemploNoReal1234`


        La organización y el contexto de acceso salen de la llave: no se usan
        JWT, `X-Account-Id` ni `X-Organization-Id`. Llama a la API sólo desde tu
        backend; nunca expongas la llave en un navegador o una app móvil.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.