twin memory

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
LoCoMo, 1,540 questions
1
model call per search
2¢
to read a LoCoMo conversation
POST /v1/memory/add
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."
    }]
  }'
202 Accepted
{
  "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.

Search reference →
search · factsuser_42
  • 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.

History reference →
history · Alice ChenPOST /v1/memory/history
AttributeValueValid from
home_cityLisbon2026-10-01
home_cityBerlin2024-03-01
employerAcme2026-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.

Forget reference →
forget · receiptitems: pref-diet
TableBeforeAfter
events43
threads32
passages32
mentions1311
passages_fts32
files1415

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.

Multi-tenant guide →
# 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"}'
Which memory a request reaches
KeyX-Twin-AccountMemory
production keyuser_42acme.production.user_42
production keyuser_43acme.production.user_43
a staging keyuser_42acme.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.

Method and full tables →
Measured, with the method published2026-10-07
BenchmarkScore
LoCoMo94.4
LongMemEval-S93.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.

All integrations →
Ways in
  • 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.

Pricing →
Plansper month
PlanPriceEventsRetrievals
Free$010,0001,000
Starter$1350,0005,000
Pro$100500,00050,000
Scale$3992,500,000250,000

Start with 10,000 events free.

No card needed. Keys for read and write, per project.