Anyone comparing mem0 vs letta is usually trying to answer one practical question: does my agent need a memory API bolted on, or does it need a memory-native runtime built around it from the start. Those are different jobs, and the two tools were built to do them, which is why a head-to-head on features alone tends to miss the point. This piece looks at what each one actually is, what each one costs, and which shape of tool fits which kind of build.
What Mem0 actually is
Mem0 is a memory extraction layer you call from inside your own agent code. Its GitHub repository describes a single-pass extraction model: one call pulls durable facts out of a conversation turn, and those facts accumulate in a store scoped to a user, a session, or an agent, rather than being overwritten each time. Retrieval mixes semantic search, keyword matching, and entity linking, and Mem0's own README reports benchmark scores on LoCoMo and LongMemEval that improved substantially in its most recent releases, with the caveat that the highest scores reflect the managed platform's proprietary optimisations rather than the open source SDK alone.
The shape of the integration matters more than the benchmark numbers. Mem0 does not run your agent. You keep whatever framework, orchestration, and tool-calling logic you already have, and Mem0 sits beside it as an add and search API. That makes it a natural fit for teams retrofitting memory onto something that already works.
What Letta actually is
Letta, formerly MemGPT, takes the opposite starting position: it is the runtime, not an add-on to one. Its lineage traces to a 2023 UC Berkeley paper that framed the whole problem in operating-system terms.
"We propose virtual context management, a technique drawing inspiration from hierarchical memory systems in traditional operating systems that provide the appearance of large memory resources through data movement between fast and slow memory."
MemGPT: Towards LLMs as Operating Systems, Packer et al., UC Berkeley, 2023
That paging idea, moving facts between a fast in-context tier and a slower persistent one, became Letta's product. An agent built on Letta owns its memory blocks directly: it can read and edit its own context, decide what to keep in the fast tier versus push to storage, and carry that state across sessions as part of how it runs, rather than as a side call to another service. Letta's own site frames this in terms of identity: "Context is selfhood" is the wording on its product page, and whatever you make of the phrase, it captures that memory is structural to the agent rather than attached to it.
Mem0 vs Letta: the actual architectural difference
The clearest way to see the split is to ask where the memory decision gets made. In Mem0, your application code decides when to call add and when to call search; the memory system answers a question you ask it. In Letta, the agent's own loop decides, turn by turn, what belongs in its immediate context and what should move to archival storage, because that decision is part of the agent's own execution, not a step your surrounding code has to orchestrate.
Neither approach is more sophisticated than the other in the abstract. They solve different placement problems. An application that already has a well-defined agent loop, built in LangGraph or a custom framework, gains little from handing that loop over to a different runtime just to get memory; Mem0's API-shaped integration fits there directly. An agent being built from first principles, where memory management is meant to be a core capability the agent reasons about rather than infrastructure it calls out to, is closer to what Letta was designed around.
Mem0 vs Letta pricing, side by side
Pricing tells a similar story about audience. Mem0's tiers assume growth in call volume against a mostly fixed data model. Letta's tiers assume growth in the number of agents and how much they run.
| Dimension | Mem0 | Letta |
|---|---|---|
| Free tier | Hobby: 10,000 memory adds, 1,000 retrievals/month, 1 project | Free: limited agents, bring your own API keys |
| Cheapest paid tier | Starter, $19/month: 50,000 adds, 5,000 retrievals/month | Pro, $20/month: weekly and monthly usage quota, up to 20 stateful agents |
| Top self-serve tier | Pro, $249/month: 500,000 adds, 50,000 retrievals, graph memory, unlimited projects | API plan: $20/month base plus $0.10 per active agent/month and metered tool execution |
| Enterprise | Custom: unlimited requests, SSO, audit logs, on-premises | Custom: role-based access control, SAML/OIDC SSO, dedicated support |
| Self-hosting | Free, Apache 2.0, documented in the GitHub repo | Free, Apache 2.0, documented self-hosting via bring-your-own-machine or cloud sandboxes |
| License | Apache 2.0 | Apache 2.0 |
Table 1: Mem0 and Letta hosted pricing and licensing as published on mem0.ai and docs.letta.com in September 2026. Both vendors reserve the right to change tiers; verify current figures before budgeting.
Mem0's own pricing history is worth flagging as a genuine data point rather than a footnote: reporting on its 2026 pricing update notes the mid tier between Starter and Pro was retired, which turns what used to be a $19-to-$79 step into a $19-to-$249 one for anyone who needs the graph memory or unlimited-project features gated at Pro. That is the kind of tier gap worth checking directly against Mem0's own pricing page before committing, since aggregator figures can lag a vendor's actual current state.
Is Letta better than Mem0 for stateful agents specifically?
If "stateful agents" is the exact phrase driving the search, Letta is the more literal answer, because persistent, evolving state across a session is what its runtime is organised around from the ground up, not a feature added to an otherwise stateless loop. Mem0 can absolutely make an agent stateful in the sense that matters to most products, remembering what a user told it, but the state lives in an external store your code queries, not in the agent's own execution model.
The distinction shows up clearest in a small, concrete case. Say you are building a customer support agent that needs to remember a customer's shipping preference across three separate conversations spread over a month. With Mem0, your application adds that fact once, and on each new session your code calls search before drafting a reply. It costs you one API integration point, and the agent framework underneath can be anything. With Letta, the same fact would live in the agent's own core memory block, something the agent itself decides is worth keeping in fast-access context on every subsequent run, and the agent's own reasoning about what to keep and what to archive is part of what you are debugging when the memory misbehaves. The Mem0 path is simpler to reason about when something goes wrong, because the memory system is a service you can test in isolation. The Letta path gives the agent more autonomy over its own state, which is more powerful and also a larger surface to get wrong.
Which one actually fits a memory api use case?
If what you are searching for is closer to "memory api" than "agent runtime," that alone points toward Mem0. It was built to be called, not adopted, and that is a real design distinction, not a marketing one. A team that wants to keep its existing orchestration and just needs a place to durably store and retrieve per-user facts should weight this heavily; switching runtimes to gain a memory feature is a much bigger commitment than adding an API call.
What neither tool solves
Both Mem0 and Letta are built around a single asker or a single agent's own state. Neither has a first-class model for a shared pool of company facts queried by many different people, or pieces of software acting on their behalf, each with different permissions on the same underlying data. Mem0's namespace is per-user or per-agent; Letta's memory belongs to the agent that owns it. That is a deliberate, reasonable scope for both, and it is worth being honest about rather than treating as a missing feature waiting to be shipped.
A related but distinct piece of infrastructure, entitlement-aware retrieval over a company's actual systems of record with per-asker permission checked before an answer is drafted, is a separate design problem from either conversational memory or single-agent state. Contextely was built specifically for that gap, and its retrieval scoring runs a lexical ranking by default with no external dependency, only using semantic ranking if an operator explicitly configures an embedding model. If your actual requirement turns out to be that shared, permission-checked layer rather than either tool's core job, the Mem0 vs Contextely comparison and the dedicated Letta review each cover that adjacent case in more depth, and the Mem0 comparison page and Letta comparison page lay out the same distinction in a shorter format.
Common pitfalls when choosing between them
- Picking based on benchmark scores alone. Mem0's published LoCoMo and LongMemEval numbers describe its managed platform, not necessarily what the open source SDK alone will do in your stack. Test against your own data before trusting a headline number.
- Assuming Letta's runtime replaces your existing agent framework painlessly. Moving an agent you already built in another framework onto Letta is a real migration, not a plug-in.
- Treating self-hosting as free in total cost. Both are Apache 2.0 and free to run yourself, but you still carry the database, the compute, and the operational burden either way.
- Expecting either tool to gate access per asker. If the product needs different people to see different subsets of the same memory pool, that logic does not exist in either tool by default.
- Comparing list prices without checking tier gaps. Mem0's jump from its $19 Starter tier to its $249 Pro tier, after a mid tier was retired, is exactly the kind of detail that changes a build-vs-buy decision.
The honest bottom line
Mem0 vs Letta is not really a competition between two versions of the same product. Mem0 is a memory API you integrate into an agent you already control. Letta is a runtime you build the agent inside of, with memory as a structural part of how it operates. Pick based on whether you have an existing agent loop to extend or a new one to design, not on which tool has the higher benchmark score or the lower headline price. Whichever you pick, both are genuinely open, self-hostable, and actively maintained, which is more than can be said for a lot of the category. If neither turns out to match what you actually need, which is company-wide answers checked against who is asking rather than either conversational or single-agent memory, pricing shows what a retrieval-time entitlement layer costs to try against your own systems instead.
