Skip to main content
One node, read in full. Returned by GET /v1/graph/nodes/{node_id}.
200 application/json

What it is

Node, one piece of the subject’s content held as a claim that can later be revised (in practice, a conversation, a document section, or a coding-session turn, stored with its own id, provenance and weight). Edge, a typed and directed relation between two nodes (in practice, a row saying “these two are related, this strongly, and here is why we think so”). Domain, a cluster of nodes that turned out to sit together (in practice, a topic Exo found by looking at how densely the graph connects, not a tag anyone applied). Authority, how much weight a node carries when Exo retrieves (in practice, a number from 0 to 1: content the person wrote or imported ranks high, narration an agent produced about them ranks low). The graph is not a second copy of your text with links bolted on. It is the only copy that matters to retrieval, and everything on the Concepts tab reads from it: contradictions are mined from nodes, phases cluster nodes by date, the identity manifold decomposes signals extracted from nodes, and the ExoBrain trains on the graph itself.

Where it comes from

Nodes and their first edges are written by ingestion. Everything after that is either the background cognition cycle adding structure or you asserting it through the API.

Node fields

createdAt is worth reading twice. Exo stamps the date the content is about rather than the date it arrived, because a ten-year archive imported on a Tuesday is not ten years of Tuesday. That is what makes phases line up with real history.

Edge fields

Domain fields

Domains are org-level: the clustering runs over the whole organization’s graph, and memberCount narrows the answer to the subject you are acting as. GET /v1/graph/domains/{id} adds a bridges array of node ids that connect this domain to others.

How to use it

Walk a domain, then drill into the node that looks interesting.
Every list route on the graph family is keyset-paginated: read data, and if hasMore is true, send nextCursor back as cursor. There are no totals. See Pagination.

Details worth knowing

Edges written through POST /v1/graph/edges are capped at a weight of 0.4, and the response returns the value actually stored. The cap exists so that a leaked key cannot inject a dominating relation into someone’s identity graph: organic evidence always outranks an assertion. The edge is stamped origin: "api" so you can tell yours apart later.
Nodes are scoped by ownership: GET /v1/graph/nodes returns nodes whose owner is the effective subject. Edges are shared across the org, so GET /v1/graph/edges scopes by the ownership of the edge’s source node. An edge whose source belongs to a teammate does not appear in your listing even if its target is yours. Filter with ?node= to get both directions around a node you own.
GET /v1/graph/domains returns the raw stored name, which for older organizations can be an opaque placeholder rather than a topic. The graph view of GET /v1/recall/{recall_type} resolves a friendly label at read time from the most central member content. Use the graph family when you want the raw substrate and the recall view when you want something to put in a UI.
PATCH /v1/graph/nodes/{id} with content re-embeds the node and collapses it to one fresh chunk. Re-segmentation into multiple chunks stays a job for the ingest pipeline, so a very long replacement is better sent as a new ingest than as a patch. metadata merges into the frontmatter rather than replacing it, and title replaces the title outright.

Limits

  • Contradiction screening is skipped on edges you assert in v1. An asserted edge that disagrees with the graph is written anyway, at the capped weight.
  • Both endpoints of an asserted edge must be owned by the effective subject. Anything else returns 404 node_not_found, which is also what a node that does not exist returns, so existence cannot be probed.
  • GET /v1/graph/nodes/{id} returns up to the 200 strongest edges around a node. It is not a full adjacency dump, and there is no route that returns one.

Next

How a memory is made

The full life of one node, from ingest through forget.

Insights and proposals

How new edges get suggested, and why they wait for you.