Adding to memory is how reading becomes something your agent can search later. You send a file or some text, and Loom takes care of reading it, breaking it into pieces, and storing it.

Formats you can send

FormatExtensions
Markdown.md, .markdown
Plain text.txt, .text, .log
CSV / TSV.csv, .tsv
JSON.json
PDF.pdf
Excel.xlsx
Word.docx
You can check the live list any time with GET /v1/ingest/formats or mem.ingest_formats(), which also tells you the maximum file size.

What Loom does with it

1

Reads the file

Loom pulls the text out of your file, keeping track of its structure — pages, rows, or sections.
2

Breaks it into pieces

The text is split into overlapping chunks so context isn’t lost at the edges.
3

Stores it for search

Each chunk is added to memory so you can find it later.
4

Pulls out claims

Loom extracts the key claims in the background, so your call returns quickly and the claims show up shortly after.

You get a report back

Every time you add something, Loom returns a summary of what it did: how much text it read, how many pieces it stored, how many claims it found, and how long it took.
report = mem.ingest_document("paper.pdf", data, title="My paper")
# report["output"]["chunks"]   -> how many pieces were stored
# report["ok"]                 -> True

Papers and documents

Loom treats research papers a little specially — they’re keyed by DOI and carry metadata like title, year, and authors. Anything else is just a document.

ingest_paper

A paper, by DOI, with title, text, year, authors, and an oa flag for open access.

ingest_document

Any supported file. Loom reads and stores it the same way.
For paywalled papers, Loom stores only the derived text by default rather than the raw file, so you stay within publisher terms while keeping the content searchable.

Add to memory via the API

POST /v1/ingest, POST /v1/papers, and the format list.