Edit a template
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.kirimdev.com/v1/106540352242922/templates/example"
payload := strings.NewReader("{ \"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 } ] }")
req, _ := http.NewRequest("PATCH", 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/example';const options = { method: 'PATCH', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"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}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}use std::str::FromStr;use serde_json::json;use reqwest;
#[tokio::main]pub async fn main() { let url = "https://api.kirimdev.com/v1/106540352242922/templates/example";
let payload = json!({"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 }) )});
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.request(reqwest::Method::from_str("PATCH").unwrap(), url) .headers(headers) .json(&payload) .send() .await;
let results = response.unwrap() .json::<serde_json::Value>() .await .unwrap();
dbg!(results);}curl --request PATCH \ --url https://api.kirimdev.com/v1/106540352242922/templates/example \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "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 } ] }'Edit an existing template’s content and re-submit it to Meta for review. The request body is components-only — send the FULL desired components array (Meta replaces all components at once; this is a replacement, not a partial patch). name, language, and category cannot change. Use ?language= to disambiguate when a name has multiple languages. Only templates already reviewed by Meta (approved / rejected) can be edited — a pending template returns 409 template_not_editable. On success the template re-enters Meta review, so the returned status is pending; poll GET /{phone_number_id}/templates/{name} for the eventual transition. Meta enforces its own edit rate limits (APPROVED: 10 edits / 30 days or 1 / 24h; rejected/paused unlimited) and surfaces them as 429 / 400.
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).
Query Parameters
Section titled “Query Parameters ”Request Body
Section titled “Request Body ”object
object
object
object
object
Responses
Section titled “ Responses ”Template edited (re-entered Meta review, status: pending)
object
object
Meta template category. null for templates synced before this field was recorded — a subsequent sync backfills it from Meta.
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", "category": "MARKETING", "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" }}