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

# Dupliquer le modèle en une demande de signature

> Crée une nouvelle demande de signature en dupliquant un modèle existant, y compris tous les champs, utilisateurs, rappels et paramètres.

**Cachets.** La nouvelle demande de signature reprend les participants de cachet du modèle et les champs du modèle qui leur appartiennent. Cette opération n'accepte pas la clé `seal_participants`. Pour les entreprises non activées pour les documents multiples, un cachet de modèle suit la version courante de sa lignée : si cette version courante est révoquée ou supprimée, ou si la lignée n'a pas de version courante, l'appel répond 409 `SEAL_UNAVAILABLE` et ne crée rien ; un cachet que l'entreprise de la clé API ne peut pas voir, ou qui est limité à un espace de travail autre que l'espace de travail cible, n'est pas copié, et ses champs non plus, et le 201 le liste dans `seal_participants` comme une entrée écartée ; si un cachet devait être conservé alors que les cachets d'organisation ne sont pas activés, l'appel répond 503 `SEALS_DISABLED` ; le 201 contient toujours `seal_participants` (un tableau vide lorsque le modèle n'a aucun participant de cachet). Pour les entreprises activées pour les documents multiples, la copie rattache telle quelle la version du cachet enregistrée dans le modèle, le 201 ne contient pas `seal_participants`, et un cachet qui a été remplacé, révoqué ou supprimé depuis l'enregistrement du modèle échoue à l'envoi de la demande.



## OpenAPI

````yaml api-reference/v01.39.01/openapi-v01.39.01.fr.json post /templates/{id}/duplicate
openapi: 3.0.3
info:
  title: API Partenaire Firma
  description: >-
    API RESTful pour la signature de documents et la gestion de modèles.


    **Authentification** : Tous les endpoints nécessitent une authentification
    par clé API via l'en-tête `Authorization`. Utilisez votre clé API
    directement sans préfixe (par exemple, `your-api-key`). Le préfixe Bearer
    est optionnel mais pas obligatoire.


    **Fonctionnalités de sécurité** :

    - Validation des entrées avec des schémas Zod incluant des messages d'erreur
    détaillés au niveau des champs

    - Jetons JWT signés RSA-256 pour l'accès aux modèles intégrés


    **Limitation de débit** : Les limites de débit sont hiérarchisées selon le
    type d'opération :

    - Opérations de lecture (GET) : 200 requêtes par minute

    - Opérations d'écriture (POST/PUT/PATCH/DELETE) : 120 requêtes par minute

    - Opérations CRUD sur les webhooks : 60 requêtes par minute

    - Test de webhook : 10 requêtes par minute

    - Régénération/expiration de clé API : 1 requête par minute

    - Rotation du secret de webhook : 1 requête par minute


    Lorsque les limites de débit sont dépassées, l'API renvoie une réponse `429
    Too Many Requests` avec les en-têtes suivants :

    - `X-RateLimit-Limit` : Nombre maximal de requêtes par minute pour cet
    endpoint

    - `X-RateLimit-Remaining` : Requêtes restantes dans la fenêtre actuelle

    - `X-RateLimit-Reset` : Horodatage Unix de la réinitialisation de la limite

    - `Retry-After` : Secondes à attendre avant de pouvoir réessayer


    **Gestion des erreurs** : Toutes les erreurs renvoient des réponses JSON
    structurées avec `error` (message lisible par un humain), `code`
    (identifiant lisible par une machine) et `details` (erreurs de validation au
    niveau des champs, le cas échéant).


    **Intégration de l'Éditeur de Modèles intégré** : L'Éditeur de Modèles Firma
    peut être intégré dans votre application à l'aide d'une bibliothèque
    JavaScript autonome.


    ```html

    <!-- Charger la bibliothèque de l'Éditeur de Modèles Firma -->

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


    <script>

    // Générer d'abord un jeton JWT via l'API

    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 => {
      // Initialiser l'éditeur avec le jeton 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>

    ```


    **En-tête X-Firma-Deprecation** : Certaines opérations de création de cachet
    et de mise à jour d'image renvoient un en-tête de réponse
    `X-Firma-Deprecation` lorsqu'elles sont appelées via l'edge gateway,
    indiquant que l'opération doit être effectuée sur l'hôte principal de l'API.


    **Documents multiples (API 01.39.00, activation requise)** : un modèle ou
    une demande de signature peut contenir jusqu'à 20 documents. Les routes de
    la sous-ressource `/documents` et les clés `documents`, `documents_version`
    et `documents_layout_version` ne sont servies qu'aux entreprises activées
    pour les documents multiples ; pour toute autre entreprise, les routes
    répondent `404 NOT_FOUND` et les clés sont absentes.


    **Cachets de modèle à la création (API 01.39.01)** : créer une demande de
    signature à partir d'un modèle avec `POST /signing-requests` ou `POST
    /signing-requests/create-and-send` hérite désormais des participants de
    cachet du modèle, et des champs du modèle qui leur appartiennent, lorsque
    `seal_participants` est absent ou vaut `null`. Cela change le comportement
    de v1 sans changement de version ; envoyez `seal_participants: []` pour
    créer la demande sans cachets. `POST /templates/{id}/duplicate` reporte
    aussi les participants de cachet du modèle ; consultez cette opération pour
    voir en quoi cela diffère pour les entreprises activées pour les documents
    multiples. `GET /templates/{id}` renvoie `seal_participants`, et `POST
    /templates` répond `warnings` lorsque son corps contient des clés qu'il
    ignore.
  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 Production - Recommandée (Actuelle)
  - url: https://api.firma.dev/api/v1
    description: API de Production - Prévue
security:
  - ApiKeyAuth: []
tags:
  - name: Company
    description: Informations et paramètres de l'entreprise
  - name: Workspaces
    description: Opérations de gestion des Espaces de Travail
  - name: Templates
    description: Opérations de gestion des Modèles
  - name: Signing Requests
    description: Opérations de Demande de Signature de documents
  - name: Custom Fields
    description: >-
      Gestion des définitions de champs personnalisés pour les espaces de
      travail, modèles et demandes de signature
  - name: Webhooks
    description: Configuration et gestion des webhooks
  - name: JWT Management
    description: Génération et révocation de jetons JWT pour les modèles intégrés
  - name: Workspace Settings
    description: Configuration et paramètres de l'espace de travail
  - name: Email Domains
    description: >-
      Configuration et vérification de domaine e-mail pour l'envoi d'e-mails de
      demande de signature depuis des domaines personnalisés
  - name: Email Templates
    description: >-
      Gestion des modèles d'e-mail pour la personnalisation des notifications de
      demande de signature au niveau de l'espace de travail et de l'entreprise
  - name: Organization Seals
    description: >-
      Gestion des cachets d'organisation : créer, mettre à jour, révoquer et
      effacer les cachets appliqués aux demandes de signature
  - name: Signer Terms
    description: >-
      Conditions d'utilisation / déclarations de consentement personnalisées
      pour le signataire, au niveau de l'entreprise avec des surcharges par
      espace de travail et par langue
paths:
  /templates/{id}/duplicate:
    post:
      tags:
        - Templates
      summary: Dupliquer le modèle en une demande de signature
      description: >-
        Crée une nouvelle demande de signature en dupliquant un modèle existant,
        y compris tous les champs, utilisateurs, rappels et paramètres.


        **Cachets.** La nouvelle demande de signature reprend les participants
        de cachet du modèle et les champs du modèle qui leur appartiennent.
        Cette opération n'accepte pas la clé `seal_participants`. Pour les
        entreprises non activées pour les documents multiples, un cachet de
        modèle suit la version courante de sa lignée : si cette version courante
        est révoquée ou supprimée, ou si la lignée n'a pas de version courante,
        l'appel répond 409 `SEAL_UNAVAILABLE` et ne crée rien ; un cachet que
        l'entreprise de la clé API ne peut pas voir, ou qui est limité à un
        espace de travail autre que l'espace de travail cible, n'est pas copié,
        et ses champs non plus, et le 201 le liste dans `seal_participants`
        comme une entrée écartée ; si un cachet devait être conservé alors que
        les cachets d'organisation ne sont pas activés, l'appel répond 503
        `SEALS_DISABLED` ; le 201 contient toujours `seal_participants` (un
        tableau vide lorsque le modèle n'a aucun participant de cachet). Pour
        les entreprises activées pour les documents multiples, la copie rattache
        telle quelle la version du cachet enregistrée dans le modèle, le 201 ne
        contient pas `seal_participants`, et un cachet qui a été remplacé,
        révoqué ou supprimé depuis l'enregistrement du modèle échoue à l'envoi
        de la demande.
      operationId: duplicateTemplate
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: ID du modèle à dupliquer
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nom personnalisé pour la nouvelle demande de signature (par
                    défaut, le nom du modèle)
            example:
              name: Q4 2025 Contract
      responses:
        '201':
          description: Modèle dupliqué avec succès en une nouvelle demande de signature
          headers:
            X-RateLimit-Limit:
              schema:
                type: integer
              description: 'Limite de taux : 120 requêtes par minute'
            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: >-
            L'accès au modèle source ou à l'espace de travail cible a été
            refusé.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '409':
          description: >-
            Conflit : `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: >-
            Les cachets d'organisation ne sont pas activés et le modèle a un
            participant de cachet qui serait conservé (`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 nouvelle demande de signature créée
        name:
          type: string
          description: Nom de la nouvelle demande de signature
        description:
          type: string
          nullable: true
          description: Description de la nouvelle demande de signature
        status:
          type: string
          description: Statut de la nouvelle demande de signature
          example: draft
        workspace_id:
          type: string
          format: uuid
          description: Espace de travail auquel appartient la demande de signature
        created_date:
          type: string
          format: date-time
          description: Horodatage de création
        seal_participants:
          type: array
          description: >-
            Participants de cachet de la nouvelle demande de signature : d'abord
            les entrées persistées (la forme des opérations de création, sauf
            que `order` peut être null) avec `dropped: false`, puis les entrées
            écartées. Renvoyé lorsque l'entreprise n'est pas activée pour les
            documents multiples : toujours présent, un tableau vide lorsque le
            modèle n'a aucun participant de cachet. Non renvoyé lorsque
            l'entreprise est activée pour les documents multiples.
          items:
            oneOf:
              - $ref: '#/components/schemas/TemplateDuplicateSealParticipant'
              - $ref: '#/components/schemas/SealParticipantDropped'
      description: Détails du modèle dupliqué
      required:
        - id
        - name
        - status
        - workspace_id
    Error:
      type: object
      properties:
        error:
          type: string
          description: Message d'erreur lisible par un humain
        code:
          type: string
          description: >-
            Code d'erreur lisible par machine. Codes liés aux cachets :
            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 Codes multi-documents : voir MultiDocumentErrorCode
            (41 codes).
        errors:
          type: array
          description: >-
            Toutes les erreurs de validation lorsque plusieurs échecs sont
            signalés ensemble. L'erreur de premier niveau répète le premier
            élément pour la rétrocompatibilité.
          items:
            type: object
            required:
              - message
            properties:
              message:
                type: string
        message:
          type: string
          description: Description détaillée de l'erreur
        details:
          type: object
          description: Détails d'erreur supplémentaires
          additionalProperties: true
      required:
        - error
      description: >-


        Codes d'erreur des cachets d'organisation : 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: Une erreur renvoyée par une route multi-documents.
      allOf:
        - $ref: '#/components/schemas/Error'
        - type: object
          required:
            - error
            - code
          properties:
            code:
              $ref: '#/components/schemas/MultiDocumentErrorCode'
    TemplateDuplicateSealParticipant:
      type: object
      description: >-
        Un participant de cachet persisté de la demande de signature dupliquée :
        toutes les clés de SealParticipantApi, plus `dropped: false`. `order`
        est normalement un entier et vaut null uniquement si la position n'a pas
        été renseignée lors de l'enregistrement du participant.
      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: >-
            Position dans l'ordre de signature, partagé avec l'espace d'ordre
            des destinataires. Normalement un entier. Null uniquement si la
            position n'a pas été renseignée lors de l'enregistrement du
            participant ; lisez la demande de signature pour l'obtenir.
        seal:
          $ref: '#/components/schemas/SealSummary'
        status:
          type: string
          enum:
            - pending
            - paused
            - applied
          description: >-
            applied lorsque applied_at est défini, sinon paused lorsque
            paused_at est défini, sinon 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: Le destinataire dont l'action a appliqué le cachet.
        sender_kind:
          type: string
          nullable: true
          enum:
            - dashboard
            - api_key
            - embedded
            - null
        seal_out_of_scope:
          type: boolean
          description: >-
            Vrai lorsque le cachet appartient à un espace de travail autre que
            celui de la demande de signature ou du modèle.
        dropped:
          type: boolean
          enum:
            - false
    SealParticipantDropped:
      type: object
      description: >-
        Un cachet de modèle qui n'a pas été copié dans la nouvelle demande de
        signature ou le nouveau modèle parce qu'il n'y est pas disponible :
        l'entreprise de la clé ne peut pas voir le cachet, ou le cachet est
        limité à un espace de travail autre que l'espace de travail cible. Les
        champs qui appartiennent au cachet n'ont pas non plus été copiés. `seal`
        est le résumé de la version courante du cachet, ou null lorsque le
        cachet n'est pas visible pour l'entreprise de la clé.
      required:
        - id
        - order
        - seal
        - seal_out_of_scope
        - dropped
      properties:
        id:
          type: string
          nullable: true
          enum:
            - null
          description: 'Toujours null : aucun participant n''a été créé.'
        order:
          type: integer
          nullable: true
          enum:
            - null
          description: 'Toujours null : aucun participant n''a été créé.'
        seal:
          type: object
          nullable: true
          description: >-
            Résumé de la version courante du cachet ; null lorsque l'entreprise
            de la clé API ne peut pas voir le cachet.
          required:
            - id
            - lineage_id
            - name
            - version
            - display_name
          properties:
            id:
              type: string
              format: uuid
            lineage_id:
              type: string
              format: uuid
              description: Partagé entre les versions du même cachet
            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: >-
        Codes d'erreur du contrat multi-documents et des routes qu'il modifie
        (générés à partir des lignes de la matrice d'erreurs exposées par
        l'API). Une véritable erreur serveur répond 500 avec INTERNAL_ERROR sur
        les routes historiques et INTERNAL sur les chemins HttpError partagés
        (répartition multi-documents, table des statuts RPC, routes de
        l'ensemble de documents) ; aucun des deux ne contient de détail.
    SealSummary:
      type: object
      description: Résumé d'un cachet d'organisation.
      required:
        - id
        - lineage_id
        - name
        - version
        - display_name
      properties:
        id:
          type: string
          format: uuid
        lineage_id:
          type: string
          format: uuid
          description: Partagé entre les versions du même cachet
        name:
          type: string
        version:
          type: integer
        display_name:
          type: string
  responses:
    UnauthorizedError:
      description: Non Autorisé - Clé API invalide ou manquante
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Unauthorized
            message: Invalid API key
    NotFoundError:
      description: Non Trouvé - La ressource n'existe pas
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Not Found
            message: The requested resource was not found
    RateLimitError:
      description: Trop de requêtes - Limite de débit dépassée
      headers:
        X-RateLimit-Limit:
          schema:
            type: integer
          description: Nombre maximum de requêtes par minute
        X-RateLimit-Remaining:
          schema:
            type: integer
          description: Requêtes restantes
        X-RateLimit-Reset:
          schema:
            type: integer
          description: Timestamp Unix de la réinitialisation
        Retry-After:
          schema:
            type: integer
          description: Secondes avant de pouvoir réessayer
      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: >-
        Clé API pour l'authentification. Utilisez votre clé API directement sans
        préfixe (par exemple, 'your-api-key'). Le préfixe Bearer est optionnel
        mais pas obligatoire.

````

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