Quickstart — your first memory in 5 minutes.
Sign up, grab a key, POST one memory, retrieve it with a natural-language question. Works from your laptop. No SDK required.
Five steps. One memory stored and retrieved.
Every code block is copy-pasteable. Replace rem_... with your real key from the console.
Head to remlabs.ai/signup. Password signup returns an api_key with full scope immediately. Bot-signup (programmatic) returns a provisional key that requires email confirmation before the scope unlocks.
curl -X POST https://remlabs.ai/v1/auth/signup \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","password":"your-password"}'
{"api_key": "rem_a1b2c3...", "tier": "free"}
Required fields: key, value. Not content. Not text. Just value. The server accepts those other names with a 200 status but silently drops them, so be strict here.
curl -X POST https://remlabs.ai/v1/memory-set \
-H "Authorization: Bearer rem_..." \
-H "Content-Type: application/json" \
-d '{"key":"pref-theme","value":"User prefers dark mode","namespace":"prefs"}'
{"success":true,"key":"pref-theme"}
Runs the full 6-stage retrieval pipeline — FTS5 lexical, vector search, graph walks, reranker, citation assembly, and answer synthesis. +15.33pp on SWE-bench Lite (n=150, p<0.05, paired bootstrap).
curl -X POST https://remlabs.ai/v1/memory/ask \
-H "Authorization: Bearer rem_..." \
-H "Content-Type: application/json" \
-d '{"question":"What theme does the user prefer?","namespace":"prefs"}'
{"answer":"Dark mode.","citations":[{"key":"pref-theme","score":0.98}]}
Dreams run nightly by default. Call this to trigger an on-demand consolidation cycle across the strategies you pick from the 9 available (synthesize, pattern, contradict, abstract, bridge, prune, strengthen, decay, narrate).
curl -X POST https://remlabs.ai/v1/memory/dream/start \
-H "Authorization: Bearer rem_..." \
-H "Content-Type: application/json" \
-d '{"namespace":"prefs","strategies":["synthesize","pattern","contradict"]}'
{"id":"drm_9kQ2abc","status":"queued"}
Four idiomatic paths. Pick the one that matches your stack. All four talk to the same endpoints you just tested with curl.
import openai, requests
def remember(key, value):
requests.post("https://remlabs.ai/v1/memory-set",
headers={"Authorization": f"Bearer {REM_KEY}"},
json={"key": key, "value": value})
import { REM } from "@remlabs/sdk";
const rem = new REM({ apiKey: process.env.REM_KEY });
await rem.memory.set({ key: "foo", value: "bar" });
from remlabs.langchain import REMMemory
memory = REMMemory(api_key=REM_KEY, namespace="chat")
{"mcpServers": {"rem": {"command": "npx", "args": ["-y", "@remlabs/mcp"]}}}
Pick your next rabbit hole.
The six most-visited pages after this one.
The three things everyone hits.
If you run into one of these in your first hour, you're not alone.
content and got HTTP 200 but stored:0.value instead. The content and text fields are silently dropped. The endpoint returns 200 because your auth was valid, but no memory was written. Swap the key name and retry.scope_denied.GET /v1/memory/dream/status/{id}. Cycles take 2 to 60 seconds depending on graph size and strategy count. If it stays in queued for more than a minute, check /v1/status for queue backlog.