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

# Copiar plantilla a otro espacio de trabajo

> Crea una copia completa de una plantilla (incluidos los campos, destinatarios, CC, recordatorios, definiciones de campos personalizados y el documento PDF) en un espacio de trabajo de destino de la misma empresa. Requiere una clave API protegida a nivel de empresa. Multidocumento (requiere habilitación): la copia de una plantilla con más de un documento es una plantilla con UN solo documento, el documento combinado de la plantilla de origen; se conservan su contenido y los números de página absolutos de sus campos, pero no las etiquetas ni las posiciones de cada documento.



## OpenAPI

````yaml api-reference/v01.39.01/openapi-v01.39.01.es.json post /templates/{id}/copy
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}/copy:
    post:
      tags:
        - Templates
      summary: Copiar plantilla a otro espacio de trabajo
      description: >-
        Crea una copia completa de una plantilla (incluidos los campos,
        destinatarios, CC, recordatorios, definiciones de campos personalizados
        y el documento PDF) en un espacio de trabajo de destino de la misma
        empresa. Requiere una clave API protegida a nivel de empresa.
        Multidocumento (requiere habilitación): la copia de una plantilla con
        más de un documento es una plantilla con UN solo documento, el documento
        combinado de la plantilla de origen; se conservan su contenido y los
        números de página absolutos de sus campos, pero no las etiquetas ni las
        posiciones de cada documento.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: ID de la plantilla que se copiará
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - workspace_id
              properties:
                workspace_id:
                  type: string
                  format: uuid
                  description: >-
                    ID del espacio de trabajo de destino al que se copiará la
                    plantilla
                name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nombre de la plantilla copiada (por defecto, el nombre
                    original con el sufijo " (copy)")
            example:
              workspace_id: 550e8400-e29b-41d4-a716-446655440000
              name: My Template Copy
      responses:
        '201':
          description: Plantilla copiada correctamente
          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/TemplateCopyResponse'
        '400':
          description: Falta workspace_id o el nombre no es válido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          description: Se requiere una clave API protegida, o acceso denegado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                protected_key_required:
                  value:
                    error: This operation requires a protected workspace API key
                    code: PROTECTED_KEY_REQUIRED
                access_denied:
                  value:
                    error: Template not found or access denied
                    code: ACCESS_DENIED
        '404':
          description: Plantilla o espacio de trabajo de destino no encontrado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          $ref: '#/components/responses/RateLimitError'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    TemplateCopyResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: ID de la nueva copia de la plantilla
        name:
          type: string
          description: Nombre de la plantilla copiada
        workspace_id:
          type: string
          format: uuid
          description: Espacio de trabajo de destino al que se copió la plantilla
        created_date:
          type: string
          format: date-time
          description: Marca de tiempo de creación
        seal_participants:
          type: array
          description: >-
            Una entrada por cada participante de sello activo de la plantilla de
            origen, en el orden de origen. Un sello que no está disponible en el
            espacio de trabajo de destino no se copia, ni tampoco los campos
            asignados a él; su entrada es `{ id: null, order: null, seal:
            <resumen o null>, seal_out_of_scope: true, dropped: true }`.
          items:
            oneOf:
              - $ref: '#/components/schemas/TemplateCopySealParticipant'
              - $ref: '#/components/schemas/SealParticipantDropped'
      description: Respuesta de copia de plantilla
      required:
        - id
        - name
        - workspace_id
        - created_date
        - seal_participants
    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
    TemplateCopySealParticipant:
      type: object
      description: >-
        Un participante de sello de la plantilla copiada. `order` es su posición
        en la plantilla copiada; `seal_out_of_scope` es true solo cuando el
        sello se ha revocado o borrado.
      required:
        - id
        - order
        - seal
        - seal_out_of_scope
        - dropped
      properties:
        id:
          type: string
          format: uuid
        order:
          type: integer
          minimum: 1
          nullable: true
          description: >-
            Posición en la plantilla copiada. Normalmente un entero. Null solo
            si la posición no se informó cuando se guardó el participante; lee
            la plantilla para obtenerla.
        seal:
          $ref: '#/components/schemas/SealSummary'
        seal_out_of_scope:
          type: boolean
        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
    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
    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.