> This page is for Referencia de la API.

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

# Messages Create

POST https://signalcore.ai/v1/conversations/{conversation_id}/messages
Content-Type: application/json

Words in the conversation over HTTP (`doors.api`), as the socket's `say`: 202 at once,
`running`; with `wait`, 200 when the turn ends, with the agent's `replies` and how it ended
(`done`, `waiting` on what, or `failed` with the error's `code`), or 202 `running` past the
wait. Refused as the socket refuses: 422 `busy`, `pending`, `files`.

Reference: https://signalcore.ai/docs/referencia/conversaciones/messages-create

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `conversation_id` (string, required)

### Body (application/json)

This endpoint expects an object.

- `text` (string, optional, default: )
- `files` (list of string, optional, default: [])
- `wait` (boolean, optional, default: false)

## Response

### 202

Successful Response

- `conversation_id` (string, required)
- `message` (MessageOut, required)
- `status` (enum, required)
  - Allowed values: `running`, `done`, `waiting`, `failed`
- `replies` (list of MessageOut, required)
- `waiting` (list of WaitOut, required)
- `error` (TurnErrorOut, required, nullable)

## Errors

### 422 Conversations Messages Create Request Unprocessable Entity Error

Validation Error

- `detail` (list of ValidationError, optional)

## Types

### MessageOut

- `id` (string, required)
- `role` (enum, required)
  - Allowed values: `user`, `assistant`
- `text` (string, required)
- `action` (map from string to any, required, nullable)
- `steps` (list of StepOut, required)
- `created_at` (datetime, required)
- `files` (list of FileRef, optional, default: [])
- `author` (enum, optional, nullable)
  - Allowed values: `contact`, `agent`, `operator`
- `delivery` (enum, optional, nullable)
  - Allowed values: `queued`, `sent`, `delivered`, `read`, `failed`
- `delivery_error` (string, optional, nullable)
- `pieces` (list of string, optional, nullable)
- `sent_parts` (integer, optional, nullable)
- `voice` (FileRef, optional, nullable) — A file of the conversation as a message shows it; its bytes are at `GET /conversations/{id}/files/{file_id}`.
- `heard` (string, optional, nullable)
- `decision` (AppSchemasDecisionOut, optional, nullable) — What was decided of a contact's message (`handlers`): by the channel's filter, the agent answers it or not this time (`skip`); by the agent's own handlers (`@sc.on`), it answers, or the conversation goes to a person (`hold`) or to nobody (`ignore`); `deciding` while they go.

### WaitOut

A call the conversation waits on: a question the person answers on what it drew (`ask`), a yes (`approve`, given by the person on the screen or by the business: `decides`), or what a host's client tool returns in the page (`tool`).

- `id` (string, required)
- `action` (string, required)
- `kind` (enum, required)
  - Allowed values: `ask`, `approve`, `tool`
- `decides` (enum, required, nullable)
  - Allowed values: `person`, `business`

### TurnErrorOut

- `code` (string, required)
- `detail` (string, required)

### ValidationError

- `loc` (list of ValidationErrorLocItem, required)
- `msg` (string, required)
- `type` (string, required)
- `input` (any, optional)
- `ctx` (map from string to any, optional)

### StepOut

An action a reply called: what, how it went, and what it drew.

- `id` (string, required)
- `action` (string, required)
- `state` (enum, required)
  - Allowed values: `running`, `waiting`, `done`, `failed`
- `output` (string, required, nullable)
- `surface` (map from string to any, required, nullable)
- `awaits` (boolean, required)
- `request` (map from string to any, required, nullable)
- `app` (StepApp, optional, nullable) — The connected app an action belongs to, as its step shows it: its name and its logo (an https address; none when the provider has none).

### FileRef

A file of the conversation as a message shows it; its bytes are at `GET /conversations/{id}/files/{file_id}`.

- `id` (string, required)
- `name` (string, required)
- `media_type` (string, required)
- `size` (integer, required)

### AppSchemasDecisionOut

What was decided of a contact's message (`handlers`): by the channel's filter, the agent answers it or not this time (`skip`); by the agent's own handlers (`@sc.on`), it answers, or the conversation goes to a person (`hold`) or to nobody (`ignore`); `deciding` while they go.

- `kind` (enum, required)
  - Allowed values: `deciding`, `answer`, `skip`, `hold`, `ignore`
- `reason` (string, required, nullable)
- `automation` (string, required, nullable)
- `title` (string, required, nullable)
- `run_id` (string, required, nullable)

### ValidationErrorLocItem

### StepApp

The connected app an action belongs to, as its step shows it: its name and its logo (an https address; none when the provider has none).

- `name` (string, required)
- `icon` (string, optional, nullable)

## Examples

**Request**

```json
{
  "text": "¿Abrís los sábados?",
  "wait": true
}
```

**Response**

```json
{
  "conversation_id": "cnv_01M4XZ3B7C9D1E4F6G8H0J2K4M",
  "message": {
    "id": "msg_01M4XZ4C8D0E2F5G7H9J1K3M5N",
    "role": "user",
    "text": "¿Abrís los sábados?",
    "action": null,
    "steps": [],
    "created_at": "2026-10-17T09:31:05Z",
    "files": []
  },
  "status": "done",
  "replies": [
    {
      "id": "msg_01M4XZ4F2G4H6J8K0M2N4P6Q8R",
      "role": "assistant",
      "text": "Sí, los sábados abrimos de 10:00 a 14:00. ¿Quieres que te reserve una cita?",
      "action": null,
      "steps": [],
      "created_at": "2026-10-17T09:31:08Z",
      "files": []
    }
  ],
  "waiting": [],
  "error": null
}
```

**SDK Code**

```python Preguntar y esperar la respuesta
import requests

url = "https://signalcore.ai/v1/conversations/cnv_01M4XZ3B7C9D1E4F6G8H0J2K4M/messages"

payload = {
    "text": "¿Abrís los sábados?",
    "wait": True
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```