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

# Descargar Documento de la Solicitud de Firma

> Recupera una URL de descarga para el documento firmado de una solicitud de firma. Para solicitudes de firma completadas, devuelve el PDF firmado final. Para solicitudes de firma en curso donde la descarga parcial está habilitada, devuelve una URL al documento parcialmente firmado generado en el momento en que el último firmante completó su firma.

**Descargas parciales:** Las descargas parciales solo están disponibles cuando la solicitud de firma tiene `allow_partial_download` habilitado en su configuración. Si el documento aún no se ha generado parcialmente, se devuelve un `503`; reintenta después del intervalo indicado en `Retry-After`.

**Expiración de la URL:** `download_url` es una URL prefirmada que expira. La marca de tiempo de expiración se proporciona en `expires_at`.



## OpenAPI

````yaml api-reference/v01.30.00/openapi-v01.30.00.es.json get /signing-requests/{id}/download
openapi: 3.0.3
info:
  title: API de Socios de Firma
  description: >-
    API RESTful para firma de documentos y gestión de plantillas.


    **Autenticación**: Todos los endpoints requieren autenticación mediante
    clave API a través del encabezado `Authorization`. Usa tu clave API
    directamente sin ningún prefijo (por ejemplo, `your-api-key`). El prefijo
    Bearer es opcional pero no obligatorio.


    **Características de Seguridad**:

    - Validación de entrada usando esquemas Zod con mensajes de error detallados
    a nivel de campo

    - Tokens JWT firmados con RSA-256 para el acceso al Editor de Plantillas
    incrustado


    **Límite de Solicitudes**: Los límites de solicitudes están escalonados
    según el tipo de operación:

    - Operaciones de lectura (GET): 200 solicitudes por minuto

    - Operaciones de escritura (POST/PUT/PATCH/DELETE): 120 solicitudes por
    minuto

    - Operaciones CRUD de webhooks: 60 solicitudes por minuto

    - Prueba de webhook: 10 solicitudes por minuto

    - Regeneración/expiración de clave API: 1 solicitud por minuto

    - Rotación de secreto de webhook: 1 solicitud por minuto


    Cuando se superan los límites de solicitudes, la API devuelve una respuesta
    `429 Too Many Requests` con los encabezados:

    - `X-RateLimit-Limit`: Máximo de solicitudes por minuto para este endpoint

    - `X-RateLimit-Remaining`: Solicitudes restantes en la ventana actual

    - `X-RateLimit-Reset`: Marca de tiempo Unix de cuándo se restablece el
    límite

    - `Retry-After`: Segundos hasta que se permita reintentar


    **Manejo de Errores**: Todos los errores devuelven respuestas JSON
    estructuradas con `error` (mensaje legible para humanos), `code`
    (identificador legible por máquina) y `details` (errores de validación a
    nivel de campo cuando corresponda).


    **Integración del Editor de Plantillas Incrustado**: El Editor de Plantillas
    de Firma se puede incrustar en tu aplicación usando una biblioteca
    JavaScript independiente.


    ```html

    <!-- Carga la biblioteca del Editor de Plantillas de Firma -->

    <script
    src="https://api.firma.dev/functions/v1/embed-proxy/template-editor.js"></script>


    <script>

    // Genera el token JWT vía API primero

    fetch('https://api.firma.dev/functions/v1/signing-request-api/generate-template-token',
    {
      method: 'POST',
      headers: {
        'Authorization': 'YOUR_API_KEY',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        companies_workspaces_templates_id: 'template-id'
      })
    })

    .then(res => res.json())

    .then(data => {
      // Inicializa el editor con el token JWT
      window.FirmaTemplateEditor.init({
        container: '#firma-editor-container',
        jwt: data.token,
        templateId: 'template-id',
        theme: 'dark',
        readOnly: false,
        onSave: (savedData) => {
          console.log('Template saved:', savedData);
        },
        onError: (error) => {
          console.error('Editor error:', error);
        },
        onLoad: (template) => {
          console.log('Template loaded:', template);
        }
      });
    });

    </script>

    ```
  version: 01.30.00
  contact:
    name: API Support
    url: https://firma.com/support
servers:
  - url: https://api.firma.dev/functions/v1/signing-request-api
    description: API de Producción - Recomendada (Actual)
  - url: https://api.firma.dev/api/v1
    description: API de Producción - Planeada
security:
  - ApiKeyAuth: []
tags:
  - name: Company
    description: Información y configuración de la empresa
  - name: Workspaces
    description: Operaciones de gestión de espacios de trabajo
  - name: Templates
    description: Operaciones de gestión de plantillas
  - name: Signing Requests
    description: Operaciones de solicitudes de firma de documentos
  - name: Custom Fields
    description: >-
      Gestión de definiciones de campos personalizados para espacios de trabajo,
      plantillas y solicitudes de firma
  - name: Webhooks
    description: Configuración y gestión de webhooks
  - name: JWT Management
    description: Generación y revocación de tokens JWT para plantillas incrustadas
  - name: Workspace Settings
    description: Configuración y ajustes del espacio de trabajo
  - name: Email Domains
    description: >-
      Configuración y verificación de dominios de correo electrónico para enviar
      correos de solicitudes de firma desde dominios personalizados
  - name: Email Templates
    description: >-
      Gestión de plantillas de correo electrónico para personalización de
      notificaciones de solicitudes de firma a nivel de espacio de trabajo y de
      empresa
  - name: Signer Terms
    description: >-
      Términos de servicio / declaraciones de consentimiento personalizadas del
      firmante, a nivel de empresa con anulaciones por espacio de trabajo según
      el idioma
paths:
  /signing-requests/{id}/download:
    get:
      tags:
        - Signing Requests
      summary: Descargar Documento de la Solicitud de Firma
      description: >-
        Recupera una URL de descarga para el documento firmado de una solicitud
        de firma. Para solicitudes de firma completadas, devuelve el PDF firmado
        final. Para solicitudes de firma en curso donde la descarga parcial está
        habilitada, devuelve una URL al documento parcialmente firmado generado
        en el momento en que el último firmante completó su firma.


        **Descargas parciales:** Las descargas parciales solo están disponibles
        cuando la solicitud de firma tiene `allow_partial_download` habilitado
        en su configuración. Si el documento aún no se ha generado parcialmente,
        se devuelve un `503`; reintenta después del intervalo indicado en
        `Retry-After`.


        **Expiración de la URL:** `download_url` es una URL prefirmada que
        expira. La marca de tiempo de expiración se proporciona en `expires_at`.
      operationId: downloadSigningRequest
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: ID de la solicitud de firma
      responses:
        '200':
          description: URL de descarga obtenida correctamente.
          headers:
            X-RateLimit-Limit:
              schema:
                type: integer
              description: 'Límite de tasa: 200 solicitudes por minuto'
            X-RateLimit-Remaining:
              schema:
                type: integer
            X-RateLimit-Reset:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SigningRequestDownloadResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          description: Solicitud de firma no encontrada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: not_found
        '409':
          description: >-
            La solicitud de firma aún no ha sido enviada. La descarga solo está
            disponible después de que se haya enviado la solicitud.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: no_document_available
                message: Signing request has not been sent yet
        '429':
          $ref: '#/components/responses/RateLimitError'
        '503':
          description: >-
            La generación del documento está en progreso. Reintenta después del
            intervalo indicado.
          headers:
            Retry-After:
              schema:
                type: integer
              description: Segundos a esperar antes de reintentar
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                generation_timeout:
                  summary: La generación del documento agotó el tiempo de espera
                  value:
                    error: generation_timeout
                stale_at_publication:
                  summary: >-
                    El documento estaba desactualizado en el momento de la
                    publicación
                  value:
                    error: stale_at_publication
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: TypeScript
          label: '@firma-dev/sdk'
          source: >-
            import { FirmaClient } from "@firma-dev/sdk";


            const firma = new FirmaClient({ apiKey: "YOUR_API_KEY" });


            const response = await
            firma.signingRequests.downloadSigningRequest({
                id: "id"
            });

            console.log(response);
components:
  schemas:
    SigningRequestDownloadResponse:
      type: object
      properties:
        status:
          type: string
          enum:
            - finished
            - in_progress
            - cancelled
            - declined
            - expired
          description: >-
            Estado de la Solicitud de Firma. `finished` significa que todos los
            Firmantes han completado el proceso. `in_progress` significa que la
            firma sigue en curso y esta es una descarga parcial. `cancelled`,
            `declined` y `expired` indican estados terminales donde el documento
            es una instantánea parcial del momento en que terminó la firma.
        is_partial:
          type: boolean
          description: >-
            Si esta URL de descarga apunta a un documento parcialmente firmado
            (no todos los Firmantes han completado el proceso).
        download_url:
          type: string
          format: uri
          description: >-
            URL prefirmada para descargar el documento PDF. Expira en el momento
            indicado por `expires_at`.
        generated_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Marca de tiempo ISO 8601 de cuándo se generó el documento por última
            vez. Para descargas parciales, es cuándo se creó el PDF parcial.
        expires_at:
          type: string
          format: date-time
          description: >-
            Marca de tiempo ISO 8601 de cuándo expira `download_url`. Vuelve a
            llamar a este endpoint para obtener una URL nueva después de que
            expire.
      required:
        - status
        - is_partial
        - download_url
        - expires_at
    Error:
      type: object
      properties:
        error:
          type: string
          description: Mensaje de error legible para humanos
        message:
          type: string
          description: Descripción detallada del error
        details:
          type: object
          description: Detalles adicionales del error
          additionalProperties: true
      required:
        - error
  responses:
    UnauthorizedError:
      description: No Autorizado - Clave API inválida o faltante
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Unauthorized
            message: Invalid API key
    RateLimitError:
      description: Demasiadas Solicitudes - Se superó el límite de solicitudes
      headers:
        X-RateLimit-Limit:
          schema:
            type: integer
          description: Número máximo de solicitudes por minuto
        X-RateLimit-Remaining:
          schema:
            type: integer
          description: Solicitudes restantes
        X-RateLimit-Reset:
          schema:
            type: integer
          description: Marca de tiempo Unix del reinicio
        Retry-After:
          schema:
            type: integer
          description: Segundos hasta que se permita reintentar
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Rate Limit Exceeded
            message: Too many requests. Please wait before retrying.
            details:
              retry_after: 45
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Clave API para autenticación. Usa tu clave API directamente sin ningún
        prefijo (por ejemplo, 'your-api-key'). El prefijo Bearer es opcional
        pero no obligatorio.

````