Employees
Staff records for the shifts, attendance and treatments modules. An employee may be linked to a company user — which is what gives them a login — or exist as a record only.
Use cases: Use this to sync a staff roster, invite people to the app, and say which services each therapist may be booked for.
GET
/employeesList employees.
`inviteStatus` is "accepted" once the employee is linked to a user, "pending" while an invite is outstanding, and "not_invited" otherwise. `linkedUser` is null for a record with no login.
Query Parameters
| Name | Type | Description | |
|---|---|---|---|
search | string | Free-text search across name, email and phone. | |
role | string | "owner", "manager", "shift_manager" or "employee". | |
groupId | number | Only employees in this employee group. | |
isActive | boolean | Filter by whether the employee is active. | |
sortBy | string | Column to sort by. | |
sortOrder | string | "asc" or "desc". | |
limit | number | Items per page. Default 50, clamped to 1-200. | |
offset | number | Row offset to start from (default 0). | |
page | number | 1-based page number (default 1). Converted to an offset; an explicit `offset` wins over it. | |
pageSize | number | Alias of `limit`. Wins over `limit` when both are sent. |
Request
curl -X GET "https://api.glance.co.il/employees" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
Response
{
"success": true,
"data": [
{
"id": 331,
"visibleId": "8d7c6b5a-4e3f-4210-9876-54321fedcba0",
"userId": 12,
"firstName": "מיכל",
"lastName": "לוי",
"email": "michal@example.co.il",
"phoneNumber": "050-1234567",
"role": "employee",
"isActive": true,
"creationDate": "2026-01-12T08:00:00.000Z",
"inviteStatus": "accepted",
"inviteToken": null,
"inviteExpiresAt": null,
"linkedUser": {
"firstName": "מיכל",
"lastName": "לוי",
"email": "michal@example.co.il"
}
}
],
"total": 14,
"limit": 50,
"offset": 0,
"pagination": {
"total": 14,
"limit": 50,
"offset": 0,
"hasMore": false,
"page": 1,
"pageSize": 50,
"totalPages": 1
}
}GET
/employees/id/:visibleIdGet a single employee.
Path Parameters
| Name | Type | Description | |
|---|---|---|---|
visibleId | string | required | The employee's `visibleId`. |
Request
curl -X GET "https://api.glance.co.il/employees/id/:visibleId" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
Response
{
"success": true,
"data": {
"id": 331,
"visibleId": "8d7c6b5a-4e3f-4210-9876-54321fedcba0",
"userId": 12,
"firstName": "מיכל",
"lastName": "לוי",
"email": "michal@example.co.il",
"role": "employee",
"isActive": true,
"groups": [
{
"id": 4,
"name": "מטפלות"
}
],
"inviteStatus": "accepted",
"inviteToken": null
}
}POST
/employees/createCreate an employee — either inviting a new person by email, or attaching a record to an existing company user.
Two different responses, depending on the path taken: with `userId` you get `linked: true` and no invite fields; without it you get `inviteId` and `inviteToken`. Read `visibleId` and `employeeId`, which are present either way.
Body Parameters
| Name | Type | Description | |
|---|---|---|---|
firstName | string | required | Given name. |
email | string | required | Email address. Required even for a linked record — it is the invite address and the key an existing invite is matched on. |
lastName | string | Family name. | |
phoneNumber | string | Phone number. | |
role | string | "employee" (the default), "shift_manager", "manager" or "owner". | |
groupIds | number[] | Employee groups to put them in. | |
userId | number | Attach the record to this existing company user instead of sending an invite. No email goes out, and the shift permissions are granted straight away. |
Request
curl -X POST "https://api.glance.co.il/employees/create" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"firstName": "example_firstName",
"email": "example_email",
"lastName": "example_lastName",
"phoneNumber": "example_phoneNumber",
"role": "example_role",
"groupIds": "example_groupIds",
"userId": 0
}'Response
Response
{
"success": true,
"visibleId": "8d7c6b5a-4e3f-4210-9876-54321fedcba0",
"employeeId": 331,
"inviteId": 55,
"inviteToken": "9f3c…"
}PUT
/employees/edit/:visibleIdUpdate an employee. All fields are optional.
Path Parameters
| Name | Type | Description | |
|---|---|---|---|
visibleId | string | required | The employee's `visibleId`. |
Body Parameters
| Name | Type | Description | |
|---|---|---|---|
firstName | string | Given name. | |
lastName | string | Family name. | |
email | string | Email address. | |
phoneNumber | string | Phone number. | |
role | string | "owner", "manager", "shift_manager" or "employee". | |
groupIds | number[] | Replacement list of employee groups. Sending it replaces the whole membership. |
Request
curl -X PUT "https://api.glance.co.il/employees/edit/:visibleId" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"firstName": "example_firstName",
"lastName": "example_lastName",
"email": "example_email",
"phoneNumber": "example_phoneNumber",
"role": "example_role",
"groupIds": "example_groupIds"
}'Response
Response
{
"success": true,
"visibleId": "8d7c6b5a-4e3f-4210-9876-54321fedcba0"
}DELETE
/employees/:visibleIdDeactivate an employee, or delete an already-inactive one.
Like retainers, this takes two calls: the first deactivates, the second deletes. The message tells you which happened, and deleting is a soft delete. `POST /employees/reactivate/:visibleId` brings a deactivated employee back.
Path Parameters
| Name | Type | Description | |
|---|---|---|---|
visibleId | string | required | The employee's `visibleId`. |
Request
curl -X DELETE "https://api.glance.co.il/employees/:visibleId" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
Response
{
"success": true,
"message": "Employee deactivated successfully"
}POST
/employees/link/:visibleIdLink an employee record to an existing company user.
`POST /employees/unlink/:visibleId` reverses it, `GET /employees/linkable-users` lists the users still available to link, and `POST /employees/resend-invite/:visibleId` issues a fresh invite (returning `inviteId`, `inviteToken` and `expiresAt`).
Path Parameters
| Name | Type | Description | |
|---|---|---|---|
visibleId | string | required | The employee's `visibleId`. |
Body Parameters
| Name | Type | Description | |
|---|---|---|---|
userId | number | required | The company user to link to. |
Request
curl -X POST "https://api.glance.co.il/employees/link/:visibleId" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"userId": 0
}'Response
Response
{
"success": true,
"visibleId": "8d7c6b5a-4e3f-4210-9876-54321fedcba0",
"userId": 12
}GET
/employees/id/:visibleId/servicesThe services this employee may be booked for, with their commission terms.
`GET /employees/id/:visibleId/eligible-services` lists every service they could be assigned to, each flagged with `isLinked`.
Path Parameters
| Name | Type | Description | |
|---|---|---|---|
visibleId | string | required | The employee's `visibleId`. |
Request
curl -X GET "https://api.glance.co.il/employees/id/:visibleId/services" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
Response
{
"success": true,
"data": [
{
"serviceId": 21,
"serviceName": "עיסוי רקמות עמוק",
"isExternal": false,
"commissionType": "PERCENT",
"commissionPercent": 40,
"commissionFixedAmount": null
}
]
}POST
/employees/id/:visibleId/servicesMake an employee bookable for a service.
Idempotent: linking a service that is already linked updates the commission terms rather than failing. The employee must be linked to a user first. `DELETE /employees/id/:visibleId/services/:serviceId` removes the link — existing bookings keep the therapist they were made with.
Path Parameters
| Name | Type | Description | |
|---|---|---|---|
visibleId | string | required | The employee's `visibleId`. |
Body Parameters
| Name | Type | Description | |
|---|---|---|---|
serviceId | number | required | The service to link. |
isExternal | boolean | The therapist is external rather than on staff. Defaults to false. | |
commissionType | string | "PERCENT" (the default) or "FIXED". | |
commissionPercent | number | Their share, when `commissionType` is "PERCENT". | |
commissionFixedAmount | number | A flat amount per treatment, when the type is "FIXED". |
Request
curl -X POST "https://api.glance.co.il/employees/id/:visibleId/services" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"serviceId": 0,
"isExternal": true,
"commissionType": "example_commissionType",
"commissionPercent": 0,
"commissionFixedAmount": 0
}'Response
Response
{
"success": true
}