Deprecate Flow
Retires a Flow from circulation on Meta without deleting it, and without deleting the responses people already submitted. Not the same as DELETE /v1/flows/{id}: delete works only on a DRAFT and removes the row; deprecate acts on a Flow that reached Meta and only marks it.
supersededByFlowId closes the pair with clonedFromFlowId: the clone points backwards, the deprecation forwards. Since publishing is irreversible, that pointer is the only thing tying the versions of one form together over time.
supersededBy is echoed in the response always, null included — it is the only way to tell “the successor I sent was recorded” from “the field was dropped between my client and the row”. A truncated body is 400, not an empty one, because an empty body is a legitimate request here. Permission flows:manage.
Requires a number-scoped key. A tenant-scoped key must name the number with the x-whatsapp-number-id header, or it gets 403 TENANT_SCOPE_NOT_ALLOWED.
Authorizations
Your ps_ API key
Path Parameters
The local id of the Flow — the id field GET /v1/flows returns, never metaFlowId.
Body
The LOCAL id of the successor Flow — the same id GET /v1/flows returns, not the metaFlowId. Optional: deprecating with no successor is legitimate. But present-and-unusable is a different request from absent — an empty or whitespace-only string is refused with 400 FLOW_DEPRECATE_INVALID_SUCCESSOR rather than dropped, because a version chain that ends silently is invisible afterwards. The successor is verified to belong to your tenant; one that does not is 404.
1"cmf2b3c4d5e6f7g8h9i0j1k2"
Response
Flow deprecated