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

# Crear o actualizar plantilla de correo del espacio de trabajo

> Crear o actualizar una plantilla de correo personalizada para un tipo específico. Si ya existe una plantilla para este tipo, se actualizará. Se devuelve una advertencia si el cuerpo de la plantilla no contiene {{signing_link}}.



## OpenAPI

````yaml api-reference/v01.30.00/openapi-v01.30.00.es.json put /workspace/{workspace_id}/email-templates/{email_type}
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:
  /workspace/{workspace_id}/email-templates/{email_type}:
    put:
      tags:
        - Email Templates
      summary: Crear o actualizar plantilla de correo del espacio de trabajo
      description: >-
        Crear o actualizar una plantilla de correo personalizada para un tipo
        específico. Si ya existe una plantilla para este tipo, se actualizará.
        Se devuelve una advertencia si el cuerpo de la plantilla no contiene
        {{signing_link}}.
      operationId: updateWorkspaceEmailTemplate
      parameters:
        - name: workspace_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: ID del espacio de trabajo
        - name: email_type
          in: path
          required: true
          schema:
            type: string
            enum:
              - signing_invite
              - next_signer
              - signing_expired
              - signing_cancelled
              - signing_declined
          description: Tipo de plantilla de correo
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - subject
                - body
              properties:
                subject:
                  type: string
                  maxLength: 500
                  description: Línea de asunto del correo
                body:
                  type: string
                  maxLength: 50000
                  description: >-
                    Cuerpo del correo (HTML). Use el marcador de posición
                    {{signing_link}} para la URL de firma.
      responses:
        '200':
          description: Plantilla de correo actualizada exitosamente
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/EmailTemplate'
                  - type: object
                    properties:
                      warnings:
                        type: array
                        items:
                          type: string
        '201':
          description: Plantilla de correo creada exitosamente
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/EmailTemplate'
                  - type: object
                    properties:
                      warnings:
                        type: array
                        items:
                          type: string
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/RateLimitError'
      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.emailTemplates.updateWorkspaceEmailTemplate({
                workspace_id: "workspace_id",
                email_type: "signing_invite",
                subject: "subject",
                body: "body"
            });

            console.log(response);
components:
  schemas:
    EmailTemplate:
      type: object
      description: >-
        Plantilla de correo personalizada para las notificaciones de Solicitud
        de Firma
      properties:
        id:
          type: string
          format: uuid
          description: Identificador único de la plantilla de correo
        email_type:
          type: string
          enum:
            - signing_invite
            - next_signer
            - signing_expired
            - signing_cancelled
            - signing_declined
          description: Tipo de correo para el que es esta plantilla
        subject:
          type: string
          description: Línea de asunto del correo
        body:
          type: string
          description: >-
            Cuerpo del correo (HTML). Admite placeholders como {{signing_link}},
            {{signer_name}}, etc.
        created_at:
          type: string
          format: date-time
          description: Marca de tiempo de creación de la plantilla
        updated_at:
          type: string
          format: date-time
          description: Marca de tiempo de la última actualización de la plantilla
      required:
        - email_type
        - subject
        - body
    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:
    ValidationError:
      description: Solicitud Incorrecta - La validación falló
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Validation Error
            message: Invalid input data
            details:
              name: Name is required
              email: Invalid email format
    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.

````