Skip to content

Members

These endpoints read the organization’s directory of people: who is a member, what role and teams they have, who has been invited and not joined, and who reports to whom. To turn a name into an id, People is cheaper. To see how one person is doing on their training, use their progress.

Every endpoint here follows the rule the app applies to the same data, which is the user.read permission. An owner, admin or billing admin reads everyone. Anyone else reads only themself, and an external account is refused with 403. The fields and endpoints that are for an organization admin are marked below.

GET /v1/members

The organization’s people, ordered by name, as the members page lists them. Active people are listed unless status says otherwise. A person’s name and email are the organization’s own record of them, which can differ from their login’s.

Parameter Type Notes
query string Matches anywhere in the name or the email, case-insensitively.
status string active (the default), deactivated, or all. A deactivated person has left the organization.
teamId string Only members of this team. A team that is not in your organization is a 400.
noManager boolean true lists only people with no manager. Organization admins only; anyone else gets 403.
cursor string Pagination cursor from a previous response.
limit number 1 to 100. Default 50.
Terminal window
curl "https://api.mereon.ai/v1/members?status=active&limit=50" \
-H "Authorization: Bearer $MEREON_TOKEN"
{
"data": [
{
"id": "usr_2d9e...",
"name": "Ada Admin",
"email": "ada@example.com",
"status": "ACTIVE",
"signedUp": true,
"role": "admin",
"companyRoles": [{ "id": "rol_1122...", "name": "Operations Manager" }],
"teams": [{ "id": "tea_77aa...", "name": "Night shift", "role": "team-admin" }],
"phone": "+15555550101",
"directoryManaged": false,
"deactivatedAt": null,
"reportsTo": { "id": "usr_8s2k...", "name": "Sam Owner", "status": "ACTIVE" }
}
],
"nextCursor": "2",
"total": 120
}
Field Type Notes
id string The person’s user id, which is what the other endpoints name a person by.
status string ACTIVE, or DEACTIVATED once they have left. Their training history is kept either way.
signedUp boolean Whether they have finished setting up their account. Someone loaded in bulk or by a directory is a member before they sign in, so this is false for them. It does not mean they are an invitation.
role string owner, admin, billing-admin, viewer, or external.
companyRoles object[] The company roles they hold now.
teams object[] The teams they are on, each with role team-admin or team-viewer.
phone string | null Organization admins only. The number the organization has on file.
directoryManaged boolean Organization admins only. Whether an identity directory is in charge of their details: it provisioned them and the organization’s connection has not been disconnected. Disconnecting turns this false for everyone at once, and a paused or failing connection still counts as in charge.
deactivatedAt string | null Organization admins only. When they left, or null while they are active.
reportsTo object | null Organization admins only. The manager they have been given, as id, name and status, or null for no manager. A manager the organization records without an account has a null id and name.

A caller who reads only themself gets one row and none of the organization-admin fields.

GET /v1/members/{id}

One person, at any status. An organization admin may open anyone with a record in the organization. Anyone else may open only themself.

Everyone else gets 404, as if the person did not exist. So does an id from another organization, a person who never belonged, and an id that does not exist, so the answer does not say whether someone is a member.

Terminal window
curl "https://api.mereon.ai/v1/members/usr_2d9e" \
-H "Authorization: Bearer $MEREON_TOKEN"

The response is one member, in the shape described above.

GET /v1/members/progress

How much training each person has, as the progress page shows it. Everyone who has finished setting up appears, including people who have since left, because this is a record of who was trained and not a roster. Someone loaded in bulk who has never signed in is not listed until they do.

Ordered by the name on the person’s login, as the progress page is, with the id breaking ties so a page boundary never repeats or skips a person. A person the organization names differently from their login can sit out of alphabetical order, because the name shown is the organization’s own.

For how one person is doing, with completion and overdue counts, use their progress.

Parameter Type Notes
query string Matches anywhere in the name or the email, case-insensitively.
teamId string Only members of this team.
cursor string Pagination cursor from a previous response.
limit number 1 to 100. Default 50.
{
"data": [
{
"id": "usr_2d9e...",
"name": "Ada Admin",
"email": "ada@example.com",
"employmentStatus": "ACTIVE",
"companyRoles": [{ "id": "rol_1122...", "name": "Operations Manager" }],
"lessonCount": 6,
"popQuizCount": 2,
"lastReviewDate": "2026-06-01T00:00:00.000Z"
}
],
"nextCursor": null,
"total": 1
}

lessonCount is every lesson the person is enrolled in, finished or not. An organization admin sees every row and every review. Anyone else sees their own row, and lastReviewDate is then only a review they wrote themselves.

GET /v1/invitations

Invitations that have been sent and not yet accepted, newest first. Expired invitations are included and marked. Organization admins only; anyone else gets 403.

{
"data": [
{
"name": "New Hire",
"email": "new.hire@example.com",
"phone": null,
"role": "viewer",
"expiresAt": "2026-10-20T00:00:00.000Z",
"expired": false
}
],
"nextCursor": null
}

role is what the person will have when they accept. An invitation sent without one takes the role the app will give it, which is owner for the first person in an organization and viewer after that. An invitation has no id here, because the id is what its public accept page is addressed by.

GET /v1/reporting-lines

Each person and the manager they have been given. This is the reporting line and not the role tree: two people who share a title are not each other’s managers. See Company roles for the chart of roles.

Organization admins only; anyone else gets 403, because who has no manager is something only an organization admin is shown.

Parameter Type Notes
status string active (the default), deactivated, or all.
noManager boolean true lists only people with no manager.
cursor string Pagination cursor from a previous response.
limit number 1 to 100. Default 50.
{
"data": [
{
"id": "usr_2d9e...",
"name": "Ada Admin",
"status": "ACTIVE",
"reportsTo": { "id": "usr_8s2k...", "name": "Sam Owner", "status": "DEACTIVATED" }
},
{ "id": "usr_8s2k...", "name": "Sam Owner", "status": "ACTIVE", "reportsTo": null }
],
"nextCursor": null,
"total": 2
}

A manager who has left is still named, with status DEACTIVATED, so a team whose manager has gone can be found.