Skip to main content
Retrieve answers a question from individual memories. A memory model answers a standing question from all of them, and keeps that answer current as new memories arrive. Give a model a question (“how does this user like to be communicated with?”, “what is this customer’s account history?”) and the memory layer synthesizes an answer across everything the space knows, then rewrites it as the space learns more. Read it back as markdown and drop it straight into a system prompt.
A model’s content is generated in the background. Creating or refreshing one returns a job_id; poll GET /v1/spaces/{space_id}/jobs/{job_id}, then read the model to get its content.
A memory model is a reason answer the space keeps, so it is written by the space’s reason model — see choosing a model. A stronger model is noticeably better at the thing these are for: holding the current value of a fact that has changed. Change the setting and the next refresh picks it up.
Everything on this page is also on the Models tab of a space in the dashboard: the profile, each model’s rendered content, and create, edit, refresh, clear and delete. Useful for reading what a space has concluded without writing a line of code.

Create a model

Response 202 Accepted

List models

Response 200 OK

Get a model

Returns the same object as a list item, plus sources — the memories, notes and other models the current content was written from.
These are the memories the refresh declared it used, not everything it retrieved. That is what makes a wrong answer diagnosable: if the memory you expected is absent from the list, it was never reached — record it, or check the model’s tags and query. If it is present and the answer still contradicts it, the memory was read and mishandled, which is a different problem and worth reporting. An empty list means the content rests on nothing in this space. For a model that has never refreshed that is expected; for one with content, it is a finding.
sources is served on this route only. The list omits it — a page of models each carrying the full text of everything behind it is a large response for a view that only names them.

Update a model

Changes the definition. Existing content is left alone. Change the query and the answer only catches up on the next refresh.
Response 200 OK, the updated model.

Refresh a model

Re-answers the model’s question from everything the space knows now.
Response 202 Accepted

Refresh modes

A delta model that has drifted over many incremental edits can be reset: clear it, then refresh for a clean rebuild.

Clear a model’s content

Drops the content, keeps the definition.
Response 200 OK, the model, with content now null.

Delete a model

Removes the model. The memories it was built from are untouched.
Response 204 No Content

Model history

Every refresh archives the content it replaced, most recent first, showing how the space’s view of the question changed as it learned more.
Response 200 OK

Space profile

The space’s standing description: what it is for, and how it weighs what it is told.
Response 200 OK
Disposition shapes how the space interprets what it is told when it synthesizes. It does not affect plain retrieval.

Setting the profile

Both clients read the profile (get_space_profile / getSpaceProfile) and neither writes it yet, so the PUT and DELETE are plain HTTP calls for now. Responds 200 OK with the profile as it now stands. Three things worth knowing before you call it. It is a full replace. A body naming only mission clears the dials back to the default, exactly as chat defaults and extraction settings do. Send both halves every time, or send only what you want the space to end up with. The response is what the space now has, not what you sent. A dial cleared to null comes back as 3, because that is the value the space will actually reason with. Owner-only. A space shared with you can be read and written to, but not reconfigured — the mission reframes every answer the space gives to everyone who can read it. A non-owner gets 403 space_owner_only. DELETE /v1/spaces/{space_id}/profile returns 204 and puts the space back to no mission and 3/3/3. It is idempotent. The mission is prepended to the reasoning prompt on every reason call and every model refresh, so it costs a few tokens per call rather than once — worth keeping to a paragraph rather than a page. Setting the profile is itself free.

Cost

Creating and refreshing a model each run a synthesis pass over the space’s memories and are billed like reason. Reading models, history and the profile is free.

Error responses

See the full error reference.

Next steps

Reason API

Answer a one-off question across memories.

MCP integration

Let an agent read a space’s profile and models directly.