Edit a template
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.kirimdev.com/v1/106540352242922/templates/order_confirmation?language=id"
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\" ] } ], \"cards\": [ { \"components\": [ { \"type\": \"HEADER\", \"format\": \"IMAGE\", \"text\": \"example\", \"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/order_confirmation?language=id';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"]}],"cards":[{"components":[{"type":"HEADER","format":"IMAGE","text":"example","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/order_confirmation";
let querystring = [ ("language", "id"), ];
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") }) ), "cards": (json!({"components": ( json!({ "type": "HEADER", "format": "IMAGE", "text": "example", "example": json!({ "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) .query(&querystring) .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/order_confirmation?language=id' \ --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" ] } ], "cards": [ { "components": [ { "type": "HEADER", "format": "IMAGE", "text": "example", "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).
Meta template name, unique within an account and language variant.
Example
order_confirmationMeta template name, unique within an account and language variant.
Query Parameters
Section titled “Query Parameters ”Select a specific language variant when several templates share the same name.
Example
idSelect a specific language variant when several templates share the same name.
Request Body
Section titled “Request Body ”object
object
object
object
object
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
Unique request identifier to include when contacting support.
Example
{ "data": { "id": "tmpl_01HXYZABCDEFGHJKMNPQRSTVWX", "object": "template", "status": "pending", "category": "MARKETING", "whatsapp_account": { "phone_number_id": "106540352242922", "customer": { "id": "cus_01HXYZABCDEFGHJKMNPQRSTVWX" } } }, "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX"}Validation failure
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
A field value is invalid.
{ "error": { "type": "invalid_request_error", "code": "invalid_field_value", "message": "A field value is invalid.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Authentication failure
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
The provided API key is invalid.
{ "error": { "type": "authentication_error", "code": "invalid_api_key", "message": "The provided API key is invalid.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Resource not found
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Resource not found.
{ "error": { "type": "not_found", "code": "resource_not_found", "message": "Resource not found.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Conflict (e.g. template already exists, webhook subscription disabled, setup link inactive)
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Only templates already reviewed by Meta (approved or rejected) can be edited. A template still under review cannot be changed.
{ "error": { "type": "conflict", "code": "template_not_editable", "message": "Only templates already reviewed by Meta (approved or rejected) can be edited. A template still under review cannot be changed.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Semantic failure (e.g. idempotency key reuse, pre-send compliance guard, media not found)
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
The WhatsApp number is not verified for this organization.
{ "error": { "type": "invalid_request_error", "code": "whatsapp_number_not_verified", "message": "The WhatsApp number is not verified for this organization.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Rate limit exceeded
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Rate limit exceeded.
{ "error": { "type": "rate_limit_error", "code": "rate_limit_exceeded", "message": "Rate limit exceeded.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Internal server error
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
An unexpected error occurred.
{ "error": { "type": "api_error", "code": "internal_error", "message": "An unexpected error occurred.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Upstream WhatsApp error
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Upstream WhatsApp API failed; please retry.
{ "error": { "type": "api_error", "code": "whatsapp_upstream_error", "message": "Upstream WhatsApp API failed; please retry.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}