Get Flow endpoint key state
The data_exchange endpoint keypair of ONE number: whether one exists (configured), its public half (publicKey), when Meta accepted it (uploadedAt), the base URL to register on a Flow (endpointUrl), and — the part that has no other symptom — what META says it holds (metaStatus).
⛔ metaStatus has FOUR values and UNKNOWN is not NOT_SET. VALID is Meta holding the key we hold; MISMATCH is Meta holding a DIFFERENT one, which silently breaks every data_exchange Flow on the number and raises no error on our side; NOT_SET is Meta answering that it holds no key; UNKNOWN is us failing to ask. Collapsing the last two makes an operator rotate over a transient Graph 500 — and rotating replaces the key Meta holds.
uploadedAt: null means a pair was generated here but Meta never accepted it. That is not the same as no key at all, and it is the state a repeat POST RESUMES rather than replaces.
The PRIVATE half is never in this payload. endpointUrl is a credential — it embeds the number’s endpoint path token — which is why the permission is flows:manage and deliberately not flows:read. Append the Flow id as a final segment to get the endpoint_uri of one Flow.
⚠️ The {id} in the path is CHECKED against the credential’s own number, never used to look one up. A path id that does not match answers 404 FLOW_NUMBER_NOT_FOUND — never 403, and the same body whether the id belongs to another tenant or to another of your own numbers, so a wrong guess learns nothing.
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 id of the number the key is bound to — the id (or instance id) GET /v1/numbers returns. It is CHECKED against the credential's own number, never used to look one up.
Response
The number's data_exchange endpoint keypair as it stands here and at Meta. The private half is never in the payload