team.member.role_changed
Collaborator's role within a team changes.
project_id is always null for team events.When this fires
A collaborator's role within the team changes — promoted, demoted, or moved between custom roles.
Required ability
team:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "team.member.role_changed",
"created_at": "2026-05-22T10:05:00Z",
"api_version": "2026-05-01",
"project_id": null,
"data": {
"team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86",
"user_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
"role_id": null
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always team.member.role_changed for this event. |
created_at | ISO 8601 timestamp | Server-side emission time. |
api_version | string | Webhook API contract version. |
project_id | null | Always null — account-level event. |
data.team_id | string UUID | Team the collaborator belongs to. |
data.user_id | string UUID | User id of the collaborator whose role changed. |
data.role_id | string UUID, nullable | Currently always null — the team's pivot role is not carried on this event. Read the role from GET /v1/teams/{team}/members/{member}. |
Caveats
- For ability detail behind a role id, listen for
role.updatedor pull the role definition from the API. - This event covers the team-level role on the
team_userpivot only. Groups carry permissions rather than roles, so a change to group membership emitsgroup.members_syncedinstead and never this event.
Related events
team.member.joined— predecessor in the lifecycle.role.updated— emits when the role definition itself changes.- Team events overview — back to family overview.
How is this guide?