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.Create a model
202 Accepted
List models
200 OK
Get a model
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.200 OK, the updated model.
Refresh a model
Re-answers the model’s question from everything the space knows now.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.200 OK, the model, with content now null.
Delete a model
Removes the model. The memories it was built from are untouched.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.200 OK
Space profile
The space’s standing description: what it is for, and how it weighs what it is told.200 OK
Disposition shapes how the space interprets what it is told when it synthesizes. It does
not affect plain retrieval.
Setting 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.