Upload Flow JSON
Uploads the Flow JSON of a Flow still in DRAFT.
Meta answers 200 with its refusals listed inside the body — this endpoint does not. POST /flows/{id}/assets returns HTTP 200 carrying validation_errors when it rejects the document, and a client reading only the status concludes the upload was accepted: the editor shows “saved”, the Flow keeps the PREVIOUS JSON, and the divergence surfaces when a customer opens the old form in production. This handler therefore ignores the Graph’s status and reads the list: a non-empty list is 422 FLOW_JSON_INVALID with validationErrors attached. A 200 from us always carries validationErrors: [], and the field is emitted explicitly on success so the client that branches on the status and the one that branches on the list reach the same conclusion.
flowJson is a string, never a nested object: Meta compiles the exact bytes, and re-serialising would move the positions its errors point at. The list is returned verbatim, untranslated — its shape is Meta’s. Body accepts only flowJson. 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 complete Flow JSON, as a STRING.
"{\"version\":\"7.1\",\"screens\":[]}"
Response
Accepted. validationErrors is always present and always empty here