MemoryKit

Users & Personalization

Track end users, scope memories per user, track events, and handle GDPR erasure.

Users let you scope memories and queries to individual end users. Each user gets their own knowledge silo — when you pass userId to create or query, MemoryKit only retrieves that user's data.

Why use users?

userPersonalization

Each user has their own memories. Queries only return their data.

globeMulti-tenancy

One project serves many users without data leaking between them.

shieldGDPR compliance

Delete a user and all their data in one API call.

Create or update a user

The upsert endpoint is idempotent — call it on every login or session start. If the user exists, fields are updated.

await mk.users.upsert({
  id: "user_123",           // your app's user ID
  name: "Alice",
  email: "alice@example.com",
  metadata: { plan: "pro" },
});

User-scoped memories

Pass userId when creating memories to assign them to a user. Then pass userId when querying to only retrieve that user's data.

// Store a memory for this user
await mk.memories.create({
  content: "Alice prefers concise summaries and dark mode.",
  userId: "user_123",
});
 
// Search only this user's memories
const results = await mk.memories.search({
  query: "What are Alice's preferences?",
  userId: "user_123",  // only searches user_123's memories
  limit: 5,
});

Memories without a userId are shared across all users in the project. Use this for company-wide knowledge (help docs, policies, etc.) that every user should be able to access.

Track events

Record user activity for analytics and personalization. Events are tied to a user and can be filtered by type.

await mk.users.createEvent("user_123", {
  type: "page_view",
  data: { page: "/settings", duration: 45 },
});
 
// List events for a user
const events = await mk.users.listEvents("user_123", { type: "page_view" });

Get user profile

const user = await mk.users.get("user_123");
console.log(user.name, user.metadata);

Delete user (GDPR erasure)

Delete a user and optionally cascade to all their memories, chats, and events. This is your GDPR "right to erasure" implementation.

With cascade=true, all memories, chats, and events associated with the user are permanently deleted. This action cannot be undone.

// Delete user profile only
await mk.users.delete("user_123");
 
// Delete user + ALL associated data (GDPR erasure)
await mk.users.delete("user_123", { cascade: true });
Edit on GitHub

On this page