Memory.listThreads()
The listThreads() method retrieves threads with pagination support and optional filtering by resourceId, metadata, or both.
Usage ExamplesDirect link to Usage Examples
List all threads with paginationDirect link to List all threads with pagination
const result = await memory.listThreads({
page: 0,
perPage: 10,
});
Fetch all threads without paginationDirect link to Fetch all threads without pagination
Use perPage: false to retrieve all matching threads at once.
warning
Generally speaking it's recommended to use pagination, especially for large datasets. Use this option cautiously.
const result = await memory.listThreads({
filter: { resourceId: "user-123" },
perPage: false,
});
Filter by resourceIdDirect link to Filter by resourceId
const result = await memory.listThreads({
filter: { resourceId: "user-123" },
page: 0,
perPage: 10,
});
Filter by metadataDirect link to Filter by metadata
const result = await memory.listThreads({
filter: { metadata: { category: "support", priority: "high" } },
page: 0,
perPage: 10,
});
Combined filter (resourceId & metadata)Direct link to Combined filter (resourceId & metadata)
const result = await memory.listThreads({
filter: {
resourceId: "user-123",
metadata: { status: "active" },
},
page: 0,
perPage: 10,
});
ParametersDirect link to Parameters
filter?:
{ resourceId?: string; metadata?: Record<string, unknown> }
Optional filter object. resourceId filters threads by resource ID. metadata filters threads by metadata key-value pairs (AND logic - all must match)
page?:
number
Page number (0-indexed) to retrieve
perPage?:
number | false
Maximum number of threads to return per page, or false to fetch all
orderBy?:
{ field: 'createdAt' | 'updatedAt', direction: 'ASC' | 'DESC' }
Sort configuration with field and direction (defaults to { field: 'createdAt', direction: 'DESC' })
ReturnsDirect link to Returns
result:
Promise<StorageListThreadsOutput>
A promise that resolves to paginated thread results with metadata
The return object contains:
threads: Array of thread objectstotal: Total number of threads matching the filterpage: Current page number (same as the inputpageparameter)perPage: Items per page (same as the inputperPageparameter)hasMore: Boolean indicating if more results are available
Extended usage exampleDirect link to Extended usage example
src/test-memory.ts
import { mastra } from "./mastra";
const agent = mastra.getAgent("agent");
const memory = await agent.getMemory();
let currentPage = 0;
const perPage = 25;
let hasMorePages = true;
// Fetch all active threads for a user, sorted by creation date
while (hasMorePages) {
const result = await memory?.listThreads({
filter: {
resourceId: "user-123",
metadata: { status: "active" },
},
page: currentPage,
perPage: perPage,
orderBy: { field: "createdAt", direction: "ASC" },
});
if (!result) {
console.log("No threads");
break;
}
result.threads.forEach((thread) => {
console.log(`Thread: ${thread.id}, Created: ${thread.createdAt}`);
});
hasMorePages = result.hasMore;
currentPage++; // Move to next page
}
Metadata FilteringDirect link to Metadata Filtering
The metadata filter uses AND logic - all specified key-value pairs must match for a thread to be included in the results:
// This will only return threads where BOTH conditions are true:
// - category === 'support'
// - priority === 'high'
await memory.listThreads({
filter: {
metadata: {
category: "support",
priority: "high",
},
},
});