---
title: "Send a governed turn to the presentation's agent (Aletheia)."
method: POST
path: "/presentations/{slug}/chat"
tags: ["Presentations"]
---

# Send a governed turn to the presentation's agent (Aletheia).

`POST /presentations/{slug}/chat`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/presentations/{slug}/chat`
- Auth: HTTP bearer

One governed Aletheia turn (MNE-1428): routed through the Mnemom gateway (Safe House / AIP / CLPI / back-door screen in-path), executing read-only Mnemom MCP tools + a curated readiness brief scoped to the viewer's grant tier. Returns her answer, the per-round verdict cascade ({cfd,aip,policy,cbd}), citations, and a compact attestation. Authed user; requires an ACTIVE grant for the presentation. A Safe House hard-block is a governance success, not an error: it returns 200 with `blocked:true` and no answer. Chat is intentionally NOT idempotent (each turn is new), so no Idempotency-Key is required.

## Path parameters

- `slug` string, required

## Request body

- object
  - `message` string, required: The viewer's turn.
  - `deck` string: The deck's own text, handed over by the page that is already rendering it, so Aletheia reads it as her primary source. Capped server-side.
  - `history` object[]: Optional prior turns for multi-turn context. Only {role:'user'|'assistant', content:string} entries are honored; the newest 20 are kept.
    - `role` 'user' | 'assistant'
    - `content` string

## Response `200`

The turn's result. `ok:false` with `blocked:true` means Safe House withheld the response (governance success).

- object
  - `ok` boolean, required
  - `blocked` boolean, required
  - `answer` string, nullable, required
  - `tier` 'L1' | 'L2' | 'L3', required
  - `citations` object[], required
    - `tool` string
    - `detail` string
  - `verdicts` object[], required
    - `round` integer
    - `cfd` string, nullable
    - `aip` string, nullable
    - `policy` string, nullable
    - `cbd` string, nullable
    - `advisory` string, nullable
  - `attestation` object, required
    - `agent_id` string, nullable
    - `session` string, nullable
    - `model` string
    - `aip_checkpoint_id` string, nullable
    - `screened_intervention` boolean

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Forbidden
- `404`: Resource not found
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.
- `502`: The governed chat runtime is currently unavailable.
- `503`: Presentation chat is not configured on this deployment.

---

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