What one person said, newest first
POST/api/v1/memory/by-speaker
In the SDKs: by_speaker
speaker is the tag written at store time — "me" for the assistant’s own words, otherwise a registered name. Same cursor paging as /images. chunks and records_to_delete say how much a delete would actually remove, which is usually more than returned — worth showing someone before they confirm one. (points_to_delete is the same number under a deprecated name.)
Authentication
Every call carries your API key in an X-API-Key header. Keys are created in the console.
X-WOS-ModeloptionalPicks the memory model that answers. Omit it and the account default is used.
Request body
JSON, required. Out-of-range values are refused with a 400 rather than quietly clamped.
user_idstring requiredThe store to operate on. Stores are explicit: create one first or use the built-in "default".
speakerstring required"me"for the assistant, or a registered person.limitinteger 5–20Per page, 5–20 (default 20).
beforestringCursor:
next_beforefrom the previous page.skip_idsstring[]Cursor:
next_skip_ids, accumulated.
Returns
The 200 body. Fields nested one level are shown as parent.child.
user_idstringspeakerstringmemoriesMemory[]memories.idstringmemories.contentstringmemories.categorystringCategory of the memory, e.g. "general".
memories.similaritynumberHow close this memory is to the query (0–1), higher is closer. It is NOT the ranking key — results already arrive best-first, and ordering by this field instead produces a WORSE order, not the same one. Take
memoriesin the order given. There is noscorefield.memories.importancenumberHow much weight this memory carries, as the engine assigned it.
memories.time_bucketstringMonth bucket, e.g. "2026-07". Omitted when temporal fields are stripped.
memories.is_supersededbooleanTrue if a later memory has superseded this one.
memories.superseded_bystring,nullId of the memory that superseded this one, or null.
memories.created_atstringWhen the memory was stored (RFC3339). Omitted when temporal fields are stripped.
memories.event_datestringWhen the content actually happened (RFC3339), if known.
memories.speakerstringWHO said it: "me" (the agent itself) or a registered person. Absent = untagged.
returnedintegerchunksintegerHow much a delete here would remove — usually more than
returned.records_to_deleteintegerThe same count. Prefer this name.
points_to_deleteintegerDeprecated alias of
records_to_delete; both carry the same value. Readrecords_to_delete.has_morebooleannext_beforestringnext_skip_idsstring[]
Example
curl -X POST https://api.wontopos.com/api/v1/memory/by-speaker \
-H "X-API-Key: $WOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'Status codes
| Status | Meaning |
|---|---|
| 200 | Success. |
| 400 | speaker missing or empty. |
| 401 | Missing or invalid API key. |
| 404 | Store (user_id) does not exist. Create it first: POST /api/v1/memory/collection. |
| 429 | Rate limited (per-account, per-tier RPM). Retry after the indicated delay. |
| 501 | The selected model’s engine does not implement this endpoint (Tablet 2 and newer do). The message names the model. |
Rate limits per tier and the full status list are in Errors & limits.
In the SDKs
The Python, TypeScript, and Rust SDKs wrap this endpoint so you do not build the request by
hand — pip install wontopos, npm i wontopos, or cargo add wontopos, then the method list is on the SDK reference. A coding agent can take the whole API in one file
at llms.txt, or over MCP with npx -y wontopos-mcp.