Endpoints
GET
Retrieve memories
POST
Create memory
PATCH
Update memory
DELETE
Delete memory
POST Batch
Create up to 25
Access and availability
Memory endpoints require a Developer API key with the corresponding scope:memories:read for reads and
memories:write for writes. Creating a key is self-service in Developer → API Keys, and creation
records the matching key grant when the key includes a memory scope.
Default memory reads also have a separate, server-owned account readiness gate. A valid, correctly scoped
key can therefore receive 403 while that account is not yet provisioned for Developer Memory API access.
Do not recreate the key in that case; retry after the account is enabled or contact Omi support if it remains
unavailable.
code is the stable programmatic signal. reason provides a diagnostic for the current server-side gate and
must not be treated as a key or scope error.
Get Memories
GET /v1/dev/user/memories
Retrieve your memories with optional filtering
Query Parameters
Query Parameters
- cURL
- Python
- JavaScript
Response Example
Response Example
Response Fields
Response Fields
Create Memory
POST /v1/dev/user/memories
Create a new memory
Request Body
Request Body
Duplicates and retries
Duplicates and retries
A memory is identified by its text. Sending text the user already has returns that memory unchanged, with the same
id, so a create is safe to retry without any extra header.Matching ignores leading and trailing whitespace and is case-sensitive. To change a memory you already created, use Update Memory with its
id.- cURL
- Python
- JavaScript
Response Example
Response Example
Create Memories (Batch)
POST /v1/dev/user/memories/batch
Create multiple memories in a single request (max 25)
Request Body
Request Body
Each memory object accepts the same fields as the single create endpoint.Items follow the same duplicate rule: text the user already has returns the existing memory at that position, so retrying a batch never stores anything twice.
created_count is the number of memories returned, including existing ones.- cURL
- Python
- JavaScript
Response Example
Response Example
Update Memory
PATCH /v1/dev/user/memories/{memory_id}
Update a memory’s content or visibility
Path Parameters
Path Parameters
Request Body
Request Body
At least one field must be provided.
- cURL
- Python
- JavaScript
Response Example
Response Example
Delete Memory
DELETE /v1/dev/user/memories/{memory_id}
Delete a memory permanently
Path Parameters
Path Parameters
- cURL
- Python
- JavaScript
Response Example
Response Example
What Are Memories?
Memories are timeless facts about the user. They cover preferences, relationships, personal details, and notable insights. They are NOT for notes, tasks, or time-sensitive information.
- Good memories: “User is vegetarian”, “User’s sister Sarah lives in Portland”, “User prefers async communication”
- Bad memories: “Meeting on March 15th”, “Call dentist tomorrow” (these are action items or conversations)
Use Case: Store User Preferences
Import known facts and preferences about the user:- Python
- JavaScript
Memory Categories Explained
system
Useful context for the AI: preferences, work details, relationships, logistical info. Example: “User prefers dark mode”
interesting
Shareable, notable facts: things the user would excitedly tell someone at dinner. Example: “User climbed Mount Kilimanjaro”
Pagination and search coverage
List responses remain arrays.limit is clamped to 1–1000. Read
X-Omi-Effective-Limit, X-Omi-Has-More, and X-Omi-Next-Offset for continuation.
X-Omi-List-Truncated: true signals that the read budget ran out. An empty
truncated page cannot guarantee progress; narrow the category filter or reduce
the page size. Unknown list parameters are ignored and counted in X-Omi-Ignored-Query-Params, except query, which returns 400; use the search route.
GET /v1/dev/user/memories/search?query=budget&limit=10 returns
{memories, effective_limit, search_coverage, message} using the same eligible
memory search as MCP. Limit is 1–20. It requires memories:read, the persisted
app/key memory grant, and account readiness. Empty indexed results do not prove
absence: inspect the memory list for unindexed content. Eligibility and privacy
rules apply to both paths; archive is excluded by default.
The existing /v1/dev/user/memories/vector/search remains available and reports
effective_limit (at most 20) plus coverage and an empty-result message.
The compatibility list has a 5000-item offset + limit window. Requests beyond
it return 413. A full page ending exactly at that boundary reports truncated
coverage without a next offset; it cannot certify that the account ends there.