Memories
Memories endpoints of the Ellipsis REST API.
Returns the memories rendered as a markdown index (one line per memory, carrying its id, path, and description) plus the same entries structured, each with every field except `content`. Read the index, then fetch the ids whose content you want.
curl "https://api.ellipsis.dev/memories" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"{
"index": "string",
"memories": [
{
"content_sha256": "string",
"created_at": "2026-01-01T00:00:00Z",
"created_by": {
"id": "string",
"type": "agent_session"
},
"description": "string",
"id": "string",
"path": "string",
"updated_at": "2026-01-01T00:00:00Z",
"updated_by": {
"id": "string",
"type": "agent_session"
}
}
]
}{
"properties": {
"index": {
"type": "string"
},
"memories": {
"items": {
"properties": {
"content_sha256": {
"type": "string"
},
"created_at": {
"format": "date-time",
"type": "string"
},
"created_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
},
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"path": {
"type": "string"
},
"updated_at": {
"format": "date-time",
"type": "string"
},
"updated_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
}
},
"required": [
"id",
"path",
"description",
"content_sha256",
"created_by",
"updated_by",
"created_at",
"updated_at"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"index",
"memories"
],
"type": "object"
}Request
Limit to memories under this path prefix, matched on whole segments — repos/acme matches repos/acme/x.md but not repos/acme2/x.md.
Responses
Memories are durable lessons shared across the whole organization — conventions, past decisions, known gotchas that an agent cannot derive from the repository itself. One concise fact per memory; the description is what a reader sees in the index. Creating never overwrites: a path that already exists is a 409, so correcting an existing memory is an explicit edit.
curl -X POST "https://api.ellipsis.dev/memories" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "...",
"description": "...",
"path": "..."
}'{
"content": "string",
"content_sha256": "string",
"created_at": "2026-01-01T00:00:00Z",
"created_by": {
"id": "string",
"type": "agent_session"
},
"description": "string",
"id": "string",
"path": "string",
"updated_at": "2026-01-01T00:00:00Z",
"updated_by": {
"id": "string",
"type": "agent_session"
}
}{
"properties": {
"content": {
"type": "string"
},
"description": {
"type": "string"
},
"path": {
"type": "string"
}
},
"required": [
"path",
"description",
"content"
],
"type": "object"
}{
"properties": {
"content": {
"type": "string"
},
"content_sha256": {
"type": "string"
},
"created_at": {
"format": "date-time",
"type": "string"
},
"created_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
},
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"path": {
"type": "string"
},
"updated_at": {
"format": "date-time",
"type": "string"
},
"updated_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
}
},
"required": [
"id",
"path",
"description",
"content",
"content_sha256",
"created_by",
"updated_by",
"created_at",
"updated_at"
],
"type": "object"
}Request
The memory's markdown content, at most 100 KB of UTF-8.
A one-line summary, at most 200 characters and no newlines. This is the only thing a reader sees in the index, so make it say what the memory is for.
Where to store the memory. A memory path is slash-separated segments of [a-z0-9._-], with no leading or trailing slash, no empty segments, no '.' or '..' segments, at most 512 characters, ending in '.md'.
Responses
The id comes from the index returned by listing memories.
curl "https://api.ellipsis.dev/memories/{memory_id}" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"{
"content": "string",
"content_sha256": "string",
"created_at": "2026-01-01T00:00:00Z",
"created_by": {
"id": "string",
"type": "agent_session"
},
"description": "string",
"id": "string",
"path": "string",
"updated_at": "2026-01-01T00:00:00Z",
"updated_by": {
"id": "string",
"type": "agent_session"
}
}{
"properties": {
"content": {
"type": "string"
},
"content_sha256": {
"type": "string"
},
"created_at": {
"format": "date-time",
"type": "string"
},
"created_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
},
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"path": {
"type": "string"
},
"updated_at": {
"format": "date-time",
"type": "string"
},
"updated_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
}
},
"required": [
"id",
"path",
"description",
"content",
"content_sha256",
"created_by",
"updated_by",
"created_at",
"updated_at"
],
"type": "object"
}Request
Responses
Pass description, content, or both. This never creates a memory (an unknown id is a 404) and never moves one — the path is immutable, so relocating a memory is a delete plus a create. Pass `if_sha256` (from a previous read) to make a concurrent write a 409 instead of silently overwriting it.
curl -X PUT "https://api.ellipsis.dev/memories/{memory_id}" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'{
"content": "string",
"content_sha256": "string",
"created_at": "2026-01-01T00:00:00Z",
"created_by": {
"id": "string",
"type": "agent_session"
},
"description": "string",
"id": "string",
"path": "string",
"updated_at": "2026-01-01T00:00:00Z",
"updated_by": {
"id": "string",
"type": "agent_session"
}
}{
"properties": {
"content": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"if_sha256": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"type": "object"
}{
"properties": {
"content": {
"type": "string"
},
"content_sha256": {
"type": "string"
},
"created_at": {
"format": "date-time",
"type": "string"
},
"created_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
},
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"path": {
"type": "string"
},
"updated_at": {
"format": "date-time",
"type": "string"
},
"updated_by": {
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"agent_session",
"api_key",
"user"
],
"type": "string"
}
},
"required": [
"type",
"id"
],
"type": "object"
}
},
"required": [
"id",
"path",
"description",
"content",
"content_sha256",
"created_by",
"updated_by",
"created_at",
"updated_at"
],
"type": "object"
}Request
Replacement markdown content. Omit to keep it.
Replacement one-line summary. Omit to keep it.
Only apply the edit if the memory's current content_sha256 matches. Returns 409 if it doesn't, so a concurrent write is a visible conflict rather than a silent overwrite.
Responses
Available to every credential type, agents included — a wrong memory is worse than a missing one. The deleted content is kept in the memory's history for forensics, not for an undo API.
curl -X DELETE "https://api.ellipsis.dev/memories/{memory_id}" \
-H "Authorization: Bearer $ELLIPSIS_API_KEY"Request
Only delete if the memory's current content_sha256 matches.