Members
Ask
List members
GET/v1/teams/{teamId}/membersLists active team members.
Required scopes: member:read
Parameters
path.teamIdrequired | string:uuidTeam identifier. |
|---|---|
query.limit | integerMaximum number of records to return. Defaults to 50 and is capped at 200. |
query.cursor | stringCursor returned by page.nextCursor from the previous list response. |
Response 200
data | object[] |
|---|---|
data[].id | string:uuidStable member identifier used in API paths. |
data[].orgId | string:uuidTeam identifier. |
data[].membershipId | string:uuidStable membership aggregate identifier. |
data[].userId | stringRoadOps user identifier for the member. |
data[].role | "admin" | "user"Member role in the team. |
data[].status | "active" | "departed" | "removed"Current membership status. |
data[].joinedAt | string:date-timeISO 8601 timestamp when the member joined. |
data[].grantedAt | string:date-timeISO 8601 timestamp when access was granted. |
data[].grantedBy | stringUser identifier that granted access. |
data[].memberName | stringMember display name. |
data[].givenName | stringMember first or given name visible to the caller. |
data[].familyName | stringMember last or family name visible to the caller. |
data[].memberEmail | string:emailMember email address. |
data[].memberPicture | string:uriMember profile photo URL. |
data[].scheduleNoticeWindow | "24h" | "48h" | "off"Member schedule notice preference. |
data[].automaticRemovalDate | stringDate-only value in YYYY-MM-DD format when this member is scheduled for automatic removal. |
data[].automaticRemovalSetBy | stringUser identifier that set the automatic removal date. |
data[].automaticRemovalSetAt | string:date-timeISO 8601 timestamp when automatic removal was set. |
data[].updatedAt | string:date-timeISO 8601 timestamp when this member record was last updated. |
data[].updatedBy | stringUser identifier that last updated this member record. |
data[].version | integerCurrent projected record version. |
data[].membershipVersion | integerCurrent membership aggregate version. |
data[].cursor | integerLatest event-ledger cursor projected into this member record. |
page | object |
page.limit | integerMaximum number of records returned in this page. |
page.nextCursor | string | nullCursor to pass as the next request's cursor query parameter, or null when there are no more results. |
meta | object |
meta.cursor | number | nullHighest record cursor represented by this response. |
Invite a member
POST/v1/teams/{teamId}/membersAccepts a command to invite a team member. The active member record becomes available after the invitation is accepted and projected.
Required scopes: member:write
Parameters
path.teamIdrequired | string:uuidTeam identifier. |
|---|---|
header.Idempotency-Key | string:uuidOptional caller-generated UUID used to make mutation retries safe. Reuse the same UUID only when retrying the same request. |
Request body (application/json)
invitationId | string:uuidOptional caller-supplied invitation ID. RoadOps generates one when omitted. |
|---|---|
emailrequired | string:emailEmail address for the invited member. |
rolerequired | "admin" | "user"Role to grant when the invitation is accepted. |
message | stringOptional invitation message. |
expiresAt | string:date-timeOptional ISO 8601 timestamp when the invitation expires. |
automaticRemovalDate | stringOptional date-only value in YYYY-MM-DD format when the member should be automatically removed. |
Response 202
commandId | string:uuidCommand identifier accepted into the RoadOps command ledger. |
|---|---|
resourceId | string:uuidIdentifier of the resource targeted by the command. |
resourceType | stringResource type targeted by the command. |
status | "applied"Command dispatch status. |
aggregateVersion | integerAggregate version produced by the accepted command. |
cursor | integerEvent-ledger cursor for the accepted update. Refetch until returned records reach this cursor. |
links | object |
links.refetch | stringRelative URL to refetch the affected resource. |
Retrieve a member
GET/v1/teams/{teamId}/members/{memberId}Returns one active team member by ID.
Required scopes: member:read
Parameters
path.teamIdrequired | string:uuidTeam identifier. |
|---|---|
path.memberIdrequired | string:uuidMember identifier. |
Response 200
data | object |
|---|---|
data.id | string:uuidStable member identifier used in API paths. |
data.orgId | string:uuidTeam identifier. |
data.membershipId | string:uuidStable membership aggregate identifier. |
data.userId | stringRoadOps user identifier for the member. |
data.role | "admin" | "user"Member role in the team. |
data.status | "active" | "departed" | "removed"Current membership status. |
data.joinedAt | string:date-timeISO 8601 timestamp when the member joined. |
data.grantedAt | string:date-timeISO 8601 timestamp when access was granted. |
data.grantedBy | stringUser identifier that granted access. |
data.memberName | stringMember display name. |
data.givenName | stringMember first or given name visible to the caller. |
data.familyName | stringMember last or family name visible to the caller. |
data.memberEmail | string:emailMember email address. |
data.memberPicture | string:uriMember profile photo URL. |
data.scheduleNoticeWindow | "24h" | "48h" | "off"Member schedule notice preference. |
data.automaticRemovalDate | stringDate-only value in YYYY-MM-DD format when this member is scheduled for automatic removal. |
data.automaticRemovalSetBy | stringUser identifier that set the automatic removal date. |
data.automaticRemovalSetAt | string:date-timeISO 8601 timestamp when automatic removal was set. |
data.updatedAt | string:date-timeISO 8601 timestamp when this member record was last updated. |
data.updatedBy | stringUser identifier that last updated this member record. |
data.version | integerCurrent projected record version. |
data.membershipVersion | integerCurrent membership aggregate version. |
data.cursor | integerLatest event-ledger cursor projected into this member record. |
meta | object |
meta.cursor | integerHighest record cursor represented by this response. |
Retrieve a member profile
GET/v1/teams/{teamId}/members/{memberId}/profileReturns the member profile fields visible to the token user based on each profile field's visibility setting.
Required scopes: member:read
Parameters
path.teamIdrequired | string:uuidTeam identifier. |
|---|---|
path.memberIdrequired | string:uuidMember identifier. |
Response 200
data | object |
|---|---|
data.id | string:uuidStable member identifier used in API paths. |
data.orgId | string:uuidTeam identifier. |
data.membershipId | string:uuidStable membership aggregate identifier. |
data.userId | stringRoadOps user identifier for the member. |
data.memberName | stringMember display name. |
data.givenName | stringMember first or given name visible to the caller. |
data.familyName | stringMember last or family name visible to the caller. |
data.memberEmail | string:emailMember email address visible to the caller. |
data.memberPicture | string:uriMember profile photo URL. |
data.fields | objectProfile detail fields visible to the caller based on each field's visibility setting. |
data.fields.firstName | object |
data.fields.firstName.value | string |
data.fields.firstName.visibility | "private" | "org-admins" | "org-members" |
data.fields.firstName.updatedBy | object |
data.fields.firstName.updatedBy.actorId | string |
data.fields.firstName.updatedBy.actorType | "user" | "admin" |
data.fields.firstName.updatedAt | string:date-time |
data.fields.lastName | object |
data.fields.lastName.value | string |
data.fields.lastName.visibility | "private" | "org-admins" | "org-members" |
data.fields.lastName.updatedBy | object |
data.fields.lastName.updatedBy.actorId | string |
data.fields.lastName.updatedBy.actorType | "user" | "admin" |
data.fields.lastName.updatedAt | string:date-time |
data.fields.preferredName | object |
data.fields.preferredName.value | string |
data.fields.preferredName.visibility | "private" | "org-admins" | "org-members" |
data.fields.preferredName.updatedBy | object |
data.fields.preferredName.updatedBy.actorId | string |
data.fields.preferredName.updatedBy.actorType | "user" | "admin" |
data.fields.preferredName.updatedAt | string:date-time |
data.fields.email | object |
data.fields.email.value | string:email |
data.fields.email.visibility | "private" | "org-admins" | "org-members" |
data.fields.email.updatedBy | object |
data.fields.email.updatedBy.actorId | string |
data.fields.email.updatedBy.actorType | "user" | "admin" |
data.fields.email.updatedAt | string:date-time |
data.fields.profileImageUrl | object |
data.fields.profileImageUrl.value | string:uri |
data.fields.profileImageUrl.visibility | "private" | "org-admins" | "org-members" |
data.fields.profileImageUrl.updatedBy | object |
data.fields.profileImageUrl.updatedBy.actorId | string |
data.fields.profileImageUrl.updatedBy.actorType | "user" | "admin" |
data.fields.profileImageUrl.updatedAt | string:date-time |
data.fields.phoneNumber | object |
data.fields.phoneNumber.value | string |
data.fields.phoneNumber.visibility | "private" | "org-admins" | "org-members" |
data.fields.phoneNumber.updatedBy | object |
data.fields.phoneNumber.updatedBy.actorId | string |
data.fields.phoneNumber.updatedBy.actorType | "user" | "admin" |
data.fields.phoneNumber.updatedAt | string:date-time |
data.fields.mailingAddress | object |
data.fields.mailingAddress.value | string |
data.fields.mailingAddress.visibility | "private" | "org-admins" | "org-members" |
data.fields.mailingAddress.updatedBy | object |
data.fields.mailingAddress.updatedBy.actorId | string |
data.fields.mailingAddress.updatedBy.actorType | "user" | "admin" |
data.fields.mailingAddress.updatedAt | string:date-time |
data.fields.gender | object |
data.fields.gender.value | "male" | "female" | "other" |
data.fields.gender.visibility | "private" | "org-admins" | "org-members" |
data.fields.gender.updatedBy | object |
data.fields.gender.updatedBy.actorId | string |
data.fields.gender.updatedBy.actorType | "user" | "admin" |
data.fields.gender.updatedAt | string:date-time |
data.fields.birthplace | object |
data.fields.birthplace.value | string |
data.fields.birthplace.visibility | "private" | "org-admins" | "org-members" |
data.fields.birthplace.updatedBy | object |
data.fields.birthplace.updatedBy.actorId | string |
data.fields.birthplace.updatedBy.actorType | "user" | "admin" |
data.fields.birthplace.updatedAt | string:date-time |
data.fields.nationality | object |
data.fields.nationality.value | string |
data.fields.nationality.visibility | "private" | "org-admins" | "org-members" |
data.fields.nationality.updatedBy | object |
data.fields.nationality.updatedBy.actorId | string |
data.fields.nationality.updatedBy.actorType | "user" | "admin" |
data.fields.nationality.updatedAt | string:date-time |
data.fields.hotelRoomType | object |
data.fields.hotelRoomType.value | string |
data.fields.hotelRoomType.visibility | "private" | "org-admins" | "org-members" |
data.fields.hotelRoomType.updatedBy | object |
data.fields.hotelRoomType.updatedBy.actorId | string |
data.fields.hotelRoomType.updatedBy.actorType | "user" | "admin" |
data.fields.hotelRoomType.updatedAt | string:date-time |
data.fields.busBunkPreference | object |
data.fields.busBunkPreference.value | object |
data.fields.busBunkPreference.value.side | "driver-side" | "passenger-side" |
data.fields.busBunkPreference.value.bunk | "top" | "middle" | "bottom" |
data.fields.busBunkPreference.value.position | "front" | "back" |
data.fields.busBunkPreference.visibility | "private" | "org-admins" | "org-members" |
data.fields.busBunkPreference.updatedBy | object |
data.fields.busBunkPreference.updatedBy.actorId | string |
data.fields.busBunkPreference.updatedBy.actorType | "user" | "admin" |
data.fields.busBunkPreference.updatedAt | string:date-time |
data.fields.flightSeatingPreference | object |
data.fields.flightSeatingPreference.value | "aisle" | "window" |
data.fields.flightSeatingPreference.visibility | "private" | "org-admins" | "org-members" |
data.fields.flightSeatingPreference.updatedBy | object |
data.fields.flightSeatingPreference.updatedBy.actorId | string |
data.fields.flightSeatingPreference.updatedBy.actorType | "user" | "admin" |
data.fields.flightSeatingPreference.updatedAt | string:date-time |
data.fields.travelTimePreference | object |
data.fields.travelTimePreference.value | "am" | "pm" |
data.fields.travelTimePreference.visibility | "private" | "org-admins" | "org-members" |
data.fields.travelTimePreference.updatedBy | object |
data.fields.travelTimePreference.updatedBy.actorId | string |
data.fields.travelTimePreference.updatedBy.actorType | "user" | "admin" |
data.fields.travelTimePreference.updatedAt | string:date-time |
data.fields.passports | object |
data.fields.passports.value | object[] |
data.fields.passports.value[].country | string |
data.fields.passports.value[].number | string |
data.fields.passports.value[].expiration | string:date |
data.fields.passports.value[].issued | string:date |
data.fields.passports.value[].scanUrl | string:uri |
data.fields.passports.value[].nameOnPassport | string |
data.fields.passports.visibility | "private" | "org-admins" | "org-members" |
data.fields.passports.updatedBy | object |
data.fields.passports.updatedBy.actorId | string |
data.fields.passports.updatedBy.actorType | "user" | "admin" |
data.fields.passports.updatedAt | string:date-time |
data.fields.frequentFlyerNumbers | object |
data.fields.frequentFlyerNumbers.value | object[] |
data.fields.frequentFlyerNumbers.value[].program | string |
data.fields.frequentFlyerNumbers.value[].number | string |
data.fields.frequentFlyerNumbers.visibility | "private" | "org-admins" | "org-members" |
data.fields.frequentFlyerNumbers.updatedBy | object |
data.fields.frequentFlyerNumbers.updatedBy.actorId | string |
data.fields.frequentFlyerNumbers.updatedBy.actorType | "user" | "admin" |
data.fields.frequentFlyerNumbers.updatedAt | string:date-time |
data.fields.dietaryRestrictions | object |
data.fields.dietaryRestrictions.value | string |
data.fields.dietaryRestrictions.visibility | "private" | "org-admins" | "org-members" |
data.fields.dietaryRestrictions.updatedBy | object |
data.fields.dietaryRestrictions.updatedBy.actorId | string |
data.fields.dietaryRestrictions.updatedBy.actorType | "user" | "admin" |
data.fields.dietaryRestrictions.updatedAt | string:date-time |
data.fields.allergies | object |
data.fields.allergies.value | string |
data.fields.allergies.visibility | "private" | "org-admins" | "org-members" |
data.fields.allergies.updatedBy | object |
data.fields.allergies.updatedBy.actorId | string |
data.fields.allergies.updatedBy.actorType | "user" | "admin" |
data.fields.allergies.updatedAt | string:date-time |
data.fields.emergencyContact | object |
data.fields.emergencyContact.value | object |
data.fields.emergencyContact.value.name | string |
data.fields.emergencyContact.value.relationship | string |
data.fields.emergencyContact.value.phone | string |
data.fields.emergencyContact.value.email | string:email |
data.fields.emergencyContact.visibility | "private" | "org-admins" | "org-members" |
data.fields.emergencyContact.updatedBy | object |
data.fields.emergencyContact.updatedBy.actorId | string |
data.fields.emergencyContact.updatedBy.actorType | "user" | "admin" |
data.fields.emergencyContact.updatedAt | string:date-time |
data.fields.swagSizes | object |
data.fields.swagSizes.value | object |
data.fields.swagSizes.value.height | string |
data.fields.swagSizes.value.weight | string |
data.fields.swagSizes.value.shirt | string |
data.fields.swagSizes.value.pants | string |
data.fields.swagSizes.value.shoes | string |
data.fields.swagSizes.value.jacket | string |
data.fields.swagSizes.value.hat | string |
data.fields.swagSizes.visibility | "private" | "org-admins" | "org-members" |
data.fields.swagSizes.updatedBy | object |
data.fields.swagSizes.updatedBy.actorId | string |
data.fields.swagSizes.updatedBy.actorType | "user" | "admin" |
data.fields.swagSizes.updatedAt | string:date-time |
data.version | integerCurrent profile detail version. |
data.cursor | integerLatest cursor represented by the membership, profile, and profile details. |
meta | object |
meta.cursor | integerHighest record cursor represented by this response. |
Update a member
PATCH/v1/teams/{teamId}/members/{memberId}Accepts one or more commands to update member role and automatic removal settings.
Required scopes: member:write
Parameters
path.teamIdrequired | string:uuidTeam identifier. |
|---|---|
path.memberIdrequired | string:uuidMember identifier. |
header.Idempotency-Key | string:uuidOptional caller-generated UUID used to make mutation retries safe. Reuse the same UUID only when retrying the same request. |
Request body (application/json)
expectedVersion | integerOptional membership aggregate version guard. |
|---|---|
role | "admin" | "user"Updated member role. |
automaticRemovalDate | string | nullUpdated automatic removal date in YYYY-MM-DD format, or null to clear it. |
Response 202
commandId | string:uuidCommand identifier accepted into the RoadOps command ledger. |
|---|---|
resourceId | string:uuidIdentifier of the resource targeted by the command. |
resourceType | stringResource type targeted by the command. |
status | "applied"Command dispatch status. |
aggregateVersion | integerAggregate version produced by the accepted command. |
cursor | integerEvent-ledger cursor for the accepted update. Refetch until returned records reach this cursor. |
links | object |
links.refetch | stringRelative URL to refetch the affected resource. |
Remove a member
DELETE/v1/teams/{teamId}/members/{memberId}Accepts a command to remove an active team member.
Required scopes: member:write
Parameters
path.teamIdrequired | string:uuidTeam identifier. |
|---|---|
path.memberIdrequired | string:uuidMember identifier. |
header.Idempotency-Key | string:uuidOptional caller-generated UUID used to make mutation retries safe. Reuse the same UUID only when retrying the same request. |
Response 202
commandId | string:uuidCommand identifier accepted into the RoadOps command ledger. |
|---|---|
resourceId | string:uuidIdentifier of the resource targeted by the command. |
resourceType | stringResource type targeted by the command. |
status | "applied"Command dispatch status. |
aggregateVersion | integerAggregate version produced by the accepted command. |
cursor | integerEvent-ledger cursor for the accepted update. Refetch until returned records reach this cursor. |
links | object |
links.refetch | stringRelative URL to refetch the affected resource. |