Create a template
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.kirimdev.com/v1/106540352242922/templates"
payload := strings.NewReader("{ \"name\": \"order_confirmation\", \"category\": \"MARKETING\", \"language\": \"en\", \"components\": [ { \"type\": \"HEADER\", \"format\": \"TEXT\", \"text\": \"example\", \"example\": { \"header_text\": [ \"example\" ], \"header_handle\": [ \"example\" ], \"header_url\": [ \"https://example.com\" ], \"body_text\": [ [ \"example\" ] ] }, \"buttons\": [ { \"type\": \"URL\", \"text\": \"example\", \"url\": \"https://example.com\", \"phone_number\": \"example\", \"otp_type\": \"COPY_CODE\", \"autofill_text\": \"example\", \"supported_apps\": [ { \"package_name\": \"example\", \"signature_hash\": \"example\" } ], \"example\": [ \"example\" ] } ], \"add_security_recommendation\": true, \"code_expiration_minutes\": 1 } ], \"variables\": [ \"example\" ], \"messageSendTtlSeconds\": 1 }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}const url = 'https://api.kirimdev.com/v1/106540352242922/templates';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"order_confirmation","category":"MARKETING","language":"en","components":[{"type":"HEADER","format":"TEXT","text":"example","example":{"header_text":["example"],"header_handle":["example"],"header_url":["https://example.com"],"body_text":[["example"]]},"buttons":[{"type":"URL","text":"example","url":"https://example.com","phone_number":"example","otp_type":"COPY_CODE","autofill_text":"example","supported_apps":[{"package_name":"example","signature_hash":"example"}],"example":["example"]}],"add_security_recommendation":true,"code_expiration_minutes":1}],"variables":["example"],"messageSendTtlSeconds":1}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}use serde_json::json;use reqwest;
#[tokio::main]pub async fn main() { let url = "https://api.kirimdev.com/v1/106540352242922/templates";
let payload = json!({ "name": "order_confirmation", "category": "MARKETING", "language": "en", "components": ( json!({ "type": "HEADER", "format": "TEXT", "text": "example", "example": json!({ "header_text": ("example"), "header_handle": ("example"), "header_url": ("https://example.com"), "body_text": (("example")) }), "buttons": ( json!({ "type": "URL", "text": "example", "url": "https://example.com", "phone_number": "example", "otp_type": "COPY_CODE", "autofill_text": "example", "supported_apps": ( json!({ "package_name": "example", "signature_hash": "example" }) ), "example": ("example") }) ), "add_security_recommendation": true, "code_expiration_minutes": 1 }) ), "variables": ("example"), "messageSendTtlSeconds": 1 });
let mut headers = reqwest::header::HeaderMap::new(); headers.insert("Authorization", "Bearer <token>".parse().unwrap()); headers.insert("Content-Type", "application/json".parse().unwrap());
let client = reqwest::Client::new(); let response = client.post(url) .headers(headers) .json(&payload) .send() .await;
let results = response.unwrap() .json::<serde_json::Value>() .await .unwrap();
dbg!(results);}curl --request POST \ --url https://api.kirimdev.com/v1/106540352242922/templates \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "order_confirmation", "category": "MARKETING", "language": "en", "components": [ { "type": "HEADER", "format": "TEXT", "text": "example", "example": { "header_text": [ "example" ], "header_handle": [ "example" ], "header_url": [ "https://example.com" ], "body_text": [ [ "example" ] ] }, "buttons": [ { "type": "URL", "text": "example", "url": "https://example.com", "phone_number": "example", "otp_type": "COPY_CODE", "autofill_text": "example", "supported_apps": [ { "package_name": "example", "signature_hash": "example" } ], "example": [ "example" ] } ], "add_security_recommendation": true, "code_expiration_minutes": 1 } ], "variables": [ "example" ], "messageSendTtlSeconds": 1 }'Create a new message template and submit it to Meta for review. The request body is components-only (mirrors Meta’s message_templates create shape). For IMAGE/VIDEO/DOCUMENT headers, supply example.header_url with a public https:// URL — Kirimdev uploads the sample to Meta on your behalf — or a Meta asset handle in example.header_handle. On success the template is persisted with status: "pending"; Meta reviews asynchronously, so poll GET /{phone_number_id}/templates/{name} (or re-run POST .../templates/sync) for the eventual approved / rejected transition. A duplicate name+language pair returns 409 template_already_exists.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Meta WhatsApp Business phone_number_id of the connected account that should send / own this resource. Discoverable via GET /v1/accounts (returned as phone_number_id on each row).
Example
106540352242922Meta WhatsApp Business phone_number_id of the connected account that should send / own this resource. Discoverable via GET /v1/accounts (returned as phone_number_id on each row).
Request Body
Section titled “Request Body ”object
Example
order_confirmationExample
UTILITYExample
idobject
object
object
object
Responses
Section titled “ Responses ”Template created (pending Meta review)
object
object
object
Meta business_phone_number_id — use as the {phone_number_id} path segment in /v1/{phone_number_id}/... endpoints.
End-customer (multi-tenant platform mode) that owns this account. NULL for direct-org accounts.
object
Example
{ "data": { "id": "tmpl_01HXYZABCDEFGHJKMNPQRSTVWX", "object": "template", "status": "pending", "whatsapp_account": { "phone_number_id": "106540352242922", "customer": { "id": "cus_01HXYZABCDEFGHJKMNPQRSTVWX" } } }}Validation failure
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Authentication failure
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Resource not found
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Conflict (e.g. template already exists, webhook subscription disabled, setup link inactive)
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Semantic failure (e.g. idempotency key reuse, pre-send compliance guard, media not found)
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Rate limit exceeded
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Internal server error
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Upstream WhatsApp error
object
object
Example
{ "error": { "type": "invalid_request_error", "code": "invalid_phone_number", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}