---
title: "Record free text and let brain extract the facts"
method: POST
path: "/v1/ingest/mention"
tags: ["Ingest"]
---

# Record free text and let brain extract the facts

`POST /v1/ingest/mention`

## Request

- Base URL: `https://brain.inite.ai`
- URL: `https://brain.inite.ai/v1/ingest/mention`
- Auth: HTTP bearer

The simplest write, and the one to reach for when the caller has prose rather than a structured claim: a chat turn, a meeting note, an email body. The text is captured as an episode, an LLM extracts entities, facts and edges from it, and each extracted fact goes through the same bitemporal resolver as `POST /v1/ingest/fact` — so extraction is noisy by design and conflict resolution cleans up at read time. Only `text` is required: `contextRef` defaults to the `chat` vertical and `emittedAt` to the moment the request arrives. `userId` stamps the per-user memory scope on the episode and every extracted fact and edge. `skipped: true` means nothing new was recorded — `reason` says why: `empty` text, `no_entities` (the extractor found nothing worth recording), or `duplicate` (this user already sent this exact text; the document store keys on the content hash and a replay commits nothing new) — a normal outcome, not an error. Prefer `POST /v1/ingest/document` for anything long enough to need chunking. Source: src/ingest/ingest.controller.ts.

Required scope: `brain:write`.

## Request body

- IngestMentionRequest
  - `contextRef` MentionContextRef
    - `conversationId` string
    - `eventId` string
    - `messageId` string
    - `recorder` string
    - `vertical` string, required
  - `emittedAt` string
  - `knownEntities` KnownEntity[]
    - `id` string, required
    - `name` string
    - `role` string
    - `vertical` string, required
  - `text` string, required
  - `timezone` string
  - `userId` string

## Response `201`

What the extractor wrote.

- IngestMentionResponse
  - `episodeId` string
  - `extractedEdgeIds` string[]
  - `extractedEntityIds` string[], required
  - `extractedFactIds` string[], required
  - `reason` string
  - `skipped` boolean, required

## Other responses

- `400`: Validation failed.
- `401`: Missing or unknown bearer key.
- `403`: The key lacks the required scope.

---

[API](https://skmtc.dev/inite/apis/inite-brain-platform-api.md) · [All operations](https://skmtc.dev/inite/apis/inite-brain-platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/inite/apis/inite-brain-platform-api/revisions/c7c3eb5e304b?raw)
