Update a team member
Edits an invited or active member. Scope: team_members:write.
- Role changes email the member and re-apply the location cardinality rules - demoting to
scannerwhile multiple locations are assigned requireslocation_ids(exactly one) in the same request (422 scanner_requires_single_location) location_idsis SET semantics and the single write path - VEXiON’s location mirror AND the member’s auth-time enforcement metadata both sync from it. A manager is never left without a location (422 manager_requires_location)expires_at(scanner only) extends, shortens, or clears the auto-expiry - the way to give a temp another month, or make them permanent (null)- Terminal states are immutable: PATCHing a
revokedorexpiredmember →409 member_not_editable; add the person again with POST - Email address is identity - not changeable via API
- Revoking a member is dashboard-only - there is no DELETE on this API
- Delegated billing: dashboard only
Authorizations
Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.
Body
Partial update of an invited or active member - terminal states (revoked, expired) return 409 member_not_editable.
Role and locations move together: changing role to scanner while the member has multiple locations requires location_ids (exactly one) in the same request. Delegated billing is never configurable via API - dashboard only.
Response
Updated member (full object).
A staff account - dashboard and scanner access. Role lives in the auth provider; the location assignment is dual-written: a queryable mirror in VEXiON (surfaced as Location.team_members[]) plus auth-time enforcement metadata on the user account, which is what locks a scanner to their single store at every request. location_ids here is the ONE write path - both copies sync from it.
id and this resource's identity fields (first_name/last_name/email/language) are anchored to a registry row scoped to YOUR organization - the same person staffing another organization has a DIFFERENT id there, and a PATCH here never changes what that other organization sees for them. Manual transactions carry the acting member as Transaction.team_member_id - which is why revoked and expired members are preserved as records: history stays attributable forever. Members sign in with their email code (OTP) or social login.
Team member identifier, tm_ prefix. For an active member it is stable within your organization across role and location changes, and it is never shared with any other organization they may also staff. For a member still invited it belongs to the current invitation and changes when the invitation is re-sent, when a PATCH edits the invited member's name, role or expires_at (the invitation is re-issued and a new email sent), and when the invite is accepted; the previous id then returns 404. Key invited members by email.
^tm_[A-Za-z0-9]+$"tm_01HW9R6M4XQ2N8MTX1RVTM0001"
What they can do:
admin- everything incl. billing, cards, team; implicit access to ALL locationsmanager- customers, notifications, scanner at assigned locations; no billing, no card editingscanner- POS scanner only, at exactly one location (a till account)
Role changes email the member automatically.
admin, manager, scanner "scanner"
Lifecycle:
invited- invitation email sent, account not yet created (invitation origin only)active- can sign in and actrevoked- removed by an admin (DELETE); sessions revoked, record preservedexpired-expires_atpassed; sessions revoked automatically, record preserved
Terminal states (revoked, expired) are not editable - add the person again with a new POST.
invited, active, revoked, expired "active"
How the account came to be: invitation - the member accepted an email invite on the branded accept page; direct - an API call created the account, active immediately with email-code (OTP) or social sign-in (typical for till/scanner accounts).
invitation, direct "direct"
Unix seconds when this member auto-expires - the temporary-staff feature, available on the scanner role only (seasonal hires, one-day events; a till account that cleans itself up). Null = permanent, and always null for admin/manager. At expiry the platform revokes all sessions (signed out within ~5 minutes), removes access, sets status: "expired", and emails the member; a heads-up email goes out 24 h before. Extend or clear by PATCHing before expiry.
null