---
title: "List templates"
method: GET
path: "/api/v1/templates"
tags: ["Templates"]
---

# List templates

`GET /api/v1/templates`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/templates`
- Auth: HTTP bearer

List one project's custom templates (see `profile_id`) with available channels, message types, and variables. Templates exist only per project; an account with no project yet lists none.

## Query parameters

- `profile_id` string: The sub-account (project) whose templates to act on — templates exist only per project. A project-bound API key acts for its own project only; naming another answers `403 profile_mismatch` (SEC-SA-002). An account-wide key or a dashboard session may name any project of the account (`403 profile_not_owned` otherwise). Omitted: the key's project, else the primary project.

## Response `200`

Templates with metadata

- object
  - `profile_id` string: MongoDB ObjectId
  - `custom_templates` Template[], required
    - `id` string: MongoDB ObjectId
    - `profile_id` string: MongoDB ObjectId
    - `channel` 'telegram' | 'whatsapp' | 'sms' | 'email', required: Template messaging channel
    - `message_type` 'verification_request' | 'verification_success' | 'verification_expired' | 'login_request' | 'login_success' | '2fa_request' | '2fa_success' | 'account_deletion_request' | 'account_deletion_success' | 'confirmation_request' | 'confirmation_approved' | 'confirmation_denied', required: Template message type. `account_deletion_request` and `account_deletion_success` are RETIRED: since h-implement-proper-deletion an account is deleted in one step with a 2FA code and no messenger confirmation, so these templates are never sent; they stay accepted so templates stored before the change can still be read and deleted.
    - `subject` string
    - `body` string, required
    - `button_text` string
    - `button_url_template` string
    - `is_active` boolean
    - `version` integer
    - `updated_at` string, date-time
  - `available_channels` TemplateChannel[], required
  - `available_message_types` MessageType[], required
  - `available_variables` TemplateVariable[], required
    - `name` string, required
    - `description` string, required

## Other responses

- `401`: Unauthorized
- `403`: profile_not_owned — the requested profile does not belong to the account

---

[API](https://skmtc.dev/proof/apis/proof-holdings-api.md) · [All operations](https://skmtc.dev/proof/apis/proof-holdings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proof/apis/proof-holdings-api/revisions/6b8d61ee354f?raw)
