---
title: "campaigns.setMessageStructure"
method: POST
path: "/v1/campaigns/{campaignId}/set-message-structure"
tags: ["campaigns"]
---

# campaigns.setMessageStructure

`POST /v1/campaigns/{campaignId}/set-message-structure`

## Request

- Base URL: `https://api.selda.ai`
- URL: `https://api.selda.ai/v1/campaigns/{campaignId}/set-message-structure`
- Auth: HTTP bearer

State what a campaign's message is made of: blocks that ship WORD FOR WORD, blocks Selda writes from an instruction you give it, the paragraph count, and what must never appear. Refuses to change a locked structure. Sends nothing.

Dispatched to `campaigns.setMessageStructure` on `POST /mcp/mutate`. This route is a different URL for the same call: the request is answered by the same dispatcher, with the same authentication, the same scope check, the same organisation scoping and the same refusals.

- Scope: `write`
- A free sandbox key may call it
- MCP tools that wrap the same function: `selda_set_message_structure`
- Filled in from your API key, never sent by you: `orgId`

## Path parameters

- `campaignId` string, required

## Request body

- object
  - `objective` string
  - `blocks` object[]
    - `id` string
    - `order` number
    - `role` 'subject' | 'body'
    - `kind` 'locked' | 'generated', required
    - `label` string
    - `content` string
    - `aiInstruction` string
    - `optional` boolean
  - `form` object
    - `paragraphs` number
    - `maxWords` number
    - `links` 'none' | 'allowed'
  - `mustNever` string[]
  - `must` string[]
  - `followUpStrategy` string

## Response `200`

The call succeeded.

- object
  - `value` unknown, required
  - `request_id` string, required: Echoed in the `X-Request-Id` header.

## Other responses

- `400`: Unknown route, or arguments the validator refused.
- `401`: Missing, expired or revoked key.
- `403`: The key lacks the scope, the plan entitlement, or is a sandbox key on a live-only function.
- `429`: Rate limited. Wait for the next minute window and retry.
- `500`: The function threw. The message says what, without leaking internals.

---

[API](https://skmtc.dev/selda/apis/selda-api.md) · [All operations](https://skmtc.dev/selda/apis/selda-api/llms.txt) · [OpenAPI document](https://skmtc.dev/selda/apis/selda-api/revisions/f0b115a94c0f?raw)
