Skip to content

Update a team member

Request

Partially updates a Team Member with a merge-patch body. services, when present, replaces the full set of bookable service links; each link is keyed by service_id and carries the same override fields as on Service. Missing services leaves links unchanged, services: [] unlinks every service, and null override fields inherit the Service default. Requires If-Match; changing links moves the ETag on both the Team Member and affected Service resources.

Security
OAuth2(Required scopes: team_members:write) or RestrictedKey
Path
location_idintegerrequired

Identifier of the Location. Verified against the credential on every call — a Location the credential cannot access responds with 404.

team_member_idintegerrequired

Identifier of the Team Member.

Headers
If-Matchstringrequired

ETag value of the resource version the change is based on. A stale value fails with 412 stale_version; a missing header fails with 428 precondition_required.

Bodyapplication/merge-patch+jsonrequired
namestring
specializationstring, non-empty

Public profession label shown to clients (for example in online booking).

position_idinteger or null
servicesArray of objects(TeamMemberServiceLink)
is_billableboolean

Moves the Team Member on or off a paid seat in the Location's licence, changing what the Location is charged. Turning it on fails with 422 when the licence has no free paid seat; turning it off also drops schedule access, because a non-billable member cannot be bookable. Locations on the older licensing model ignore this field.

curl -i -X PATCH \
  'https://developer.alteg.io/_mock/en/b2b-v3/openapi/locations/{location_id}/team_members/{team_member_id}' \
  -H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
  -H 'Content-Type: application/merge-patch+json' \
  -H 'If-Match: string' \
  -d '{
    "position_id": 16
  }'

Responses

The updated team member.

Headers
RateLimit-Remaininginteger, (int32), >= 0

Requests left in the most constrained policy window that applies to this request.

RateLimit-Resetinteger, (int32), >= 0

On 429, seconds until the most constrained policy frees up; it equals Retry-After there. On a successful response it reports the length of that policy's window rather than the time left in the current one, so treat it as the window size, not as a countdown — the counter to pace against is RateLimit-Remaining.

RateLimit-Policystring

Most constrained policy applied to the request, as <limit>;w=<window in seconds>.

Example:"10;w=60"
ETagstring

Version tag of the returned resource. Send it back in If-Match on the next PATCH or DELETE.

X-Request-Idstring

Request identifier for support and log correlation.

Bodyapplication/json
idintegerread-onlyrequired
objectstringread-onlyrequired
Value:"team_member"
namestringrequired
specializationstringrequired

Public profession label shown to clients (for example in online booking).

position_idinteger or null

Position from listPositions.

service_idsArray of integers

Services this Team Member can be scheduled for.

is_bookablebooleanread-only

Derived — whether the member can currently receive appointments.

is_billableboolean

Whether this Team Member occupies a paid seat in the Location's licence, which is what the Location is charged for. A non-billable member cannot hold schedule access, so is_bookable is always false for one. Locations still on the older licensing model report false here and ignore the field on write — there the paid seat count follows schedule access instead.

created_atstring, (date-time)read-only

UTC.

updated_atstring, (date-time)read-only

UTC.

Response
{ "id": 321, "object": "team_member", "name": "Aigerim Bekova", "specialization": "Hairdresser", "position_id": 15, "service_ids": [ 100 ], "is_bookable": true, "created_at": "2026-06-01T08:00:00Z", "updated_at": "2026-07-01T08:00:00Z" }