---
title: "Post Session Message"
method: POST
path: "/sessions/{session_id}/messages"
tags: ["sessions"]
---

# Post Session Message

`POST /sessions/{session_id}/messages`

Start the next turn of an existing session.

409 while a turn is active (the lock-by-insert unique index); 402-class
SessionGateError with a machine-readable reason on gate failure — nothing
is persisted in either case (decision 15: no fake "queued" state).

## Path parameters

- `session_id` string, uuid, required

## Headers

- `X-Posthog-Session-Id` string, nullable
- `X-Client-Mobile` string, nullable

## Request body

- PostSessionMessageRequest
  - `message` string, required
  - `prompt_source` string, nullable
  - `queued` boolean

## Response `201`

Successful Response

- SessionTurnCreatedResponse
  - `session` SessionResponse, required
    - `id` string, required
    - `company_id` string, required
    - `trigger` 'user' | 'schedule', required
    - `title` string, nullable
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
  - `turn` SessionTurnResponse, required
    - `id` string, required
    - `session_id` string, nullable
    - `status` 'pending' | 'running' | 'completed' | 'failed' | 'interrupted', required
    - `trigger` 'manual' | 'ceo_agent' | 'cron' | 'founding', required
    - `interrupt_requested_at` string, date-time, nullable
    - `error_message` string, nullable
    - `created_at` string, date-time, required
    - `started_at` string, date-time, nullable
    - `completed_at` string, date-time, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/nanocorp/apis/nanocorp-api.md) · [All operations](https://skmtc.dev/nanocorp/apis/nanocorp-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/nanocorp/nanocorp-api/revisions/04b208d3215b/schema)
