Skip to main content
POST
/
v2
/
team.user.update
UpdateUser
curl --request POST \
  --url https://api.manus.im/v2/team.user.update \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <api-key>' \
  --data '
{
  "email": "user@example.com",
  "team_user_id": "123456"
}
'
{
  "ok": true,
  "request_id": "<string>",
  "user": {
    "email": "<string>",
    "user_name": "<string>",
    "team_user_id": "<string>",
    "delegated_to": "<string>",
    "delegated_profiles": [
      {
        "team_user_id": "<string>",
        "display_name": "<string>",
        "delegated_at": "2023-11-07T05:31:56Z"
      }
    ],
    "original_email": "<string>"
  },
  "cascade_affected": [
    {
      "team_user_id": "<string>",
      "display_name": "<string>",
      "action": "<string>"
    }
  ]
}
Questions or issues? Contact us at api-support@manus.ai.
Identifier: Provide either email or team_user_id. When both are supplied, team_user_id wins. Use team_user_id for delegated profiles — their email is rewritten to a synthetic delegate-<id>@... address that no longer matches what your IDP knows.Status transitions:
  • USER_STATUS_ACTIVEUSER_STATUS_INACTIVE — reversible.
  • USER_STATUS_REMOVED — irreversible. Equivalent to calling team.user.remove on the underlying team_user_id. Cannot be combined with a role update.
Cascade: When status becomes INACTIVE or REMOVED and the user has profiles delegated to them, those profiles are returned to the deactivated pool and listed in cascade_affected[].Role values: TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, or TEAM_MEMBER_ROLE_GUEST. Delegated (and formerly-delegated) profiles can be promoted freely — TEAM_MEMBER_ROLE_OWNER is the only role API cannot set; transfer ownership in the UI.Seat sync side effect: Promoting TEAM_MEMBER_ROLE_GUEST → MEMBER/ADMIN/SUPER_ADMIN triggers a Stripe seat-quantity bump so the subscription covers the new paid occupant. The reverse direction does not call Stripe — the seat is implicitly released the next time the team’s count is computed. If Stripe rejects the upgrade, the API returns internal and the role change is rolled back to keep DB and billing in sync.Owner is API-immutable: Returns failed_precondition for the team owner.Protocols: Also callable via Connect RPC. See Protocols.

Authorizations

X-API-Key
string
header
required

Body

application/json
email
string<email>

Email of the team member to update. Either email or team_user_id must be provided. Must be a valid RFC 5321 address when present.

Maximum string length: 254
Example:

"user@example.com"

team_user_id
string

Team member ID (stable identifier). Either email or team_user_id must be provided; when both are supplied, team_user_id wins. Recommended for delegated profiles, whose email is rewritten to a synthetic delegate-<id>@... address.

Maximum string length: 64
Example:

"123456"

status
enum<string>

New status. Accepts USER_STATUS_ACTIVE, USER_STATUS_INACTIVE, or USER_STATUS_REMOVED. REMOVED is irreversible and triggers the same cascade as team.user.remove.

Available options:
USER_STATUS_ACTIVE,
USER_STATUS_INACTIVE,
USER_STATUS_REMOVED
role
enum<string>

New role. Accepts TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, or TEAM_MEMBER_ROLE_GUEST. Delegated (or formerly-delegated) profiles can be promoted freely — TEAM_MEMBER_ROLE_OWNER is the only role the API cannot set (transfer ownership in the UI). Promoting GUEST → MEMBER/ADMIN/SUPER_ADMIN calls Stripe to bump the team's seat quantity; the reverse direction requires no Stripe call.

Available options:
TEAM_MEMBER_ROLE_OWNER,
TEAM_MEMBER_ROLE_ADMIN,
TEAM_MEMBER_ROLE_MEMBER,
TEAM_MEMBER_ROLE_SUPER_ADMIN,
TEAM_MEMBER_ROLE_GUEST

Response

Team member updated successfully.

ok
boolean
Example:

true

request_id
string
user
object

A team member.

cascade_affected
object[]

Profiles returned to the deactivated pool because the target user was deactivated or removed. Empty when no cascade occurred.