Register Flow endpoint at Meta
Registers OUR proxy as this Flow’s endpoint_uri at Meta — the deliberate act the PUT on this same resource refuses to perform. Without it data_exchange is unreachable: Meta refuses to publish a Flow whose routing model needs an endpoint, with “Publishing without specifying ‘endpoint_uri’ is forbidden”.
⛔ It is a different verb and not a side effect of the PUT because the two acts have different subjects. Saving a destination is the tenant describing THEIR webhook; this is us telling META to route the Flow through us. Fusing them would mean a tenant who runs their own Flow endpoint loses every exchange the next time they fix a typo in a URL.
⚠️ The body is OPTIONAL — unlike PUT, this verb has no required field, so no body, an empty string and {} are all accepted. A truncated body is still refused (400 FLOW_BODY_INVALID), and confirmOverwrite is the only field accepted.
⛔ confirmOverwrite is not a formality. The current endpoint_uri is read LIVE from the Graph — not from metaEndpointUri, which an hourly sync writes and which is therefore silent about a URI registered in the last hour. If the Flow already points somewhere else, registering takes every exchange away from whoever answers today, so the default is 409 FLOW_ENDPOINT_URI_WOULD_OVERWRITE — whose body carries a FOURTH top-level field, currentEndpointUri, naming the endpoint that would be displaced. Ours is never echoed: it embeds the number’s endpoint path token. A non-boolean is refused and never coerced (400 FLOW_ENDPOINT_CONFIRM_INVALID), because "false" read as truthy would take over a live endpoint on a request whose author believed they had declined.
Idempotent: a Flow already pointing at us answers 200 without a Graph write, and metaEndpointUri is refreshed either way. A number with no endpoint keypair is refused with 422 FLOW_ENDPOINT_NUMBER_HAS_NO_KEY — registering anyway tells Meta to encrypt for a keypair that does not exist, and every exchange of the published Flow would 421. 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
Consent to displace an endpoint_uri that is not ours. Must be a real boolean — the string "false" is refused, never coerced. Unnecessary when Meta holds no endpoint_uri, or already holds ours.
true
Response
Meta now points this Flow at our proxy. metaEndpointUri is refreshed from what was just written, not from the hourly mirror. No secret: registering mints nothing