twin memory
← Blog

Introducing twin memory for developers

2026-10-21 · Alexein

twin memory is a hosted memory API for AI apps. Your backend adds what your users say; your model searches it later and gets back dated facts, each with the address of the passage it was read from; and when a user asks to be forgotten, one call erases every copy and returns a receipt.

Today we are opening it to developers: a console for keys and projects, docs with a quickstart and the full API reference, and a hosted MCP server so Claude Code, Cursor and other clients can use memory with one line of config.

Three calls

Add takes items: messages, notes or documents. It answers 202 at once, and the item is searchable a moment later. Each end user is named by the X-Twin-Account header, never by a field in the body, and each has a database file of their own.

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."
    }]
  }'

Search returns what memory knows, newest statements first, and the records it read from your users’ words, each with its date and source. A value that changed keeps both statements and the day each was said; memory does not guess which one replaced the other.

200 OK
{
  "query": "Where does Alice live?",
  "found": 2,
  "known": [
    "Alice Chen · home_city: Lisbon [said 2026-10-01]; Berlin [said 2024-06-01]"
  ],
  "facts": [{
    "id": "th_8b5e5d4c8946d815#r028d461216652fe5",
    "text": "(happened 2026-10-01) Alice lives in Lisbon",
    "source": "passages/memory/messages/th_8b5e5d4c8946d815/p_0001.md"
  }]
}

Forget removes the item as sent, the passages cut from it, the records read from it, their index rows and vectors. The response counts each table before and after, and the erased id is kept so a retry still in flight cannot bring it back.

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

Items can also carry an expires date, after which they are forgotten the same way, on time; versions lists every version of an item until then.

Where it stands

We ran six public memory benchmarks and published every row we could find beside ours, including the ones that beat us. On LoCoMo we score 94.4; one published row is higher, with a larger answer model. On BEAM-128K, three vendors report higher scores than ours. Each table on the benchmarks page names the answer model, the judge and the caveats, because a different answer model is a different test.

Standingsours, 2026-10-07
BenchmarkScoreRank
LoCoMoOverall94.42 of 28
LongMemEval-SOverall93.53 of 19
LoCoMo-PlusOverall46.61 of 9
BEAM-128KMean of abilities0.4684 of 10
MemoryAgentBenchRULER-QA192.01 of 14
MemoryAgentBenchDetectiveQA66.23 of 14
MemoryAgentBenchFC single-hop94.01 of 16
MemoryAgentBenchFC multi-hop20.02 of 16
MuSiQueF156.21 of 12

Start

The Free plan has 10,000 events and 1,000 retrievals a month, with no card. Reads by address, history and erasure are never metered. The quickstart takes you from a key to a first search; the MCP page has the config for your client; and if you are coming from Mem0, the migration guide maps each call across.