List and search memories
GET/v1/memory
Page through the memories this key can read, newest first, or search them by meaning or by words.
Without q, every memory this key can read, newest first, a page at a time. With q, a search: by meaning when an embedding model is available to the key, otherwise by words. search.matched_on says which was attempted: a search by meaning whose embedding call fails falls back to words and still reports meaning. The key's scope decides what is visible, exactly as it does in chat: an organisation key never sees personal memory, a "mine only" key never sees shared memory, and team and connection grants apply. A search, and a read by id, count as using the memories they return; a listing does not.
Example
Against https://platform.memtro.com, with your key in MEMTRO_API_KEY.
curl "https://platform.memtro.com/v1/memory?q=billing%20migration&limit=5" \
-H "Authorization: Bearer $MEMTRO_API_KEY"
import os, requests
r = requests.get(
"https://platform.memtro.com/v1/memory",
headers={"Authorization": f"Bearer {os.environ['MEMTRO_API_KEY']}"},
params={"q": "billing migration", "limit": 5},
)
r.raise_for_status()
print(r.json())
const res = await fetch("https://platform.memtro.com/v1/memory?q=billing%20migration&limit=5", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.MEMTRO_API_KEY}` },
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
console.log(await res.json());
A search. A listing has `as_of` in place of `search`, and a `next_cursor` while `has_more` is true.
{
"object": "list",
"data": [
{
"object": "memory",
"id": "6f1c…",
"content": "Priya Shah owns the billing migration (BIL-142) from 3 November 2026.",
"kind": "fact",
"scope": "shared",
"source": "sync",
"system": "linear",
"url": "https://linear.app/…",
"confidence": 0.9,
"importance": 0.6,
"trust": "trusted",
"taint": null,
"corroborations": 1,
"valid_from": "2026-11-03",
"valid_to": null,
"superseded_by": null,
"superseded_at": null,
"subject_entity_id": "a83e…",
"entity_ids": ["a83e…", "0c2d…"],
"connection_id": "c19b…",
"episode_id": null,
"created_at": "2026-11-03T10:14:22.000Z",
"score": 0.82
}
],
"has_more": false,
"next_cursor": null,
"search": { "query": "billing migration", "matched_on": "meaning", "as_of": null }
}
Authentication
An API key, as Authorization: Bearer or x-api-key. Read-only keys may call it.
- Every reply, errors included, carries
x-request-idandrequest-idheaders with the same id, startingreq-. Quote it to support. - Browsers may call it from any origin: it answers CORS preflights and allows the
Authorization,x-api-keyand Anthropic version headers.
Query parameters
qstringOptionalSearch for this, at least two characters. Search results are not paged.
scopestringOptionalNarrow to shared or personal memory. It narrows what the key can read and never widens it:
personalon an organisation key, ororgon a "mine only" key, is a 400.as_ofstringOptionalA date: memory as it stood then.
limitintegerOptionalResults per page, at most 100: a larger number reads as 100, and anything below 1 or not a number as 20.
cursorstringOptionalThe
next_cursorfrom the previous page. A cursor that cannot be read starts again from the first page rather than failing.
Pagination
Listing is keyset-paged: pass each reply's next_cursor as cursor until has_more is false. New memories written while you page do not shift the pages you have not read yet. Search is not paged: limit is the whole result, has_more is false and next_cursor is null; to read everything, list.
Response
200application/json
A list of memory objects.
object"list"OptionalAlways
list.dataarray of objectsOptionalMemories; in a search each also has
score(a number, or null).22 fields of
dataobject"memory"OptionalAlways
memory.idstringOptionalThe memory's id.
contentstringOptionalThe statement, as remembered.
kindstringOptionalWhat sort of statement it is.
scopestringOptionalWho it belongs to: the organisation, a team, or one person.
sourcestringOptionalWhere it came from, such as
chat,syncorimport.systemstring or nullOptionalThe connected system it was read from, if any.
urlstring or nullOptionalA link to the record it came from, if one was kept.
confidencenumberOptionalHow sure the extractor was.
importancenumberOptionalHow much it matters, as the extractor judged it.
truststring or nullOptionalWhether it is believed outright or waiting to be confirmed.
taintstring or nullOptionalSet when it was learned from outside content.
corroborationsintegerOptionalHow many times something independent has confirmed it.
valid_fromstring or nullOptionalStart of the period the statement is about.
valid_tostring or nullOptionalEnd of that period, if it has one.
superseded_bystring or nullOptionalThe id of the memory that replaced it.
superseded_atstring or nullOptionalWhen it was replaced.
subject_entity_idstring or nullOptionalThe entity the statement is about.
entity_idsarray of stringsOptionalEvery entity it mentions.
connection_idstring or nullOptionalThe connection it was synced through.
episode_idstring or nullOptionalThe exchange or import it was learned from.
created_atstringOptionalWhen it was recorded.
has_morebooleanOptionalWhether there is another page.
next_cursorstring or nullOptionalPass as
cursorfor the next page.as_ofstring or nullOptionalListing: the
as_ofyou sent.searchobjectOptionalSearch only:
query,matched_on(meaningorwords) andas_of.
Errors
In the OpenAI envelope, {"error": {"message", "type", "param", "code"}}. What each code means and what to do about it is in the error catalogue.
| Status | Code | When |
|---|---|---|
| 400 | unsupported_parameter |
|
| 401 | invalid_api_key | The key is missing, malformed, revoked or expired. |
| 402 | subscription_inactive | The organisation has no active subscription. |