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

# Create a template

> Creates a new template from HTML, MJML, or plain-text content. MJML is compiled to HTML when the template is saved.



## OpenAPI

````yaml /openapi.json post /templates
openapi: 3.1.0
info:
  description: Helo Email API (https://helohq.com)
  version: 1.0.0
  title: Helo API
servers:
  - url: https://api.helohq.com
security: []
tags:
  - name: Activity
    description: >-
      Track and retrieve message activity, including messages, delivery and
      engagement events.
  - name: Broadcasts
    description: Manage and track broadcast email campaigns.
  - name: Channels
    description: Create and manage communication channels for organizing messages.
  - name: Domains
    description: Register, verify, and manage domains for email sending.
  - name: Sending
    description: Send transactional and broadcast emails.
  - name: Statistics
    description: Access activity statistics.
  - name: Templates
    description: Manage templates for sending.
  - name: Webhooks
    description: Create and manage webhooks for event notifications.
paths:
  /templates:
    post:
      tags:
        - Templates
      summary: Create a template
      description: >-
        Creates a new template from HTML, MJML, or plain-text content. MJML is
        compiled to HTML when the template is saved.
      operationId: Templates_create
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTemplateRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TemplateResponse'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '422':
          $ref: '#/components/responses/422'
        '500':
          $ref: '#/components/responses/500'
      security:
        - bearerAuth: []
      x-codeSamples:
        - lang: ruby
          source: |-
            Helo.configure do |config|
              config.api_key = ENV.fetch("HELO_API_KEY")
            end

            create_template_request = Helo::CreateTemplateRequest.new(
              name: "test-name",
              subject: "test-subject",
              html: "test-html",
              mjml: "test-mjml",
              text: "test-text",
              channel_ids: ["550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8"]
            )
            Helo::Templates.create(create_template_request)
        - lang: javascript
          source: |-
            import Helo from "@helo-email/sdk";

            const apiKey = process.env.HELO_API_KEY;
            const helo = new Helo(apiKey);

            const result = await helo.templates.create({
              name: "test-name",
              subject: "test-subject",
              html: "test-html",
              mjml: "test-mjml",
              text: "test-text",
              channelIds: ["550e8400-e29b-41d4-a716-446655440000"],
            });
        - lang: go
          source: "package main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/helo-email/helo-sdk-go\"\n)\n\nfunc main() {\n\tclient := helo.NewHelo(os.Getenv(\"HELO_API_KEY\"))\n\tctx := context.Background()\n\n\tparams := &helo.CreateTemplateRequest{\n\t\tName: \"test-name\",\n\t\tSubject: \"test-subject\",\n\t\tHtml: \"test-html\",\n\t\tMjml: \"test-mjml\",\n\t\tText: \"test-text\",\n\t\tChannelIds: []string{\"550e8400-e29b-41d4-a716-446655440000\"},\n\t}\n\tresult, err := client.Templates.Create(ctx, params)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t_ = result\n}"
        - lang: csharp
          source: |-
            using HeloEmail.Sdk.Templates;

            var template = await helo.Templates.Create(new CreateTemplateRequest
            {
                Name = "test-name",
                Subject = "test-subject",
                Html = "test-html",
                Mjml = "test-mjml",
                Text = "test-text",
                ChannelIds = ["550e8400-e29b-41d4-a716-446655440000"],
            });
        - lang: python
          source: |-
            import sdk_helo_email as helo

            client = helo.Helo()  # reads HELO_API_KEY from the environment

            template = client.templates.create(
                name="test-name",
                subject="test-subject",
                html="test-html",
                mjml="test-mjml",
                text="test-text",
                channel_ids=["550e8400-e29b-41d4-a716-446655440000"],
            )
components:
  schemas:
    CreateTemplateRequest:
      type: object
      properties:
        name:
          type: string
          description: Maximum 64 characters.
        subject:
          type: string
          description: Maximum 256 characters.
        html:
          type: string
          description: Maximum 500,000 characters.
        mjml:
          type: string
          description: >-
            Maximum 500,000 characters. The html it compiles to must also be
            within the html limit.
        text:
          type: string
          description: Maximum 100,000 characters.
        channelIds:
          type: array
          items:
            type: string
            format: uuid
      required:
        - name
        - subject
      description: >
        At least one of html, mjml or text must be supplied. Supplying both html
        and mjml in  the same request is rejected - mjml content will be
        rendered to html. Providing raw html will override any mjml content
        stored on the template.
    TemplateResponse:
      type: object
      properties:
        id:
          type: string
          format: uuid
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        version:
          type: integer
          format: int64
          description: >
            Opaque version, changing on every update. Pass it back as the
            version of an update to have the update rejected if the template has
            been modified in the meantime.
        name:
          type: string
        subject:
          type: string
        html:
          type: string
        mjml:
          type: string
        text:
          type: string
        channelIds:
          type: array
          items:
            type: string
            format: uuid
      required:
        - id
        - createdAt
        - updatedAt
        - version
        - name
        - subject
    ErrorResponse:
      description: Standard error response body.
      type: object
      properties:
        type:
          description: A URI reference identifying the problem type.
          type: string
        title:
          description: Short, human-readable summary of the problem.
          type: string
        instance:
          description: URI reference identifying the specific occurrence of the problem.
          type: string
        status:
          description: HTTP status code.
          type: integer
          format: int32
        code:
          description: Application-specific error code.
          type: string
        detail:
          description: Human-readable explanation of this specific occurrence.
          type: string
        requestId:
          description: Unique request ID, useful for support correlation.
          type: string
        errors:
          description: Field-level validation errors, keyed by field name.
          type: object
          additionalProperties:
            type: array
            items:
              $ref: '#/components/schemas/ValidationError'
    ValidationError:
      description: A single field validation error.
      required:
        - message
      type: object
      properties:
        message:
          description: Description of the validation failure.
          type: string
  responses:
    '401':
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    '403':
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    '422':
      description: Validation Failed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    '500':
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````

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