The acting user — the delegate token’s own user, or the body userId when
authenticating with an API key or partner token — must belong to the company and
hold the setup or setup_communication_templates permission.
Only plain templates can be created here — htmlBuilder must be false or
omitted.
attachmentIds are resolved against the company’s uploaded files, stored on the
template as full attachment entries, and tied to it so the detached-upload cleanup
leaves them alone — ids that no longer resolve are dropped. A pdf template’s
subject becomes a file name, so characters that are illegal in one are stripped.
Merge fields
subject and content may contain merge placeholders, which are replaced with
the recipient’s, board card’s or company’s own values when the template is sent.
Fetch the available fields from
GET /api/board/{boardId}/merge-fields for the board the template is used with.
Every item in that response is { label, value } — label is what to show a
human, value is what goes inside the braces:
A placeholder may carry a fallback, used when the field is empty or unknown:
{{firstname || fallback: there}} -> "there" when the contact has no first name{{Locations["Rent"] || fallback: TBD}} -> "TBD" when the card has no rent{{firstname || fallback: }} -> renders nothing at all
Everything after fallback: up to the closing braces is the fallback text, and an
empty one (or _blank) renders nothing.
Placeholders are shape-checked on write — an unclosed {{, an empty field
name, or a malformed bracket reference such as Locations["Rent] is rejected with
400. Whether the field exists is not checked: an unknown field is normal (boards
differ), and simply renders as its fallback at merge time.
POST
/
api
/
templates
Create a template
curl --request POST \ --url https://core-api.getaptly.com/api/templates \ --header 'Content-Type: application/json' \ --header 'x-token: <api-key>' \ --data '{ "companyId": "{{companyId}}", "userId": "{{userId}}", "name": "Move-in welcome", "description": "Sent to new residents on move-in day", "templateType": "email", "subject": "Welcome to your new home", "content": "<p>Welcome!</p>", "htmlBuilder": false}'
import requests
url = "https://core-api.getaptly.com/api/templates"
payload = {
"companyId": "{{companyId}}",
"userId": "{{userId}}",
"name": "Move-in welcome",
"description": "Sent to new residents on move-in day",
"templateType": "email",
"subject": "Welcome to your new home",
"content": "<p>Welcome!</p>",
"htmlBuilder": False
}
headers = {
"x-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {'x-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '{{companyId}}',
userId: '{{userId}}',
name: 'Move-in welcome',
description: 'Sent to new residents on move-in day',
templateType: 'email',
subject: 'Welcome to your new home',
content: '<p>Welcome!</p>',
htmlBuilder: false
})
};
fetch('https://core-api.getaptly.com/api/templates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
Email subject, or the file name for a pdf template — in which case filename-illegal characters are stripped. Merge placeholders work here too, and are shape-checked the same way.
Template body. Merge placeholders take the form {{value}} or {{value || fallback: text}}, where value is an item's value from GET /api/board/{boardId}/merge-fields — for example {{firstname}}, {{Locations["Rent"] || fallback: TBD}}. They are checked for shape — an unclosed {{, an empty field name or a malformed bracket reference is rejected. Whether each field exists is not checked: an unknown one renders as its fallback at merge time.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Aptly API","colors":{"primary":"#0066FF"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"aptly-10a57313","hasAudioNarration":false,"actualSubdomain":"aptly-10a57313","customDomains":["docs.getaptly.com"],"gitSource":{"type":"github","owner":"workturbo","repo":"core-api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4dfc987cb31e1fa2cb0ab","collectionId":"1788173d-2862-4418-873a-da2b64e83176","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4dfc987cb31e1fa2cb0ab"},"feedback":{"agentFeedback":true},"entitlements":{},"buildId":"6ae4dfc987cb31e1fa2cb0ab","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API Reference","count":192},{"language":"default","tag":"Board","count":28},{"language":"default","tag":"Documentation","count":17},{"language":"default","tag":"Aptly Portal","count":14},{"language":"default","tag":"Contacts","count":10},{"language":"default","tag":"Cards","count":9},{"language":"default","tag":"Knowledge","count":8},{"language":"default","tag":"Getting Started","count":7},{"language":"default","tag":"Inboxes","count":7},{"language":"default","tag":"Context \u0026 Locations","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/templates/create-a-template","slug":"/api-reference/templates/create-a-template","pageMetadata":{"title":"Create a template","description":"Creates a communication template.\n\nThe acting user — the delegate token's own user, or the body `userId` when\nauthenticating with an API key or partner token — must belong to the company and\nhold the `setup` or `setup_communication_templates` permission.\n\nOnly plain templates can be created here — `htmlBuilder` must be `false` or\nomitted.\n\n`attachmentIds` are resolved against the company's uploaded files, stored on the\ntemplate as full attachment entries, and tied to it so the detached-upload cleanup\nleaves them alone — ids that no longer resolve are dropped. A `pdf` template's\n`subject` becomes a file name, so characters that are illegal in one are stripped.\n\n### Merge fields\n\n`subject` and `content` may contain merge placeholders, which are replaced with\nthe recipient's, board card's or company's own values when the template is sent.\n\nFetch the available fields from\n`GET /api/board/{boardId}/merge-fields` for the board the template is used with.\nEvery item in that response is `{ label, value }` — `label` is what to show a\nhuman, `value` is what goes inside the braces:\n\n```\n{{firstname}}\n{{Locations[\"Rent\"]}}\n{{customFields.7Lq2.LoyaltyTier}}\n```\n\nA placeholder may carry a fallback, used when the field is empty or unknown:\n\n```\n{{firstname || fallback: there}} -> \"there\" when the contact has no first name\n{{Locations[\"Rent\"] || fallback: TBD}} -> \"TBD\" when the card has no rent\n{{firstname || fallback: }} -> renders nothing at all\n```\n\nEverything after `fallback:` up to the closing braces is the fallback text, and an\nempty one (or `_blank`) renders nothing.\n\nPlaceholders are **shape**-checked on write — an unclosed `{{`, an empty field\nname, or a malformed bracket reference such as `Locations[\"Rent]` is rejected with\n400. Whether the field exists is not checked: an unknown field is normal (boards\ndiffer), and simply renders as its fallback at merge time.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/templates","href":"/api-reference/templates/create-a-template","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n h3: \"h3\",\n p: \"p\",\n pre: \"pre\",\n span: \"span\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n }, {CodeBlock} = _components;\n if (!CodeBlock) _missingMdxReference(\"CodeBlock\", true);\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Creates a communication template.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The acting user — the delegate token’s own user, or the body \", _jsx(_components.code, {\n children: \"userId\"\n }), \" when\\nauthenticating with an API key or partner token — must belong to the company and\\nhold the \", _jsx(_components.code, {\n children: \"setup\"\n }), \" or \", _jsx(_components.code, {\n children: \"setup_communication_templates\"\n }), \" permission.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Only plain templates can be created here — \", _jsx(_components.code, {\n children: \"htmlBuilder\"\n }), \" must be \", _jsx(_components.code, {\n children: \"false\"\n }), \" or\\nomitted.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"attachmentIds\"\n }), \" are resolved against the company’s uploaded files, stored on the\\ntemplate as full attachment entries, and tied to it so the detached-upload cleanup\\nleaves them alone — ids that no longer resolve are dropped. A \", _jsx(_components.code, {\n children: \"pdf\"\n }), \" template’s\\n\", _jsx(_components.code, {\n children: \"subject\"\n }), \" becomes a file name, so characters that are illegal in one are stripped.\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Merge fields\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"subject\"\n }), \" and \", _jsx(_components.code, {\n children: \"content\"\n }), \" may contain merge placeholders, which are replaced with\\nthe recipient’s, board card’s or company’s own values when the template is sent.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Fetch the available fields from\\n\", _jsx(_components.code, {\n children: \"GET /api/board/{boardId}/merge-fields\"\n }), \" for the board the template is used with.\\nEvery item in that response is \", _jsx(_components.code, {\n children: \"{ label, value }\"\n }), \" — \", _jsx(_components.code, {\n children: \"label\"\n }), \" is what to show a\\nhuman, \", _jsx(_components.code, {\n children: \"value\"\n }), \" is what goes inside the braces:\"]\n }), \"\\n\", _jsx(CodeBlock, {\n numberOfLines: \"4\",\n language: \"text\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"text\",\n children: _jsxs(_components.code, {\n language: \"text\",\n numberOfLines: \"4\",\n children: [_jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"{{firstname}}\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"{{Locations[\\\"Rent\\\"]}}\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"{{customFields.7Lq2.LoyaltyTier}}\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n })]\n })\n })\n }), \"\\n\", _jsx(_components.p, {\n children: \"A placeholder may carry a fallback, used when the field is empty or unknown:\"\n }), \"\\n\", _jsx(CodeBlock, {\n numberOfLines: \"4\",\n language: \"text\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"text\",\n children: _jsxs(_components.code, {\n language: \"text\",\n numberOfLines: \"4\",\n children: [_jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"{{firstname || fallback: there}} -> \\\"there\\\" when the contact has no first name\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"{{Locations[\\\"Rent\\\"] || fallback: TBD}} -> \\\"TBD\\\" when the card has no rent\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"{{firstname || fallback: }} -> renders nothing at all\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n })]\n })\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Everything after \", _jsx(_components.code, {\n children: \"fallback:\"\n }), \" up to the closing braces is the fallback text, and an\\nempty one (or \", _jsx(_components.code, {\n children: \"_blank\"\n }), \") renders nothing.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Placeholders are \", _jsx(_components.strong, {\n children: \"shape\"\n }), \"-checked on write — an unclosed \", _jsx(_components.code, {\n children: \"{{\"\n }), \", an empty field\\nname, or a malformed bracket reference such as \", _jsx(_components.code, {\n children: \"Locations[\\\"Rent]\"\n }), \" is rejected with\\n400. Whether the field exists is not checked: an unknown field is normal (boards\\ndiffer), and simply renders as its fallback at merge time.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\nfunction _missingMdxReference(id, component) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\");\n}\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a template","description":"Creates a communication template.\n\nThe acting user — the delegate token's own user, or the body `userId` when\nauthenticating with an API key or partner token — must belong to the company and\nhold the `setup` or `setup_communication_templates` permission.\n\nOnly plain templates can be created here — `htmlBuilder` must be `false` or\nomitted.\n\n`attachmentIds` are resolved against the company's uploaded files, stored on the\ntemplate as full attachment entries, and tied to it so the detached-upload cleanup\nleaves them alone — ids that no longer resolve are dropped. A `pdf` template's\n`subject` becomes a file name, so characters that are illegal in one are stripped.\n\n### Merge fields\n\n`subject` and `content` may contain merge placeholders, which are replaced with\nthe recipient's, board card's or company's own values when the template is sent.\n\nFetch the available fields from\n`GET /api/board/{boardId}/merge-fields` for the board the template is used with.\nEvery item in that response is `{ label, value }` — `label` is what to show a\nhuman, `value` is what goes inside the braces:\n\n```\n{{firstname}}\n{{Locations[\"Rent\"]}}\n{{customFields.7Lq2.LoyaltyTier}}\n```\n\nA placeholder may carry a fallback, used when the field is empty or unknown:\n\n```\n{{firstname || fallback: there}} -> \"there\" when the contact has no first name\n{{Locations[\"Rent\"] || fallback: TBD}} -> \"TBD\" when the card has no rent\n{{firstname || fallback: }} -> renders nothing at all\n```\n\nEverything after `fallback:` up to the closing braces is the fallback text, and an\nempty one (or `_blank`) renders nothing.\n\nPlaceholders are **shape**-checked on write — an unclosed `{{`, an empty field\nname, or a malformed bracket reference such as `Locations[\"Rent]` is rejected with\n400. Whether the field exists is not checked: an unknown field is normal (boards\ndiffer), and simply renders as its fallback at merge time.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/templates","href":"/api-reference/templates/create-a-template","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Create a template","description":"Creates a communication template.\n\nThe acting user — the delegate token's own user, or the body `userId` when\nauthenticating with an API key or partner token — must belong to the company and\nhold the `setup` or `setup_communication_templates` permission.\n\nOnly plain templates can be created here — `htmlBuilder` must be `false` or\nomitted.\n\n`attachmentIds` are resolved against the company's uploaded files, stored on the\ntemplate as full attachment entries, and tied to it so the detached-upload cleanup\nleaves them alone — ids that no longer resolve are dropped. A `pdf` template's\n`subject` becomes a file name, so characters that are illegal in one are stripped.\n\n### Merge fields\n\n`subject` and `content` may contain merge placeholders, which are replaced with\nthe recipient's, board card's or company's own values when the template is sent.\n\nFetch the available fields from\n`GET /api/board/{boardId}/merge-fields` for the board the template is used with.\nEvery item in that response is `{ label, value }` — `label` is what to show a\nhuman, `value` is what goes inside the braces:\n\n```\n{{firstname}}\n{{Locations[\"Rent\"]}}\n{{customFields.7Lq2.LoyaltyTier}}\n```\n\nA placeholder may carry a fallback, used when the field is empty or unknown:\n\n```\n{{firstname || fallback: there}} -> \"there\" when the contact has no first name\n{{Locations[\"Rent\"] || fallback: TBD}} -> \"TBD\" when the card has no rent\n{{firstname || fallback: }} -> renders nothing at all\n```\n\nEverything after `fallback:` up to the closing braces is the fallback text, and an\nempty one (or `_blank`) renders nothing.\n\nPlaceholders are **shape**-checked on write — an unclosed `{{`, an empty field\nname, or a malformed bracket reference such as `Locations[\"Rent]` is rejected with\n400. Whether the field exists is not checked: an unknown field is normal (boards\ndiffer), and simply renders as its fallback at merge time.\n","operationId":"createTemplate","tags":["Templates"],"security":["04a2c3bb-7399-420b-9095-9eced5821aa4","cf8189c2-49df-4877-acbf-36ac19acfcbb","6a90045b-6b69-4b06-a6f7-af42f08085e1"],"requestBody":"af83bbb8-7230-49ff-9fa9-69120c4797d4","responses":{"201":"de451c63-450d-4680-bf20-7aa731d7ce9c","400":"8b6d0a89-a872-4adc-a99e-562451d11236","401":"9a838a69-536a-4c7c-bb52-9316d69fc3bc","403":"1aac258a-b64d-4bf8-bee4-4f5c6cae1a7e"},"method":"post","type":"path","servers":["07b42306-8584-4b68-93b8-f52adbaae2fe"],"path":"/api/templates","baseUrlOptions":["https://core-api.getaptly.com"],"title":"Create a template","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","description","templateType","subject","content"],"properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"description":{"type":"string","isRequired":true,"uniqueKey":"description","typeLabel":"string"},"templateType":{"type":"string","enum":["sms","email","form","eSignature","pdf"],"description":"Template kind. `blockDocument` is not accepted — it is an internal type for document blocks, not a user-facing template.","isRequired":true,"uniqueKey":"templateType","typeLabel":"enum\u003cstring>"},"subject":{"type":"string","description":"Email subject, or the file name for a `pdf` template — in which case filename-illegal characters are stripped. Merge placeholders work here too, and are shape-checked the same way.","isRequired":true,"uniqueKey":"subject","typeLabel":"string"},"content":{"type":"string","description":"Template body. Merge placeholders take the form `{{value}}` or `{{value || fallback: text}}`, where `value` is an item's `value` from `GET /api/board/{boardId}/merge-fields` — for example `{{firstname}}`, `{{Locations[\"Rent\"] || fallback: TBD}}`. They are checked for shape — an unclosed `{{`, an empty field name or a malformed bracket reference is rejected. Whether each field exists is not checked: an unknown one renders as its fallback at merge time.","isRequired":true,"uniqueKey":"content","typeLabel":"string"},"companyId":{"type":"string","description":"Required with a partner token; resolved from an API key or delegate token.","uniqueKey":"companyId","typeLabel":"string"},"userId":{"type":"string","description":"The acting user. Required with an API key or partner token; a delegate token supplies its own.","uniqueKey":"userId","typeLabel":"string"},"htmlBuilder":{"type":"boolean","enum":[false],"default":false,"description":"Must be `false` or omitted. HTML-builder templates keep their markup in a builder-owned `builderData` format and can only be authored in the app.","uniqueKey":"htmlBuilder","typeLabel":"enum\u003cboolean>"},"builderData":{"type":"object","description":"Builder document, when one already exists.","uniqueKey":"builderData","typeLabel":"object"},"folderId":{"type":"string","description":"Library folder the template belongs to — must be an existing, non-archived folder in the company. Governs who may edit the template.","uniqueKey":"folderId","typeLabel":"string"},"aptletUuid":{"type":"string","description":"Board the template is scoped to. Must be an existing, non-archived board in the company.","uniqueKey":"aptletUuid","typeLabel":"string"},"signature":{"type":"string","uniqueKey":"signature","typeLabel":"string"},"attachmentIds":{"type":"array","items":{"type":"string","uniqueKey":"attachmentIds.items.[INDEX]","typeLabel":"string"},"description":"Uploaded file ids to attach.","uniqueKey":"attachmentIds","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"email":{"title":"email","value":{"companyId":"{{companyId}}","userId":"{{userId}}","name":"Move-in welcome","description":"Sent to new residents on move-in day","templateType":"email","subject":"Welcome to your new home","content":"\u003cp>Welcome!\u003c/p>","htmlBuilder":false}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"de451c63-450d-4680-bf20-7aa731d7ce9c":{"description":"Template created.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"_id":{"type":"string","description":"Template ID.","uniqueKey":"data._id","typeLabel":"string"},"companyId":{"type":"string","description":"Company the template belongs to.","uniqueKey":"data.companyId","typeLabel":"string"},"name":{"type":"string","description":"Template display name.","uniqueKey":"data.name","typeLabel":"string"},"templateType":{"type":"string","enum":["sms","email","form","eSignature","pdf","blockDocument"],"description":"Template category.","uniqueKey":"data.templateType","typeLabel":"enum\u003cstring>"},"archived":{"type":"boolean","uniqueKey":"data.archived","typeLabel":"boolean"},"createdAt":{"type":"string","format":"date-time","uniqueKey":"data.createdAt","typeLabel":"string\u003cdate-time>"},"createdBy":{"type":"string","description":"User ID of the creator.","uniqueKey":"data.createdBy","typeLabel":"string"},"updatedAt":{"type":"string","format":"date-time","uniqueKey":"data.updatedAt","typeLabel":"string\u003cdate-time>"}},"additionalProperties":{"description":"Additional properties depend on the templateType (e.g. `subject`, `content` for email templates).","uniqueKey":"data.additionalProperties","typeLabel":"any"},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"_id":"\u003cstring>","companyId":"\u003cstring>","name":"\u003cstring>","templateType":"sms","archived":true,"createdAt":"2023-11-07T05:31:56Z","createdBy":"\u003cstring>","updatedAt":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"8b6d0a89-a872-4adc-a99e-562451d11236":{"description":"Missing companyId, or an invalid payload.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"9a838a69-536a-4c7c-bb52-9316d69fc3bc":{"description":"Invalid or missing credential.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"1aac258a-b64d-4bf8-bee4-4f5c6cae1a7e":{"description":"The acting user lacks the template permission.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"04a2c3bb-7399-420b-9095-9eced5821aa4":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"x-token","scopes":[],"schemeName":"ApiKeyHeader"}},"cf8189c2-49df-4877-acbf-36ac19acfcbb":{"DelegateToken":{"type":"apiKey","in":"header","name":"Authorization","description":"Delegate token issued by the platform. Format: `DelegateToken \u003ctoken>`","scopes":[],"schemeName":"DelegateToken"}},"6a90045b-6b69-4b06-a6f7-af42f08085e1":{"PartnerBearer":{"type":"http","scheme":"bearer","description":"Partner token. Format: `Authorization: Bearer \u003ctoken>`","scopes":[],"schemeName":"PartnerBearer"}}},"servers":{"07b42306-8584-4b68-93b8-f52adbaae2fe":{"url":"https://core-api.getaptly.com","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-token","scopes":[],"schemeName":"ApiKeyHeader"},"schema":{"title":"x-token","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyHeader","name":"x-token"}],"title":"ApiKeyHeader"},{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"Authorization","description":"Delegate token issued by the platform. Format: `DelegateToken \u003ctoken>`","scopes":[],"schemeName":"DelegateToken"},"schema":{"title":"Authorization","type":"string","description":"Delegate token issued by the platform. Format: `DelegateToken \u003ctoken>`","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"DelegateToken","name":"Authorization"}],"title":"DelegateToken"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Partner token. Format: `Authorization: Bearer \u003ctoken>`","scopes":[],"schemeName":"PartnerBearer"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Partner token. Format: `Authorization: Bearer \u003ctoken>`","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"PartnerBearer","name":"Authorization"}],"title":"PartnerBearer"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"aptly-10a57313","siteName":"Aptly API","title":"Create a template - Aptly API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T18:20:14.792Z","originalFileLocation":"api-reference/templates/create-a-template.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates a communication template. The acting user — the delegate token\u0026#x27;s own user, or the body userId when authenticating with an API key or partner token — must belong to the company and hold the setup or setup_communication_templates permission. Only plain templates can be created here — htmlBuilder must be false or omitted. attachmentIds are resolved against the company\u0026#x27;s uploaded files, stored on the template as full attachment entries, and tied to it so the detached-upload cleanup leaves them alone — ids that no longer resolve are dropped. A pdf template\u0026#x27;s subject becomes a file name, so characters that are illegal in one are stripped. ### Merge fields subject and content may contain merge placeholders, which are replaced with the recipient\u0026#x27;s, board card\u0026#x27;s or company\u0026#x27;s own values when the template is sent. Fetch the available fields from GET /api/board/{boardId}/merge-fields for the board the template is used with. Every item in that response is { label, value } — label is what to show a human, value is what goes inside the braces: {{firstname}} {{Locations[\u0026quot;Rent\u0026quot;]}} {{customFields.7Lq2.LoyaltyTier}} A placeholder may carry a fallback, used when the field is empty or unknown: {{firstname || fallback: there}} -\u0026gt; \u0026quot;there\u0026quot; when the contact has no first name {{Locations[\u0026quot;Rent\u0026quot;] || fallback: TBD}} -\u0026gt; \u0026quot;TBD\u0026quot; when the card has no rent {{firstname || fallback: }} -\u0026gt; renders nothing at all Everything after fallback: up to the closing braces is the fallback text, and an empty one (or _blank) renders nothing. Placeholders are shape-checked on write — an unclosed {{, an empty field name, or a malformed bracket reference such as Locations[\u0026quot;Rent] is rejected with 400. Whether the field exists is not checked: an unknown field is normal (boards differ), and simply renders as its fallback at merge time.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Aptly API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/aptly-10a57313/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/aptly-10a57313/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/aptly-10a57313/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/aptly-10a57313/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a template - Aptly API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a communication template. The acting user — the delegate token\u0026#x27;s own user, or the body userId when authenticating with an API key or partner token — must belong to the company and hold the setup or setup_communication_templates permission. Only plain templates can be created here — htmlBuilder must be false or omitted. attachmentIds are resolved against the company\u0026#x27;s uploaded files, stored on the template as full attachment entries, and tied to it so the detached-upload cleanup leaves them alone — ids that no longer resolve are dropped. A pdf template\u0026#x27;s subject becomes a file name, so characters that are illegal in one are stripped. ### Merge fields subject and content may contain merge placeholders, which are replaced with the recipient\u0026#x27;s, board card\u0026#x27;s or company\u0026#x27;s own values when the template is sent. Fetch the available fields from GET /api/board/{boardId}/merge-fields for the board the template is used with. Every item in that response is { label, value } — label is what to show a human, value is what goes inside the braces: {{firstname}} {{Locations[\u0026quot;Rent\u0026quot;]}} {{customFields.7Lq2.LoyaltyTier}} A placeholder may carry a fallback, used when the field is empty or unknown: {{firstname || fallback: there}} -\u0026gt; \u0026quot;there\u0026quot; when the contact has no first name {{Locations[\u0026quot;Rent\u0026quot;] || fallback: TBD}} -\u0026gt; \u0026quot;TBD\u0026quot; when the card has no rent {{firstname || fallback: }} -\u0026gt; renders nothing at all Everything after fallback: up to the closing braces is the fallback text, and an empty one (or _blank) renders nothing. Placeholders are shape-checked on write — an unclosed {{, an empty field name, or a malformed bracket reference such as Locations[\u0026quot;Rent] is rejected with 400. Whether the field exists is not checked: an unknown field is normal (boards differ), and simply renders as its fallback at merge time.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Aptly API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.getaptly.com/api-reference/templates/create-a-template\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://aptly-10a57313.mintlify.app/_mintlify/api/og/v2?division=Templates\u0026amp;title=Create+a+template\u0026amp;description=Creates+a+communication+template.%0A%0AThe+acting+user+%E2%80%94+the+delegate+token%27s+own+user%2C+or+the+body+%60userId%60+when%0Aauthenticating+with+an+API+key+or+partner+token+%E2%80%94+\u0026amp;theme=2df7969a14dd47f616338bb6\u0026amp;signature=b164a733aee06b049d5ee4cabaeda73689821bf0964d21027c78e066f0fe2456\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a template - Aptly API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a communication template. The acting user — the delegate token\u0026#x27;s own user, or the body userId when authenticating with an API key or partner token — must belong to the company and hold the setup or setup_communication_templates permission. Only plain templates can be created here — htmlBuilder must be false or omitted. attachmentIds are resolved against the company\u0026#x27;s uploaded files, stored on the template as full attachment entries, and tied to it so the detached-upload cleanup leaves them alone — ids that no longer resolve are dropped. A pdf template\u0026#x27;s subject becomes a file name, so characters that are illegal in one are stripped. ### Merge fields subject and content may contain merge placeholders, which are replaced with the recipient\u0026#x27;s, board card\u0026#x27;s or company\u0026#x27;s own values when the template is sent. Fetch the available fields from GET /api/board/{boardId}/merge-fields for the board the template is used with. Every item in that response is { label, value } — label is what to show a human, value is what goes inside the braces: {{firstname}} {{Locations[\u0026quot;Rent\u0026quot;]}} {{customFields.7Lq2.LoyaltyTier}} A placeholder may carry a fallback, used when the field is empty or unknown: {{firstname || fallback: there}} -\u0026gt; \u0026quot;there\u0026quot; when the contact has no first name {{Locations[\u0026quot;Rent\u0026quot;] || fallback: TBD}} -\u0026gt; \u0026quot;TBD\u0026quot; when the card has no rent {{firstname || fallback: }} -\u0026gt; renders nothing at all Everything after fallback: up to the closing braces is the fallback text, and an empty one (or _blank) renders nothing. Placeholders are shape-checked on write — an unclosed {{, an empty field name, or a malformed bracket reference such as Locations[\u0026quot;Rent] is rejected with 400. Whether the field exists is not checked: an unknown field is normal (boards differ), and simply renders as its fallback at merge time.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://aptly-10a57313.mintlify.app/_mintlify/api/og/v2?division=Templates\u0026amp;title=Create+a+template\u0026amp;description=Creates+a+communication+template.%0A%0AThe+acting+user+%E2%80%94+the+delegate+token%27s+own+user%2C+or+the+body+%60userId%60+when%0Aauthenticating+with+an+API+key+or+partner+token+%E2%80%94+\u0026amp;theme=2df7969a14dd47f616338bb6\u0026amp;signature=b164a733aee06b049d5ee4cabaeda73689821bf0964d21027c78e066f0fe2456\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/aptly-10a57313/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Aptly API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0066FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.getaptly.com/api-reference/templates/create-a-template\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/templates/create-a-template.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.getaptly.com/#organization\",\"name\":\"Aptly API\",\"url\":\"https://docs.getaptly.com\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.getaptly.com#website\",\"name\":\"Aptly API\",\"url\":\"https://docs.getaptly.com\",\"publisher\":{\"@id\":\"https://docs.getaptly.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.getaptly.com/api-reference/templates/create-a-template#webpage\",\"url\":\"https://docs.getaptly.com/api-reference/templates/create-a-template\",\"name\":\"Create a template\",\"description\":\"Creates a communication template. The acting user — the delegate token's own user, or the body userId when authenticating with an API key or partner token — must belong to the company and hold the setup or setup_communication_templates permission. Only plain templates can be created here — htmlBuilder must be false or omitted. attachmentIds are resolved against the company's uploaded files, stored on the template as full attachment entries, and tied to it so the detached-upload cleanup leaves them alone — ids that no longer resolve are dropped. A pdf template's subject becomes a file name, so characters that are illegal in one are stripped. ### Merge fields subject and content may contain merge placeholders, which are replaced with the recipient's, board card's or company's own values when the template is sent. Fetch the available fields from GET /api/board/{boardId}/merge-fields for the board the template is used with. Every item in that response is { label, value } — label is what to show a human, value is what goes inside the braces: {{firstname}} {{Locations[\\\"Rent\\\"]}} {{customFields.7Lq2.LoyaltyTier}} A placeholder may carry a fallback, used when the field is empty or unknown: {{firstname || fallback: there}} -> \\\"there\\\" when the contact has no first name {{Locations[\\\"Rent\\\"] || fallback: TBD}} -> \\\"TBD\\\" when the card has no rent {{firstname || fallback: }} -> renders nothing at all Everything after fallback: up to the closing braces is the fallback text, and an empty one (or _blank) renders nothing. Placeholders are shape-checked on write — an unclosed {{, an empty field name, or a malformed bracket reference such as Locations[\\\"Rent] is rejected with 400. Whether the field exists is not checked: an unknown field is normal (boards differ), and simply renders as its fallback at merge time.\",\"dateModified\":\"2026-10-30T18:20:14.792Z\",\"isPartOf\":{\"@id\":\"https://docs.getaptly.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.getaptly.com/api-reference/templates/create-a-template#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.getaptly.com/api-reference/templates/create-a-template#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.getaptly.com/api-reference/users/list-users\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Templates\",\"item\":\"https://docs.getaptly.com/api-reference/templates/list-templates\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create a template\",\"item\":\"https://docs.getaptly.com/api-reference/templates/create-a-template\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.getaptly.com/api-reference/templates/create-a-template#apireference\",\"headline\":\"Create a template\",\"name\":\"Create a template\",\"description\":\"Creates a communication template. The acting user — the delegate token's own user, or the body userId when authenticating with an API key or partner token — must belong to the company and hold the setup or setup_communication_templates permission. Only plain templates can be created here — htmlBuilder must be false or omitted. attachmentIds are resolved against the company's uploaded files, stored on the template as full attachment entries, and tied to it so the detached-upload cleanup leaves them alone — ids that no longer resolve are dropped. A pdf template's subject becomes a file name, so characters that are illegal in one are stripped. ### Merge fields subject and content may contain merge placeholders, which are replaced with the recipient's, board card's or company's own values when the template is sent. Fetch the available fields from GET /api/board/{boardId}/merge-fields for the board the template is used with. Every item in that response is { label, value } — label is what to show a human, value is what goes inside the braces: {{firstname}} {{Locations[\\\"Rent\\\"]}} {{customFields.7Lq2.LoyaltyTier}} A placeholder may carry a fallback, used when the field is empty or unknown: {{firstname || fallback: there}} -> \\\"there\\\" when the contact has no first name {{Locations[\\\"Rent\\\"] || fallback: TBD}} -> \\\"TBD\\\" when the card has no rent {{firstname || fallback: }} -> renders nothing at all Everything after fallback: up to the closing braces is the fallback text, and an empty one (or _blank) renders nothing. Placeholders are shape-checked on write — an unclosed {{, an empty field name, or a malformed bracket reference such as Locations[\\\"Rent] is rejected with 400. Whether the field exists is not checked: an unknown field is normal (boards differ), and simply renders as its fallback at merge time.\",\"url\":\"https://docs.getaptly.com/api-reference/templates/create-a-template\",\"mainEntityOfPage\":{\"@id\":\"https://docs.getaptly.com/api-reference/templates/create-a-template#webpage\"},\"dateModified\":\"2026-10-30T18:20:14.792Z\",\"publisher\":{\"@id\":\"https://docs.getaptly.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.getaptly.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Aptly API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Aptly API","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"API Reference","groups":[{"group":"API Reference","pages":[{"group":"Users","pages":[{"title":"List users","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/users","href":"/api-reference/users/list-users"},{"title":"List a user's email inboxes","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/users/{userId}/inboxes","href":"/api-reference/users/list-a-users-email-inboxes"}]},{"group":"Inboxes","pages":[{"title":"List inboxes you can query","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/inboxes","href":"/api-reference/inboxes/list-inboxes-you-can-query"},{"title":"List threads and messages on an inbox","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/inboxes/{channelId}/messages","href":"/api-reference/inboxes/list-threads-and-messages-on-an-inbox"},{"title":"Conversation analytics for an inbox","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/inboxes/{channelId}/analytics","href":"/api-reference/inboxes/conversation-analytics-for-an-inbox"},{"title":"Activity history for an inbox","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/inboxes/{channelId}/history","href":"/api-reference/inboxes/activity-history-for-an-inbox"},{"title":"Volume and response-time trends for an inbox","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/inboxes/{channelId}/trends","href":"/api-reference/inboxes/volume-and-response-time-trends-for-an-inbox"},{"title":"Volume health for an inbox against its own baseline","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/inboxes/{channelId}/health","href":"/api-reference/inboxes/volume-health-for-an-inbox-against-its-own-baseline"},{"title":"List unsent drafts on an inbox","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/inboxes/{channelId}/drafts","href":"/api-reference/inboxes/list-unsent-drafts-on-an-inbox"}]},{"group":"Schema","pages":[{"title":"Get board schema","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/schema/{boardId}","href":"/api-reference/schema/get-board-schema"}]},{"group":"Boards","pages":[{"title":"List boards","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/boards","href":"/api-reference/boards/list-boards"},{"title":"Create a board","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/boards","href":"/api-reference/boards/create-a-board"}]},{"group":"Cards","pages":[{"title":"List cards","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/list","href":"/api-reference/cards/list-cards"},{"title":"List cards (deprecated)","deprecated":true,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}","href":"/api-reference/cards/list-cards-deprecated"},{"title":"Create or update a card","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}","href":"/api-reference/cards/create-or-update-a-card"},{"title":"Get a card","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/{cardId}","href":"/api-reference/cards/get-a-card"},{"title":"Archive a card","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/board/{boardId}/{cardId}","href":"/api-reference/cards/archive-a-card"},{"title":"List comments on a card","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/{cardId}/comments","href":"/api-reference/cards/list-comments-on-a-card"},{"title":"List contacts linked to a card","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/{cardId}/contacts","href":"/api-reference/cards/list-contacts-linked-to-a-card"},{"title":"Add or update a comment","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/{cardId}/comment","href":"/api-reference/cards/add-or-update-a-comment"},{"title":"Upload a file to a card","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/{cardId}/file","href":"/api-reference/cards/upload-a-file-to-a-card"}]},{"group":"Board","pages":[{"title":"Archive a board","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/board/{boardId}","href":"/api-reference/board/archive-a-board"},{"title":"List merge fields for a board","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/merge-fields","href":"/api-reference/board/list-merge-fields-for-a-board"},{"title":"List users who can open a board","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/users","href":"/api-reference/board/list-users-who-can-open-a-board"},{"title":"Add a tab view","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/configuration/tabViews","href":"/api-reference/board/add-a-tab-view"},{"title":"Add a tab view (legacy)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/tabView","href":"/api-reference/board/add-a-tab-view-legacy"},{"title":"Verify a delegate token","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/verify-user","href":"/api-reference/board/verify-a-delegate-token"},{"title":"Set or update the board's webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/webhook","href":"/api-reference/board/set-or-update-the-boards-webhook"},{"title":"Remove the board's webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/board/{boardId}/webhook","href":"/api-reference/board/remove-the-boards-webhook"},{"title":"Get full board configuration","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration","href":"/api-reference/board/get-full-board-configuration"},{"title":"List board automations","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/automations","href":"/api-reference/board/list-board-automations"},{"title":"Create an automation","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/configuration/automations","href":"/api-reference/board/create-an-automation"},{"title":"List create-card rules","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/card-rules","href":"/api-reference/board/list-create-card-rules"},{"title":"Get board options","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/options","href":"/api-reference/board/get-board-options"},{"title":"List board fields","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/fields","href":"/api-reference/board/list-board-fields"},{"title":"Add a field","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/configuration/fields","href":"/api-reference/board/add-a-field"},{"title":"Add a mirror field","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/configuration/mirror-fields","href":"/api-reference/board/add-a-mirror-field"},{"title":"Update a field","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/board/{boardId}/configuration/fields/{fieldUuid}","href":"/api-reference/board/update-a-field"},{"title":"Delete a field","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/board/{boardId}/configuration/fields/{fieldUuid}","href":"/api-reference/board/delete-a-field"},{"title":"Reorder fields","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/board/{boardId}/configuration/field-order","href":"/api-reference/board/reorder-fields"},{"title":"List board field groups","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/groups","href":"/api-reference/board/list-board-field-groups"},{"title":"Create a field group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/board/{boardId}/configuration/groups","href":"/api-reference/board/create-a-field-group"},{"title":"Update a field group","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/board/{boardId}/configuration/groups/{groupUuid}","href":"/api-reference/board/update-a-field-group"},{"title":"Get the create-card form order","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/start-card-order","href":"/api-reference/board/get-the-create-card-form-order"},{"title":"Set the create-card form order","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/board/{boardId}/configuration/start-card-order","href":"/api-reference/board/set-the-create-card-form-order"},{"title":"Get board access settings","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/shares","href":"/api-reference/board/get-board-access-settings"},{"title":"Get board identity fields","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/theme","href":"/api-reference/board/get-board-identity-fields"},{"title":"Update board identity fields","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/board/{boardId}/configuration/theme","href":"/api-reference/board/update-board-identity-fields"},{"title":"List board filters","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/board/{boardId}/configuration/filters","href":"/api-reference/board/list-board-filters"}]},{"group":"Company","pages":[{"title":"Get company info","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/company/info","href":"/api-reference/company/get-company-info"}]},{"group":"Contacts","pages":[{"title":"Get conversations for contacts","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/contacts/conversations","href":"/api-reference/contacts/get-conversations-for-contacts"},{"title":"Get contact conversations","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/contacts/{contactId}/conversations","href":"/api-reference/contacts/get-contact-conversations"},{"title":"List contacts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/contacts","href":"/api-reference/contacts/list-contacts"},{"title":"Create or update a contact","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/contacts","href":"/api-reference/contacts/create-or-update-a-contact"},{"title":"Look up contacts by email","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/contacts/by-email","href":"/api-reference/contacts/look-up-contacts-by-email"},{"title":"Initiate contact email verification","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/contacts/verify-email","href":"/api-reference/contacts/initiate-contact-email-verification"},{"title":"Confirm contact email verification","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/contacts/verify-email/{requestId}/confirm","href":"/api-reference/contacts/confirm-contact-email-verification"},{"title":"Get a contact","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/contacts/{contactId}","href":"/api-reference/contacts/get-a-contact"},{"title":"Update a contact","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/contacts/{contactId}","href":"/api-reference/contacts/update-a-contact"},{"title":"Get a contact's sentiment history","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/contacts/{contactId}/sentiment","href":"/api-reference/contacts/get-a-contacts-sentiment-history"}]},{"group":"Knowledge","pages":[{"title":"Create a knowledge document","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/knowledge/create","href":"/api-reference/knowledge/create-a-knowledge-document"},{"title":"List knowledge documents","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/knowledge/list","href":"/api-reference/knowledge/list-knowledge-documents"},{"title":"Get the knowledge document tree","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/knowledge/tree","href":"/api-reference/knowledge/get-the-knowledge-document-tree"},{"title":"List a knowledge document's direct children","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/knowledge/{id}/children","href":"/api-reference/knowledge/list-a-knowledge-documents-direct-children"},{"title":"List saved knowledge document versions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/knowledge/{id}/history","href":"/api-reference/knowledge/list-saved-knowledge-document-versions"},{"title":"Read a saved knowledge document version","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/knowledge/{id}/history/{versionId}","href":"/api-reference/knowledge/read-a-saved-knowledge-document-version"},{"title":"Get a knowledge document","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/knowledge/{id}","href":"/api-reference/knowledge/get-a-knowledge-document"},{"title":"Update a knowledge document","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/knowledge/{id}","href":"/api-reference/knowledge/update-a-knowledge-document"}]},{"group":"Email","pages":[{"title":"Create an email draft","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/email/create-draft","href":"/api-reference/email/create-an-email-draft"},{"title":"Send an email","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/email/send","href":"/api-reference/email/send-an-email"}]},{"group":"App","pages":[{"title":"Verify a delegate token (keyless)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/verify","href":"/api-reference/app/verify-a-delegate-token-keyless"},{"title":"Get credential info","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/me","href":"/api-reference/app/get-credential-info"}]},{"group":"Templates","pages":[{"title":"List templates","description":"Returns communication templates for the company. All filter parameters are optional.\n\nAccepts an API key (`x-token`), delegate token (`Authorization: DelegateToken \u003ctoken>`),\nor partner token (`Authorization: Bearer \u003ctoken>` with `templates` permission).\nWhen using a partner token, pass `companyId` as a query parameter.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/templates","href":"/api-reference/templates/list-templates"},{"title":"Create a template","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/templates","href":"/api-reference/templates/create-a-template"},{"title":"Get a template","description":"Returns a single template by its ID. The template must belong to the authenticated company.","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/templates/{id}","href":"/api-reference/templates/get-a-template"},{"title":"Update a template","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/templates/{id}","href":"/api-reference/templates/update-a-template"}]},{"group":"Tasks","pages":[{"title":"Search tasks","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/tasks/search","href":"/api-reference/tasks/search-tasks"},{"title":"Create a task","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/tasks","href":"/api-reference/tasks/create-a-task"},{"title":"Update many tasks","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/tasks/bulk-update","href":"/api-reference/tasks/update-many-tasks"},{"title":"Get a task by ID","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/tasks/{taskId}","href":"/api-reference/tasks/get-a-task-by-id"},{"title":"Update a task","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/tasks/{taskId}","href":"/api-reference/tasks/update-a-task"}]},{"group":"RoutingGroups","pages":[{"title":"List routing groups","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/routing-groups","href":"/api-reference/routinggroups/list-routing-groups"},{"title":"Create a routing group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/routing-groups/create","href":"/api-reference/routinggroups/create-a-routing-group"},{"title":"Update a routing group","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/routing-groups/{id}","href":"/api-reference/routinggroups/update-a-routing-group"},{"title":"Archive a routing group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/routing-groups/{id}/archive","href":"/api-reference/routinggroups/archive-a-routing-group"}]},{"group":"Files","pages":[{"title":"Get a presigned URL for a direct file upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/files/upload-url","href":"/api-reference/files/get-a-presigned-url-for-a-direct-file-upload"},{"title":"Finalize a direct file upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/files/upload-complete","href":"/api-reference/files/finalize-a-direct-file-upload"}]},{"group":"WebForms","pages":[{"title":"Submit a web form","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/web-forms/{formId}","href":"/api-reference/webforms/submit-a-web-form"}]},{"group":"Tours","pages":[{"title":"List tour feedback","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/tours/feedback","href":"/api-reference/tours/list-tour-feedback"},{"title":"Get one showing's tour feedback","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/tours/{showingId}/feedback","href":"/api-reference/tours/get-one-showings-tour-feedback"}]},{"group":"Docs","pages":[{"title":"Fetch this OpenAPI spec","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/docs/openapi","href":"/api-reference/docs/fetch-this-openapi-spec"}]}]}]},{"tab":"Aptly Portal","icon":"door-closed","pages":[{"title":"Aptly Portal","href":"/portal/introduction"}]}]},"basePath":"","title":"Create a template - Aptly API","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DCDCdBVX.js","utils-ME8dDnLe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-0e84ACsd.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-wgRBj-ia.js","snippetPresets-C11Sgb-o.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-C0lapOpP.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ZeRQV8fF.js","shallow-BupWh095.js","getApiPlaygroundDisplay-BnYQO2Ss.js","CodeSnippet-RKKOc8c_.js","CodeSnippets-Drf_m8wS.js","Page-Bevw23-4.js","getPastedJson-u6QiPzNZ.js","icon-Bb-CBSxO.js","MethodPill-F7l5AI7V.js","DuplicateIcon-IiAXkdSg.js","createIcon-FliI8EBc.js","DynamicMarkdown-B62XqCSI.js","SectionHeading-Dj31pT03.js","axios-vUo_bRtp.js","Markdown-BOgQCTwD.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-UDqbR6xh.js"]}