Users
Reading returns only registered users — those who have accepted an invite. Pending invitations and deactivated accounts are not returned.
Creating and deleting mirror the CMS user management: users are created as regular employees and optionally invited to the app, and only manually created users can be deleted. Profile pictures can be set for any employee, for example from an HR system that holds the photos.
Required scope: read:users for reading, write:users for creating, deleting and setting profile pictures.
Endpoints
/api/open/v1/usersList registered users (paginated). Filters: ?group_id={id}, ?since={date}
/api/open/v1/users/{id}Get a single user
/api/open/v1/usersCreate a user (returns 201 with the user)
/api/open/v1/users/{id}Soft delete a user (returns 204)
/api/open/v1/users/{id}/avatarSet the user's profile picture (multipart/form-data, returns 200 with the user)
List users
curl "https://customer.monotree.com/api/open/v1/users?group_id=1&per_page=25" \
-H "Authorization: Bearer mono_your_token_here"| Query param | Notes |
|---|---|
group_id | Filter users that belong to this group. |
page, per_page, since | Standard pagination — see Pagination. |
Response
{
"data": {
"id": 42,
"name": "John Doe",
"first_name": "John",
"last_name": "Doe",
"title": "Head of Engineering",
"email": "john@example.com",
"type": "default",
"avatar_url": "https://images.monotree.com/avatars/john-doe.jpg",
"is_manager": false,
"groups": [
{ "id": 1, "name": "Kitchen Staff", "type": "department", "is_manager": false, "created_at": "2026-01-15T10:00:00+00:00" }
],
"hired_at": "2025-06-01",
"date_of_birth": "1994-08-12",
"is_away": false,
"last_active_on": "2026-03-22T14:05:12.000000Z",
"registered_at": "2025-06-01T09:00:00+00:00",
"created_at": "2025-06-01T09:00:00+00:00"
}
}Field notes
hired_atis the effective hire date: a manual override set in the CMS wins over the synced value.date_of_birthis null unless the customer collects it (e.g. via an onboarding field).titleis the employee's job title, set per user in the CMS. It isnullunless the customer fills it in, and nothing syncs it from the HR system. The profession group(s) remain the synced position: filtergroups[]by typeprofession. Departments (typedepartment) are the organizational/location unit; a user can belong to several.avatar_urlis a direct URL to the profile picture, ornull. Embedded user objects on posts, comments and announcements carry the same field.is_manager(top level) is true when the user manages at least one group. Theis_managerflag on eachgroups[]entry tells which ones. To resolve an employee's manager(s), fetch the managers of their department group(s) via Groups.
Create a user
curl -X POST https://customer.monotree.com/api/open/v1/users \
-H "Authorization: Bearer mono_your_token_here" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"phone": "12345678",
"phone_country_code": "NO",
"groups": [1],
"hired_at": "2026-09-01",
"send_invite": true
}'| Field | Notes |
|---|---|
first_name, last_name | Required. |
email | Required. Lower-cased and trimmed; must not belong to an active user. |
phone | Optional. |
phone_country_code | Optional. ISO 3166-1 alpha-2 (e.g. NO) — used to format the number for SMS invites. |
locale | Optional. One of the platform's languages — see Locales. |
hired_at | Optional date. Defaults to today. |
groups | Optional array of group ids — departments, professions and custom groups (see Groups). The memberships count as manually added, so admins can change them in the CMS. |
send_invite | Optional boolean, default false. Emails the employee an invite to the app. |
Returns 201 with the same user object as GET /users/{id}, with registered_at null. A new user only shows up in GET /users after accepting the invite — keep the id from the create response if you need to delete the user before that.
- An email already used by an active user is rejected with
422(errors.email). - An email belonging to a deleted user restores that account instead of creating a duplicate: the fields you send are written over it, the response is still
201and carries the existing id. - Users are always created as regular employees (
type: default) — bots have their own endpoints.
Delete a user
curl -X DELETE https://customer.monotree.com/api/open/v1/users/42 \
-H "Authorization: Bearer mono_your_token_here"Soft deletes the user, same as deleting in the CMS: they lose access and disappear from the app; creating a user with the same email later restores the account. Returns 204.
Only manually created users can be deleted — a user synced from an external system (HR or rota portal) belongs to that sync and returns 422. Bots, system accounts and already deleted users return 404.
Set a profile picture
curl -X POST https://customer.monotree.com/api/open/v1/users/42/avatar \
-H "Authorization: Bearer mono_your_token_here" \
-F "media=@./jane.jpg"Send the image as a multipart/form-data field named media (jpg, png, gif, webp, bmp or svg, the same rule as the app's own upload). Returns 200 with the user object; avatar_url already points at the new picture.
- Works for any employee, including invited-but-unregistered and deactivated users. Bots return
404, set theirs withPUT /bots/{id}. - Replaces whatever picture the user has, including one they chose themselves, and deletes the previous file. Colleagues are not notified.