API reference
Memory stores
Make memory stores, give them to a task, write and read the notes in them, and read every version of a note.
A memory store holds notes that workers read and write from one task to the next. A note is a text at a path, such as /customers/sam.md, and every change to a note is kept as a version that says who made it and when. Memory explains how a task reads its stores, and the dreams that tidy a store up.
A workspace has two kinds of store. A shared store is one you make here, or a person makes in the app. A worker's own store is made when the worker first saves a note, is named after the worker, and holds what the worker remembers by itself. The list shows both. A worker's own store cannot be archived or deleted, and it cannot be given to a task, since every task already reads its worker's own store.
A task reads the stores a person attached to its worker in the app, unless the task is given stores of its own. Name them in the task's resources, as { "type": "memory_store", "memory_store_id": "memstore_..." }, with access set to read_write (the default) or read_only, and instructions of up to 4,096 characters that tell the worker how to use the store. With any memory_store entry, the task reads only the stores named, at most 8, besides its worker's own. A task keeps the name, access and instructions each store had when the task was made, so a later rename does not reach it.
A note holds 0 to 102,400 UTF-8 bytes, and a store holds up to 10,000 notes. A workspace keeps up to 1,000 live shared stores. A worker's own store does not count, and archiving a store frees its place. A note whose text or path holds a saved password is refused. A write to an archived store is refused.
Every change to a note saves a version. Versions are kept for 30 days after they are written. The two newest versions of a note that still exists are always kept, so a note that rarely changes can keep history longer. Versions of a deleted note and redacted versions follow the same rule. To keep history longer, read the versions with this API and keep your own copy. Little Worker running on your own computer keeps every version.
The memory store object
The routes for stores answer a store, or a list of them. The routes for notes answer a note, which has its own fields under Write a note, and the routes for versions answer a version, with its fields under Read a version. Times are RFC 3339 in UTC, to the millisecond.
Fields
typestringAlwaysmemory_store.idmemory store idThe store's id:memstore_and 32 hex digits.namestringThe store's name, 1 to 255 characters.descriptionstringWhat the store is for, up to 1,024 characters. Empty when unset.metadataobjectYour own labels for the store: up to 16 keys of 1 to 64 characters, each with a string value of up to 512.created_attimeWhen the store was made.updated_attimeWhen the store's name, description or labels last changed, or when it was archived. Writing a note does not move it.archived_attime or nullWhen the store was archived.nullwhile it is not.
{
"type": "memory_store",
"id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales"
},
"created_at": "2026-10-20T09:14:02.331Z",
"updated_at": "2026-10-20T09:14:02.331Z",
"archived_at": null
}Make a memory store
POST/memory_stores
Make a shared store. It starts empty. To let a task use it, name it in the task's resources. This route ignores Idempotency-Key, so a retry after a timeout can make a second store. List the stores and look for yours before you try again.
Body
namestringRequiredThe store's name, 1 to 255 characters, with no control characters such as a line break or a tab.descriptionstringWhat the store is for, up to 1,024 characters.metadataobjectYour own labels: up to 16 keys of 1 to 64 characters, each with a string value of up to 512.
Returns
200 and the store.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | A field is missing or not valid (error_code validation_error), or the workspace already keeps 1,000 live shared stores. message says which. Archive or delete a store it no longer needs. |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores" \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19" \
-H "content-type: application/json" \
-d '{
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales"
}
}'const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores", {
method: "POST",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
"content-type": "application/json",
},
body: JSON.stringify({
name: "Customer notes",
description: "What customers order and how they like to be reached.",
metadata: {
team: "sales",
},
}),
})
const store = await response.json()import os
import requests
response = requests.post(
"https://core.thelittleworker.com/api/v1/memory_stores",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
json={
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales",
},
},
)
store = response.json(){
"type": "memory_store",
"id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales"
},
"created_at": "2026-10-20T09:14:02.331Z",
"updated_at": "2026-10-20T09:14:02.331Z",
"archived_at": null
}List memory stores
GET/memory_stores
List the stores in the key's workspace, newest first. Archived stores are left out unless you ask for them.
Query parameters
limitintegerHow many to answer, 1 to 100. The default is 20.pagestringThenext_pageof the answer before, to read the next page.orderstringdesc, newest first (the default), orasc, oldest first.One of
desc,asccreated_at[gt]timeOnly those made after this time, an RFC 3339 time compared to the millisecond the answer shows. It may end inZor in an offset such as+02:00.created_at[lt]works the same way.created_at[gte]andcreated_at[lte]take a UTC time that ends inZ, and an offset is refused.include_archivedstringtruelists archived stores too.One of
true,false
Returns
A list: data holds the stores, and next_page is the page to send for the next ones (null on the last page).
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | A filter is not valid, such as a limit outside 1 to 100, an include_archived that is not true or false, or a time that is not an RFC 3339 time (error_code validation_error). page is not a page this list gave (error_code validation_error, That cursor is not valid.), or it was made with another order (That cursor was made with another order. Use the same one, or read the first page again.). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores?limit=10" \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores?limit=10", {
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const stores = await response.json()import os
import requests
response = requests.get(
"https://core.thelittleworker.com/api/v1/memory_stores",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
params={
"limit": "10",
},
)
stores = response.json(){
"data": [
{
"type": "memory_store",
"id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales"
},
"created_at": "2026-10-20T09:14:02.331Z",
"updated_at": "2026-10-20T09:14:02.331Z",
"archived_at": null
}
],
"next_page": null
}Read a memory store
GET/memory_stores/{memory_store_id}
Read one store, archived or not.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.
Returns
The store.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | memory_store_id is not a memory store id. error_code is validation_error. |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | No memory store in the key's workspace has this id (Memory store not found.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24 \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24", {
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const store = await response.json()import os
import requests
response = requests.get(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
)
store = response.json(){
"type": "memory_store",
"id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales"
},
"created_at": "2026-10-20T09:14:02.331Z",
"updated_at": "2026-10-20T09:14:02.331Z",
"archived_at": null
}Change a memory store
POST/memory_stores/{memory_store_id}
Change a store's name, description or labels. A field left out, or sent as null, stays as it was. An archived store takes no change.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.
Body
namestringA new name, 1 to 255 characters.descriptionstringA new description, up to 1,024 characters.metadataobjectLabels to set on the store. A key with a string value is set, a key set tonullis removed, and keys left out stay. The request holds at most 16 keys, and at most 16 remain.
Returns
The store, changed.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | A field is not valid, or the labels would pass 16 (error_code validation_error). The store is archived and can only be read (This memory store is archived and can only be read.). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | No memory store in the key's workspace has this id (Memory store not found.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24" \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19" \
-H "content-type: application/json" \
-d '{
"metadata": {
"region": "west"
}
}'const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24", {
method: "POST",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
"content-type": "application/json",
},
body: JSON.stringify({
metadata: {
region: "west",
},
}),
})
const store = await response.json()import os
import requests
response = requests.post(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
json={
"metadata": {
"region": "west",
},
},
)
store = response.json(){
"type": "memory_store",
"id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales",
"region": "west"
},
"created_at": "2026-10-20T09:14:02.331Z",
"updated_at": "2026-10-21T08:30:12.507Z",
"archived_at": null
}Archive a memory store
POST/memory_stores/{memory_store_id}/archive
Archive a store so it can only be read. It cannot be undone. Its notes and versions stay, lists leave it out unless you ask for include_archived=true, and it no longer counts toward the workspace's 1,000 live shared stores. Archiving a store twice changes nothing. A task that already has the store can still read it.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.
Returns
The store, with archived_at set.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | memory_store_id is not a memory store id. error_code is validation_error. |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | No memory store in the key's workspace has this id (Memory store not found.). |
| 409 | conflict_error | The store is a worker's own (A worker's own memory cannot be archived.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/archive" \
-X POST \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/archive", {
method: "POST",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const store = await response.json()import os
import requests
response = requests.post(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/archive",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
)
store = response.json(){
"type": "memory_store",
"id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"name": "Customer notes",
"description": "What customers order and how they like to be reached.",
"metadata": {
"team": "sales"
},
"created_at": "2026-10-20T09:14:02.331Z",
"updated_at": "2026-10-25T17:12:03.418Z",
"archived_at": "2026-10-25T17:12:03.418Z"
}Delete a memory store
DEL/memory_stores/{memory_store_id}
Delete a shared store with all its notes and versions, and its place in any worker's stores and in any task or routine that names it. An archived store can be deleted. It cannot be undone.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.
Returns
type is memory_store_deleted, with the store's id.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | memory_store_id is not a memory store id. error_code is validation_error. |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | No memory store in the key's workspace has this id (Memory store not found.). |
| 409 | conflict_error | The store is a worker's own (A worker's own memory goes when the worker does.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24" \
-X DELETE \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24", {
method: "DELETE",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const deleted = await response.json()import os
import requests
response = requests.delete(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
)
deleted = response.json(){
"type": "memory_store_deleted",
"id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24"
}Write a note
POST/memory_stores/{memory_store_id}/memories
Write a new note at a path. The note starts with one created version, made by your key. A path that already holds a note is refused, even for the same text. To replace a note, change it. This route ignores Idempotency-Key.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.
Query parameters
viewstringfullanswers the text of the note.basic, the default, leavescontentasnull.One of
basic,full
Body
pathstringRequiredWhere to put the note, such as/customers/sam.md: it starts with/, is 2 to 1,024 UTF-8 bytes, and has no empty,.or..part between its slashes. It is kept in Unicode normal form NFC.contentstringRequiredThe note's text, 0 to 102,400 UTF-8 bytes. Send""for an empty note.
Returns
200 and the note, with content left as null unless you send view=full. Its content_sha256 is the hash of the text you sent.
typestringAlwaysmemory.idnote idThe note's id:mem_and 32 hex digits.memory_store_idmemory store idThe store the note is in.memory_version_idversion idThe note's newest version, which holds the text it has now.pathstringWhere the note is in its store, such as/customers/sam.md. A path starts with/, is 2 to 1,024 UTF-8 bytes, has no empty,.or..part between its slashes, and so does not end with/. Case matters.contentstring or nullThe note's text.nullin the basic view. Reading one note answers the text by default. Writing, changing and listing leave it out unless you ask forview=full.content_sha256stringThe SHA-256 of the note's text as UTF-8 bytes, in lowercase hexadecimal. It is the hash of the bytes you sent, so a client can compute it, and it is whatpreconditionandexpected_content_sha256take.content_size_bytesintegerThe text's size in UTF-8 bytes. A note holds 0 to 102,400.created_attimeWhen the note was made.updated_attimeWhen the note's path or text last changed.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | A field is missing or not valid (error_code validation_error): the path is not a note path, the text is over 102,400 bytes, or the view is not basic or full. The text holds a saved password (This note contains a saved password. Remove it and try again.), or so does the path. The store is archived and can only be read (This memory store is archived and can only be read.). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | No memory store in the key's workspace has this id (Memory store not found.). |
| 409 | memory_path_conflict_error | A note is already at the path, at a folder above it, or inside it as a folder (error_code memory_path_conflict). /notes and /notes/todo.md cannot both be notes. Choose another path. |
| 409 | conflict_error | The store already holds 10,000 notes. Delete one, or change one that is there. |
| 413 | request_too_large | The request body is over 10 MiB (error_code request_too_large). A note holds at most 102,400 bytes. |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories" \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19" \
-H "content-type: application/json" \
-d '{
"path": "/customers/sam.md",
"content": "Sam orders on Fridays and likes a text more than a call."
}'const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories", {
method: "POST",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
"content-type": "application/json",
},
body: JSON.stringify({
path: "/customers/sam.md",
content: "Sam orders on Fridays and likes a text more than a call.",
}),
})
const note = await response.json()import os
import requests
response = requests.post(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
json={
"path": "/customers/sam.md",
"content": "Sam orders on Fridays and likes a text more than a call.",
},
)
note = response.json(){
"type": "memory",
"id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"memory_version_id": "memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35",
"path": "/customers/sam.md",
"content": null,
"content_sha256": "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba",
"content_size_bytes": 56,
"created_at": "2026-10-20T09:20:41.007Z",
"updated_at": "2026-10-20T09:20:41.007Z"
}List notes
GET/memory_stores/{memory_store_id}/memories
List the notes in a store, by path. A listing holds notes and, when you ask for depth=1, folders. A folder is a memory_prefix, which has only a type and a path that ends with /. It has no id.
Notes come in path order, not newest first, and this list takes no order and no created_at filter. To see what changed lately, list the versions.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.
Query parameters
path_prefixstringThe folder to list:/(the default), or a path that ends with/, such as/customers/.depthstring0, the default, lists every note below the folder.1lists only what is directly in it, and shows each folder inside it as onememory_prefix.One of
0,1viewstringfullanswers the text of the notes.basic, the default, leavescontentasnull.One of
basic,fulllimitintegerHow many to answer, 1 to 1,000. The default is 100. Withview=fullthe most is 20, and the default is 20.pagestringThenext_pageof the answer before, to read the next page.
Returns
A list: data holds notes and folders, in path order, and next_page is the page to send for the next ones (null on the last page). A note has the fields of Write a note.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | path_prefix is not a folder, limit is outside its range, limit is over 20 with view=full, or depth or view is not one of its values (error_code validation_error). page is not a page this list gave (error_code validation_error, That cursor is not valid.). Read the first page again. |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | No memory store in the key's workspace has this id (Memory store not found.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories?path_prefix=%2Fcustomers%2F&depth=1" \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories?path_prefix=%2Fcustomers%2F&depth=1", {
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const notes = await response.json()import os
import requests
response = requests.get(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
params={
"path_prefix": "/customers/",
"depth": "1",
},
)
notes = response.json(){
"data": [
{
"type": "memory_prefix",
"path": "/customers/archive/"
},
{
"type": "memory",
"id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"memory_version_id": "memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35",
"path": "/customers/sam.md",
"content": null,
"content_sha256": "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba",
"content_size_bytes": 56,
"created_at": "2026-10-20T09:20:41.007Z",
"updated_at": "2026-10-20T09:20:41.007Z"
}
],
"next_page": null
}Read a note
GET/memory_stores/{memory_store_id}/memories/{memory_id}
Read one note. Unlike a listing, a read answers the note's text unless you ask for view=basic.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.memory_idnote idRequiredThe note, such asmem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20.
Query parameters
viewstringbasicleaves the text of the note out, andcontentisnull.full, the default, answers it.One of
basic,full
Returns
The note, as Write a note shows it.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | An id is not of its kind, or view is not basic or full (error_code validation_error). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | The workspace has no memory store with this id (Memory store not found.), or the store has no note with this id (Memory not found.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20 \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20", {
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const note = await response.json()import os
import requests
response = requests.get(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
)
note = response.json(){
"type": "memory",
"id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"memory_version_id": "memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35",
"path": "/customers/sam.md",
"content": "Sam orders on Fridays and likes a text more than a call.",
"content_sha256": "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba",
"content_size_bytes": 56,
"created_at": "2026-10-20T09:20:41.007Z",
"updated_at": "2026-10-20T09:20:41.007Z"
}Change a note
POST/memory_stores/{memory_store_id}/memories/{memory_id}
Change a note's text, its path, or both. A content or path left out, or sent as null, stays as it was. Changing the path moves the note, and the new path must be free. A change that changes nothing answers the note as it is and saves no version.
To change a note only if no one else has, send a precondition with the content_sha256 you read. If the note's text is no longer that text, the change is refused. If the note already has the path and text you ask for, the answer is 200 even when the hash is stale, so a retry of a change that landed is safe.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.memory_idnote idRequiredThe note, such asmem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20.
Query parameters
viewstringfullanswers the text of the note.basic, the default, leavescontentasnull.One of
basic,full
Body
contentstringThe new text, 0 to 102,400 UTF-8 bytes.pathstringThe new path, which moves the note. It follows the rules of a path in Write a note.preconditionobjectChange the note only if it still has the text a hash names.Show its 2 fields
typestringRequiredAlwayscontent_sha256.content_sha256stringRequiredThecontent_sha256of the text you read.
Returns
The note, as Write a note shows it. A change that saves a version names it in memory_version_id.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | A field is not valid (error_code validation_error): the path is not a note path, the text is over 102,400 bytes, precondition.content_sha256 is not a SHA-256 in lowercase hexadecimal, or the view is not basic or full. The text holds a saved password (This note contains a saved password. Remove it and try again.), or so does the path. The store is archived and can only be read (This memory store is archived and can only be read.). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | The workspace has no memory store with this id (Memory store not found.), or the store has no note with this id (Memory not found.). |
| 409 | memory_path_conflict_error | A note is already at the path, at a folder above it, or inside it as a folder (error_code memory_path_conflict). /notes and /notes/todo.md cannot both be notes. Choose another path. |
| 409 | memory_precondition_failed_error | The note's text is no longer the text the hash names (error_code memory_precondition_failed). Read the note again and make the change from its new hash. |
| 413 | request_too_large | The request body is over 10 MiB (error_code request_too_large). A note holds at most 102,400 bytes. |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20?view=full" \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19" \
-H "content-type: application/json" \
-d '{
"content": "Sam orders on Mondays and likes a text more than a call.",
"precondition": {
"type": "content_sha256",
"content_sha256": "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba"
}
}'const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20?view=full", {
method: "POST",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
"content-type": "application/json",
},
body: JSON.stringify({
content: "Sam orders on Mondays and likes a text more than a call.",
precondition: {
type: "content_sha256",
content_sha256: "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba",
},
}),
})
const note = await response.json()import os
import requests
response = requests.post(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
params={
"view": "full",
},
json={
"content": "Sam orders on Mondays and likes a text more than a call.",
"precondition": {
"type": "content_sha256",
"content_sha256": "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba",
},
},
)
note = response.json(){
"type": "memory",
"id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"memory_version_id": "memver_8b2d4f6a0c1e4a3b9d5f7e1c3a9b6d48",
"path": "/customers/sam.md",
"content": "Sam orders on Mondays and likes a text more than a call.",
"content_sha256": "fc0f613597834eece1ddce8ff30052ac267e1fac58ba8496e6ac67a9872711c5",
"content_size_bytes": 56,
"created_at": "2026-10-20T09:20:41.007Z",
"updated_at": "2026-10-24T11:02:19.640Z"
}Delete a note
DEL/memory_stores/{memory_store_id}/memories/{memory_id}
Delete a note. Its versions stay, with a deleted version on top, so the change can be seen. To delete only if no one else has changed the note, send the content_sha256 you read as expected_content_sha256.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.memory_idnote idRequiredThe note, such asmem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20.
Query parameters
expected_content_sha256stringDelete the note only if its text still has this hash.
Returns
type is memory_deleted, with the note's id.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | An id is not of its kind, or expected_content_sha256 is not a SHA-256 in lowercase hexadecimal (error_code validation_error). The store is archived and can only be read (This memory store is archived and can only be read.). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | The workspace has no memory store with this id (Memory store not found.), or the store has no note with this id (Memory not found.). |
| 409 | memory_precondition_failed_error | The note's text is no longer the text the hash names (error_code memory_precondition_failed). Nothing was deleted. |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20?expected_content_sha256=fc0f613597834eece1ddce8ff30052ac267e1fac58ba8496e6ac67a9872711c5" \
-X DELETE \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20?expected_content_sha256=fc0f613597834eece1ddce8ff30052ac267e1fac58ba8496e6ac67a9872711c5", {
method: "DELETE",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const deleted = await response.json()import os
import requests
response = requests.delete(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memories/mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
params={
"expected_content_sha256": "fc0f613597834eece1ddce8ff30052ac267e1fac58ba8496e6ac67a9872711c5",
},
)
deleted = response.json(){
"type": "memory_deleted",
"id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20"
}List versions
GET/memory_stores/{memory_store_id}/memory_versions
List every change made in a store, newest first, across all its notes. Filter by note, by what the change did, by the task a worker was in, or by the key that made it.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.
Query parameters
memory_idnote idOnly the versions of this note.operationstringOnly changes of this kind.One of
created,modified,deletedtask_idtask idOnly the changes a worker made in this task.api_key_idapi key idOnly the changes this key made.viewstringfullanswers the text of the versions.basic, the default, leavescontentasnull.One of
basic,fulllimitintegerHow many to answer, 1 to 100. The default is 20. Withview=fullthe most is 20.pagestringThenext_pageof the answer before, to read the next page.orderstringdesc, newest first (the default), orasc, oldest first.One of
desc,asccreated_at[gt]timeOnly those made after this time, an RFC 3339 time compared to the millisecond the answer shows. It may end inZor in an offset such as+02:00.created_at[lt]works the same way.created_at[gte]andcreated_at[lte]take a UTC time that ends inZ, and an offset is refused.
Returns
A list: data holds the versions, and next_page is the page to send for more (null on the last page). A version has the fields of Read a version.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | A filter is not valid, such as an id of the wrong kind, an operation that is not one of its values, a time that is not an RFC 3339 time, a limit outside its range, or a limit over 20 with view=full (error_code validation_error). page is not a page this list gave (error_code validation_error, That cursor is not valid.), or it was made with another order (That cursor was made with another order. Use the same one, or read the first page again.). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | No memory store in the key's workspace has this id (Memory store not found.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions?memory_id=mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20" \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions?memory_id=mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20", {
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const versions = await response.json()import os
import requests
response = requests.get(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
params={
"memory_id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
},
)
versions = response.json(){
"data": [
{
"type": "memory_version",
"id": "memver_8b2d4f6a0c1e4a3b9d5f7e1c3a9b6d48",
"memory_id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"operation": "modified",
"path": "/customers/sam.md",
"content": null,
"content_sha256": "fc0f613597834eece1ddce8ff30052ac267e1fac58ba8496e6ac67a9872711c5",
"content_size_bytes": 56,
"created_by": {
"type": "api_actor",
"api_key_id": "apikey_7c1e3a5b9d2f4e6a8b0c4d6f2a1e9b35"
},
"created_at": "2026-10-24T11:02:19.640Z",
"redacted_at": null,
"redacted_by": null
},
{
"type": "memory_version",
"id": "memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35",
"memory_id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"operation": "created",
"path": "/customers/sam.md",
"content": null,
"content_sha256": "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba",
"content_size_bytes": 56,
"created_by": {
"type": "api_actor",
"api_key_id": "apikey_7c1e3a5b9d2f4e6a8b0c4d6f2a1e9b35"
},
"created_at": "2026-10-20T09:20:41.007Z",
"redacted_at": null,
"redacted_by": null
}
],
"next_page": null
}Read a version
GET/memory_stores/{memory_store_id}/memory_versions/{memory_version_id}
Read one version. Like a note, a version answers its text unless you ask for view=basic.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.memory_version_idversion idRequiredThe version, such asmemver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35.
Query parameters
viewstringbasicleaves the text of the version out, andcontentisnull.full, the default, answers it.One of
basic,full
Returns
type is memory_version, with these fields.
typestringAlwaysmemory_version.idversion idThe version's id:memver_and 32 hex digits.memory_idnote idThe note it changed.memory_store_idmemory store idThe store the note is in.operationstringWhat the change did:createdthe note,modifiedits path or text, ordeletedit.One of
created,modified,deletedpathstring or nullThe note's path after the change, or the path it was deleted from.nullonce the version is redacted.contentstring or nullThe note's text after the change.nullfor adeletedversion, for a redacted one, and in the basic view.content_sha256string or nullThe SHA-256 of the text.nullfor adeletedversion and a redacted one.content_size_bytesinteger or nullThe text's size in bytes.nullfor adeletedversion and a redacted one.created_byobject or nullWho made the change.nullfor a change the service made, and for a worker's write outside a task.Show its 4 fields
typestringtask_actorfor a worker's write in a task,api_actorfor a key's write,user_actorfor a person's write in the app.One of
task_actor,api_actor,user_actortask_idtask idOnly on atask_actor: the task the worker was in.api_key_idapi key idOnly on anapi_actor: the key,apikey_and 32 hex digits.user_iduser idOnly on auser_actor: the person,user_and 32 hex digits. It is the same on every device.
created_attimeWhen the change was made.redacted_attime or nullWhen the version's path, text, hash and size were removed.nullif they were not.redacted_byobject or nullWho redacted it: a key (api_actor) or a person (user_actor).nullif it was not redacted.Show its 3 fields
typestringapi_actorfor a key,user_actorfor a person in the app.One of
api_actor,user_actorapi_key_idapi key idOnly on anapi_actor: the key,apikey_and 32 hex digits.user_iduser idOnly on auser_actor: the person,user_and 32 hex digits. It is the same on every device.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | An id is not of its kind, or view is not basic or full (error_code validation_error). |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | The workspace has no memory store with this id (Memory store not found.), or the store has no version with this id (Version not found.). |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions/memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35 \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions/memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35", {
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const version = await response.json()import os
import requests
response = requests.get(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions/memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
)
version = response.json(){
"type": "memory_version",
"id": "memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35",
"memory_id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"operation": "created",
"path": "/customers/sam.md",
"content": "Sam orders on Fridays and likes a text more than a call.",
"content_sha256": "3264f64c28ae4c6a20c3a58ebdfa89735a5aeeff334fb1a7a1f2e815b8b197ba",
"content_size_bytes": 56,
"created_by": {
"type": "api_actor",
"api_key_id": "apikey_7c1e3a5b9d2f4e6a8b0c4d6f2a1e9b35"
},
"created_at": "2026-10-20T09:20:41.007Z",
"redacted_at": null,
"redacted_by": null
}Redact a version
POST/memory_stores/{memory_store_id}/memory_versions/{memory_version_id}/redact
Remove a version's path, text, hash and size from history, for a text that should not have been kept. The version stays, with who made the change and when, and redacted_at and redacted_by say who redacted it. It cannot be undone. Redacting a version twice answers it as it is. An archived store can still be redacted.
Path parameters
memory_store_idmemory store idRequiredThe memory store, such asmemstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24.memory_version_idversion idRequiredThe version, such asmemver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35.
Returns
The version, as Read a version shows it.
Errors
| Status | Type | When |
|---|---|---|
| 400 | invalid_request_error | An id is not of its kind. error_code is validation_error. |
| 401 | authentication_error | The key is missing, removed, or not a key. Send it in x-api-key. |
| 404 | not_found_error | The workspace has no memory store with this id (Memory store not found.), or the store has no version with this id (Version not found.). |
| 409 | conflict_error | The version is the newest of a note that still exists, so it holds the note's text now (This is the note's current text. Change or forget the note first.). Change or delete the note first. |
| 429 | rate_limit_error | The workspace made too many requests this minute. Wait the seconds in Retry-After, then try again. |
curl "https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions/memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35/redact" \
-X POST \
-H "x-api-key: $LITTLE_WORKER_API_KEY" \
-H "Little-Worker-Version: 2026-10-19"const response = await fetch("https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions/memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35/redact", {
method: "POST",
headers: {
"x-api-key": process.env.LITTLE_WORKER_API_KEY,
"Little-Worker-Version": "2026-10-19",
},
})
const version = await response.json()import os
import requests
response = requests.post(
"https://core.thelittleworker.com/api/v1/memory_stores/memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24/memory_versions/memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35/redact",
headers={
"x-api-key": os.environ["LITTLE_WORKER_API_KEY"],
"Little-Worker-Version": "2026-10-19",
},
)
version = response.json(){
"type": "memory_version",
"id": "memver_1d3f5a7c9e0b4c2d8a6e4f2b0c9d7a35",
"memory_id": "mem_c4e8a2f6b0d14a3e9b7c5d1f3a8e6b20",
"memory_store_id": "memstore_6a1f9c3e5b7d4e2a8f0c1d3b5a7e9f24",
"operation": "created",
"path": null,
"content": null,
"content_sha256": null,
"content_size_bytes": null,
"created_by": {
"type": "api_actor",
"api_key_id": "apikey_7c1e3a5b9d2f4e6a8b0c4d6f2a1e9b35"
},
"created_at": "2026-10-20T09:20:41.007Z",
"redacted_at": "2026-10-25T17:12:03.418Z",
"redacted_by": {
"type": "api_actor",
"api_key_id": "apikey_7c1e3a5b9d2f4e6a8b0c4d6f2a1e9b35"
}
}