Upsert user
curl --request POST \
--url https://api.jeantechnologies.com/v1/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"user_id": "u_alice",
"domain": "dating",
"context": "32, NYC, looking for someone serious. Reads a lot, runs in the park, vegetarian.",
"fields": {
"age": 32,
"location": "New York, NY"
},
"memory_ref": "jeanmemory://tenant/u_alice"
}
'{
"user_id": "u_alice",
"domain": "dating",
"schema_version": "dating.v3",
"fields": {
"age": 32,
"location": "New York, NY",
"relationship_goal": "serious"
},
"derived": {
"attachment_style": "secure"
},
"embeddings": {
"dating": {
"dim": 1024,
"version": "dating-2026-05-01"
}
},
"last_enriched_at": "2023-11-07T05:31:56Z"
}Users
Upsert user
Create or update a user with raw context, structured fields, or an external memory reference.
POST
/
users
Upsert user
curl --request POST \
--url https://api.jeantechnologies.com/v1/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"user_id": "u_alice",
"domain": "dating",
"context": "32, NYC, looking for someone serious. Reads a lot, runs in the park, vegetarian.",
"fields": {
"age": 32,
"location": "New York, NY"
},
"memory_ref": "jeanmemory://tenant/u_alice"
}
'{
"user_id": "u_alice",
"domain": "dating",
"schema_version": "dating.v3",
"fields": {
"age": 32,
"location": "New York, NY",
"relationship_goal": "serious"
},
"derived": {
"attachment_style": "secure"
},
"embeddings": {
"dating": {
"dim": 1024,
"version": "dating-2026-05-01"
}
},
"last_enriched_at": "2023-11-07T05:31:56Z"
}Use this when a user first enters your system. Send whatever context you have, in any form:
The
- Free text in
context(resume, intake transcript, profile blurb). The platform extracts fields against your domain schema. - Pre-structured
fieldswhen you already have typed values. Skips extraction. memory_refpointing at an external store you operate (Jean Memory, Mem0, or your own vector DB).
fields wins over anything extracted from context.
For incremental updates later (a new chat message, a follow-up call), use POST /context instead so you don’t re-send the whole user.
curl https://api.jeantechnologies.com/v1/users \
-H "Authorization: Bearer $JEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"user_id": "u_alice",
"domain": "dating",
"context": "32, NYC, looking for someone serious. Reads a lot, runs in the park, vegetarian.",
"fields": { "location": "New York, NY" }
}'
Example response
{
"user_id": "u_alice",
"domain": "dating",
"schema_version": "dating.v3",
"fields": {
"age": 32,
"location": "New York, NY",
"relationship_goal": "serious"
},
"derived": {
"attachment_style": "secure"
},
"embeddings": {
"dating": { "dim": 1024, "version": "dating-2026-05-01" }
},
"last_enriched_at": "2026-05-17T22:01:09Z"
}
embeddings object lists each domain head this user now has a vector for. After a single upsert in dating, only the dating head is populated. Other heads materialize lazily when the user is matched against in another domain.
Common pitfalls
My extracted fields are empty
My extracted fields are empty
Either the schema for this domain has no extraction rules yet (we co-design it during onboarding) or the
context was too sparse to ground anything. Run GET /schema?domain=... to inspect what the platform is trying to extract.Fields I sent don't match the schema
Fields I sent don't match the schema
Unrecognized field keys are stored under
extras and not used for ranking. Add them to the schema at onboarding or strip them before sending.Upsert vs. partial update
Upsert vs. partial update
POST /users replaces the user’s row entirely (subject to merging logic on provenance). For non-destructive incremental updates, use POST /context.Authorizations
API key issued by Jean Technologies. Contact the team for access.
Body
application/json
Client-supplied unique identifier.
Example:
"u_alice"
Domain this user belongs to (e.g. dating, hiring).
Example:
"dating"
Free-text context. The platform extracts structured fields from it.
Example:
"32, NYC, looking for someone serious. Reads a lot, runs in the park, vegetarian."
Pre-structured field values. Overrides any conflicting extraction.
Example:
{ "age": 32, "location": "New York, NY" }Optional pointer to an external memory or context store the customer operates.
Example:
"jeanmemory://tenant/u_alice"
Response
User upserted
Example:
"u_alice"
Example:
"dating"
Example:
"dating.v3"
Example:
{
"age": 32,
"location": "New York, NY",
"relationship_goal": "serious"
}Example:
{ "attachment_style": "secure" }Show child attributes
Show child attributes
Example:
{
"dating": {
"dim": 1024,
"version": "dating-2026-05-01"
}
}⌘I

