---
title: "Create email template"
method: POST
path: "/email-templates"
tags: ["Email Templates"]
---

# Create email template

`POST /email-templates`

## Request

- Base URL: `https://api.100hires.com/v2`
- URL: `https://api.100hires.com/v2/email-templates`
- Auth: HTTP bearer

Creates a new email template with subject and body.

**Placeholder workflow:**
1. `GET /template-placeholders` — list available placeholders
2. `POST /template-placeholders/prepare` — convert chosen placeholder to an HTML `<tag>` element
3. Insert the returned HTML tag into the template body
4. `POST /email-templates` — save the template with embedded placeholder tags

## Request body

- EmailTemplateCreateRequest
  - `company_id` integer: Target company ID.
  - `name` string, required: Template name
  - `subject` string, required: Email subject line. Plain text. **Placeholders:** literal `{{first_name}}` / `{{job_title}}` tokens are NOT substituted — they will be delivered to the recipient verbatim. To embed a placeholder, call `POST /template-placeholders/prepare` and paste the returned HTML `<tag>…</tag>` string into this field.
  - `body` string, required: Email body HTML. **Placeholders:** literal `{{first_name}}` tokens are NOT substituted — the recipient will see the raw text. To embed a placeholder, call `POST /template-placeholders/prepare` and insert the returned `<tag contenteditable="false" data-type="…" data-identifier="…">…</tag>` element into the HTML at the position where the value should appear.

## Response `200`

Created email template

- EmailTemplate
  - `id` integer: Email template ID
  - `name` string: Template name
  - `subject` string: Email subject line as stored. Placeholders, when present, are stored as `<tag>` HTML produced by `POST /template-placeholders/prepare`; they are rendered to real values only at send time, not on read.
  - `body` string: Email body HTML as stored. Placeholders are stored as `<tag>` HTML produced by `POST /template-placeholders/prepare` and rendered at send time. Present only when `view=full` (default); omitted entirely when `view=summary` — template bodies can be tens of KB each.
  - `url_backoffice` string, uri: Absolute backoffice URL to edit this email template in the 100Hires recruiter app. Use to render deep-links in agent UIs.
  - `created_at` integer: Unix timestamp
  - `updated_at` integer: Unix timestamp

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `415`: Content-Type must be application/json
- `429`: Too many requests

---

[API](https://skmtc.dev/100hires/apis/100hires-api.md) · [All operations](https://skmtc.dev/100hires/apis/100hires-api/llms.txt) · [OpenAPI document](https://skmtc.dev/100hires/apis/100hires-api/revisions/e63e2d3115f7?raw)
