Memory stores
A memory store is a place where an agent keeps what it has learned so it can use it in later sessions: a customer’s preferences, the outcome of a past ticket, facts about a project. Without one, every session starts from nothing except the agent’s instructions.
Memory is opt-in. You create a store, attach it to an agent definition, and the agent gets two built-in tools to use it: one to search memories and one to write them. You can also read, add, correct and delete memories yourself through the API, which is how you seed a store, review what an agent remembered, and meet deletion requests.
When to use it
| Use a memory store for | Use something else for |
|---|---|
| Facts learned during conversations that should carry over | Fixed reference material: put it in the instructions, a skill or a file |
| Per-customer or per-user context across many sessions | The history of one conversation: the session already keeps it |
| Lessons the agent should apply next time (“this customer prefers email”) | Secrets: use a vault |
How scoping works
Each memory carries a scope string that you choose, such as customer:4821 or team:support. When a session starts, you pass memory_scope on POST /v1/sessions; the agent then reads and writes only memories with that scope (plus memories with the scope global, which it can read but not write unless the store allows it). One store can therefore serve thousands of customers without one customer’s memories reaching another’s session.
Endpoints
| Method | Path | Purpose |
|---|---|---|
POST | /v1/memory_stores | Create a store. |
GET | /v1/memory_stores | List stores. |
GET | /v1/memory_stores/{store_id} | Read a store’s settings and counts. |
PATCH | /v1/memory_stores/{store_id} | Change settings. |
DELETE | /v1/memory_stores/{store_id} | Delete the store and every memory in it. |
POST | /v1/memory_stores/{store_id}/memories | Add a memory. |
GET | /v1/memory_stores/{store_id}/memories | List memories, filtered by scope. |
POST | /v1/memory_stores/{store_id}/memories/search | Search by meaning. |
PATCH | /v1/memory_stores/{store_id}/memories/{memory_id} | Correct a memory. |
DELETE | /v1/memory_stores/{store_id}/memories/{memory_id} | Delete one memory. |
POST | /v1/memory_stores/{store_id}/memories/delete_scope | Delete every memory in a scope (for example, one customer). |
POST | /v1/memory_stores/{store_id}/export | Export memories as a JSONL file in the Files API. |
Base URL https://app.syntic.ai/v1 (the paths above already include /v1). Authenticate with a private key and send syntic-beta: agents-2026-11-01. Stores belong to the key’s workspace.
The store object
{
"id": "mem_01JC1A3C5E7G9J1L3N5Q",
"type": "memory_store",
"name": "support-customers",
"description": "What the support agents know about each customer.",
"agent_write": "scoped",
"max_memories_per_scope": 500,
"default_ttl_days": 365,
"memory_count": 18342,
"created_at": "2026-11-02T12:00:00Z"
}| Field | Description |
|---|---|
name | Unique in the workspace. |
agent_write | none (agents read only), scoped (agents write in the session’s scope; default) or scoped_and_global. |
max_memories_per_scope | Oldest memories are dropped beyond this. 1 to 10,000, default 500. |
default_ttl_days | Memories expire after this many days unless written with their own expires_at. null means never. |
The memory object
{
"id": "mmr_01JC8D1F3H5K7M9P1R3T",
"store_id": "mem_01JC1A3C5E7G9J1L3N5Q",
"scope": "customer:4821",
"content": "Prefers replies by email, not phone. Has asked twice about bulk discounts.",
"tags": ["preference"],
"source": { "kind": "agent", "session_id": "sesn_01JC7M2K4P6R8T0V2X4Z", "agent_id": "agt_01JC4R8W6Q2N9X3T5V7Y" },
"created_at": "2026-11-05T10:00:15Z",
"updated_at": "2026-11-05T10:00:15Z",
"expires_at": "2027-11-05T10:00:15Z"
}content is plain text up to 4,000 characters. source.kind is agent or api, so you can always tell what the agent wrote from what you seeded.
Add a memory
POST /v1/memory_stores/{store_id}/memories with scope (required), content (required), and optional tags (up to 10) and expires_at.
Search
POST /v1/memory_stores/{store_id}/memories/search with query (required), scope (required, or "*" for all scopes when reviewing), limit (1 to 50, default 10) and optional tags. Results come back with a score from 0 to 1, highest first. This is the same search the agent’s built-in tool uses.
# Seed a memory, then search for it
curl -sS https://app.syntic.ai/v1/memory_stores/mem_01JC1A3C5E7G9J1L3N5Q/memories \
-H "Authorization: Bearer $SYNTIC_API_KEY" \
-H "Content-Type: application/json" \
-H "syntic-beta: agents-2026-11-01" \
-d '{"scope": "customer:4821", "content": "Account manager is Dana Lee.", "tags": ["account"]}'
curl -sS https://app.syntic.ai/v1/memory_stores/mem_01JC1A3C5E7G9J1L3N5Q/memories/search \
-H "Authorization: Bearer $SYNTIC_API_KEY" \
-H "Content-Type: application/json" \
-H "syntic-beta: agents-2026-11-01" \
-d '{"scope": "customer:4821", "query": "who looks after this account?"}'Attaching a store to an agent
Add the store’s id to memory_store_ids on the agent definition and pass memory_scope when you start each session. The agent then has two tools:
| Tool | What it does |
|---|---|
memory_search | Searches the session’s scope (and global) and returns the best matches. |
memory_write | Adds or updates a memory in the session’s scope, if agent_write allows it. |
Both calls appear as memory steps in the run’s traces, so you can see exactly what was read and written.
Agents should not store anything you would not want a later session to repeat back. Say what is worth remembering in the agent’s instructions (“remember stated preferences and open issues; never store payment details”) and review new memories now and then with GET .../memories?source=agent.
Deletion and compliance
DELETE .../memories/{id}removes one memory immediately from search and within 24 hours from backups.POST .../memories/delete_scopewith{"scope": "customer:4821"}removes everything about one subject; use it for erasure requests. Returns the number deleted.POST .../exportwith an optionalscopewrites a JSONL file and returns itsfile_id, for access requests.- Zero data retention: organizations with zero data retention cannot create memory stores unless an Owner turns on Allow agent memory in organization settings, which is recorded in the audit log. See Data retention.
Errors
Errors use the error envelope.
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request | scope_required | A memory or search call without scope. |
| 400 | invalid_request | content_too_long | content over 4,000 characters. |
| 403 | permission | memory_disabled_by_retention | The organization uses zero data retention and memory is not allowed. |
| 404 | not_found | memory_store_not_found, memory_not_found | No such id in this workspace. |
| 409 | invalid_request | store_in_use | Delete while an agent references the store. |
Limits and billing
| Limit | Value |
|---|---|
| Stores per workspace | 100 |
| Memories per store | 1,000,000 |
| Search results per call | 50 |
Stored memories are free up to 100,000 per workspace, then billed per thousand memories per month. Searches made by agents are included in the session’s cost; searches through the API are free. Rates appear on Pricing at launch.
Build notes for the platform team
- Back stores with the existing memory service, adding a
workspace_idandscopeon every row and enforcing them in every query. - Every write records
source; agent writes record the session and agent ids. - Export and scope deletion must also cover the search index, not only the primary table.