A segment is an audience described by rules, such as "ordered twice in 90 days", evaluated when it is used. Unlike a list, its membership changes as contacts and their events change, so a count or preview is true only for that moment. See Objects and rules for the rule grammar. A contact's segments: GET /v1/contacts/{id}/segments.
Endpoints
| Endpoint | Request |
|---|---|
| List segments | GET /v1/segments |
| Create a segment | POST /v1/segments |
| Retrieve a segment | GET /v1/segments/{id} |
| Update a segment | PATCH /v1/segments/{id} |
| Delete a segment | DELETE /v1/segments/{id} |
| Preview segment rules | POST /v1/segments/preview |
| List contacts in a segment | GET /v1/segments/{id}/contacts |
| List who joined or left a segment on a day | GET /v1/segments/{id}/membership-changes |
| Retrieve a segment's size history | GET /v1/segments/{id}/size-history |
| Retrieve a segment's usage | GET /v1/segments/{id}/usage |
The Segment object
{
"id": "0192f3a3-2c4d-7f6e-9b32-5a7b8c9d0e1f",
"name": "Lapsed customers",
"description": "Newsletter readers who have not ordered in 90 days, for the win-back offer",
"rules": {
"all": [
{
"type": "event",
"name": "Order Completed",
"count": {
"operator": "equals",
"value": 0
},
"withinDays": 90
},
{
"type": "list",
"listIds": [
"0192f3a2-1b3c-7e5d-8a21-4f6a7b8c9d0e"
],
"member": true
}
]
},
"memberCount": 214,
"memberCountedAt": "2026-10-01T03:00:00.000Z",
"tags": [
"Win-back"
],
"createdAt": "2026-09-15T10:00:00.000Z",
"updatedAt": "2026-09-15T10:00:00.000Z"
}idstringrequireduuid
namestringrequireddescriptionstring | nullrequiredrulesobjectrequiredAny of 2 shapes
- Match all
1 child attribute
allobject[]requiredEvery rule or nested group must match.
at least 1 item · at most 20 items
Any of 10 shapes
- Attribute
5 child attributes
type"attribute"requiredfieldstringrequiredattributes.<key>, e.g.attributes.plan.pattern
^attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}$operatorstringrequiredHow to compare. Text comparisons (
equals,notEquals,contains,notContains,startsWith,in) ignore case and accents ("jose" matches "José").notEqualsandnotContainsalso match contacts without the value. Date operators (before,after,withinLastDays,moreThanDaysAgo) compare as dates and times in UTC: a stored ISO-8601 date is the start of that day,beforemeans earlier than the given day andafterlater than it, and a value that is not an ISO-8601 date or date and time never matches.inNextDaysis a date from today to that many days ahead.anniversaryInNextDays(0 = today) andanniversaryThisMonthignore the year, so they suit birthdays, and also read a yearless--MM-DD; a 29 February counts on 28 February in other years. Days are UTC days; these three are for attributes and dates, not contact fields.one of
equals,notEquals,contains,notContains,startsWith,exists,notExists,before,after,gt,gte,lt,lte,in,withinLastDays,moreThanDaysAgo,inNextDays,anniversaryInNextDays,anniversaryThisMonthvaluestringoptionalWhat to compare with, always as text:
"pro","3","true". Equality compares the stored value as text, so a stored 5 matches"5". An ISO date forbeforeandafter; a number forgt,gte,ltandlte; a whole number of days (1 to 3650) forwithinLastDays,moreThanDaysAgoandinNextDays, and 0 to 365 foranniversaryInNextDays. Omit forin,exists,notExistsandanniversaryThisMonth.up to 255 characters
valuesstring[]optionalFor
inonly: up to 100 values, each as text, any of which matches.at least 1 item · at most 100 items
- Contact field
5 child attributes
type"contact"requiredfieldstringrequiredThe contact column to test. Each takes these operators, and is refused with others:
email: equals, notEquals, contains, startsWith, exists, notExists, in;firstName: equals, notEquals, contains, startsWith, exists, notExists, in;lastName: equals, notEquals, contains, startsWith, exists, notExists, in;phone: equals, notEquals, contains, startsWith, exists, notExists, in;timezone: equals, notEquals, contains, startsWith, exists, notExists, in;externalId: equals, notEquals, contains, startsWith, exists, notExists, in;consent.email: equals;consent.push: equals;country: equals, notEquals, in, exists, notExists;locale: equals, notEquals, startsWith, in, exists, notExists;rfmGroup: equals, notEquals, in, exists, notExists;rfmRecency: equals, notEquals, in, exists, notExists, gt, gte, lt, lte;rfmFrequency: equals, notEquals, in, exists, notExists, gt, gte, lt, lte;rfmMonetary: equals, notEquals, in, exists, notExists, gt, gte, lt, lte;purchaseCount: equals, gt, gte, lt, lte;totalSpent: equals, gt, gte, lt, lte;lastPurchasedAt: before, after, withinLastDays, moreThanDaysAgo, exists, notExists;createdAt: before, after, withinLastDays, moreThanDaysAgo.phoneholds +country numbers: writeequals,notEqualsandinvalues with their country code. Consent takes"true"or"false". Purchases:purchaseCount,totalSpent(in the main currency) andlastPurchasedAtare a customer's totals of the workspace's purchase event (purchaseEventin workspace settings: an order, a paid invoice, a booking), recomputed daily; the contact's storedtotalSpentis null when the workspace's purchases carry no amount. In comparisons onpurchaseCountandtotalSpenta missing count or spend is 0, so someone who never purchased has 0 purchases and 0 spent. RFM:rfmGroupand its scoresrfmRecency,rfmFrequencyandrfmMonetary(monetary value: how much they spend) come from the same daily pass. A score is a whole number from 1 to 5, written as text ("5";valuesof them forin), 5 being the most recent, most frequent or highest spending; any other value is refused with 400. Someone who never purchased has norfmGroupor scores: on those four fields they match onlynotExistsandnotEquals. SorfmRecencynotEquals5 includes everyone who never purchased; add anexistsrule on the same field to leave them out (bought, but not recently).one of
email,firstName,lastName,phone,timezone,externalId,consent.email,consent.push,country,locale,rfmGroup,rfmRecency,rfmFrequency,rfmMonetary,purchaseCount,totalSpent,lastPurchasedAt,createdAtoperatorstringrequiredHow to compare. Text comparisons (
equals,notEquals,contains,notContains,startsWith,in) ignore case and accents ("jose" matches "José").notEqualsandnotContainsalso match contacts without the value. Date operators (before,after,withinLastDays,moreThanDaysAgo) compare as dates and times in UTC: a stored ISO-8601 date is the start of that day,beforemeans earlier than the given day andafterlater than it, and a value that is not an ISO-8601 date or date and time never matches.inNextDaysis a date from today to that many days ahead.anniversaryInNextDays(0 = today) andanniversaryThisMonthignore the year, so they suit birthdays, and also read a yearless--MM-DD; a 29 February counts on 28 February in other years. Days are UTC days; these three are for attributes and dates, not contact fields.one of
equals,notEquals,contains,notContains,startsWith,exists,notExists,before,after,gt,gte,lt,lte,in,withinLastDays,moreThanDaysAgo,inNextDays,anniversaryInNextDays,anniversaryThisMonthvaluestringoptionalWhat to compare with, always as text:
"pro","3","true". Equality compares the stored value as text, so a stored 5 matches"5". An ISO date forbeforeandafter; a number forgt,gte,ltandlte; a whole number of days (1 to 3650) forwithinLastDays,moreThanDaysAgoandinNextDays, and 0 to 365 foranniversaryInNextDays. Omit forin,exists,notExistsandanniversaryThisMonth.up to 255 characters
valuesstring[]optionalFor
inonly: up to 100 values, each as text, any of which matches.at least 1 item · at most 100 items
- Event
6 child attributes
type"event"requirednamestringrequiredThe event name.
1–128 characters
withinDaysintegeroptionalOnly events from the last
withinDaysdays.min > 0 · max 3650
notFollowedBystringoptionalOnly when this event name did not follow it afterwards.
1–128 characters
countobjectoptionalHow often; defaults to at least once.
{ operator: equals, value: 0 }is "has not done".whereobject[]optionalProperty conditions the event must meet, up to 5;
countcounts only events meeting all of them.at least 1 item · at most 5 items
- Message activity
9 child attributes
type"activity"requiredactivitystringrequirednotOpenedandnotClicked: sent, and not opened or clicked. Opens include machine opens (seeopenedByMachine).one of
sent,notSent,opened,clicked,notOpened,notClicked,bouncedcountobjectoptionalHow many messages had this activity; defaults to at least one. Not with
notSent.linkstringoptionalWith
clickedornotClicked: only clicks on a link whose address contains this text, ignoring case.1–500 characters
channelstringoptionalOnly messages on this channel (opened a push, not an email); any when left out.
one of
email,pushcampaignIdstringoptionalOnly messages of this campaign.
uuid
tagIdstringoptionalOnly messages of campaigns or journeys carrying this tag, as they are tagged when the rule is evaluated.
uuid
journeyStepIdstringoptionalInside a journey only: the message sent by the step with this id in the contact's current enrollment. Matches nobody outside a journey.
pattern
^[a-z0-9][a-z0-9_-]{0,63}$withinDaysintegeroptionalOnly activity from the last
withinDaysdays. FornotOpenedandnotClickedit is a waiting time instead: only messages sent at least this many days ago count, so each has had that long to be opened or clicked.min > 0 · max 3650
- Push installation
4 child attributes
type"installation"requiredhasstringrequiredactive: reachable by push (granted, active, not invalidated);none: not.one of
active,nonepushProjectIdstringoptionalOnly devices of this push project; any when omitted.
uuid
platformstringoptionalOnly devices on this platform; any when omitted.
one of
ios,android,web
- List membership
3 child attributes
type"list"requiredlistIdsstring[]requiredOne list or several: with
member: truein any of them, withfalsein none of them. Each must be one of the workspace's lists when the rules are saved.at least 1 item · at most 50 items
memberbooleanrequiredTrue for in the lists, false for not in them.
- Segment membership
3 child attributes
type"segment"requiredsegmentIdstringrequireduuid
memberbooleanrequiredTrue for in the segment, false for not in it.
- Topic
4 child attributes
type"topic"requiredtopicIdstringrequiredOne of the workspace's topics when the rules are saved.
uuid
channelstringoptionalReads the contact's choice for this channel, which overrides their topic-wide choice. Without it, the rule reads the topic-wide choice, which a contact's
subscribedshows.one of
email,pushsubscribedbooleanrequiredTrue for contacts the topic reaches, false for those it does not.
- Match all
1 child attribute
allobject[]requiredEvery rule must match.
at least 1 item · at most 20 items
- Match any
1 child attribute
anyobject[]requiredAt least one rule must match.
at least 1 item · at most 20 items
- Match any
1 child attribute
anyobject[]requiredAt least one rule or nested group must match.
at least 1 item · at most 20 items
Any of 10 shapes
- Attribute
5 child attributes
type"attribute"requiredfieldstringrequiredattributes.<key>, e.g.attributes.plan.pattern
^attributes\.[\p{L}\p{N}\p{M}_.-]{1,64}$operatorstringrequiredHow to compare. Text comparisons (
equals,notEquals,contains,notContains,startsWith,in) ignore case and accents ("jose" matches "José").notEqualsandnotContainsalso match contacts without the value. Date operators (before,after,withinLastDays,moreThanDaysAgo) compare as dates and times in UTC: a stored ISO-8601 date is the start of that day,beforemeans earlier than the given day andafterlater than it, and a value that is not an ISO-8601 date or date and time never matches.inNextDaysis a date from today to that many days ahead.anniversaryInNextDays(0 = today) andanniversaryThisMonthignore the year, so they suit birthdays, and also read a yearless--MM-DD; a 29 February counts on 28 February in other years. Days are UTC days; these three are for attributes and dates, not contact fields.one of
equals,notEquals,contains,notContains,startsWith,exists,notExists,before,after,gt,gte,lt,lte,in,withinLastDays,moreThanDaysAgo,inNextDays,anniversaryInNextDays,anniversaryThisMonthvaluestringoptionalWhat to compare with, always as text:
"pro","3","true". Equality compares the stored value as text, so a stored 5 matches"5". An ISO date forbeforeandafter; a number forgt,gte,ltandlte; a whole number of days (1 to 3650) forwithinLastDays,moreThanDaysAgoandinNextDays, and 0 to 365 foranniversaryInNextDays. Omit forin,exists,notExistsandanniversaryThisMonth.up to 255 characters
valuesstring[]optionalFor
inonly: up to 100 values, each as text, any of which matches.at least 1 item · at most 100 items
- Contact field
5 child attributes
type"contact"requiredfieldstringrequiredThe contact column to test. Each takes these operators, and is refused with others:
email: equals, notEquals, contains, startsWith, exists, notExists, in;firstName: equals, notEquals, contains, startsWith, exists, notExists, in;lastName: equals, notEquals, contains, startsWith, exists, notExists, in;phone: equals, notEquals, contains, startsWith, exists, notExists, in;timezone: equals, notEquals, contains, startsWith, exists, notExists, in;externalId: equals, notEquals, contains, startsWith, exists, notExists, in;consent.email: equals;consent.push: equals;country: equals, notEquals, in, exists, notExists;locale: equals, notEquals, startsWith, in, exists, notExists;rfmGroup: equals, notEquals, in, exists, notExists;rfmRecency: equals, notEquals, in, exists, notExists, gt, gte, lt, lte;rfmFrequency: equals, notEquals, in, exists, notExists, gt, gte, lt, lte;rfmMonetary: equals, notEquals, in, exists, notExists, gt, gte, lt, lte;purchaseCount: equals, gt, gte, lt, lte;totalSpent: equals, gt, gte, lt, lte;lastPurchasedAt: before, after, withinLastDays, moreThanDaysAgo, exists, notExists;createdAt: before, after, withinLastDays, moreThanDaysAgo.phoneholds +country numbers: writeequals,notEqualsandinvalues with their country code. Consent takes"true"or"false". Purchases:purchaseCount,totalSpent(in the main currency) andlastPurchasedAtare a customer's totals of the workspace's purchase event (purchaseEventin workspace settings: an order, a paid invoice, a booking), recomputed daily; the contact's storedtotalSpentis null when the workspace's purchases carry no amount. In comparisons onpurchaseCountandtotalSpenta missing count or spend is 0, so someone who never purchased has 0 purchases and 0 spent. RFM:rfmGroupand its scoresrfmRecency,rfmFrequencyandrfmMonetary(monetary value: how much they spend) come from the same daily pass. A score is a whole number from 1 to 5, written as text ("5";valuesof them forin), 5 being the most recent, most frequent or highest spending; any other value is refused with 400. Someone who never purchased has norfmGroupor scores: on those four fields they match onlynotExistsandnotEquals. SorfmRecencynotEquals5 includes everyone who never purchased; add anexistsrule on the same field to leave them out (bought, but not recently).one of
email,firstName,lastName,phone,timezone,externalId,consent.email,consent.push,country,locale,rfmGroup,rfmRecency,rfmFrequency,rfmMonetary,purchaseCount,totalSpent,lastPurchasedAt,createdAtoperatorstringrequiredHow to compare. Text comparisons (
equals,notEquals,contains,notContains,startsWith,in) ignore case and accents ("jose" matches "José").notEqualsandnotContainsalso match contacts without the value. Date operators (before,after,withinLastDays,moreThanDaysAgo) compare as dates and times in UTC: a stored ISO-8601 date is the start of that day,beforemeans earlier than the given day andafterlater than it, and a value that is not an ISO-8601 date or date and time never matches.inNextDaysis a date from today to that many days ahead.anniversaryInNextDays(0 = today) andanniversaryThisMonthignore the year, so they suit birthdays, and also read a yearless--MM-DD; a 29 February counts on 28 February in other years. Days are UTC days; these three are for attributes and dates, not contact fields.one of
equals,notEquals,contains,notContains,startsWith,exists,notExists,before,after,gt,gte,lt,lte,in,withinLastDays,moreThanDaysAgo,inNextDays,anniversaryInNextDays,anniversaryThisMonthvaluestringoptionalWhat to compare with, always as text:
"pro","3","true". Equality compares the stored value as text, so a stored 5 matches"5". An ISO date forbeforeandafter; a number forgt,gte,ltandlte; a whole number of days (1 to 3650) forwithinLastDays,moreThanDaysAgoandinNextDays, and 0 to 365 foranniversaryInNextDays. Omit forin,exists,notExistsandanniversaryThisMonth.up to 255 characters
valuesstring[]optionalFor
inonly: up to 100 values, each as text, any of which matches.at least 1 item · at most 100 items
- Event
6 child attributes
type"event"requirednamestringrequiredThe event name.
1–128 characters
withinDaysintegeroptionalOnly events from the last
withinDaysdays.min > 0 · max 3650
notFollowedBystringoptionalOnly when this event name did not follow it afterwards.
1–128 characters
countobjectoptionalHow often; defaults to at least once.
{ operator: equals, value: 0 }is "has not done".whereobject[]optionalProperty conditions the event must meet, up to 5;
countcounts only events meeting all of them.at least 1 item · at most 5 items
- Message activity
9 child attributes
type"activity"requiredactivitystringrequirednotOpenedandnotClicked: sent, and not opened or clicked. Opens include machine opens (seeopenedByMachine).one of
sent,notSent,opened,clicked,notOpened,notClicked,bouncedcountobjectoptionalHow many messages had this activity; defaults to at least one. Not with
notSent.linkstringoptionalWith
clickedornotClicked: only clicks on a link whose address contains this text, ignoring case.1–500 characters
channelstringoptionalOnly messages on this channel (opened a push, not an email); any when left out.
one of
email,pushcampaignIdstringoptionalOnly messages of this campaign.
uuid
tagIdstringoptionalOnly messages of campaigns or journeys carrying this tag, as they are tagged when the rule is evaluated.
uuid
journeyStepIdstringoptionalInside a journey only: the message sent by the step with this id in the contact's current enrollment. Matches nobody outside a journey.
pattern
^[a-z0-9][a-z0-9_-]{0,63}$withinDaysintegeroptionalOnly activity from the last
withinDaysdays. FornotOpenedandnotClickedit is a waiting time instead: only messages sent at least this many days ago count, so each has had that long to be opened or clicked.min > 0 · max 3650
- Push installation
4 child attributes
type"installation"requiredhasstringrequiredactive: reachable by push (granted, active, not invalidated);none: not.one of
active,nonepushProjectIdstringoptionalOnly devices of this push project; any when omitted.
uuid
platformstringoptionalOnly devices on this platform; any when omitted.
one of
ios,android,web
- List membership
3 child attributes
type"list"requiredlistIdsstring[]requiredOne list or several: with
member: truein any of them, withfalsein none of them. Each must be one of the workspace's lists when the rules are saved.at least 1 item · at most 50 items
memberbooleanrequiredTrue for in the lists, false for not in them.
- Segment membership
3 child attributes
type"segment"requiredsegmentIdstringrequireduuid
memberbooleanrequiredTrue for in the segment, false for not in it.
- Topic
4 child attributes
type"topic"requiredtopicIdstringrequiredOne of the workspace's topics when the rules are saved.
uuid
channelstringoptionalReads the contact's choice for this channel, which overrides their topic-wide choice. Without it, the rule reads the topic-wide choice, which a contact's
subscribedshows.one of
email,pushsubscribedbooleanrequiredTrue for contacts the topic reaches, false for those it does not.
- Match all
1 child attribute
allobject[]requiredEvery rule must match.
at least 1 item · at most 20 items
- Match any
1 child attribute
anyobject[]requiredAt least one rule must match.
at least 1 item · at most 20 items
memberCountinteger | nullrequiredContacts in the stored membership, exact, from the background evaluation that runs about every 15 minutes; null until first counted, and again for a moment after the rules change.
min 0
memberCountedAtstring | nullrequiredWhen
memberCountwas taken.date-time
tagsstring[]requiredTag names, sorted without case.
createdAtstringrequireddate-time
updatedAtstringrequireddate-time