Skip to main content
A document is parsed, split into chunks, and stored as memory, so the same Retrieve and Reason calls surface file content alongside anything you recorded conversationally.

Upload files

If you use scoping, upload with the same scope you retrieve with. Scoped search is strict, so a document uploaded without user_id is not returned to a search with one: it is only reachable from an unscoped search.
Ingestion is always asynchronous. The call returns immediately with a job_ids list; poll each with the job status endpoint. When a job reaches completed, that file’s content is searchable. Response 202 Accepted
Parsing and embedding a document is billed on completion, not at upload. Larger files and richer formats, such as scanned PDFs and audio, cost more because more content is processed.

List documents

Response 200 OK
memory_count is how many searchable memories were extracted from the document.

What counts as a document

This list contains everything ingested into the space, not only uploaded files. Storing a memory with POST /v1/record also creates a document row, so source tells you which is which. To group your writes into meaningful documents, such as a conversation, a ticket, or a session, pass your own document_id when recording. Reusing an id replaces that document’s memories, which is how you keep a document current.
The dashboard’s Documents tab hides memory rows by default for this reason, with a toggle to show everything ingested.

Get a document

Returns the document’s metadata and ingestion status, in the same shape as one item in the list above.

Delete a document

Removes the document and every memory extracted from it.
Response 204 No Content.

Error responses

See the full error reference.

Next steps

Retrieve API

Search across recorded memory and uploaded documents.

Memories API

Record memories and poll ingestion jobs.