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.
List members
Section titled “List members”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.
Query parameters
Section titled “Query parameters”| 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. |
Request
Section titled “Request”curl "https://api.mereon.ai/v1/members?status=active&limit=50" \ -H "Authorization: Bearer $MEREON_TOKEN"Response
Section titled “Response”{ "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}Fields
Section titled “Fields”| 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 a member
Section titled “Get a member”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.
Request
Section titled “Request”curl "https://api.mereon.ai/v1/members/usr_2d9e" \ -H "Authorization: Bearer $MEREON_TOKEN"The response is one member, in the shape described above.
List members with their training counts
Section titled “List members with their training counts”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.
Query parameters
Section titled “Query parameters”| 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. |
Response
Section titled “Response”{ "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.
List pending invitations
Section titled “List pending invitations”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.
Response
Section titled “Response”{ "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.
List who reports to whom
Section titled “List who reports to whom”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.
Query parameters
Section titled “Query parameters”| 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. |
Response
Section titled “Response”{ "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.