User groups as the service container (services get/update with its deactivate-what-you-omit semantics), user CRUD including create_many and find_by_address, user aliases, password resets, and user syncs — LDAP/AD source creation, Entra/Google console-only sources, sync schedules, and comparison-type filters.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add WYRE-AI/msp-claude-plugins --skill users-and-groups --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Users And Groups?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/wyre-ai-users-and-groups)More formats (shields.io, HTML) on the badges page.
---
name: "Mailprotector Users & Groups"
description: >
User groups as the service container (services get/update with its
deactivate-what-you-omit semantics), user CRUD including create_many and
find_by_address, user aliases, password resets, and user syncs — LDAP/AD
source creation, Entra/Google console-only sources, sync schedules, and
comparison-type filters.
when_to_use: >-
When managing Mailprotector user groups, users, aliases, services, or
directory syncs. Use when: mailprotector user, user group, create users,
find by address, user alias, reset password, user sync, AD sync, Entra
sync, LDAP sync, mailprotector services, provision bracket.
---
# Mailprotector Users & Groups
## Overview
Users live in user groups; user groups live under domains and are the
unit of **service provisioning** — which products (CloudFilter, Bracket,
SafeSend, XtraMail, SecureStore, hosting) a set of users gets. Manual
user CRUD and directory sync are alternative population strategies for
the same groups.
## Key Concepts
| Concept | Detail |
|---------|--------|
| User group | `{id, name, domain, user_count}` — created under a domain with just `name` |
| Services | Per user group; split into one `hosting` option plus any number of `addons` |
| `user_type` | `1` User, `2` Alias, `3` Mailing List, `11` Unlicensed User |
| Primary address | Generated as `<name>@<domain>`; one extra address per domain alias |
| User sync | Domain-level directory import into a `destination_user_group` |
| Sync source types | `UserSync::LdapSource` (API-creatable), `UserSync::GoogleSource` and `UserSync::MicrosoftGraphSource` (Entra/O365 — **console-only**) |
## Common Workflows
### User groups and services
1. Create: `POST /domains/{domain_id}/user_groups` `{"name": "..."}`;
list with `mailprotector_user_groups_list`.
2. Read services: `GET /user_groups/{user_group_id}/services` → array of
`{id, service_type, user_group, domain}`.
3. Update services: `PUT /user_groups/{user_group_id}/services` with
```json
{"service_types": {"hosting": "other", "addons": ["bracket", "securestore"]}}
```
One `hosting` value, any number of `addons`. **Any currently active
service not present in the body is deactivated** — always GET the
current services, merge, then PUT the full desired set.
4. Rename: `PUT /user_groups/{id}`; delete: `DELETE /user_groups/{id}` —
**deletes every user in the group**. Move users to another group
first to preserve them.
### Creating users
- Single: `POST /user_groups/{user_group_id}/users` with
`{"name": "username", "password": "...", "first_name": "...",
"last_name": "...", "user_type_id": 1, "aliases": ["alias1"]}`.
Responds 201 with an **array** containing the created user.
- Bulk: `POST /user_groups/{user_group_id}/users/create_many` with
`{"users": [ {...}, {...} ]}` — same per-user shape.
- Each user gets `<name>@<domain>` plus one address per domain alias.
- Lookup: `mailprotector_users_list` (filterable, e.g.
`?first_name=Bob`), `mailprotector_users_get`, and
`mailprotector_users_find_by_address`
(`POST /users/find_by_address` `{"address": "someone@domain.com"}`) —
searching an alias address returns the **root** user.
### Maintaining users
- Update: `PUT /users/{user_id}` — `first_name`, `last_name`, `phone`,
`user_type_id`.
- Reset password: `POST /users/{user_id}/reset_password`
`{"password": "..."}` — sets it to the supplied value (high-impact;
confirm with the operator).
- Delete: `DELETE /users/{user_id}` — irreversible.
- Aliases: `GET /users/{user_id}/aliases`;
`POST /users/{user_id}/aliases` with the **nested** body
`{"alias": {"name": "alias-username"}}` (unlike the flat `aliases`
array on user create). The parent must be `user_type` "User" —
mailing lists and equipment accounts cannot take aliases. An alias
address is created for the domain and each domain alias.
### Directory sync (AD / Entra)
1. List: `GET /domains/{domain_id}/user_syncs`; single:
`GET /user_syncs/{user_sync_id}`.
2. Create (LDAP/AD only):
`POST /domains/{domain_id}/user_syncs` with
`destination_user_group_id`, `source_type: "UserSync::LdapSource"`,
`enabled: "true"`, and
`source: {host, port, use_ssl, username, password, search_base}`.
New syncs are **disabled by default** unless `enabled` is passed.
Google Workspace and Microsoft Graph (Entra ID / Office 365) sources
must be provisioned in the web console — but once they exist, their
schedule and filters are managed via the API like any other sync.
3. Schedule (per domain, not per sync):
`GET`/`PUT /domains/{domain_id}/user_sync_schedule` with
`{"interval": 30, "enabled": true}` — `interval` is minutes between
runs; the response carries `last_run_at`/`next_run_at`.
4. Filters: `GET`/`POST /user_syncs/{user_sync_id}/filters` with
`{"field": "Department", "value": "Accounting", "filter_group":
"all", "comparison_type_id": 1}`; delete via
`DELETE /user_sync_filters/{id}`. `filter_group` is `all` (AND) or
`any` (OR). Comparison types:
| id | Comparison | id | Comparison |
|----|------------|----|------------|
| 1 | Equals | 5 | Contains |
| 2 | Does not equal | 6 | Does not contain |
| 3 | Greater than | 7 | Matches |
| 4 | Less than | 8 | Does not match |
## Gotchas
- **The services PUT is declarative, not additive.** Omitting an active
addon deactivates it. This is the highest-risk write in this skill —
read-merge-write, always.
- **Sync health**: `alive: false` on a sync means the source stopped
answering; check host/credentials before touching filters.
- **`enabled` on sync create is the string `"true"`** in the documented
body; the update accepts a boolean. Send what the endpoint shows.
- **User create returns an array**, even for a single user — index
`[0]` for the created record.
- **Deleting a user group deletes its users** — the API will not warn.
## Related Skills
- [customers-and-domains](../customers-and-domains/SKILL.md) — the domain must be Active before users receive mail
- [quarantine-and-messages](../quarantine-and-messages/SKILL.md) — per-user quarantine once users exist
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!