> ## 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.

# Duplicar plantilla en solicitud de firma

> Crea una nueva solicitud de firma duplicando una plantilla existente, incluyendo todos los campos, usuarios, recordatorios y configuraciones.

**Sellos.** La nueva solicitud de firma lleva los participantes de sello de la plantilla y los campos de la plantilla que les pertenecen. Esta operación no admite la clave `seal_participants`. Para las empresas no habilitadas para documentos múltiples, un sello de plantilla sigue la versión actual de su linaje: si esa versión actual está revocada o borrada, o el linaje no tiene versión actual, la llamada responde 409 `SEAL_UNAVAILABLE` y no crea nada; un sello que la empresa de la clave API no puede ver, o que está limitado a un espacio de trabajo distinto del espacio de trabajo de destino, no se copia y tampoco sus campos, y el 201 lo lista en `seal_participants` como una entrada descartada; si se conservara un sello mientras los sellos de organización no están habilitados, la llamada responde 503 `SEALS_DISABLED`; el 201 siempre incluye `seal_participants` (un array vacío cuando la plantilla no tiene participantes de sello). Para las empresas habilitadas para documentos múltiples, la copia adjunta la versión del sello almacenada en la plantilla tal cual, el 201 no incluye `seal_participants`, y un sello que se reemplazó, revocó o borró desde que se guardó la plantilla falla cuando se envía la solicitud.



## OpenAPI

````yaml api-reference/v01.39.01/openapi-v01.39.01.es.json post /templates/{id}/duplicate
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>

    ```


    **Encabezado X-Firma-Deprecation**: Algunas operaciones de creación de
    sellos y de actualización de imagen devuelven un encabezado de respuesta
    `X-Firma-Deprecation` cuando se invocan a través del edge gateway, indicando
    que la operación debe realizarse en el host principal de la API.


    **Documentos múltiples (API 01.39.00, requiere habilitación)**: una
    plantilla o solicitud de firma puede contener hasta 20 documentos. Las rutas
    del subrecurso `/documents` y las claves `documents`, `documents_version` y
    `documents_layout_version` solo se ofrecen a las empresas habilitadas para
    documentos múltiples; para cualquier otra empresa, las rutas responden `404
    NOT_FOUND` y las claves no aparecen.


    **Sellos de plantilla al crear (API 01.39.01)**: crear una solicitud de
    firma a partir de una plantilla con `POST /signing-requests` o `POST
    /signing-requests/create-and-send` ahora hereda los participantes de sello
    de la plantilla, y los campos de la plantilla que les pertenecen, cuando
    `seal_participants` está ausente o es `null`. Esto cambia el comportamiento
    de v1 sin incrementar la versión; envía `seal_participants: []` para crear
    la solicitud sin sellos. `POST /templates/{id}/duplicate` también traslada
    los participantes de sello de la plantilla; consulta esa operación para ver
    en qué se diferencia para las empresas habilitadas para documentos
    múltiples. `GET /templates/{id}` devuelve `seal_participants`, y `POST
    /templates` responde `warnings` cuando su cuerpo contiene claves que ignora.
  version: 01.39.01
  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: Organization Seals
    description: >-
      Gestión de sellos de organización: crear, actualizar, revocar y borrar
      sellos aplicados a solicitudes de firma
  - 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:
  /templates/{id}/duplicate:
    post:
      tags:
        - Templates
      summary: Duplicar plantilla en solicitud de firma
      description: >-
        Crea una nueva solicitud de firma duplicando una plantilla existente,
        incluyendo todos los campos, usuarios, recordatorios y configuraciones.


        **Sellos.** La nueva solicitud de firma lleva los participantes de sello
        de la plantilla y los campos de la plantilla que les pertenecen. Esta
        operación no admite la clave `seal_participants`. Para las empresas no
        habilitadas para documentos múltiples, un sello de plantilla sigue la
        versión actual de su linaje: si esa versión actual está revocada o
        borrada, o el linaje no tiene versión actual, la llamada responde 409
        `SEAL_UNAVAILABLE` y no crea nada; un sello que la empresa de la clave
        API no puede ver, o que está limitado a un espacio de trabajo distinto
        del espacio de trabajo de destino, no se copia y tampoco sus campos, y
        el 201 lo lista en `seal_participants` como una entrada descartada; si
        se conservara un sello mientras los sellos de organización no están
        habilitados, la llamada responde 503 `SEALS_DISABLED`; el 201 siempre
        incluye `seal_participants` (un array vacío cuando la plantilla no tiene
        participantes de sello). Para las empresas habilitadas para documentos
        múltiples, la copia adjunta la versión del sello almacenada en la
        plantilla tal cual, el 201 no incluye `seal_participants`, y un sello
        que se reemplazó, revocó o borró desde que se guardó la plantilla falla
        cuando se envía la solicitud.
      operationId: duplicateTemplate
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: ID de la plantilla a duplicar
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nombre personalizado para la nueva solicitud de firma (por
                    defecto, el nombre de la plantilla)
            example:
              name: Q4 2025 Contract
      responses:
        '201':
          description: Plantilla duplicada correctamente en una nueva solicitud de firma
          headers:
            X-RateLimit-Limit:
              schema:
                type: integer
              description: 'Límite de solicitudes: 120 solicitudes por minuto'
            X-RateLimit-Remaining:
              schema:
                type: integer
            X-RateLimit-Reset:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TemplateDuplicateResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          description: >-
            Se denegó el acceso a la plantilla de origen o al espacio de trabajo
            de destino.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '409':
          description: >-
            Conflicto: `SEAL_UNAVAILABLE`, `MULTI_DOCUMENT_READ_ONLY`,
            `DOCUMENT_SET_BUSY`, `DOCUMENT_SET_INCONSISTENT`,
            `DOCUMENT_SET_VERSION_CONFLICT`, `DOCUMENT_SET_DISPATCH_STALE`
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/MultiDocumentError'
                  - allOf:
                      - $ref: '#/components/schemas/Error'
                      - type: object
                        required:
                          - error
                          - code
                        properties:
                          code:
                            type: string
                            enum:
                              - SEAL_UNAVAILABLE
        '429':
          $ref: '#/components/responses/RateLimitError'
        '503':
          description: >-
            Los sellos de organización no están habilitados y la plantilla tiene
            un participante de sello que se conservaría (`SEALS_DISABLED`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      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.templates.duplicateTemplate({
                id: "id",
                name: "Q4 2025 Contract"
            });
            console.log(response);
components:
  schemas:
    TemplateDuplicateResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: ID de la solicitud de firma recién creada
        name:
          type: string
          description: Nombre de la nueva solicitud de firma
        description:
          type: string
          nullable: true
          description: Descripción de la nueva solicitud de firma
        status:
          type: string
          description: Estado de la nueva solicitud de firma
          example: draft
        workspace_id:
          type: string
          format: uuid
          description: Espacio de trabajo al que pertenece la solicitud de firma
        created_date:
          type: string
          format: date-time
          description: Marca de tiempo de creación
        seal_participants:
          type: array
          description: >-
            Participantes de sello de la nueva solicitud de firma: primero las
            entradas persistidas (la forma de las operaciones de creación, salvo
            que `order` puede ser null) con `dropped: false`, y después las
            entradas descartadas. Se responde cuando la empresa no está
            habilitada para documentos múltiples: siempre presente, un array
            vacío cuando la plantilla no tiene participantes de sello. No se
            responde cuando la empresa está habilitada para documentos
            múltiples.
          items:
            oneOf:
              - $ref: '#/components/schemas/TemplateDuplicateSealParticipant'
              - $ref: '#/components/schemas/SealParticipantDropped'
      description: Detalles de la plantilla duplicada
      required:
        - id
        - name
        - status
        - workspace_id
    Error:
      type: object
      properties:
        error:
          type: string
          description: Mensaje de error legible para humanos
        code:
          type: string
          description: >-
            Código de error legible por máquina. Códigos relacionados con
            sellos: SEALS_DISABLED, SEAL_ALREADY_REVOKED,
            SEAL_CREATION_DISABLED_EDGE, SEAL_ERASE_NOT_ELIGIBLE,
            SEAL_IMAGE_INVALID, SEAL_MUTATION_NOT_ALLOWED, SEAL_NOT_FOUND,
            SEAL_NO_IMAGE_FIELD, SEAL_ORDER_COLLISION, SEAL_PAUSED,
            SEAL_SCOPE_FORBIDDEN, SEAL_UNAVAILABLE Códigos multidocumento:
            consulte MultiDocumentErrorCode (41 códigos).
        errors:
          type: array
          description: >-
            Todos los errores de validación cuando se notifican varios fallos a
            la vez. El error de nivel superior repite el primer elemento por
            compatibilidad con versiones anteriores.
          items:
            type: object
            required:
              - message
            properties:
              message:
                type: string
        message:
          type: string
          description: Descripción detallada del error
        details:
          type: object
          description: Detalles adicionales del error
          additionalProperties: true
      required:
        - error
      description: >-


        Códigos de error de sellos de organización: SEALS_DISABLED,
        SEAL_ALREADY_REVOKED, SEAL_CREATION_DISABLED_EDGE,
        SEAL_ERASE_NOT_ELIGIBLE, SEAL_IMAGE_INVALID, SEAL_MUTATION_NOT_ALLOWED,
        SEAL_NOT_FOUND, SEAL_NO_IMAGE_FIELD, SEAL_ORDER_COLLISION, SEAL_PAUSED,
        SEAL_SCOPE_FORBIDDEN, SEAL_UNAVAILABLE
    MultiDocumentError:
      description: Un error respondido por una ruta multidocumento.
      allOf:
        - $ref: '#/components/schemas/Error'
        - type: object
          required:
            - error
            - code
          properties:
            code:
              $ref: '#/components/schemas/MultiDocumentErrorCode'
    TemplateDuplicateSealParticipant:
      type: object
      description: >-
        Un participante de sello persistido de la solicitud de firma duplicada:
        todas las claves de SealParticipantApi, más `dropped: false`. `order` es
        normalmente un entero y es null solo si la posición no se informó cuando
        se guardó el participante.
      required:
        - id
        - order
        - seal
        - status
        - applied_at
        - paused_at
        - pause_reason
        - swapped_from_seal_id
        - triggered_by_recipient_id
        - sender_kind
        - seal_out_of_scope
        - dropped
      properties:
        id:
          type: string
          format: uuid
        order:
          type: integer
          minimum: 1
          nullable: true
          description: >-
            Posición en el orden de firma, compartido con el espacio de orden de
            los destinatarios. Normalmente un entero. Null solo si la posición
            no se informó cuando se guardó el participante; lee la solicitud de
            firma para obtenerla.
        seal:
          $ref: '#/components/schemas/SealSummary'
        status:
          type: string
          enum:
            - pending
            - paused
            - applied
          description: >-
            applied cuando applied_at tiene valor; si no, paused cuando
            paused_at tiene valor; si no, pending.
        applied_at:
          type: string
          format: date-time
          nullable: true
        paused_at:
          type: string
          format: date-time
          nullable: true
        pause_reason:
          type: string
          nullable: true
          enum:
            - seal_revoked_stop_pending
            - seal_integrity_mismatch
            - null
        swapped_from_seal_id:
          type: string
          format: uuid
          nullable: true
        triggered_by_recipient_id:
          type: string
          format: uuid
          nullable: true
          description: El destinatario cuya acción aplicó el sello.
        sender_kind:
          type: string
          nullable: true
          enum:
            - dashboard
            - api_key
            - embedded
            - null
        seal_out_of_scope:
          type: boolean
          description: >-
            Verdadero cuando el sello pertenece a un espacio de trabajo distinto
            del de la solicitud de firma o de la plantilla.
        dropped:
          type: boolean
          enum:
            - false
    SealParticipantDropped:
      type: object
      description: >-
        Un sello de plantilla que no se copió a la nueva solicitud de firma o
        plantilla porque no está disponible allí: la empresa de la clave no
        puede ver el sello, o el sello está limitado a un espacio de trabajo
        distinto del espacio de trabajo de destino. Los campos que pertenecen al
        sello tampoco se copiaron. `seal` es el resumen de la versión actual del
        sello, o null cuando el sello no es visible para la empresa de la clave.
      required:
        - id
        - order
        - seal
        - seal_out_of_scope
        - dropped
      properties:
        id:
          type: string
          nullable: true
          enum:
            - null
          description: 'Siempre null: no se creó ningún participante.'
        order:
          type: integer
          nullable: true
          enum:
            - null
          description: 'Siempre null: no se creó ningún participante.'
        seal:
          type: object
          nullable: true
          description: >-
            Resumen de la versión actual del sello; null cuando la empresa de la
            clave API no puede ver el sello.
          required:
            - id
            - lineage_id
            - name
            - version
            - display_name
          properties:
            id:
              type: string
              format: uuid
            lineage_id:
              type: string
              format: uuid
              description: Compartido entre las versiones del mismo sello
            name:
              type: string
            version:
              type: integer
            display_name:
              type: string
        seal_out_of_scope:
          type: boolean
          enum:
            - true
        dropped:
          type: boolean
          enum:
            - true
    MultiDocumentErrorCode:
      type: string
      enum:
        - ALREADY_CANCELLED
        - ALREADY_FINISHED
        - ALREADY_SENT
        - ANCHOR_DOCUMENT_REQUIRED
        - ANCHOR_MISMATCH
        - CONFLICTING_DOCUMENT_SOURCE
        - DIMENSION_MISMATCH
        - DOCUMENTS_LAYOUT_VERSION_REQUIRED
        - DOCUMENT_CANDIDATE_EXPIRED
        - DOCUMENT_NOT_FOUND
        - DOCUMENT_ORIGINAL_NOT_AVAILABLE
        - DOCUMENT_SET_BUSY
        - DOCUMENT_SET_DISPATCH_STALE
        - DOCUMENT_SET_INCONSISTENT
        - DOCUMENT_SET_LOCKED
        - DOCUMENT_SET_TOO_LARGE
        - DOCUMENT_SET_VERSION_CONFLICT
        - DOCUMENT_SIGNED_NOT_AVAILABLE
        - DOCUMENT_UPLOAD_NOT_FOUND
        - DUPLICATE_DOCUMENT_ID
        - FENCE_COLUMN_PROTECTED
        - INSUFFICIENT_CREDITS
        - INTERNAL
        - INTERNAL_ERROR
        - INVALID_DOCUMENT_ORDER
        - INVALID_SIGNING_ORDER
        - MAX_DOCUMENTS_EXCEEDED
        - MIN_DOCUMENTS_REQUIRED
        - MULTI_DOCUMENT_READ_ONLY
        - MULTI_DOCUMENT_REPLACE_UNSUPPORTED
        - NOT_FOUND
        - PAGE_COUNT_MISMATCH
        - PARTICIPANTS_CHANGED
        - RATE_LIMIT_EXCEEDED
        - SEAL_MUTATION_NOT_ALLOWED
        - SEND_EFFECTS_EXIST
        - SEND_IN_PROGRESS
        - SIGNED_DATA_IMMUTABLE
        - SIGNING_ORDER_LOCKED_APPLIED
        - SIGNING_ORDER_LOCKED_SENDING
        - SIGNING_ORDER_LOCKED_SENT
        - VALIDATION_ERROR
      description: >-
        Códigos de error del contrato multidocumento y de las rutas que modifica
        (generados a partir de las filas de la matriz de errores que expone la
        API). Un fallo genuino del servidor responde 500 con INTERNAL_ERROR en
        las rutas heredadas e INTERNAL en las rutas HttpError compartidas
        (despacho multidocumento, el mapa de estados RPC, las rutas del conjunto
        de documentos); ninguno de los dos incluye detalles.
    SealSummary:
      type: object
      description: Resumen de un sello de organización.
      required:
        - id
        - lineage_id
        - name
        - version
        - display_name
      properties:
        id:
          type: string
          format: uuid
        lineage_id:
          type: string
          format: uuid
          description: Compartido entre las versiones del mismo sello
        name:
          type: string
        version:
          type: integer
        display_name:
          type: string
  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
    NotFoundError:
      description: No Encontrado - El recurso no existe
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Not Found
            message: The requested resource was not found
    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.

````

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