> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.getdial.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.getdial.ai/_mcp/server.

# response_required

> Dial wants the agent to speak — reply with response frames carrying this response_id.

**Direction:** Dial → your server. Dial has decided it's the agent's turn. Reply with one or more
[`response`](/api-reference/self-hosted-protocol/response) frames that carry the same `response_id`.

## Schema

| Field         | Type    | Description                                                                                 |
| ------------- | ------- | ------------------------------------------------------------------------------------------- |
| `type`        | string  | Always `"response_required"`.                                                               |
| `response_id` | integer | Identifies this turn. Echo it back on every `response` frame so Dial can group your reply.  |
| `transcript`  | array   | The full conversation so far — `[{ role, content }]`. Enough to rebuild context on its own. |

## Example

```json
{
  "type": "response_required",
  "response_id": 7,
  "transcript": [
    { "role": "agent", "content": "Hi, thanks for calling — how can I help?" },
    { "role": "user", "content": "I'd like to check my order status." }
  ]
}
```

## Superseding

If a newer `response_required` arrives before you finish answering the previous one, it
**supersedes** it: stop generating for the old `response_id` and answer the new one. This is how
natural turn‑taking works when the user keeps talking over the agent.