Skip to main content

REST API: Memory store

The memory store endpoints are available only when a store is configured in agentflow.json. They provide cross-thread, semantic-search-enabled memory.

Base path: /v1/store

Every request body extends a common base, so all endpoints accept these two optional fields in addition to their own:

FieldTypeDescription
configobjectConfiguration values forwarded to the store backend (for example user_id, agent_id, or backend-specific keys). Defaults to {}.
optionsobjectExtra keyword arguments forwarded verbatim to the store backend.

Scoping a memory to a user or agent is done through config, not through top-level fields.


POST /v1/store/memories

Store a memory record. Requires store:write.

Request body:

{
"content": "User prefers concise responses.",
"memory_type": "episodic",
"category": "preference",
"metadata": {"source": "chat"},
"config": {"user_id": "user-123"}
}
FieldTypeRequiredDefaultDescription
contentstring or MessageyesMemory text, or a structured Message object
memory_typestringnoepisodicMemory classification used by the backend
categorystringnogeneralCategory label
metadataobjectnonullArbitrary metadata stored with the memory

Response:

{
"success": true,
"message": "Memory stored successfully",
"data": {"memory_id": "mem_abc123"}
}

POST /v1/store/search

Search memories by semantic similarity. Requires store:read.

Request body:

{
"query": "How does this user like to receive information?",
"category": "preference",
"limit": 5,
"config": {"user_id": "user-123"}
}
FieldTypeRequiredDefaultDescription
querystringyesSearch query. Empty or whitespace-only returns 422
memory_typestringnonullFilter by memory type
categorystringnonullFilter by category
limitintegerno10Maximum results. Must be greater than 0
score_thresholdfloatnonullMinimum similarity score for a result to be returned
filtersobjectnonullAdditional store-specific filters
retrieval_strategystringnosimilarityRetrieval strategy used by the backend
distance_metricstringnocosineDistance metric applied during similarity search
max_tokensintegerno4000Token budget used for truncation during similarity search

Response:

{
"success": true,
"data": {
"results": [
{
"memory_id": "mem_abc123",
"content": "User prefers concise responses.",
"score": 0.91,
"metadata": {"category": "preference"}
}
]
}
}

POST /v1/store/memories/list

List stored memories. Requires store:read.

This is a POST because the request carries a config object; there is no GET variant.

Request body (optional):

{
"limit": 50,
"config": {"user_id": "user-123"}
}
FieldTypeRequiredDefaultDescription
limitintegerno100Maximum memories to return. Values <= 0 return 422

Sending no body at all is valid and applies the defaults.

Response:

{
"success": true,
"data": {
"memories": [
{
"memory_id": "mem_abc123",
"content": "User prefers concise responses.",
"metadata": {"category": "preference"}
}
]
}
}

POST /v1/store/memories/{memory_id}

Get a single memory by ID. Requires store:read.

The body is optional and carries only config and options. An empty or whitespace-only memory_id returns 422.

Response:

{
"success": true,
"data": {
"memory": {
"memory_id": "mem_abc123",
"content": "User prefers concise responses.",
"metadata": {}
}
}
}
note

list and forget are registered before this catch-all route, so POST /v1/store/memories/list lists memories rather than fetching a memory whose ID is the literal string list.


PUT /v1/store/memories/{memory_id}

Update a stored memory. Requires store:write.

Request body:

{
"content": "Updated memory content.",
"metadata": {"updated": true}
}
FieldTypeRequiredDescription
contentstring or MessageyesReplacement content
metadataobjectnoReplacement metadata

Response:

{
"success": true,
"message": "Memory updated successfully",
"data": {"success": true}
}

DELETE /v1/store/memories/{memory_id}

Delete one memory record. Requires store:delete.

The body is optional and carries only config and options.

Response:

{
"success": true,
"message": "Memory deleted successfully",
"data": {"success": true}
}

POST /v1/store/memories/forget

Delete every memory matching the given filters. Requires store:delete.

Request body:

{
"memory_type": "episodic",
"category": "preference",
"filters": {"source": "chat"},
"config": {"user_id": "user-123"}
}
FieldTypeRequiredDescription
memory_typestringnoRestrict deletion to one memory type
categorystringnoRestrict deletion to one category
filtersobjectnoAdditional backend filters

Response:

{
"success": true,
"message": "Memories removed successfully",
"data": {"success": true}
}

Permissions

OperationRequired permission
Store, updatestore:write
Search, get, liststore:read
Delete, forgetstore:delete