---
title: "Recent Memory"
method: POST
path: "/api/v1/memory/recent"
tags: ["memory"]
---

# Recent Memory

`POST /api/v1/memory/recent`

## Request

- Base URL: `https://core.mnemoverse.com`
- URL: `https://core.mnemoverse.com/api/v1/memory/recent`
- Auth: one of:
  - API key in header `X-Api-Key`
  - HTTP bearer

Queryless newest-first feed (#404 R5) — backs MCP ``memory_list_recent``.

A keyset walk over ``(created_at DESC, id DESC)``, complete by
construction: the temporal complement of /memory/read's semantic gate.
An empty feed is ``200 {"items": [], "next_cursor": null}`` and NEVER a
404 — the shipped MCP client reads a bare 404 as "endpoint not deployed"
and hides the feature behind a fallback hint.

## Request body

- RecentRequestSchema: Request body for the queryless newest-first feed (#404 R5, #431). Backs the MCP `memory_list_recent` tool: "what happened lately", complete by construction — a keyset walk over `created_at`, not a semantic search.
  - `domain` string, nullable: Optional domain filter (null = all the caller's domains). An 'xroom:<room_id>' address resolves through the same membership gate as /memory/read.
  - `since` string, date-time, nullable: Only entries created at or after this ISO-8601 instant (inclusive). Naive datetimes are read as UTC — same rule as /memory/read. The caller's novelty watermark.
  - `until` string, date-time, nullable: Only entries created at or before this ISO-8601 instant (inclusive). Naive datetimes are read as UTC. Pair with `since` to name a closed window — 'what happened on Monday' — instead of paging back from now and discarding.
  - `exclude_author` string, nullable: Drop entries whose provenance principal equals this value — the 'everyone but me' read in a shared room. Mirrors the parameter of the same name on /memory/read (#404 R4).
  - `limit` integer: Page size. Newest first.
  - `cursor` string, nullable: Opaque continuation cursor from a previous page's next_cursor. Malformed values fail loud (400 VALIDATION_ERROR) — a garbage cursor must never degrade into an unfiltered first page.
  - `include_history` boolean: Return superseded revisions alongside live ones; each carries `superseded_by`, and every item carries `supersedes` when it replaced something. History is returned in the domain where each revision is stored: a read scoped to the successor's domain does not include a cross-domain predecessor — use an unscoped read or `GET /memory/atoms/{id}`. History items compete under normal ranking, `min_relevance` and `top_k`/`limit` — `include_history` grants eligibility, not chain completeness; for the chain itself use `GET /memory/atoms/{id}/chain`, which spends a 64-LOOKUP budget per call (resolved revisions AND dangling-pointer misses both count) and sets `truncated` when the budget ran out — so `truncated` means the walk stopped early, not that the chain necessarily holds more than 64 revisions. One exception to the domain rule above: when a fingerprint matches a revision that has been replaced, the live tip is returned alongside it even if that tip lives in another domain — the episodic index is domain-blind, and this makes it two atoms rather than one. No effect until the read-side supersession filter is enabled (nothing is hidden before then, so nothing needs unhiding), and inert for `xroom:<room_id>` domains, whose atoms cannot be superseded at all.

## Response `200`

Successful Response

- RecentResponseSchema: Response of the newest-first feed.
  - `items` RecentItemSchema[], required: Feed entries, created_at DESC (ties broken by id DESC).
    - `atom_id` string, uuid, required: Unique identifier of the atom.
    - `content` string, required: Stored text content of the memory.
    - `domain` string, required: Domain/namespace of the atom.
    - `created_at` string, date-time, required: UTC creation instant, ISO-8601.
    - `concepts` string[]: Concepts associated with this atom.
    - `provenance` ProvenanceSchema: Server-stamped authorship of an atom (CN-001). Returned (as the optional `provenance` object on a read item) only when at least one field is non-null; an atom with no recorded authorship omits the whole object. Stamped from VERIFIED JWT claims at write time — never client-supplied.
      - `principal` string, nullable: The person/principal who wrote it.
      - `agent` string, nullable: Stable agent identifier, if any.
      - `agent_name` string, nullable: Human-readable agent name, if any.
      - `client_env` string, nullable: Calling client environment: cursor·claude·chatgpt·chat·api·unknown.
      - `is_external` boolean: True when the principal is external to the org.
    - `supersedes` string[]: Ids this entry replaced. OMITTED when it replaced nothing.
    - `superseded_by` string, uuid, nullable: Id of the revision that replaced this entry. OMITTED while this entry is the live tip.
  - `next_cursor` string, nullable: Opaque cursor for the next (older) page; null when nothing older remains. Always matches ^[A-Za-z0-9_=-]{1,512}$ — the MCP client refuses to echo a cursor outside that shape (CN-032).

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `422`: Validation Error
- `429`: Rate limited
- `500`: Internal server error
- `503`: Service unavailable

---

[API](https://skmtc.dev/mnemoverse/apis/mnemoverse-core.md) · [All operations](https://skmtc.dev/mnemoverse/apis/mnemoverse-core/llms.txt) · [OpenAPI document](https://skmtc.dev/mnemoverse/apis/mnemoverse-core/revisions/1f5e0048f017?raw)
