A template file is a JSON export of the templates on one account. Import it on another account and every template in it is submitted to Meta for approval there, exactly as if it had been written by hand — nothing is copied approved, because Meta approves per WhatsApp Business account. The file costs nothing to make or to import.
You do not have to write one: Templates → Export downloads it, Templates → Import reads it back. The format is documented here for anyone who wants to generate it from their own system.
The file
{
"format": "wabapi.templates.v1",
"exported_at": "2026-09-10T09:30:00.000Z",
"source": "Pathoflex Diagnostics",
"templates": [
{
"name": "lab_report_ready",
"category": "UTILITY",
"language": "en",
"body": "Hello {{1}}, your report for {{2}} (order {{3}}) is ready. Sample collected on {{4}}. The PDF is attached to this message; reply here or call the lab if anything is unclear.",
"footerText": "Pathoflex Diagnostics · Reports are confidential",
"templateType": "DOCUMENT",
"headerDocumentUrl": "https://wabapi.com/samples/lab-report-sample.pdf",
"headerDocumentFilename": "Lab-Report.pdf",
"buttons": [
{
"type": "URL",
"text": "View report online",
"url": "https://pathoflex.com/reports"
},
{
"type": "PHONE_NUMBER",
"text": "Call the lab",
"phone_number": "+919512174001"
},
{
"type": "QUICK_REPLY",
"text": "Need help"
}
]
},
{
"name": "full_body_checkup_offer",
"category": "MARKETING",
"language": "en",
"body": "Hi {{1}}, this {{2}} get a Full Body Health Checkup at Pathoflex for ₹{{3}} instead of ₹{{4}}. Free home sample collection, reports in 24 hours. Offer valid till {{5}}.",
"footerText": "Reply STOP to opt out of offers",
"templateType": "IMAGE",
"headerImageUrl": "https://wabapi.com/samples/checkup-offer.jpg",
"buttons": [
{
"type": "URL",
"text": "Book a slot",
"url": "https://pathoflex.com/book"
},
{
"type": "PHONE_NUMBER",
"text": "Call us",
"phone_number": "+919512174001"
},
{
"type": "QUICK_REPLY",
"text": "Stop promotions"
}
]
},
{
"name": "verification_code",
"category": "UTILITY",
"language": "en",
"body": "{{1}} is your Pathoflex verification code. It is valid for {{2}} minutes. Do not share it with anyone, including lab staff.",
"footerText": "Pathoflex Diagnostics · Not you? Ignore this message.",
"templateType": "TEXT",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "I did not request this"
}
]
}
]
}https://sendpanel.in/docs/template-files/sample.jsonThe envelope
| Field | Type | Required | Description |
|---|---|---|---|
| format | string | yes | Always "wabapi.templates.v1". A file with any other value is refused unread. |
| exported_at | string | no | When the file was written, ISO 8601 in UTC. Informational. |
| source | string | no | The business the file came from. Informational. |
| templates | array | yes | One entry per template, 1 to 200 of them. |
Each template
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | yes | Lower case letters, digits and underscores, as Meta requires. A name already present on the destination account is skipped. |
| category | string | yes | MARKETING, UTILITY or AUTHENTICATION. |
| language | string | yes | The language code, for example en or hi. |
| body | string | yes | The message text, with variables as {{1}}, {{2}} and so on, numbered from 1 with no gaps. |
| headerText | string | no | A text header, up to 60 characters. Absent for a media header. |
| footerText | string | no | A footer line, up to 60 characters. |
| templateType | string | no | TEXT, IMAGE, VIDEO, DOCUMENT or CAROUSEL. Defaults to TEXT. |
| headerImageUrl | string | no | Public URL of the header image, for an IMAGE template. Fetched during the import, so it must still be reachable. |
| headerVideoUrl | string | no | Public URL of the header video, for a VIDEO template. |
| headerDocumentUrl | string | no | Public URL of the header document, for a DOCUMENT template. |
| headerDocumentFilename | string | no | The file name the recipient sees on that document. |
| cards | array | no | Carousel cards, for a CAROUSEL template: each has imageUrl, body and its own buttons. |
| buttons | array | no | The template's buttons, in Meta's shape — URL and quick-reply buttons travel as they were approved. |
Fields with no value are written as absent rather than null; both are accepted when reading. Unknown fields are ignored, so an export from a newer version still imports.
Rules
- At most 200 templates in one file, and at least one.
- A template whose name and language already exist on the destination account is skipped, never overwritten.
- Header images, videos and documents are fetched from the URLs in the file during the import, so those URLs must stay reachable and public.
- Every template is validated on import exactly as the composer validates it, and each one is reported back as created, skipped or failed with a reason.
- Sample values for the variables are not carried in the file — Meta sees placeholder examples for a template imported this way, so fill them in on the destination account if a reviewer needs the context.
Moving templates between accounts
On the account that has them: Templates → Export (with rows selected, or none for all). On the account that needs them: Templates → Import, choose the file, check the preview, confirm. The new templates start as pending review on that account.
The file holds no keys, tokens or customer data — only the templates themselves. It is safe to email to a colleague.