dynamicDistributionGroups
Dynamic Distribution Groups. Distribution groups whose membership is computed live from a query. The dynamicDistributionGroups entity set lives under /exchange/v1.0/dynamicDistributionGroups in the Recipients category.
| Fact | Value |
|---|---|
| Path | /exchange/v1.0/dynamicDistributionGroups |
| Category | Recipients |
| Tier | Tier 0, Directory |
| Read role | Group.Read.All (Community) |
| Write role | Group.ReadWrite.All (Pro) |
| Backing cmdlets | Get-DynamicDistributionGroup, Get-DynamicDistributionGroupMember, Set-DynamicDistributionGroup, New-DynamicDistributionGroup, Remove-DynamicDistributionGroup |
Routes
Section titled “Routes”| Method | Path | Synopsis | Role | Plan |
|---|---|---|---|---|
| GET | /exchange/v1.0/dynamicDistributionGroups |
List dynamicDistributionGroups entries. | Group.Read |
Community |
| POST | /exchange/v1.0/dynamicDistributionGroups |
POST /dynamicDistributionGroups - creates a filter-based group. Required: name. Then EITHER includedRecipients (precanned) OR recipientFilter (custom OPATH) - cmdlet enforces mutex. | Group.ReadWrite |
Pro |
| GET | /exchange/v1.0/dynamicDistributionGroups/{key} |
Get a single dynamicDistributionGroups entry by Identity. | Group.Read |
Community |
| PATCH | /exchange/v1.0/dynamicDistributionGroups/{key} |
PATCH /dynamicDistributionGroups/{key} - partial update via Set-DynamicDistributionGroup. To change membership pass updated recipientFilter/conditional*. Use ?forceMembershipRefresh=true to recompute immediately. | Group.ReadWrite |
Pro |
| DELETE | /exchange/v1.0/dynamicDistributionGroups/{key} |
DELETE /dynamicDistributionGroups/{key} - members (recipient objects) unaffected. | Group.ReadWrite |
Pro |
| GET | /exchange/v1.0/dynamicDistributionGroups/{key}/members |
Get-DynamicDistributionGroupMember - the live-evaluated member list for this filter-based group. Returns polymorphic recipients. | Group.Read |
Community |
| GET | /exchange/v1.0/dynamicDistributionGroups/{key}/owners |
GET /dynamicDistributionGroups/{key}/owners - owners are the ManagedBy identities on the group; resolve each via Get-Recipient. Mirrors GET /distributionGroups/{key}/owners; no dedicated owner cmdlet exists for dynamic groups, so we read the property off the entity. | Group.Read |
Community |
GET /exchange/v1.0/dynamicDistributionGroups
Section titled “GET /exchange/v1.0/dynamicDistributionGroups”List dynamicDistributionGroups entries.
Backing cmdlet: Get-DynamicDistributionGroup. Role: Group.Read (Community).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
all |
query | bool (switch) | Return all results instead of the EXO default of 1000. Maps -ResultSize Unlimited on Get-DynamicDistributionGroup; prevents silent truncation in large tenants. | |
anr |
query | string | Ambiguous name resolution (ANR) search string. Maps -Anr on Get-DynamicDistributionGroup; matches against CN, DisplayName, FirstName, LastName, and Alias. | |
sortBy |
query | string | Sort the results by a single property (Name, DisplayName, or Alias), ascending. Maps -SortBy on Get-DynamicDistributionGroup. | |
managedBy |
query | string | Filter the results by the group owner. Maps -ManagedBy on Get-DynamicDistributionGroup; accepts Name, Alias, DN, email address, or GUID. |
List dynamicDistributionGroups
Section titled “List dynamicDistributionGroups”Stub auto-generated example for the dynamicDistributionGroups collection. Backing cmdlet: Get-DynamicDistributionGroup. Live-verify with ?$top=3&$select=Id,Name and replace the synthetic body before promoting to Tier 1.
GET /exchange/v1.0/dynamicDistributionGroups?$top=3 HTTP/1.1Authorization: Bearer {token}HTTP/1.1 200 OK
{ "@odata.context": "http://localhost:5043/exchange/v1.0/$metadata#dynamicDistributionGroups", "value": []}Notes: Illustrative example derived from the cmdlet documentation, not a live capture: field names are real, values are placeholders.
Related: GET /exchange/v1.0/dynamicDistributionGroups/{key}
POST /exchange/v1.0/dynamicDistributionGroups
Section titled “POST /exchange/v1.0/dynamicDistributionGroups”POST /dynamicDistributionGroups - creates a filter-based group. Required: name. Then EITHER includedRecipients (precanned) OR recipientFilter (custom OPATH) - cmdlet enforces mutex.
Backing cmdlet: New-DynamicDistributionGroup. Role: Group.ReadWrite (Pro).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
name |
body | yes | ||
alias |
body | |||
conditionalCompany |
body | |||
conditionalCustomAttribute1 |
body | |||
conditionalCustomAttribute10 |
body | |||
conditionalCustomAttribute11 |
body | |||
conditionalCustomAttribute12 |
body | |||
conditionalCustomAttribute13 |
body | |||
conditionalCustomAttribute14 |
body | |||
conditionalCustomAttribute15 |
body | |||
conditionalCustomAttribute2 |
body | |||
conditionalCustomAttribute3 |
body | |||
conditionalCustomAttribute4 |
body | |||
conditionalCustomAttribute5 |
body | |||
conditionalCustomAttribute6 |
body | |||
conditionalCustomAttribute7 |
body | |||
conditionalCustomAttribute8 |
body | |||
conditionalCustomAttribute9 |
body | |||
conditionalDepartment |
body | |||
conditionalStateOrProvince |
body | |||
directMembershipOnly |
body | |||
displayName |
body | |||
includedRecipients |
body | |||
moderatedBy |
body | |||
moderationEnabled |
body | |||
organizationalUnit |
body | |||
primarySmtpAddress |
body | |||
recipientContainer |
body | |||
recipientFilter |
body | |||
sendModerationNotifications |
body | |||
dryRun |
query | bool (switch) |
Create rejected - missing required name
Section titled “Create rejected - missing required name”New-DynamicDistributionGroup requires the name field. Omitting it returns a 400 BadRequest from the canonical validation envelope before the cmdlet is invoked.
POST /exchange/v1.0/dynamicDistributionGroups HTTP/1.1Authorization: Bearer {token}Content-Type: application/json
{ "includedRecipients": "MailboxUsers", "conditionalDepartment": "Engineering"}HTTP/1.1 400 Bad Request
{ "error": { "code": "BadRequest", "message": "The 'name' field is required.", "target": "name" }, "correlationId": "0HN3K2A9D7F4B:00000012"}Notes: Doc-derived from Wiki + write-param allowlist; not live-captured. Body fields are Wiki-valid; values are illustrative.
Related: GET /exchange/v1.0/dynamicDistributionGroups
Create a dynamic distribution group
Section titled “Create a dynamic distribution group”Creates a filter-based distribution group via New-DynamicDistributionGroup. Membership is computed at delivery time from the precanned filter (includedRecipients + conditional fields) or a custom recipientFilter OPATH expression.
POST /exchange/v1.0/dynamicDistributionGroups HTTP/1.1Authorization: Bearer {token}Content-Type: application/json
{ "name": "exonaut-sample-dynamicDistributionGroups", "displayName": "Exonaut Sample Dynamic Group", "alias": "exonaut-sample-ddg", "primarySmtpAddress": "exonaut-sample-ddg@contoso.com", "includedRecipients": "MailboxUsers", "conditionalDepartment": "Engineering", "conditionalCompany": "Contoso"}HTTP/1.1 201 CreatedLocation: /exchange/v1.0/dynamicDistributionGroups/exonaut-sample-dynamicDistributionGroups
{ "Id": "exonaut-sample-dynamicDistributionGroups", "Identity": "exonaut-sample-dynamicDistributionGroups", "name": "exonaut-sample-dynamicDistributionGroups", "displayName": "Exonaut Sample Dynamic Group", "alias": "exonaut-sample-ddg", "primarySmtpAddress": "exonaut-sample-ddg@contoso.com", "includedRecipients": "MailboxUsers"}Notes: Doc-derived from Wiki + write-param allowlist; not live-captured. Body fields are Wiki-valid; values are illustrative.
Related: GET /exchange/v1.0/dynamicDistributionGroups
GET /exchange/v1.0/dynamicDistributionGroups/{key}
Section titled “GET /exchange/v1.0/dynamicDistributionGroups/{key}”Get a single dynamicDistributionGroups entry by Identity.
Backing cmdlet: Get-DynamicDistributionGroup. Role: Group.Read (Community).
Get a single dynamicDistributionGroups entry
Section titled “Get a single dynamicDistributionGroups entry”Stub auto-generated example for GET /dynamicDistributionGroups/{key}. Backing cmdlet: Get-DynamicDistributionGroup with -Identity {key}. Returns the full entity body; 404 if the identity doesn’t resolve.
GET /exchange/v1.0/dynamicDistributionGroups/{key} HTTP/1.1Authorization: Bearer {token}HTTP/1.1 200 OK
{ "@odata.context": "http://localhost:5043/exchange/v1.0/$metadata#dynamicDistributionGroups/$entity"}Notes: Illustrative example derived from the cmdlet documentation, not a live capture: field names are real, values are placeholders.
Related: GET /exchange/v1.0/dynamicDistributionGroups
PATCH /exchange/v1.0/dynamicDistributionGroups/{key}
Section titled “PATCH /exchange/v1.0/dynamicDistributionGroups/{key}”PATCH /dynamicDistributionGroups/{key} - partial update via Set-DynamicDistributionGroup. To change membership pass updated recipientFilter/conditional. Use ?forceMembershipRefresh=true to recompute immediately.*
Backing cmdlet: Set-DynamicDistributionGroup. Role: Group.ReadWrite (Pro).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
acceptMessagesOnlyFrom |
body | |||
acceptMessagesOnlyFromDLMembers |
body | |||
acceptMessagesOnlyFromSendersOrMembers |
body | |||
alias |
body | |||
bypassModerationFromSendersOrMembers |
body | |||
conditionalCompany |
body | |||
conditionalCustomAttribute1 |
body | |||
conditionalCustomAttribute10 |
body | |||
conditionalCustomAttribute11 |
body | |||
conditionalCustomAttribute12 |
body | |||
conditionalCustomAttribute13 |
body | |||
conditionalCustomAttribute14 |
body | |||
conditionalCustomAttribute15 |
body | |||
conditionalCustomAttribute2 |
body | |||
conditionalCustomAttribute3 |
body | |||
conditionalCustomAttribute4 |
body | |||
conditionalCustomAttribute5 |
body | |||
conditionalCustomAttribute6 |
body | |||
conditionalCustomAttribute7 |
body | |||
conditionalCustomAttribute8 |
body | |||
conditionalCustomAttribute9 |
body | |||
conditionalDepartment |
body | |||
conditionalStateOrProvince |
body | |||
customAttribute1 |
body | |||
customAttribute10 |
body | |||
customAttribute11 |
body | |||
customAttribute12 |
body | |||
customAttribute13 |
body | |||
customAttribute14 |
body | |||
customAttribute15 |
body | |||
customAttribute2 |
body | |||
customAttribute3 |
body | |||
customAttribute4 |
body | |||
customAttribute5 |
body | |||
customAttribute6 |
body | |||
customAttribute7 |
body | |||
customAttribute8 |
body | |||
customAttribute9 |
body | |||
directMembershipOnly |
body | |||
displayName |
body | |||
emailAddresses |
body | |||
extensionCustomAttribute1 |
body | |||
extensionCustomAttribute2 |
body | |||
extensionCustomAttribute3 |
body | |||
extensionCustomAttribute4 |
body | |||
extensionCustomAttribute5 |
body | |||
grantSendOnBehalfTo |
body | |||
hiddenFromAddressListsEnabled |
body | |||
includedRecipients |
body | |||
mailTip |
body | |||
mailTipTranslations |
body | |||
managedBy |
body | |||
moderatedBy |
body | |||
moderationEnabled |
body | |||
name |
body | |||
notes |
body | |||
phoneticDisplayName |
body | |||
primarySmtpAddress |
body | |||
recipientContainer |
body | |||
recipientFilter |
body | |||
rejectMessagesFrom |
body | |||
rejectMessagesFromDLMembers |
body | |||
rejectMessagesFromSendersOrMembers |
body | |||
reportToManagerEnabled |
body | |||
reportToOriginatorEnabled |
body | |||
requireSenderAuthenticationEnabled |
body | |||
sendModerationNotifications |
body | |||
sendOofMessageToOriginatorEnabled |
body | |||
simpleDisplayName |
body | |||
updateMemberCount |
body | boolean (switch) | ||
windowsEmailAddress |
body | |||
forceMembershipRefresh |
query | bool (switch) | ||
forceUpgrade |
query | bool (switch) | ||
ignoreDefaultScope |
query | bool (switch) | ||
dryRun |
query | bool (switch) |
Update a dynamic distribution group
Section titled “Update a dynamic distribution group”Partial update via Set-DynamicDistributionGroup. To change membership, pass an updated recipientFilter or conditional* field; add ?forceMembershipRefresh=true to recompute the membership immediately.
PATCH /exchange/v1.0/dynamicDistributionGroups/{key} HTTP/1.1Authorization: Bearer {token}Content-Type: application/json
{ "displayName": "Exonaut Sample Dynamic Group (Updated)", "mailTip": "This group is managed by Exonaut.", "conditionalDepartment": "Platform Engineering"}HTTP/1.1 200 OK
{ "Id": "exonaut-sample-dynamicDistributionGroups", "Identity": "exonaut-sample-dynamicDistributionGroups", "name": "exonaut-sample-dynamicDistributionGroups", "displayName": "Exonaut Sample Dynamic Group (Updated)", "mailTip": "This group is managed by Exonaut.", "conditionalDepartment": "Platform Engineering"}Notes: Doc-derived from Wiki + write-param allowlist; not live-captured. Body fields are Wiki-valid; values are illustrative.
Related: GET /exchange/v1.0/dynamicDistributionGroups
DELETE /exchange/v1.0/dynamicDistributionGroups/{key}
Section titled “DELETE /exchange/v1.0/dynamicDistributionGroups/{key}”DELETE /dynamicDistributionGroups/{key} - members (recipient objects) unaffected.
Backing cmdlet: Remove-DynamicDistributionGroup. Role: Group.ReadWrite (Pro).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
ignoreDefaultScope |
query | bool (switch) | ||
dryRun |
query | bool (switch) |
Delete a dynamic distribution group
Section titled “Delete a dynamic distribution group”Removes the filter-based group via Remove-DynamicDistributionGroup. The recipient objects that match the filter are unaffected - only the group definition is deleted.
DELETE /exchange/v1.0/dynamicDistributionGroups/{key} HTTP/1.1Authorization: Bearer {token}Content-Type: application/jsonHTTP/1.1 204 No ContentNotes: Doc-derived from Wiki + write-param allowlist; not live-captured. Body fields are Wiki-valid; values are illustrative.
Related: GET /exchange/v1.0/dynamicDistributionGroups
GET /exchange/v1.0/dynamicDistributionGroups/{key}/members
Section titled “GET /exchange/v1.0/dynamicDistributionGroups/{key}/members”Get-DynamicDistributionGroupMember - the live-evaluated member list for this filter-based group. Returns polymorphic recipients.
Backing cmdlet: Get-DynamicDistributionGroupMember. Role: Group.Read (Community).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
resultSize |
query | int | Max members to return (Get-DynamicDistributionGroupMember -ResultSize). Cmdlet default is 1000; pass a higher value to retrieve large filter-based groups. | |
includeSoftDeletedObjects |
query | bool (switch) | Include soft-deleted (still recoverable) members in the computed list (Get-DynamicDistributionGroupMember -IncludeSoftDeletedObjects). |
List the computed members of a dynamic distribution group
Section titled “List the computed members of a dynamic distribution group”Sub-resource of the dynamic distribution group at GET /dynamicDistributionGroups/{key} - returns the recipients that currently match the group’s OPATH filter, evaluated live at request time. Membership is filter-driven, so the set can change between calls without any explicit add or remove.
GET /exchange/v1.0/dynamicDistributionGroups/{key}/members HTTP/1.1Authorization: Bearer {token}HTTP/1.1 200 OK
{ "@odata.context": "http://localhost:5043/exchange/v1.0/$metadata#recipients", "value": []}Related: GET /exchange/v1.0/dynamicDistributionGroups/{key}, GET /exchange/v1.0/dynamicDistributionGroups
GET /exchange/v1.0/dynamicDistributionGroups/{key}/owners
Section titled “GET /exchange/v1.0/dynamicDistributionGroups/{key}/owners”GET /dynamicDistributionGroups/{key}/owners - owners are the ManagedBy identities on the group; resolve each via Get-Recipient. Mirrors GET /distributionGroups/{key}/owners; no dedicated owner cmdlet exists for dynamic groups, so we read the property off the entity.
Backing cmdlet: Get-Recipient. Role: Group.Read (Community).
?dryRun=true previews of any write stay on Community.

