Team Members

Create Team Member

Adds a member to an account's team with a system role. Identify them by exactly one of user_id or email. If the person has not yet accepted — or the email does not belong to a Whop account yet — an invitation is sent instead and the response is 202 with { "object": "team_member_invite", "invitation_sent": true }. If they already have a pending invite, the request fails with a 400. Custom roles cannot be granted via the API. Granting the workforce role is also allowed with the bounty:create scope.

post/team_members

Headers

Idempotency-Keystring
Example:d9105228-4a08-46b1-8b91-42fed586d383

A unique key that makes this request safe to retry. See Idempotent requests.

Request body

account_idstring required

Account ID, prefixed biz_.

emailstring

Email address to invite. Mutually exclusive with user_id. If the email already belongs to a Whop account it is treated the same as passing that account's user_id; otherwise a pending invite is created for the email.

role'owner' | 'admin' | 'partner' | 'sales_manager' | 'moderator' | 'advertiser' | 'workforce' required

The system role to grant. The Partner role can only be granted to the account's attached, verified partner.

user_idstring

The user to add to the team, prefixed user_. Mutually exclusive with email.

Example request

{
  "account_id": "biz_xxxxxxxxxxxxxx",
  "email": "marcus@shinetime.example",
  "role": "sales_manager",
  "user_id": "user_xxxxxxxxxxxxxx"
}

Response

Team member created.

account_idstring required

The account this membership belongs to, prefixed biz_.

created_atstring required

When the member joined or the invite was sent, as an ISO 8601 timestamp.

emailstring nullable required

The member's email address. For accepted members, null unless the caller holds the email read scope; for invites, the invited address.

idstring required

Team member ID — ausr_ for accepted members, ausri_ for pending invites.

is_agentboolean required

Whether this member is an agent (app-controlled account) rather than a human team member. Always false for invites.

role'owner' | 'admin' | 'partner' | 'sales_manager' | 'moderator' | 'advertiser' | 'app_manager' | 'support' | 'manager' | 'workforce' | 'custom' required

The member's role on the account. custom means a bespoke dashboard-managed role; the API can read but not grant it.

status'joined' | 'pending' required

joined for accepted members, pending while the invite is pending.

updated_atstring required

When the membership was last updated, as an ISO 8601 timestamp.

Example response

{
  "account_id": "biz_xxxxxxxxxxxxxx",
  "created_at": "2026-01-01T12:00:00.000Z",
  "email": "marcus@shinetime.example",
  "id": "ausr_xxxxxxxxxxxxxx",
  "role": "moderator",
  "status": "joined",
  "updated_at": "2026-01-01T12:00:00.000Z",
  "user": {
    "id": "user_xxxxxxxxxxxxxx",
    "name": "Dana Whitfield",
    "profile_picture": {
      "url": "https://ui-avatars.com/api/"
    },
    "username": "danawhitfield"
  }
}

Changes

Changed in 7 of the 74 revisions of this API.29

  • c19acf2e254811See the full diff
    • ●

      added the new partner enum value to the response property for the response status

      response-property-enum-value-added

    • ○

      added the new partner enum value to the request property

      request-property-enum-value-added

    This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog

    • ○

      added the required property to the response with the status

      response-required-property-added

    • ○

      added the new workforce enum value to the request property

      request-property-enum-value-added

  • ae20b30817de11See the full diff
    • ●

      added the new workforce enum value to the response property for the response status

      response-property-enum-value-added

    • ○

      added the non-success response with the status

      response-non-success-status-added

    • ○

      added the optional property / to the response with the status

      response-optional-property-added

    • ○

      added the optional property / to the response with the status

      response-optional-property-added

    This revision also has 9 changes that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      the request property became optional

      request-property-became-optional

    This revision also has 4 changes that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog

    • ○

      endpoint added

      endpoint-added

    This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog

Of the 74 revisions, 1 has no diff computed.