Most AI memory features are a black box. The assistant remembers things about your users, but you cannot see what it stored, you cannot fix a wrong fact, and you definitely cannot take the data with you if you leave. Your users' information lives in someone else's system on someone else's terms.
We want you to be here by choice, not by force.
Backboard treats memory as your data. Every memory an assistant holds is readable, editable, exportable, and deletable through the API. No black box. If you want to inspect it, you can. If you want to leave, you take it with you.
Here is the full lifecycle.
Read: see everything the assistant knows
List every memory on an assistant. Results are paginated, and omitting the page fetches all of them.
Python
pip install backboard-sdk
import asyncio
from backboard import BackboardClient
async def main():
client = BackboardClient(api_key="YOUR_API_KEY")
assistant_id = "your-assistant-id"
memories = await client.get_memories(assistant_id, page=1, page_size=25)
for m in memories.memories:
print(f"[{m.id}] {m.content}")
print(f"Total: {memories.total_count}")
asyncio.run(main())
JavaScript (Node 18+)
const assistantId = "your-assistant-id";
const res = await fetch(
`https://app.backboard.io/api/assistants/${assistantId}/memories?page=1&page_size=25`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
for (const m of data.memories) {
console.log(`[${m.id}] ${m.content}`);
}
console.log(`Total: ${data.total_count}`);
cURL
curl "https://app.backboard.io/api/assistants/your-assistant-id/memories?page=1&page_size=25" \
-H "X-API-Key: YOUR_API_KEY"
You can also search semantically instead of listing everything:
results = await client.search_memories(
assistant_id,
query="user interface preferences",
limit=5,
)
for m in results["memories"]:
print(f"[{m.get('score', 0):.2f}] {m['content']}")
Edit: fix what is wrong
A user gets promoted, changes a preference, corrects a detail. Update the memory in place. You can also add a fact manually.
Python
# Add a fact yourself
await client.add_memory(
assistant_id,
content="User prefers dark mode in all applications",
metadata={"source": "manual", "confidence": "high"},
)
# Update an existing memory
await client.update_memory(
assistant_id,
memory_id,
content="Updated preference: user prefers system theme",
)
JavaScript (Node 18+)
// Add a fact
await fetch(`https://app.backboard.io/api/assistants/${assistantId}/memories`, {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
content: "User prefers dark mode in all applications",
metadata: { source: "manual", confidence: "high" },
}),
});
// Update a memory
await fetch(
`https://app.backboard.io/api/assistants/${assistantId}/memories/${memoryId}`,
{
method: "PUT",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ content: "Updated preference: user prefers system theme" }),
}
);
cURL
# Add
curl -X POST "https://app.backboard.io/api/assistants/your-assistant-id/memories" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "User prefers dark mode in all applications", "metadata": {"source": "manual"}}'
# Update
curl -X PUT "https://app.backboard.io/api/assistants/your-assistant-id/memories/MEMORY_ID" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "Updated preference: user prefers system theme"}'
Export: take it with you
There is no special export format to learn. List every memory and write it to a file. Because the list endpoint returns all memories when you omit the page, a full export is a few lines.
Python
import json
# Fetch all memories (omit page to get everything)
all_memories = await client.get_memories(assistant_id)
export = [{"id": m.id, "content": m.content} for m in all_memories.memories]
with open("memory_export.json", "w") as f:
json.dump(export, f, indent=2)
print(f"Exported {len(export)} memories")
JavaScript (Node 18+)
import { writeFileSync } from "node:fs";
const res = await fetch(
`https://app.backboard.io/api/assistants/${assistantId}/memories`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
const exportData = data.memories.map((m) => ({ id: m.id, content: m.content }));
writeFileSync("memory_export.json", JSON.stringify(exportData, null, 2));
console.log(`Exported ${exportData.length} memories`);
cURL
curl "https://app.backboard.io/api/assistants/your-assistant-id/memories" \
-H "X-API-Key: YOUR_API_KEY" \
-o memory_export.json
Plain JSON, your fields, on your disk. That is the export.
Delete: remove one or wipe the slate
Delete a single memory, or reset every memory on an assistant. Reset removes them from both the database and the vector store and is irreversible.
Python
# Delete one memory
await client.delete_memory(assistant_id, memory_id)
# Delete all memories for an assistant (irreversible)
result = await client.reset_memories(assistant_id)
print(result["message"])
JavaScript (Node 18+)
// Delete one memory
await fetch(
`https://app.backboard.io/api/assistants/${assistantId}/memories/${memoryId}`,
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
cURL
# Delete one memory
curl -X DELETE "https://app.backboard.io/api/assistants/your-assistant-id/memories/MEMORY_ID" \
-H "X-API-Key: YOUR_API_KEY"
For users exercising a delete request, that one call removes their data for good.
The point
Memory is only useful if you trust it, and you trust it when you can see it, fix it, take it, and remove it. Backboard exposes the whole lifecycle through the API: read every fact, edit the wrong ones, export the lot as plain JSON, delete on demand. The data the assistant stores about your users is yours, and you are never locked in.
Grab a key and try it: app.backboard.io
Memory API: docs.backboard.io/sdk/memory
Top comments (0)