/v1/templates/archivebetaArchive templates
- Needs
- Send WhatsApp messages; manage templates, quick messages and WhatsApp short links
(messaging:write) - Plan
- Any plan with API access
- Limits
- 60 a minute per key
- Dry run
- Yes — every check runs with ?dry_run=true, nothing changes
- Confirm
- Header
Api-Confirm: archive - Undo
- Restore them in the app within 28 days.
Archives up to 20 templates. They can no longer be sent: chatbots, automations and broadcasts that use them start failing. An archived template can be restored in the app for 28 days.
The answer lists what was archived and what failed, each failure with a stable code and a sentence. Needs Api-Confirm: archive.
Try it
Protects against doing it twice if you retry: a retry with the same key gets the first answer back instead of running again.
Code and response
curl -X POST 'https://mcp.wa-api.cloud/v1/templates/archive?dry_run=true' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"ids": [
"9120",
"9121"
]
}'The code reads your key from $API_KEY.
Body
| Field | Type | What it is |
|---|---|---|
| idsrequired | array of string | integer | Template ids (1–20).1–20 itemsSigned in? Pick one from your data with “My data”. |
Headers
| Field | Type | What it is |
|---|---|---|
| Authorizationrequired | header | Bearer $API_KEY — your API key. |
| Api-Version | header | The API version to use, e.g. 2026-10-01. Default: the version your key is pinned to.one of: 2026-10-01 · pattern ^\d{4}-\d{2}-\d{2}$ |
| Idempotency-Key | header | Any unique string (8–128 characters). A retry with the same key returns the first answer instead of running twice. Kept 24 hours.pattern ^[A-Za-z0-9._:-]+$ · 8–128 characters |
| Api-Confirmrequired | header | Type the operation's verb (e.g. delete, submit) to confirm a change that cannot be undone or that WhatsApp or your customers see. Not needed with dry_run=true. |
Response 200
Archived ids, and the ones that failed: a stable `code` (`not_found`, `account_not_connected`, `not_submitted`, `refused_by_whatsapp`) and a sentence for it.
| Field | Type | What it is |
|---|---|---|
| archivedrequired | array of string | |
| failedrequired | array of object | |
| idrequired | string | |
| namerequired | string or null | |
| coderequired | string | one of: not_found, account_not_connected, not_submitted, refused_by_whatsapp |
| reasonrequired | string | A fixed sentence for the code. |
| dry_run | boolean | true when this was a dry run: every check ran and nothing changed. |
Errors
Errors are application/problem+json. Branch on code.
| Status | Code | When |
|---|---|---|
| 400 | invalid_input | A field is missing or has the wrong format. |
| 401 | unauthenticated | The Authorization header is missing, the key is unknown, expired or revoked. |
| 403 | entitlement_required | The workspace's plan does not include API access ( |
| 403 | insufficient_scope | The key does not have the permission this operation needs. |
| 409 | conflict | Also returned while a request with the same Idempotency-Key is still running. |
| 428 | confirm_required | Send the header |
| 429 | rate_limited | The key or workspace went over its rate limit. Wait for |
| 503 | upstream_unavailable | A service behind the API is briefly unavailable. Safe to retry with backoff. |
| 504 | timeout | The change did not finish in time. Retry with the same Idempotency-Key: it never runs twice. |
Examples
Archive two old templates
Request body
{
"ids": [
"9120",
"9121"
]
}Response 200
{
"archived": [
"9120"
],
"failed": [
{
"id": "9121",
"name": "summer_sale",
"code": "refused_by_whatsapp",
"reason": "WhatsApp refused to archive this template. Try again later, or archive it in the app."
}
]
}Operation path
The same operation is also at POST /v1/ops/messaging_archive_templates, with every field in the JSON body.