People and cohorts
Events come from people, and the directory is built from what they send: an anonymous id becomes a person the moment an identify call names them, groups arrive the same way, and a cohort is a saved set of people defined by behaviour or state.
At a glance
- Identity
identifynames an anonymous id; write-once- Traits
$-prefixed traits are reserved; the rest are yours- Groups
group(type, key)rides the same pipeline- Cohorts
- Behavioural clauses are swept; state clauses are live
- Auth
- Project key to send, access token to read
- Reserved traits wear the $ prefix; a custom property named email stays custom.
- Identification is write-once: the moment a person was first named never moves.
- Merging is deliberate: two ids fold into one person only when asked, never by guess.
How it works
Every event carries a distinct id, and the directory folds them into people: first seen, last seen, event and session counts, and the properties their identifying events carried. Identification is an event like any other, which is why an identify accepted with a 202 is accepted for processing rather than instantly visible. A cohort then names a set of these people: behavioural clauses count events over a window and are re-evaluated by a sweep that stamps when it ran; state clauses compare current attributes and are answered live. The same cohort scopes a workbench question, targets a campaign and gates a workflow trigger.
Where to reach it
| Surface | Operation |
|---|---|
| REST | POST /v1/identify · POST /v1/group (project key, accepted for processing) |
| GraphQL | people, person, peopleGroups, cohorts queries · mergePeople, createCohort, updateCohort, setCohortActive, deleteCohort mutations |
| Realtime | None of its own: the directory updates as events are processed |
| MCP | None |
Example
curl "https://eu.api.prodantix.com/v1/identify" \
-H "Authorization: Bearer $PRODANTIX_KEY" \
-H "Content-Type: application/json" \
-d '{ "distinct_id": "u_8f3a", "properties": { "$email": "ada@example.com", "plan": "pro" } }'prodantix.identify('u_8f3a', {
traits: { email: 'ada@example.com' },
set: { plan: 'pro' },
});
prodantix.group('team', 'acme', { tier: 'scale' });prodantix.identify('u_8f3a',
traits: PersonTraits(email: 'ada@example.com'),
set: {'plan': 'pro'});prodantix.identify(
"u_8f3a",
traits=PersonTraits(email="ada@example.com"),
set_props={"plan": "pro"},
)The directory is browsed on the People screen and cohorts are authored on Cohorts.