---
title: "Send Netter Agent Message"
method: POST
path: "/api/v1/netter-agent/chats/{chat_id}/messages"
tags: ["netter-agent"]
---

# Send Netter Agent Message

`POST /api/v1/netter-agent/chats/{chat_id}/messages`

## Request

- Base URL: `https://api.netter.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.netter.ai/api/v1/netter-agent/chats/{chat_id}/messages`
- Auth: none declared

Rate-limited at the in-app data chat's budget (20/minute): every request buys an agent turn.

## Path parameters

- `chat_id` string, uuid, required

## Request body

- SendMessageRequest
  - `content` string, required
  - `client_message_id` string, uuid, nullable
  - `page_context` PageContext, required
    - `page_id` string, required
    - `revision` integer, required
    - `path` string, required
    - `title` string, required
    - `resource` PageResource
      - `kind` string, required
      - `id` string, required
      - `version_id` string, nullable
      - `branch_id` string, nullable
    - `selection` PageSelection
      - `text` string, nullable
      - `widget_id` string, nullable
      - `row_id` string, nullable
    - `controls` PageControl[]
      - `id` string, required
      - `label` string, required
      - `kind` 'search' | 'filter' | 'sort' | 'tab' | 'date_range' | 'detail' | 'ai_filter', required
      - `value` unknown
      - `options` JsonValue[], nullable
        - unknown
      - `filter_target` FilterTarget
        - `key_column` string, required
        - `scope_sql` string, required
    - `app_view` object, nullable
    - `app_browser` object, nullable
    - `timezone` string, nullable
  - `attachments` object[]
  - `question_answer_to` string, uuid, nullable
  - `app_scope` AppScopeRequest: An explicit request to answer this ONE turn about an app's data. Set only by the app's data-chat trigger and the selection pill, never derived from the page context. The server re-authorizes it on every turn (APP VIEWER + the app's data-chat switch + the version rule, see `domains/apps/application/data_chat_scope.py`). `focus` and `page_queries` are client-supplied grounding, never executed.
    - `app_id` string, uuid, required
    - `version_id` string, uuid, nullable
    - `focus` AppFocus: What the user highlighted, resolved against the bundle's widget registry. CLIENT-SUPPLIED, GROUNDING ONLY — the same contract as `AppPageQuery` above. `sql` is rendered into the agent's turn as text describing what the widget ran; it is never parsed, never validated as SQL and never handed to an executor. Every statement that actually runs is authored by the agent and passes the guard. Caps mirror the client's own (`buildSelectionFocus` / `toFocus` in DMI_front). They are restated here because the client is not the security boundary — a request need not come from our page.
      - `text` string, required
      - `widget_title` string, nullable
      - `widget_kind` string, nullable
      - `sql` string, nullable
      - `columns` string[]
      - `rows` object[]
      - `cell` AppFocusCell: Where the highlighted value sits in the widget's own result set. Present only when the bundle's runtime VALUE-MATCHED the displayed value to a cell. Its absence is meaningful and is rendered as such: a number the matcher could not find in any recorded query is almost always computed in the app's JavaScript, and that is the signal telling the agent to read the app's code instead of re-querying.
        - `column` string, required
        - `row_index` integer, required
        - `ambiguous` boolean
      - `raw_value` union
        - string
        - integer
        - number
        - boolean
    - `page_queries` AppPageQuery[]
      - `sql` string, required
      - `title` string, nullable

## Response `202`

Successful Response

- TurnResponse
  - `status` 'generating'
  - `app_scope` AppScopeRead: What an admitted app-scoped turn may read: the app and its bound entity names, for the dock's scope chip (members cannot list these entities through `/ontology/entities`).
    - `app_id` string, uuid, required
    - `version_id` string, uuid, nullable
    - `app_name` string, required
    - `entity_names` string[], required

## Other responses

- `422`: Validation Error

## Changes

> 61 revisions in range; 1 not diffed.

- **2026-11-02** `29c68bd8ba7b`: 1 info
  - added the new optional request property `page_context/app_browser`
- **2026-10-30** `d2da3984ee41`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/netter/apis/dmi-backend/changes/api/v1/netter-agent/chats/:chat_id/messages/post.md)

---

[API](https://skmtc.dev/netter/apis/dmi-backend.md) - [All operations](https://skmtc.dev/netter/apis/dmi-backend/llms.txt) - [OpenAPI document](https://skmtc.dev/netter/apis/dmi-backend/revisions/68e89013efe0?raw)
