Memory for AI apps that shows its work.
Add what your users say. Search it with dates and sources. Erase it with a receipt. One API, with every end user kept apart.
- 94.4
- 1
- 2¢
curl https://api.twinmemory.dev/v1/memory/add \
-H "Authorization: Bearer $TWIN_MEMORY_API_KEY" \
-H "X-Twin-Account: user_42" \
-H "Content-Type: application/json" \
-d '{
"items": [{
"id": "msg-001",
"session": "onboarding",
"role": "user",
"text": "I just moved to Lisbon from Berlin for the new job at Acme."
}]
}'{
"items": [
{ "id": "msg-001", "event_id": "ev_620270db0bff9328", "landed": false }
],
"queued": 1,
"pending": 1
}Every answer says where it came from
Search returns dated facts read from what your user said, and each one carries the address of the passage it came from. Your model can quote it. You can open it.
Facts are read once, when they arrive, so a search costs one call, not a pipeline.
- 2026-10-01
Alice lives in Lisbon · state
passages/memory/messages/th_8b5e5d4c8946d815/p_0001.md
- 2026-10-01
Alice works at Acme · state
passages/memory/messages/th_8b5e5d4c8946d815/p_0001.md
- 2026-10-02
Alice is allergic to peanuts · preference
passages/memory/notes/th_616a0ef898bcfdd1/p_0001.md
Values as stated, newest first
When a user moves city, memory keeps both statements and the day each was said. It does not guess which one replaced the other; your model sees the history and decides.
| Attribute | Value | Valid from |
|---|---|---|
| home_city | Lisbon | 2026-10-01 |
| home_city | Berlin | 2024-03-01 |
| employer | Acme | 2026-10-01 |
Erasure you can prove
Forget removes every copy: the original, the passages cut from it, the facts read from it, their index entries and vectors. The response counts each table before and after.
The erased id is kept as a tombstone, so a retry still in flight cannot bring it back.
| Table | Before | After |
|---|---|---|
| events | 4 | 3 |
| threads | 3 | 2 |
| passages | 3 | 2 |
| mentions | 13 | 11 |
| passages_fts | 3 | 2 |
| files | 14 | 15 |
One key per project. One header per end user.
Your key decides the organisation and project. The X-Twin-Account header names your end user. Each end user is a separate store, and no request body can name another.
# Your backend, serving two of your users
curl https://api.twinmemory.dev/v1/memory/search \
-H "Authorization: Bearer $TWIN_MEMORY_API_KEY" \
-H "X-Twin-Account: user_42" \
-H "Content-Type: application/json" -d '{"query": "diet"}'
curl https://api.twinmemory.dev/v1/memory/search \
-H "Authorization: Bearer $TWIN_MEMORY_API_KEY" \
-H "X-Twin-Account: user_43" \
-H "Content-Type: application/json" -d '{"query": "diet"}'| Key | X-Twin-Account | Memory |
|---|---|---|
| production key | user_42 | acme.production.user_42 |
| production key | user_43 | acme.production.user_43 |
| a staging key | user_42 | acme.staging.user_42 |
Benchmarks you can rerun
Our numbers come from saved run outputs, with the reader, the judge and the command to reproduce them. Rows from other systems are quoted from their own reports.
| Benchmark | Score |
|---|---|
| LoCoMo | 94.4 |
| LongMemEval-S | 93.5 |
Use it from wherever your agent runs
A REST API and a hosted MCP endpoint today. SDKs, framework adapters and coding-agent plugins are on the way.
- REST APIadd, search, history, forget, correct, lineageLive
- MCP, hostedOne URL for Claude Code, Cursor, VS Code, WindsurfLive
- ChatGPT and Claude.aiMemory as a connector in the chat appsSoon
- Python SDKpip install twinmemorySoon
- TypeScript SDKnpm install twinmemorySoon
- Go SDKgo get twinmemory.dev/goSoon
- CLILogin, keys, add and search from the terminalSoon
- LangGraphuvx / npx twinmemory-cli init langgraphSoon
- CrewAIuvx twinmemory-cli init crewaiSoon
- OpenAI AgentsMemory adapters for agent frameworksSoon
- n8n, LiveKitAutomation and voice agentsSoon
- Claude Code, Cursor, CodexPlugins that save each sessionSoon
Priced by what you write and what you search
Reads by address, history and forget are never metered. Past a limit, writes still land and stay searchable; only the paid reading waits.
| Plan | Price | Events | Retrievals |
|---|---|---|---|
| Free | $0 | 10,000 | 1,000 |
| Starter | $13 | 50,000 | 5,000 |
| Pro | $100 | 500,000 | 50,000 |
| Scale | $399 | 2,500,000 | 250,000 |
Start with 10,000 events free.
No card needed. Keys for read and write, per project.