/clients/{clientId}/assignment-rulesList a client's assignment rulesReturns one entry per active integration in the organization, each carrying that integration's current rule for this client. When an integration has no rule configured for the client yet, the entry is still returned with ruleId: null — so this doubles as a way to discover the integrationIds you can bind.
Cross-tenant lookups and missing clients both return 404 not_found so existence is never leaked.
Parameters
clientIdstring · uuidpathrequiredClient UUID.
Responses
Headers
X-RateLimit-LimitThe request cap for the tighter of the per-organization / per-endpoint windows that applied to this request.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetUnix timestamp (seconds) when the current window resets.
allOf · 2 options
datavaluerequiredThe response payload — shape depends on the endpoint.
metaobjectrequiredPagination metadata — populated on list endpoints, empty on single-resource endpoints.
Show child attributes
cursornull | stringOpaque cursor to pass to the next request.
hasMoreboolean | nullTrue when further pages of results are available.
dataarray of objectShow child attributes
Show array items
A client's assignment rule for a single integration. One is returned per active integration; `ruleId` and the other rule fields are `null` when no rule is configured for the client on that integration yet.
chatLabelsobjectOnly on read-only WhatsApp entries — maps the chat JIDs referenced by `filterCriteria` to display names taken from synced conversations. A ruled chat that never synced a message has no entry.
createdAtnull | string · date-timerequiredUTC timestamp when the rule was created (`null` when none is set).
enabledbooleanrequiredWhether the rule is active.
filterCriteriavaluerequiredShow child attributes
anyOf · 2 options
The rich querybuilder criteria deciding which of the integration's communications are assigned to the client; `null` when no rule is set. For Slack, a channel binding looks like `{"condition":"or","rules":[{"field":"channel","operator":"equals","value":"general"}]}`.
integrationIdstring · uuidrequiredThe integration this rule binds to the client. Pass it back in a PUT to configure the rule.
integrationTypestringrequiredProvider of the bound integration (e.g. `slack`, `gmail`).
priorityintegerrequiredRule ordering (lower number = higher priority).
providerEmailstringrequiredThe account/email the integration authenticates as.
readOnlybooleanThe caller may not write this rule — the integration is configurable only by the user who connected it (WhatsApp). Never include a read-only entry in a PUT replacement set; writing one is rejected. User-authenticated callers still see the rule's real values; callers with no user identity additionally get `rulesHidden: true` with the rule fields withheld.
ruleIdnull | string · uuidrequiredStable UUID of the rule, or `null` when none is configured yet.
rulesHiddenbooleanThe rule was withheld entirely because the caller carries no user identity (org-scoped service keys): `ruleId` and `filterCriteria` are `null` and `enabled` is `false` regardless of what is configured — do not read such an entry as "no rule yet". Deprecated as the do-not-write signal in favor of `readOnly`, which also covers user-authenticated callers.
updatedAtnull | string · date-timerequiredUTC timestamp of the most recent rule update (`null` when none is set).
{
"data": [
{
"chatLabels": {
"additionalProp1": "string"
},
"createdAt": "2026-06-09T00:00:00Z",
"enabled": true,
"filterCriteria": null,
"integrationId": "00000000-0000-0000-0000-000000000000",
"integrationType": "slack",
"priority": 0,
"providerEmail": "string",
"readOnly": true,
"ruleId": "00000000-0000-0000-0000-000000000000",
"rulesHidden": true,
"updatedAt": "2026-06-09T00:00:00Z"
}
],
"meta": {
"cursor": "string",
"hasMore": true
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "invalid_argument",
"message": "limit must be an integer between 1 and 100"
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "unauthorized",
"message": "Authentication required"
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "not_found",
"message": "client not found"
}
}Headers
Retry-AfterSeconds the client should wait before retrying.
errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "rate_limited",
"details": {
"retry_after_seconds": 30
},
"message": "Rate limit exceeded"
}
}