Assemble a broadcast — ALWAYS lands in pending_approval (never sends)
Guardrail: an assembled broadcast is held in pending_approval and can only go out via the dashboard approve flow. A MARKETING template requires an opted-in audience.
Beyond name, a valid call needs two things the schema below cannot mark required (they are checked by the assembler, which reports failures as 400):
- A template —
template_name(withtemplate_language) ortemplate_id. It must already be APPROVED by Meta. - An audience — either a saved
segment_id, or an inline filter built fromopted_in/tags/clicked. An audience that resolves to zero contacts is rejected.
Also supply variable_mapping whenever the template has variables; a mapping that does not match the template is rejected. schedule is genuinely optional — omit it to assemble for immediate approval.
Required scope: broadcasts:manage
Authorizations
Project API key issued in Settings → API keys. Send it as Authorization: Bearer pk_live_….
Headers
Target project id, for an MCP OAuth bearer (mcp_at_…) attached to more than one project — get ids from GET /v1/projects. Matched case-insensitively.
Omit it and a READ falls back to the connection's default project; a mutation (any non-GET) on a connection with 2+ projects is rejected with 400 project_required — a write is never defaulted to a guessed project. A connection with exactly one project never needs the header.
Scopes are checked against the SELECTED project only, never a union across the connection.
For a pk_ API key the header selects nothing — one key is one project's context — but it IS validated: omit it and the key's own project is used, send it and it must name that project, otherwise the call is rejected with 403 project_not_attached (a blank value is 400 invalid_project_header, as above).
