---
title: "Store a memory"
method: POST
path: "/v2/workspaces/{id}/remember"
tags: ["Runtime"]
---

# Store a memory

`POST /v2/workspaces/{id}/remember`

## Request

- Base URL: `https://api.infolang.ai`
- URL: `https://api.infolang.ai/v2/workspaces/{id}/remember`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer

Class A — accepts a session JWT, an `il_live_`/`il_test_` API key, or an `il_oauth_` token. On the `il_*` lanes the bearer is forwarded to Kairos verbatim and Kairos enforces the credential's grant on this workspace (its 401/403 is surfaced in the v2 envelope). The response body is Kairos's, passed through unchanged; `X-InfoLang-Tokens-Saved` / `X-InfoLang-Overage` are echoed when set.

Requires the `memories:write` scope. Accepts all three lanes: a session JWT (bounded by the caller's role on this workspace) or an `il_*` machine credential whose own scope set, workspace set and validity window cover it — both ceilings apply and neither can raise the other, so a credential carrying `memories:write` is still refused where the role does not permit it.

A credential with no scope record resolves to `LEGACY_DEFAULT`, which INCLUDES `memories:write` — every key minted before scoping keeps working here.

## Path parameters

- `id` string, required

## Request body

- object
  - `text` string, required
  - `source` string
  - `tags` string[]
  - `namespace` string
  - `subject` string
  - `mode` 'correct' | 'update' | 'refine' | 'escalate'
  - `authority` 'inference' | 'observation' | 'operator'
  - `regimes` string[]
  - `warrant_reason` string
  - `propose_correspondence` boolean
  - `answers_inquiry` string, uuid

## Response `200`

Stored (forge shape). With `subject`, also `belief` — an ADVISORY reporting whether the assertion landed, the authority actually recorded (it is clamped, not refused), and any subject-key drift warnings. `belief.asserted: false` is a 200: the memory is written first, so coordination can fail without losing it.

With `regimes: [<regime_id>…]`, also `regime` — the scoping advisory, with one `scope_links[]` entry per link that landed. Keep those ids: a scope link can only ever be withdrawn by naming it. Partial success is representable and reported, because the links are independent appends with no transaction across them.

With `subject` AND `warrant_reason`, also `warrant` — the support edge `Memory(id) → Assertion(id)` that reason states, and the edge id that is the ONLY handle able to withdraw it later. There is no boolean here on purpose: a memory is not automatically a reason for the assertion that cites it: Phase 1's evidence pointer already records that provenance, and minting a support edge from it would make every asserted memory warrant its own claim — `warranted` would then mean `written down`. Pass `warrant_reason` to state a real reason and the gateway mints the edge you described.

With `subject` AND `propose_correspondence: true`, also `correspondence` — the `corresponds` links the gateway proposed from this write's own drift advisories, at band `proposed`. Off by default: the gateway does NOT propose correspondence links unless asked. Proposing from drift advisories is the kernel's own documented input port (S-c: adapters propose, humans dispose), but the correspondence log never deletes, so an always-on proposer writes a permanent record per near-miss per write forever. Pass `propose_correspondence: true` alongside `subject` and the gateway mints at most 3 `corresponds` links at band `proposed`, with ids derived deterministically from the subject pair — so the same advisory firing a thousand times mints one link and every repeat answers `appended: false`. What was written is on the response.

- object
  - `id` string, required
  - `namespace` string, required
  - `stored` boolean, required
  - `total_memories` integer, required
  - `deduplicated` boolean
  - `deduped_against` string, nullable
  - `chunks_ingested` integer
  - `tokens_ingested` integer
  - `wal_id` string
  - `properties` object

## Other responses

- `401`: Missing/invalid credential
- `403`: The credential holds no grant on this workspace. Or `lane_not_supported` — the credential is well-formed but this route does not accept its lane
- `422`: Body failed the pinned kairos-runtime schema
- `502`: Upstream Kairos failure
- `503`: not_ready — Kairos ML backend still warming up

---

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