Documentation menu
Every synthesis pass extracts entities and relationships into a bi-temporal knowledge graph — who a user knows, what they use, where they work, and when each of those was true.
What gets extracted
The synthesis worker identifies five entity types:
| Type | Examples |
|---|---|
| person | "Alex", "my manager Sarah" |
| org | "Stripe", "Acme Corp", "Y Combinator" |
| tech | "Next.js", "PostgreSQL", "BullMQ" |
| project | "Project Atlas", "the payments rewrite" |
| location | "San Francisco", "HQ" |
And six relationship types:
| Relationship | Meaning |
|---|---|
| works_at | person → org |
| uses | person/project → tech |
| knows | person → person |
| member_of | person → org/project |
| reports_to | person → person |
| part_of | project → org |
Bi-temporal edges
Each relationship is stored as an edge with validity bounds:
validFrom— when this relationship became true (derived from chunk timestamps)validUntil— when it stopped being true;nullmeans currently activecurrent— convenience boolean,truewhenvalidUntilisnull
If synthesis later learns "Alex left Stripe and joined Anthropic", the Stripe edge gets validUntil set and a new Anthropic edge is created. Both are preserved — you get the full history, not a snapshot. Edges also carry a second, independent knowledge-time axis (when Anansi learned each boundary) — see temporal memory for asOf and asOfKnowledge point queries.
How to read the graph
Every GET /v1/context response includes entities[]:
Response shape (same as GET /v1/entities):
For graphs you want to render or query independently, use the dedicated endpoint:
Temporal facts in context
Alongside the entity graph, GET /v1/context returns temporal[] — a flat list of time-bounded facts extracted in the same synthesis pass:
This complements the entity graph: entities[] is structured and queryable; temporal[] is for prompt injection where you want to give the LLM a clean timeline. Both support point-in-time queries via asOf — see Temporal memory & point-in-time queries.
How to use entities in a prompt
When entities are populated
The entity graph is populated after the first synthesis run for a user. Synthesis is triggered automatically after every POST /v1/ingest call, but runs asynchronously — typically within a few seconds. A user who has never been synthesized returns entities: [].
To confirm synthesis has run, check that static[] is non-empty in GET /v1/context. Entities and temporal facts are extracted in the same pass as the static/dynamic profile.
GET /v1/entities are Pro+ features.