Five primitives. Every API call works on one of them. See Models for the three-tier compatibility-model architecture that powersDocumentation Index
Fetch the complete documentation index at: https://docs.jeanmemory.com/llms.txt
Use this file to discover all available pages before exploring further.
/match.
User
A row keyed by
user_id, scoped to a domain. Structured fields plus dense vectors.Schema
The typed shape of a user in a domain. Hard, soft, and derived fields.
Match
Pipeline that takes a user plus filters and returns ranked candidates.
Feedback
Outcome labels that train the ranker.
Users
Auser_id plus domain uniquely identifies a record. Two ways to write:
POST /usersis an upsert. You send the full payload (rawcontext, pre-builtfields, or amemory_refto an external store) and we replace or create. Right for initial intake and one-shot uploads.POST /contextis an incremental append. You send one new piece of context (a chat message, a voice transcript chunk, a behavior event) and we merge it into the existing representation. Right for anything that streams.
GET /users/{user_id} and returns the full representation: structured fields, derived attributes, dense vectors per domain, and provenance.
Schemas
A schema declares what to extract from incoming context for a given domain. Three kinds of field:Hard fields
Hard fields
Strict types. Used as
WHERE clauses in the SQL filter stage. Examples: age, gender, location, salary_min_usd.Soft fields
Soft fields
Free-text fields that feed the domain-adapted embedding head. Examples:
values_text, motivation_text, thesis_text.Derived fields
Derived fields
Computed at ingest from raw input. Examples:
attachment_style from intake transcript, tenure_predicted from CV trajectory, photo_aesthetic_vector from vision model.GET /schema?domain=....
Matches
POST /match runs the pipeline:
Each stage can be toggled or tuned via the stages object on the request:
true or false as a shortcut, or pass { "enabled": ..., "top_k": ..., "min_score": ..., "model": ... } for finer control. Set explain: true to get per-candidate stage_scores and human-readable reasons so you can attribute any decision back to the stage that made it.
| Stage | Per-candidate cost | Typical survivors |
|---|---|---|
| SQL filter | microseconds | 10,000 |
| Light ML | milliseconds | 500 |
| Dense embedding | sub-ms (ANN) | 50 |
| Cross-encoder | ~10 ms | 10 |
| LLM judge | seconds | 5 |
Feedback
POST /feedback accepts outcome labels (accepted, rejected, converted, expired, or a tenant-registered label) plus an optional weight. Outcomes accumulate into training triplets. Past a per-domain threshold, the ranker auto-fine-tunes. Use POST /train with force=true to skip the threshold.
Where context comes from
You decide.Raw text on intake
Pass
context to POST /users. The platform extracts fields against your domain schema.Structured fields
Pass
fields directly. Skips extraction.Memory reference
Pass
memory_ref pointing at an external store you operate (Jean Memory, Mem0, your own vector DB).Streaming context
POST /context for chat messages, transcripts, behavior events. The platform merges incrementally without you re-sending the full user.Voice or chat intake
Optionally, we run a short intake (LLM-driven call or web widget) on your behalf and ingest the transcript.

