Download OpenAPI specification:
AgentMemory is a persistent, semantic memory service for AI agents. It stores conversation history, extracted facts, and vector embeddings, enabling agents to recall relevant past context across sessions and conversations.
AgentMemory organizes data in a three-level hierarchy:
When a memory block is written, AgentMemory generates its vector embedding before responding,
so every block is searchable as soon as the write returns. The optional LLM-generated summary
and contexts are produced separately, by default asynchronously in the background. Search
returns blocks in any status: a processing or extraction_failed block has no summary or
contexts yet, only its raw content.
Authentication is optional and controlled by the OIDC_AUTH_ENABLED server configuration.
When enabled, all endpoints except GET /health and GET /metrics require a valid JWT
Bearer token issued by the configured OIDC provider.
Include the token in every request: Authorization: Bearer <token>
Tokens are validated against the provider's JWKS endpoint. A 401 response indicates a
missing, malformed, or expired token.
Role-based authorization is a separate switch, AGENTMEMORY_AUTHZ_ENABLED, off by default.
When it is off, any valid token reaches every endpoint. When it is on, the token's roles claim
must carry at least one of three ranked roles:
| Role | Grants |
|---|---|
ams_ro |
Reads: search, get, list, and the /health/* diagnostics |
ams_rw |
Everything ams_ro does, plus user, session, and memory mutations |
ams_admin |
Everything, plus GET /users, prompt mutations, and GET /logs/collect |
Ranks are cumulative, so a single role is enough - ams_admin does not also need the lower two.
Roles the server does not recognize are ignored rather than rejected, so unrelated realm roles in
the same claim are harmless. A token carrying none of the three is denied on every non-public
endpoint.
A 403 response means the token was valid but its rank was below what the endpoint requires; the
response body names the role needed, for example
Insufficient permissions. Required role: ams_rw or higher.
All request and response bodies use application/json. All timestamps are ISO 8601 strings
in UTC. Errors are returned as a JSON object with an error code, a human-readable
message, and an optional details field.
Memory block ingestion is accepted immediately, but semantic extraction (embedding generation
and summarization) is rate-limited by the configured model provider. If the extraction queue
reaches capacity, ingestion requests return 503 with a retry_after_seconds field.
Create and manage user identities. A user is the top-level entity in the AgentMemory hierarchy - every session and memory block is owned by a user.
The user_id is application-defined and must be unique across the deployment. Use your application's native user identifier (UUID, account ID, or similar) as user_id to avoid maintaining a separate mapping table.
Deleting a user is a cascade operation - it permanently removes all sessions and memory blocks associated with that user. There is no soft-delete or recovery.
Create a new user with the specified ID, name, and optional metadata.
The user_id must be unique — attempting to create a user with an existing ID returns a conflict error.
| user_id required | string (User Id) Unique user ID. Must not be blank. A duplicate returns 409. |
| name required | string (Name) Display name. Must not be blank. |
Metadata (object) or Metadata (null) (Metadata) Free-form JSON stored with the user. GET /users can filter on its values. |
{- "user_id": "user_123",
- "name": "John Doe",
- "metadata": {
- "department": "Engineering",
- "level": "senior",
- "role": "developer"
}
}{- "id": "string",
- "name": "string",
- "sessions": [
- "string"
], - "metadata": { }
}Retrieve users, optionally filtered by name and/or metadata, paginated.
Criteria are combined with AND logic and match on exact equality — no wildcards.
Returns an empty list if no users match, or if no users exist.
Name (string) or Name (null) (Name) Filter by exact user name | |
Array of Metadata (strings) or Metadata (null) (Metadata) Filter by metadata, as repeated | |
| limit | integer (Limit) [ 1 .. 500 ] Default: 50 |
| offset | integer (Offset) >= 0 Default: 0 |
{- "users": [
- {
- "id": "string",
- "name": "string",
- "sessions": [
- "string"
], - "metadata": { }
}
], - "count": 0,
- "total": 0,
- "limit": 1,
- "offset": 0
}Retrieve a single user by ID. Responds with 404 if no such user exists. Filtered lookup lives on the List Users endpoint.
| user_id required | string (User Id) Unique identifier for the user |
{- "id": "string",
- "name": "string",
- "sessions": [
- "string"
], - "metadata": { }
}Update an existing user's name and/or metadata.
At least one field must be provided. Omitted fields retain their existing values.
| user_id required | string (User Id) Unique identifier for the user |
Name (string) or Name (null) (Name) New display name. Omit to keep the current one. | |
Metadata (object) or Metadata (null) (Metadata) Replaces the whole metadata object (no merge). Omit to keep the current one. At least one of name or metadata is required. |
{- "name": "Jane Smith",
- "metadata": {
- "department": "Engineering",
- "role": "senior_developer"
}
}{- "id": "string",
- "name": "string",
- "sessions": [
- "string"
], - "metadata": { }
}Permanently delete a user and all associated sessions and memory blocks. This operation is irreversible — there is no soft-delete or recovery.
| user_id required | string (User Id) Unique identifier for the user |
{- "error": "AUTHENTICATION_REQUIRED",
- "message": "Authentication required"
}Update the time-to-live (TTL) for memory blocks belonging to a user. Optionally scope the update to one session, or to specific block IDs within that session (block_ids requires session_id). Every targeted session must already be ended; open sessions are rejected before any block is retimed.
| user_id required | string (User Id) Unique identifier for the user |
Session Id (string) or Session Id (null) (Session Id) Session to retime. Omit to retime every session the user owns. Every targeted session must already be ended. | |
Array of Block Ids (strings) or Block Ids (null) (Block Ids) Retime only these blocks. Requires session_id, and every ID must belong to that session. | |
| new_ttl required | integer (New Ttl) >= 0 New TTL in seconds, counted from this call. 0 removes the expiry so the blocks never expire. |
{- "session_id": "string",
- "block_ids": [
- "string"
], - "new_ttl": 0
}nullRetrieve a user's sessions, including lifecycle state and annotations, paginated. Returns an empty list if the user has no sessions.
| user_id required | string (User Id) Unique identifier for the user |
| limit | integer (Limit) [ 1 .. 500 ] Default: 50 |
| offset | integer (Offset) >= 0 Default: 0 |
{- "sessions": [
- {
- "user_id": "string",
- "session_id": "string",
- "start_time": "string",
- "end_time": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "metadata": { },
- "blocks_ttl": 0
}
], - "count": 0,
- "total": 0,
- "limit": 1,
- "offset": 0
}Create and manage conversation sessions. A session scopes memory blocks and defines the default retrieval boundary for semantic search.
Sessions have a two-state lifecycle:
POST /users/{user_id}/sessions/{session_id}/end to end a session.Deleting a session cascades to all of its memory blocks.
Create a new session for the specified user.
The session_id must be unique per user — attempting to create a session with a duplicate ID returns a conflict error.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Session ID, unique per user. Must not be blank. A duplicate returns 409. |
Annotations (object) or Annotations (null) (Annotations) String key/value labels stored with the session. | |
Metadata (object) or Metadata (null) (Metadata) Free-form JSON stored with the session. | |
Memory Blocks Ttl (integer) or Memory Blocks Ttl (null) (Memory Blocks Ttl) Default TTL in seconds for blocks added to this session without their own memory_block_ttl. Omit or 0 for no session default: blocks then use AGENTMEMORY_MEMORY_BLOCK_TTL if set, otherwise never expire. |
{- "session_id": "session_456",
- "annotations": {
- "category": "technical",
- "intent": "support"
}, - "metadata": {
- "platform": "ios",
- "source": "web_chat"
}, - "memory_blocks_ttl": 3600
}{- "user_id": "string",
- "session_id": "string",
- "start_time": "string",
- "end_time": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "metadata": { },
- "blocks_ttl": 0
}Retrieve a session by ID, including its lifecycle state, annotations, and metadata.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
{- "user_id": "string",
- "session_id": "string",
- "start_time": "string",
- "end_time": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "metadata": { },
- "blocks_ttl": 0
}Update a session's annotations and/or metadata. At least one field must be provided. Omitted fields retain their existing values.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
Annotations (object) or Annotations (null) (Annotations) Replaces all session annotations (no merge). Omit to keep them. Must not be an empty object. | |
Metadata (object) or Metadata (null) (Metadata) Replaces all session metadata (no merge). Omit to keep it. Must not be an empty object. |
{- "annotations": {
- "intent": "support",
- "status": "resolved"
}, - "metadata": {
- "duration": 1200,
- "satisfaction": "high"
}
}{- "user_id": "string",
- "session_id": "string",
- "start_time": "string",
- "end_time": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "metadata": { },
- "blocks_ttl": 0
}Permanently delete a session and all its memory blocks. This operation is irreversible.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
{- "error": "AUTHENTICATION_REQUIRED",
- "message": "Authentication required"
}Mark a session as ended. Once ended, no new memory blocks can be added.
Existing memory blocks remain readable and searchable. Returns the updated session with end_time set.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
{- "user_id": "string",
- "session_id": "string",
- "start_time": "string",
- "end_time": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "metadata": { },
- "blocks_ttl": 0
}Add, retrieve, update, and search memory blocks. A memory block is the atomic unit of knowledge - each block holds either a chat message exchange or a standalone fact, and is automatically processed for semantic search.
Adding memory - Submit messages or facts in a single request. Semantic extraction runs asynchronously by default; blocks are readable and searchable immediately, and their extracted facts appear once extraction completes.
Searching memory - Provide a natural-language query to retrieve semantically similar blocks. Search is session-scoped by default. Set filters.session_ids to "all" to search across all sessions for a user. Blocks still being processed are returned with their raw content.
TTL and expiry - Memory blocks carry an optional time-to-live in seconds. TTL can be set per-block, per-session, or globally via server configuration.
Add one or more memory blocks to the session. Each block holds either a chat message (user + assistant turn) or a fact (declarative string). Blocks are written immediately and queued for semantic extraction. The session must be open — ended sessions reject new blocks.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
Array of Messages (objects) or Messages (null) (Messages) Chat exchanges to store, one block per message. Send exactly one of messages or facts. | |
Array of Facts (strings) or Facts (null) (Facts) Facts to store, one block per fact. Each must be non-blank. Send exactly one of messages or facts. | |
Annotations (object) or Annotations (null) (Annotations) Keys must match ^[a-zA-Z_][a-zA-Z0-9_]*$ (letters, digits, underscore; not starting with a digit): each key becomes an index field and a query identifier. Values are free-form strings. | |
Created At (string) or Created At (null) (Created At) ISO 8601 timestamp indicating when the data was originally created. Defaults to the ingestion time if not provided. | |
| async_processing | boolean (Async Processing) Default: true If true, returns once blocks are stored with status processing, and LLM extraction runs in the background. If false, extraction finishes before the response. Embeddings are always generated before the response, so blocks are searchable either way. |
Memory Block Ttl (integer) or Memory Block Ttl (null) (Memory Block Ttl) TTL in seconds for the new blocks; 0 means never expire. Omit to use the session's blocks_ttl, then AGENTMEMORY_MEMORY_BLOCK_TTL, otherwise no expiry. | |
Context Required (boolean) or Context Required (null) (Context Required) Whether to run LLM extraction (summary and contexts). Omit to use AGENTMEMORY_EXTRACT_SEMANTIC (default true). | |
Prompt Id (string) or Prompt Id (null) (Prompt Id) Registry prompt_id to use for extraction. Must already exist (and not be archived) - an unresolvable prompt_id rejects the whole call before any work is done. | |
Prompt Vid (integer) or Prompt Vid (null) (Prompt Vid) Pin extraction to this exact immutable registry version of prompt_id, rather than late-binding to whatever prompt_id currently says. Requires prompt_id to also be provided in the same call - rejected otherwise. |
{- "messages": [
- {
- "assistant_content": "It's sunny and 72°F.",
- "user_content": "What's the weather?"
}
], - "facts": [
- "User prefers email notifications",
- "User is allergic to peanuts"
], - "annotations": {
- "category": "preferences",
- "importance": "high"
}, - "created_at": "2024-06-15T12:00:00",
- "async_processing": true,
- "memory_block_ttl": 3600,
- "context_required": true,
- "prompt_id": "support_tickets",
- "prompt_vid": 1
}{- "message": "Successfully added 2 memory block(s)",
- "accepted_count": 2,
- "block_ids": [
- "block-abc123",
- "block-def456"
], - "rejected_count": 1,
- "rejected_details": {
- "actual_tokens": 500,
- "input_index": 0,
- "per_request_token_limit": 400,
- "reason": "memory block exceeds per-request token limit"
}
}Delete memory blocks by ID. Pass a list of block IDs to delete specific blocks,
or "all" to delete every block in the session.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
required | Array of Block Ids (strings) or "all" (string) (Block Ids) Block IDs to delete, or "all" for every block in the session. |
{- "block_ids": [
- "string"
]
}{- "deleted_count": 0,
- "failed_count": 0,
- "failed_block_ids": [ ]
}Update the content, annotations, or TTL of an existing memory block.
Providing a new message or fact triggers re-extraction (new embedding and summary).
Changing prompt_id or prompt_vid also triggers re-extraction. Omitted fields retain
their existing values. To retry a block with status: extraction_failed, resend its
message or fact: that re-runs extraction and resets fail_count.
async_processing only controls whether that extraction runs in the background.
If the block does not exist or has expired due to TTL, responds with 404.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
| block_id required | string (Block Id) Unique identifier for the memory block |
ChatMessage (object) or null New content for a message block. Rejected on a fact block. Re-embeds the block and re-runs extraction. | |
Fact (string) or Fact (null) (Fact) New content for a fact block. Rejected on a message block. Re-embeds the block and re-runs extraction. | |
Annotations (object) or Annotations (null) (Annotations) New annotations to overwrite existing ones. If None, existing annotations are preserved. Keys must match ^[a-zA-Z_][a-zA-Z0-9_]*$ (letters, digits, underscore; not starting with a digit): each key becomes an index field and a query identifier. Values are free-form strings. | |
Memory Block Ttl (integer) or Memory Block Ttl (null) (Memory Block Ttl) New TTL in seconds. If None, existing TTL is preserved. | |
| async_processing | boolean (Async Processing) Default: false If True, semantic extraction runs in background via queue. |
Context Required (boolean) or Context Required (null) (Context Required) Whether semantic extraction is required. If None, uses environment variable. | |
Prompt Id (string) or Prompt Id (null) (Prompt Id) Omit to inherit the block's existing prompt_id/prompt_vid. Pass the literal string "default" to explicitly clear both to None. Pass a real prompt_id to switch - must already exist (and not be archived). | |
Prompt Vid (integer) or Prompt Vid (null) (Prompt Vid) Pin extraction to this exact immutable registry version of prompt_id. Requires a real prompt_id in this same call - rejected if prompt_id is omitted or is 'default'. |
{- "message": {
- "assistant_content": "Updated answer",
- "user_content": "Updated question"
}, - "fact": "Updated fact about the user",
- "annotations": {
- "category": "updated",
- "importance": "high"
}, - "memory_block_ttl": 3600,
- "async_processing": true,
- "context_required": true,
- "prompt_id": "support_tickets",
- "prompt_vid": 1
}{- "message": "Memory block updated successfully",
- "block": {
- "block_id": "string",
- "user_id": "string",
- "session_id": "string",
- "message": {
- "user_content": "What's the weather today?",
- "assistant_content": "It's sunny and 72°F."
}, - "fact": "string",
- "ingested_at": "string",
- "created_at": "string",
- "last_queued_at": "string",
- "fail_count": 0,
- "prompt_id": "string",
- "prompt_vid": 0,
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "summary": "string",
- "contexts": [
- "string"
], - "status": "processing",
- "rel_score": 0
}
}Retrieve memory blocks using semantic similarity and/or filters. Provide a natural-language
query to rank blocks by relevance, or use filters alone for deterministic retrieval.
Search is session-scoped by default — set filters.session_ids to "all" to search
across all sessions for the user. Blocks still being processed are included and
carry their raw content until extraction finishes.
| user_id required | string (User Id) Unique identifier for the user |
| session_id required | string (Session Id) Unique identifier for the session |
Query (string) or Query (null) (Query) Natural-language text to rank blocks by semantic similarity. Omit to retrieve by filters only. | |
FilterOptions (object) or null Scope and filters. Omit to search the current session with defaults. |
{- "query": "What are the user's preferences?",
- "filters": {
- "start_time": "2025-12-22T00:00:00",
- "end_time": "2025-12-22T23:59:59",
- "created_start_time": "2025-12-22T00:00:00",
- "created_end_time": "2025-12-22T23:59:59",
- "session_ids": [
- "session_123",
- "session_456"
], - "block_ids": [
- "block_001",
- "block_002"
], - "relevant_k": 10,
- "annotations": {
- "importance": "high"
}, - "annotation_filter_mode": "pre",
- "order_by": "ingested_at",
- "prompt_id": "support_tickets",
- "prompt_vid": 1
}
}{- "memory_blocks": [
- {
- "block_id": "string",
- "user_id": "string",
- "session_id": "string",
- "message": {
- "user_content": "What's the weather today?",
- "assistant_content": "It's sunny and 72°F."
}, - "fact": "string",
- "ingested_at": "string",
- "created_at": "string",
- "last_queued_at": "string",
- "fail_count": 0,
- "prompt_id": "string",
- "prompt_vid": 0,
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "summary": "string",
- "contexts": [
- "string"
], - "status": "processing",
- "rel_score": 0
}
], - "count": 0
}Paginated list of memory blocks for a user, ordered newest first.
Use session_ids to scope results to specific sessions.
Always specify limit and offset — unbounded requests on large datasets are slow.
| user_id required | string (User Id) Unique identifier for the user |
Session Ids (string) or Session Ids (null) (Session Ids) Comma-separated session IDs to filter by, or 'all' for all sessions | |
| limit | integer (Limit) [ 1 .. 200 ] Default: 20 Maximum number of memory blocks to return (1–200) |
| offset | integer (Offset) >= 0 Default: 0 Number of memory blocks to skip for pagination |
| order_by | string (Order By) Default: "ingested_at" Enum: "ingested_at" "created_at" Field to order results by. Defaults to 'ingested_at'. |
{- "memory_blocks": [
- {
- "block_id": "string",
- "user_id": "string",
- "session_id": "string",
- "message": {
- "user_content": "What's the weather today?",
- "assistant_content": "It's sunny and 72°F."
}, - "fact": "string",
- "ingested_at": "string",
- "created_at": "string",
- "last_queued_at": "string",
- "fail_count": 0,
- "prompt_id": "string",
- "prompt_vid": 0,
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "summary": "string",
- "contexts": [
- "string"
], - "status": "processing",
- "rel_score": 0
}
], - "count": 0,
- "total": 0,
- "limit": 1,
- "offset": 0
}Manage the custom extraction prompt registry. A prompt is a named, versioned block of extraction instructions that add_memory/update_memory can reference by prompt_id to customize what gets extracted from a memory block, without touching the locked output schema.
prompt_id is the only identifier - fixed at creation, no renaming. Every update to prompt text appends to an audit-only version history; there is no rollback endpoint.
Register a new named custom extraction prompt.
prompt_id must be globally unique -- a duplicate, or a previously
archived prompt_id, returns a conflict error. A previously purged
prompt_id is genuinely gone and can be freely re-registered.
| prompt_id required | string (Prompt Id) <= 128 characters ^[a-zA-Z0-9_-]+$ Only letters, digits, underscores, and hyphens - avoids collision with the internal prompt:: |
| prompt required | string (Prompt) <= 4000 characters Max 4000 characters (~1000 tokens) - keeps custom instructions well within any model's context budget alongside real block content. |
| description required | string (Description) <= 200 characters Short, human-written summary of what this prompt is for - shown in GET /prompts list results for discoverability. No fixed template required; aim for something like the example. |
Annotations (object) or Annotations (null) (Annotations) String key/value labels. Not versioned. |
{- "prompt_id": "support_tickets",
- "prompt": "Focus on product issues, error codes, and resolution steps.",
- "description": "Use for support ticket extraction - focuses on product issues and resolution steps",
- "annotations": {
- "category": "tickets",
- "team": "support"
}
}{- "prompt_id": "string",
- "prompt": "string",
- "description": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "current_vid": 0,
- "version_count": 0,
- "last_updated_at": "string",
- "archived": false
}List registered prompts (lean head-doc shape, no version history),
paginated. Archived prompts are included, flagged via archived.
| limit | integer (Limit) [ 1 .. 1000 ] Default: 100 |
| offset | integer (Offset) >= 0 Default: 0 |
{- "prompts": [
- {
- "prompt_id": "string",
- "prompt": "string",
- "description": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "current_vid": 0,
- "version_count": 0,
- "last_updated_at": "string",
- "archived": false
}
], - "count": 0,
- "total": 0,
- "limit": 1,
- "offset": 0
}Retrieve a prompt's current state, or (if vid is given) a single
historical version's text along with whether it's archived and whether
it's the current version. Use GET .../versions for the full history.
| prompt_id required | string (Prompt Id) ^[a-zA-Z0-9_-]+$ Unique identifier for the prompt |
| vid | integer (Vid) >= 0 If given, retrieve this specific version instead. |
{- "prompt_id": "string",
- "prompt": "string",
- "description": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "current_vid": 0,
- "version_count": 0,
- "last_updated_at": "string",
- "archived": false
}Update a prompt. Providing prompt creates a new, immutable version;
description/annotations are updated in place and never versioned.
Omitting a field preserves its existing value. Returns a conflict error
if the prompt has been archived.
| prompt_id required | string (Prompt Id) ^[a-zA-Z0-9_-]+$ Unique identifier for the prompt |
Prompt (string) or Prompt (null) (Prompt) Max 4000 characters (~1000 tokens). Omit to preserve the existing text (no new version created). | |
Description (string) or Description (null) (Description) Omit to preserve the existing description. Never versioned (same as annotations) - updating it does not create a new prompt version. | |
Annotations (object) or Annotations (null) (Annotations) Replaces all annotations (no merge). Omit to keep them. Never versioned. |
{- "prompt": "Focus on billing disputes and refund policy exceptions.",
- "description": "Use for billing-dispute extraction - refunds and exceptions",
- "annotations": {
- "team": "billing"
}
}{- "prompt_id": "string",
- "prompt": "string",
- "description": "string",
- "annotations": {
- "property1": "string",
- "property2": "string"
}, - "current_vid": 0,
- "version_count": 0,
- "last_updated_at": "string",
- "archived": false
}Permanently delete a prompt (vid=all) or a single version of it
(vid=<int>). Irreversible. vid=all removes the prompt and its
entire history and frees prompt_id for re-registration; memory blocks
still queued against it fall back to the default extraction behavior.
vid=<int> removes just that one version, leaving the rest of the
history untouched.
| prompt_id required | string (Prompt Id) ^[a-zA-Z0-9_-]+$ Unique identifier for the prompt |
| vid required | string (Vid) "all" for the whole prompt, or a version number for just that one version. Required -- there is no default -- so a caller can never silently escalate to the wrong scope by omitting it. |
{- "error": "INVALID_REQUEST",
- "message": "Invalid request"
}List a prompt's version history, paginated. Each item indicates whether that specific version is archived and whether it's the current version. Returns a not-found error if prompt_id doesn't exist.
| prompt_id required | string (Prompt Id) ^[a-zA-Z0-9_-]+$ Unique identifier for the prompt |
| limit | integer (Limit) [ 1 .. 1000 ] Default: 100 |
| offset | integer (Offset) >= 0 Default: 0 |
{- "versions": [
- {
- "prompt_id": "string",
- "vid": 0,
- "prompt": "string",
- "updated_at": "string",
- "archived": false,
- "is_current": false
}
], - "count": 0,
- "total": 0,
- "limit": 1,
- "offset": 0
}Archive a prompt (vid=all) or a single version of it
(vid=<int>) without deleting it -- content and history are
retained. vid=all blocks all new references and permanently
reserves prompt_id against reuse; vid=<int> blocks only new
references pinned to that exact version. Anything already in progress
resolves normally either way.
| prompt_id required | string (Prompt Id) ^[a-zA-Z0-9_-]+$ Unique identifier for the prompt |
| vid required | string (Vid) "all" for the whole prompt, or a version number for just that one version. Required -- there is no default -- so a caller can never silently escalate to the wrong scope by omitting it. |
{- "error": "INVALID_REQUEST",
- "message": "Invalid request"
}Monitor the operational status of AgentMemory and its dependencies.
GET /health is a public endpoint suitable for load balancer health probes. All other health endpoints require authentication and provide deeper diagnostic detail about the database connection, model service availability, and the semantic extraction queue.
| Status | Meaning |
|---|---|
healthy |
Component is operating normally |
degraded |
Component is reachable but not fully functional |
unhealthy |
Component is unreachable or critically impaired |
Check reachability and status of the configured embedding and LLM model services.
status is healthy when both models are healthy, degraded when either is rate
limited, and unhealthy when either is in any other state, in which case memory
routes that need that model return 503.
{- "status": "healthy",
- "embedding": {
- "status": "string",
- "model": "string",
- "retry_after": 0
}, - "llm": {
- "status": "string",
- "model": "string",
- "retry_after": 0
}
}Return lightweight readiness status for the semantic extraction queue.
{- "status": "string",
- "message": "string",
- "queue": {
- "size": 0,
- "queued_ids": 0,
- "processing": 0,
- "max_size": 0
}, - "rate_budget": {
- "available_requests": 0,
- "available_tokens": 0,
- "max_requests_per_minute": 0,
- "max_tokens_per_minute": 0,
- "per_request_token_limit": 0
}, - "statistics": {
- "total_enqueued": 0,
- "total_recovered": 0,
- "total_dispatched": 0,
- "total_completed": 0,
- "total_failed": 0,
- "queue_full": 0,
- "queue_duplicates": 0,
- "queue_oversized": 0,
- "recovery_duplicates": 0,
- "active_tasks": 0,
- "loop_running": true,
- "dispatcher_alive": true
}, - "loop_running": true,
- "dispatcher_alive": true
}Return detailed queue depth, model API rate budget, and cumulative throughput statistics for the semantic extraction queue.
{- "status": "string",
- "message": "string",
- "queue": {
- "size": 0,
- "queued_ids": 0,
- "processing": 0,
- "max_size": 0
}, - "rate_budget": {
- "available_requests": 0,
- "available_tokens": 0,
- "max_requests_per_minute": 0,
- "max_tokens_per_minute": 0,
- "per_request_token_limit": 0
}, - "statistics": {
- "total_enqueued": 0,
- "total_recovered": 0,
- "total_dispatched": 0,
- "total_completed": 0,
- "total_failed": 0,
- "queue_full": 0,
- "queue_duplicates": 0,
- "queue_oversized": 0,
- "recovery_duplicates": 0,
- "active_tasks": 0,
- "loop_running": true,
- "dispatcher_alive": true
}, - "loop_running": true,
- "dispatcher_alive": true
}Return current memory usage relative to the configured quota threshold. When usage exceeds the threshold, new ingestion requests are rejected until pressure subsides.
{- "status": "string",
- "message": "string",
- "accepting_requests": true,
- "usage_percent": 0,
- "threshold_percent": 0,
- "last_check": 0
}Expose Prometheus-compatible metrics for monitoring and alerting. This endpoint is public and requires no authentication, making it suitable for Prometheus scrape targets and infrastructure monitoring tools.
Download a ZIP archive of server logs and optional system diagnostics. Use this endpoint to collect diagnostic data for support requests or incident post-mortems. Requires authentication.
Download server logs and optional system diagnostics as a ZIP archive.
Use log_types to select log categories and start_time/end_time to narrow the time range.
Add sys_commands to include live system snapshots (CPU, memory, disk, network) in the archive.
Include this archive in support requests and incident post-mortems.
Start Time (string) or Start Time (null) (Start Time) Include log lines at or after this timestamp | |
End Time (string) or End Time (null) (End Time) Include log lines at or before this timestamp | |
Array of Log Types (strings) or Log Types (null) (Log Types) Log categories to include | |
Array of Sys Commands (strings) or Sys Commands (null) (Sys Commands) Optional system commands to run and include in the archive |
null