---
title: "Ingest a conversation transcript with full extraction."
method: POST
path: "/v1/memories/ingest"
tags: ["Memories"]
---

# Ingest a conversation transcript with full extraction.

`POST /v1/memories/ingest`

Full-extraction ingest. The `metadata` field on the body schema is **rejected with 400** on this route — caller metadata is only supported on `POST /v1/memories/ingest/quick` with `skip_extraction=true` and no workspace context.

## Request body

- object — Ingest a conversation transcript. User-scoped unless workspace_id + agent_id are both provided.
  - `agent_id` string — Optional agent identifier. Silently dropped if empty / non-string.
  - `config_override` object — Optional per-request overlay on RuntimeConfig. Keys correspond to RuntimeConfig field names; values must be primitives (boolean / number / string / null). Unknown keys are accepted but surfaced via the X-Atomicmem-Unknown-Override-Keys response header and a server-side warning log — they do not cause a 400. Scope: just this request — no server mutation.
  - `content_class` 'summary' | 'redacted' | 'raw' — Optional sensitivity class of the supplied content: 'summary' (distilled, hosted-safe), 'redacted' (sensitive spans removed by the caller), or 'raw' (verbatim prompt/response/diff/source). When the deployment runs RAW_CONTENT_POLICY=reject, a verbatim write of 'raw' content — or content with no content_class at all (treated as unknown/raw) — is rejected with 422 raw_content_rejected; on extraction paths the raw transcript is instead withheld from the stored audit episode.
  - `conversation` string, required — Required. conversation.
  - `metadata` object — Caller-supplied metadata, persisted alongside the memory. Honored ONLY on /v1/memories/ingest/quick with skip_extraction=true and no workspace context — rejected with 400 on every other branch. Reserved keys (RESERVED_METADATA_KEYS in repository-types) are rejected. Max 32 KB UTF-8 serialized.
  - `session_id` string — Optional thread/session identifier used to scope ingest, search, and list symmetrically.
  - `skip_extraction` boolean
  - `source_site` string, required — Required. source_site.
  - `source_url` string
  - `user_id` string, required — Required. user_id.
  - `visibility` 'agent_only' | 'restricted' | 'workspace' — Visibility (one of agent_only / restricted / workspace). Invalid values silently drop to undefined.
  - `workspace_id` string — Optional workspace identifier. Silently dropped if empty / non-string.

## Response `200`

Ingest result with extracted facts.

- object — Ingest result: extraction counts + stored/updated memory IDs.
  - `composites_created` number, required
  - `episode_id` string, required
  - `facts_extracted` number, required
  - `ingest_trace_id` string
  - `links_created` number, required
  - `memories_deleted` number, required
  - `memories_skipped` number, required
  - `memories_stored` number, required
  - `memories_updated` number, required
  - `stored_memory_ids` string[], required
  - `updated_memory_ids` string[], required

## Other responses

- `400` — Input validation error
- `500` — Internal server error
- `502` — Upstream AI provider returned an unrecoverable failure (auth, non-retryable 4xx).
- `503` — Upstream AI provider is rate-limited, quota-exhausted, or returned 5xx; consult `retryable`.

## Changes

- **2026-07-17** `d501daa39bb2` — 1 info
  - added the new optional request property `content_class`
- **2026-05-18** `457c8928e1ab` — 1 warning
  - removed the request property `content_class`

[Change history](https://skmtc.dev/atomicstrata/apis/atomicmemory-http-api/changes/v1/memories/ingest/post.md)

---

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