Searching is how your agent reads from memory. You ask a question, and Loom returns the most relevant pieces, each with its source. You set a token budget, and Loom fills it with the best results.
spans = mem.recall("gliotransmission calcium", budget_tokens=8000)
for s in spans:
    print(s["text"])
    print("  from:", s["provenance"]["paper_doi"])
    print("  tokens:", s["tokens"], "score:", s["score"])
Each result is a dict with node_id, text, score, tokens, and provenance.

Options

question
str
required
What you want to find, in plain language.
budget_tokens
int
Stop once the results add up to this many tokens. Defaults to 8000. You’re in control of how much comes back.
keywords
list[str]
Extra keywords to nudge the search.
domain
str
Limit the search to one domain.
section_types
list[str]
Limit to certain sections, like methods or results.
scope_signals
list[str]
Focus the search — for example open_questions, mechanisms, reliability, or what_to_build.
label
str
default:"Claim"
The kind of memory to search.
spans = mem.recall(
    "what changed about astrocyte calcium signalling?",
    budget_tokens=6000,
    scope_signals=["open_questions"],
    domain="neuroscience",
)

Every result has a source

Each result includes provenance — at least the paper it came from (paper_doi), plus section and location details. That’s what lets your agent cite memory and lets you check it.

Finding papers

To look up papers by metadata instead of text:
papers = mem.recall_papers("metaplasticity astrocyte")
# [{"doi": ..., "title": ..., "year": ..., "oa": ..., "cached": ..., "score": ...}, ...]

mem.has_paper("10.1/astro")   # -> True / False

Personal memory

You can also keep memory for a single user — preferences and context that belong to them, not the whole workspace. See User memory.
mem.user.remember("style", "concise plans with citations", confidence=0.9)
facts = mem.user.recall("how should I write plans?")

Search API

POST /v1/recall and the paper lookup endpoints.