Proof
Proofof Holdings
How It Works
PricingDocsFAQ
Log InGet Started

Documentation

Browse all docs

Documentation

Learn how to integrate proof.holdings

Core Primitives
The mental model in one page
API Reference
Complete API documentation
SDKs
Official client libraries
Smart Reuse
Skip re-verification with existing proofs
Multi-Profile System
Multiple public profiles per account
Message Templates
Custom branding and message templates per project
Comparison
vs SMS OTP, TOTP, WebAuthn
Pricing
Plans and pricing tiers
Security
Threat model and guarantees
MCP Server
131 tools for AI agents
Integrations
n8n, Zapier, Make, and custom integrations
Resources
GitHub Docs
API Status

Message Templates

Custom branding and message templates per project


Overview

Projects let you manage multiple brands or applications under a single account. Each project has its own branding (name, logo, colors), callback URLs, and custom message templates that override the default messages sent via WhatsApp, Telegram, SMS, and email.

A default project is automatically created for every user and cannot be deleted.


Project Endpoints

All endpoints require JWT authentication.

Base path: https://api.proof.holdings/api/v1/me

MethodEndpointPurpose
GET/me/projectsList all projects
POST/me/projectsCreate new project
GET/me/projects/:idGet project details
PUT/me/projects/:idUpdate project
DELETE/me/projects/:idDelete project

Create Project

POST /api/v1/me/projects

Request Body

ParameterTypeRequiredDescription
namestringYesProject name (max 100 chars)
descriptionstringNoDescription (max 500 chars)
brandingobjectNoBranding settings (see below)

Branding Object

FieldTypeDescription
business_namestringName shown to users in messages
logo_urlstringLogo URL for email templates
primary_colorstringHex color (e.g., #3B82F6)
support_emailstringSupport contact shown in messages
bash
curl -X POST https://api.proof.holdings/api/v1/me/projects \
  -H "Cookie: session=eyJ..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Marketplace",
    "description": "Verification flows for the Acme marketplace app",
    "branding": {
      "business_name": "Acme Marketplace",
      "logo_url": "https://acme.com/logo.png",
      "primary_color": "#10B981",
      "support_email": "[email protected]"
    }
  }'

Response

json
{
  "id": "64a1b2c3d4e5f6a7b8c9d0e1",
  "name": "Acme Marketplace",
  "description": "Verification flows for the Acme marketplace app",
  "is_default": false,
  "branding": {
    "business_name": "Acme Marketplace",
    "logo_url": "https://acme.com/logo.png",
    "primary_color": "#10B981",
    "support_email": "[email protected]"
  },
  "callbacks": {},
  "templates": [],
  "status": "active",
  "created_at": "2026-02-06T12:00:00Z",
  "updated_at": "2026-02-06T12:00:00Z"
}

Update Project

PUT /api/v1/me/projects/:id

Accepts any subset of the create fields, plus callback URLs:

ParameterTypeDescription
callbacksobjectRedirect URLs for verification flows

Callbacks Object

FieldTypeDescription
success_urlstringRedirect after successful verification
failure_urlstringRedirect after failed verification
cancel_urlstringRedirect when user cancels
bash
curl -X PUT https://api.proof.holdings/api/v1/me/projects/64a1b2c3d4e5f6a7b8c9d0e1 \
  -H "Cookie: session=eyJ..." \
  -H "Content-Type: application/json" \
  -d '{
    "callbacks": {
      "success_url": "https://acme.com/verified",
      "failure_url": "https://acme.com/failed",
      "cancel_url": "https://acme.com/cancelled"
    }
  }'

Template Endpoints

Templates let you customize the messages sent to users during verification flows.

MethodEndpointPurpose
GET/me/projects/:id/templatesList project templates
PUT/me/projects/:id/templates/:channel/:typeCreate or update template
DELETE/me/projects/:id/templates/:channel/:typeDelete template (revert to default)
POST/me/projects/:id/templates/previewPreview rendered template

Create/Update Template

PUT /api/v1/me/projects/:id/templates/:channel/:type

URL Parameters

ParameterValues
channeltelegram, whatsapp, sms, email
typeverification_request, verification_success, verification_expired, login_request, login_success, 2fa_request, 2fa_success

Request Body

ParameterTypeRequiredDescription
bodystringYesTemplate text with {{variables}} (max 2000 chars)
subjectstringNoEmail subject line (max 200 chars, email only)
button_textstringNoCTA button text (max 50 chars)
button_url_templatestringNoButton URL template (max 500 chars)
is_activebooleanNoEnable/disable this template

Template Variables

Use {{variable_name}} syntax in the body text:

VariableDescription
{{business_name}}Project's business name
{{code}}Verification code
{{expires_in}}Time until expiry
{{user_identifier}}The asset being verified
{{channel}}Verification channel name
{{callback_url}}Callback/redirect URL
{{support_email}}Support email address

Example: Custom WhatsApp Verification Message

bash
curl -X PUT https://api.proof.holdings/api/v1/me/projects/64a1b2c3d4e5f6a7b8c9d0e1/templates/whatsapp/verification_request \
  -H "Cookie: session=eyJ..." \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Welcome to {{business_name}}! Your verification code is {{code}}. This code expires in {{expires_in}}.",
    "is_active": true
  }'

Example: Custom Email Template

bash
curl -X PUT https://api.proof.holdings/api/v1/me/projects/64a1b2c3d4e5f6a7b8c9d0e1/templates/email/verification_request \
  -H "Cookie: session=eyJ..." \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Verify your email for {{business_name}}",
    "body": "Hi there,\n\nPlease verify your email address ({{user_identifier}}) by entering this code:\n\n{{code}}\n\nThis code expires in {{expires_in}}.\n\nIf you did not request this, please ignore this email.\n\n— The {{business_name}} Team",
    "button_text": "Verify Email",
    "is_active": true
  }'

Preview Template

POST /api/v1/me/projects/:id/templates/preview

Render a template with sample data before saving.

Request Body

ParameterTypeRequiredDescription
channelstringYestelegram, whatsapp, sms, email
message_typestringYesMessage type (see values above)
bodystringYesTemplate body to preview
subjectstringNoEmail subject to preview
button_textstringNoButton text to preview
button_url_templatestringNoButton URL to preview
bash
curl -X POST https://api.proof.holdings/api/v1/me/projects/64a1b2c3d4e5f6a7b8c9d0e1/templates/preview \
  -H "Cookie: session=eyJ..." \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "email",
    "message_type": "verification_request",
    "subject": "Verify your email for {{business_name}}",
    "body": "Your code is {{code}}. Expires in {{expires_in}}."
  }'

Delete Template

DELETE /api/v1/me/projects/:id/templates/:channel/:type

Removes a custom template. Future messages for that channel/type will use the system default.

bash
curl -X DELETE https://api.proof.holdings/api/v1/me/projects/64a1b2c3d4e5f6a7b8c9d0e1/templates/whatsapp/verification_request \
  -H "Cookie: session=eyJ..."

Message Types

TypeWhen Sent
verification_requestUser needs to verify an asset
verification_successAsset successfully verified
verification_expiredVerification challenge expired
login_requestLogin verification initiated
login_successLogin completed
2fa_request2FA challenge sent
2fa_success2FA completed

Channel Support

ChannelSubjectBodyButtonRate Limit
emailYesYesYes30/min
whatsappNoYesNo30/min
telegramNoYesNo30/min
smsNoYesNo30/min

Notes

  • Each user gets a default project automatically (cannot be deleted)
  • Project names must be unique within an account
  • When no custom template exists for a channel/type, the system default is used
  • Template updates are rate-limited to 30 per minute
  • Projects can be archived by setting status: "archived" (not yet exposed via API)

Related

API ReferenceIntegrations
Last updated February 7, 2026
Proof
Proofof Holdings

Trust infrastructure for humans and AI agents. Verify control, delegate authority, get human approval — with cryptographic proof.

XGitHubLinkedIn
© 2026 Proof of Holdings

A service of LT Telecom (Uždaroji akcinė bendrovė "LT telekomunikacijos")

Product

  • How It Works
  • Verification Types
  • Human Approvals
  • FAQ

Developers

  • Docs
  • MCP Server
  • Integrations
  • OpenAPI Spec
  • GitHub Docs
  • API Status

Company

  • Brand Kit
  • About
  • Privacy
  • Terms