GET
/template
List templates

Returns all templates owned by the tenant. Templates are scoped by tenant and never visible across tenant boundaries.

Request

// No body — tenant scoped via X-Tenant-ID header

Response

type GetTemplatesResponse = {
  templates: {
    id: number;
    code: string;
    name: string;
    isActive: boolean;
  }[];
};
GET
/template/:code
Get template

Returns a single template by code, including its subject and HTML body templates.

Request

// code in path — no request body

Response

type GetTemplateResponse = {
  id: number;
  code: string;
  name: string;
  description?: string;
  subjectTemplate: string;
  htmlTemplate: string;
  isActive: boolean;
  createdAt: string;
  updatedAt: string;
};
POST
/template
Create template or render preview

Creates a new template when creation fields are supplied. Also supports render-preview mode when request body includes id, slug, or template.

Request

type CreateTemplateRequest = {
  code: string;
  name: string;
  description?: string;
  subjectTemplate: string;
  htmlTemplate: string;
};

type RenderViaTemplatePostRequest = {
  id?: number;
  slug?: string;
  template?: string;
  data: Record<string, unknown>;
  options?: {
    escapeHtml?: boolean;
    removeSpaceBeforePunctuation?: boolean;
    removeEmptyLines?: boolean;
    collapseWhitespace?: boolean;
  };
};

Response

type CreateTemplateResponse = {
  id: number;
  code: string;
};

type RenderViaTemplatePostResponse = {
  source: 'stored' | 'inline';
  rendered: string;
  renderedSubject?: string;
  renderedHtml?: string;
};
PUT
/template/:code
Update template

Updates one or more fields of an existing template. All fields are optional. Historical sent emails are unaffected by updates.

Request

type UpdateTemplateRequest = {
  name?: string;
  description?: string;
  subjectTemplate?: string;
  htmlTemplate?: string;
  isActive?: boolean;
};

Response

type UpdateTemplateResponse = {
  success: boolean;
};
DELETE
/template/:code
Deactivate template

Soft-deletes the template by marking it inactive. Existing email records are unchanged. Deactivated templates are excluded from future send operations.

Request

// code in path — no request body

Response

type DeleteTemplateResponse = {
  success: boolean;
};