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

# Update a template

> Changes a template. Send the revision you read and only the fields you change.

Permission: `templates:write`

[Read the recovery rules](https://docs.emailx.ai/en/api-reference/idempotency.md) before retrying a write. Keep the same key and body for the same logical operation.


## OpenAPI

````yaml openapi/emailx.en.json PATCH /workspaces/{workspace_id}/templates/{template_id}
openapi: 3.0.3
info:
  title: Emailx API
  version: 1.0.0-beta
  description: >-
    Customer and agency integrations for Emailx. Beta access is operator-issued.
    The v1 beta supports bounded People CSV/XLSX imports, saved email-template
    settings, selected email generation with explicit AI-credit confirmation,
    exact-message approval, reviewed email activation for native scheduled
    sending, and explicitly confirmed inbox replies bound to saved context when
    host capabilities permit. Inbox context is bounded and may be incomplete or
    stale; no provider refresh occurs. Manual LinkedIn imports, reviewed
    activation and reviewed resume of paused campaigns are separate gated
    workflows. Reply drafts, knowledge, team, infrastructure quotes with hosted
    checkout and agency administration are covered by separate scopes. Signed
    webhooks report durable operation outcomes. It does not support immediate
    batches or direct card charges.
servers:
  - url: https://app.emailx.ai/api/v1
    description: Emailx application · access must be enabled
security: []
tags:
  - name: Getting started
  - name: Workspaces
  - name: Contacts
  - name: Templates
  - name: Campaigns
  - name: Inbox
  - name: Senders
  - name: Team
  - name: Analytics
  - name: Imports
  - name: Operations
  - name: Knowledge
  - name: Infrastructure
  - name: Agency
paths:
  /workspaces/{workspace_id}/templates/{template_id}:
    patch:
      tags:
        - Email templates
      summary: Update a template
      description: >-
        Changes a template. Send the revision you read and only the fields you
        change.


        Permission: `templates:write`
      operationId: update_api_template
      parameters:
        - name: workspace_id
          in: path
          required: true
          schema:
            type: integer
            minimum: 1
          description: Emailx workspace (Clients) ID, not the agency workspace link ID.
        - name: template_id
          in: path
          required: true
          schema:
            type: integer
            minimum: 1
          description: Resource identifier.
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
            pattern: ^[A-Za-z0-9_.:/-]+$
          description: Unique per logical mutation. Same path and body replay for 24 hours.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTemplate'
            example:
              expected_revision: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
              prompt: Write a concise introduction.
      responses:
        '200':
          description: Success
          headers:
            X-Request-Id:
              schema:
                type: string
            Emailx-Api-Version:
              schema:
                type: string
            X-RateLimit-Limit:
              schema:
                type: string
            X-RateLimit-Remaining:
              schema:
                type: string
            X-RateLimit-Reset:
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Template'
                required:
                  - data
              example:
                data:
                  id: 601
                  workspace_id: 123
                  name: Italian intro
                  subject: A quick introduction
                  preview_text: null
                  body: <p>Hello</p>
                  prompt: null
                  prompt_html: null
                  subject_instruction: null
                  preview_instruction: null
                  goal: Sales
                  ai_sections: []
                  language: English
                  unsubscribe: false
                  tracking: true
                  click_tracking: false
                  plain_text: false
                  include_signature: true
                  generation_fingerprint: >-
                    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
                  revision: >-
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        '400':
          description: Request error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Invalid, expired or revoked API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Insufficient scope or write permission
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Resource missing or inaccessible
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: Conflict, concurrent request or uncertain original result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            Retry-After:
              schema:
                type: string
              description: Seconds to wait when present.
        '413':
          description: Request error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '415':
          description: Request error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited; respect Retry-After
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            Retry-After:
              schema:
                type: string
              description: Seconds to wait when present.
        '500':
          description: Request error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: API disabled, request storage unavailable or feature not enabled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            Retry-After:
              schema:
                type: string
              description: Seconds to wait when present.
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: cURL
          source: >-
            curl -X PATCH
            "https://app.emailx.ai/api/v1/workspaces/123/templates/601" \
              -H "Authorization: Bearer $EMAILX_API_KEY" \
              -H "Content-Type: application/json" \
              -H "Idempotency-Key: example-operation-001" \
              --data '{"expected_revision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","prompt":"Write a concise introduction."}'
        - lang: Python
          source: |-
            import os, requests

            response = requests.patch(
                "https://app.emailx.ai/api/v1/workspaces/123/templates/601",
                headers={"Authorization": "Bearer " + os.environ["EMAILX_API_KEY"], "Idempotency-Key": "example-operation-001"},
                json={'expected_revision': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'prompt': 'Write a concise introduction.'},
                timeout=30,
            )
            response.raise_for_status()
            print(response.json())
        - lang: JavaScript
          source: >-
            const response = await
            fetch("https://app.emailx.ai/api/v1/workspaces/123/templates/601", {
              method: "PATCH",
              headers: { Authorization: `Bearer ${process.env.EMAILX_API_KEY}`, "Content-Type": "application/json", "Idempotency-Key": "example-operation-001" },
              body: JSON.stringify({"expected_revision": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "prompt": "Write a concise introduction."}),
              signal: AbortSignal.timeout(30000),
            });

            if (!response.ok) throw new Error(`Emailx: ${response.status}`);

            console.log(await response.json());
components:
  schemas:
    UpdateTemplate:
      type: object
      properties:
        expected_revision:
          type: string
          pattern: ^[a-f0-9]{64}$
        name:
          type: string
          minLength: 1
          maxLength: 120
        subject:
          type: string
          nullable: true
          maxLength: 500
        preview_text:
          type: string
          nullable: true
          maxLength: 5000
        body:
          type: string
          nullable: true
          maxLength: 5000
        prompt:
          type: string
          nullable: true
          maxLength: 5000
        prompt_html:
          type: string
          nullable: true
          maxLength: 5000
        subject_instruction:
          type: string
          nullable: true
          maxLength: 5000
        preview_instruction:
          type: string
          nullable: true
          maxLength: 5000
        goal:
          type: string
          nullable: true
          maxLength: 50
          default: Sales
        language:
          type: string
          maxLength: 50
          default: English
        ai_sections:
          type: array
          nullable: true
          items:
            type: object
            properties:
              id:
                type: string
                minLength: 1
                maxLength: 120
              prompt:
                type: string
                maxLength: 5000
              prompt_html:
                type: string
                maxLength: 5000
              position:
                type: integer
                minimum: 0
                maximum: 99
            required:
              - id
              - prompt
              - position
            additionalProperties: false
          maxItems: 100
          description: IDs and positions must each be unique; input order is preserved.
        unsubscribe:
          type: boolean
          default: false
        tracking:
          type: boolean
          default: true
        click_tracking:
          type: boolean
          default: false
        plain_text:
          type: boolean
          default: false
        include_signature:
          type: boolean
          default: true
      required:
        - expected_revision
      minProperties: 2
      additionalProperties: false
    Template:
      type: object
      properties:
        id:
          type: integer
          minimum: 1
        workspace_id:
          type: integer
          minimum: 1
        name:
          type: string
          nullable: true
          maxLength: 120
        subject:
          type: string
          nullable: true
          maxLength: 500
        goal:
          type: string
          nullable: true
          maxLength: 50
        revision:
          type: string
          pattern: ^[a-f0-9]{64}$
        preview_text:
          type: string
          nullable: true
          maxLength: 5000
        body:
          type: string
          nullable: true
          maxLength: 5000
        prompt:
          type: string
          nullable: true
          maxLength: 5000
        prompt_html:
          type: string
          nullable: true
          maxLength: 5000
        subject_instruction:
          type: string
          nullable: true
          maxLength: 5000
        preview_instruction:
          type: string
          nullable: true
          maxLength: 5000
        ai_sections:
          type: array
          nullable: true
          items: {}
        language:
          type: string
          nullable: true
          maxLength: 50
        unsubscribe:
          type: boolean
          nullable: true
        tracking:
          type: boolean
          nullable: true
        click_tracking:
          type: boolean
          nullable: true
        plain_text:
          type: boolean
          nullable: true
        include_signature:
          type: boolean
          nullable: true
        generation_fingerprint:
          type: string
          pattern: ^[a-f0-9]{64}$
      required:
        - id
        - workspace_id
        - name
        - subject
        - preview_text
        - body
        - prompt
        - prompt_html
        - subject_instruction
        - preview_instruction
        - goal
        - ai_sections
        - language
        - unsubscribe
        - tracking
        - click_tracking
        - plain_text
        - include_signature
        - generation_fingerprint
        - revision
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            request_id:
              type: string
            details:
              type: object
              additionalProperties: true
          required:
            - code
            - message
            - request_id
      required:
        - error
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        ex_test_ or ex_live_ key issued by an Emailx operator. Never use
        provider keys or session cookies.

````

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