---
title: "Create Team Member"
method: POST
path: "/team_members"
tags: ["Team Members"]
---

# Create Team Member

`POST /team_members`

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.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `account_id` string, required — Account ID, prefixed `biz_`.
  - `email` string — 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' | 'sales_manager' | 'moderator' | 'advertiser' | 'workforce', required — The system role to grant.
  - `user_id` string — The user to add to the team, prefixed `user_`. Mutually exclusive with `email`.

## Response `201`

Team member created.

- TeamMember
  - `account_id` string, required — The account this membership belongs to, prefixed `biz_`.
  - `authorized_role` TeamMemberAuthorizedRole, required
    - `id` string, required — Custom role ID, prefixed `aurl_`.
    - `name` string, required — Custom role name.
  - `created_at` string, required — When the member joined or the invite was sent, as an ISO 8601 timestamp.
  - `email` string, nullable, required — The member's email address. For accepted members, `null` unless the caller holds the email read scope; for invites, the invited address.
  - `id` string, required — Team member ID — `ausr_` for accepted members, `ausri_` for pending invites.
  - `is_agent` boolean, required — Whether this member is an agent (app-controlled account) rather than a human team member. Always `false` for invites.
  - `role` 'owner' | 'admin' | '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_at` string, required — When the membership was last updated, as an ISO 8601 timestamp.
  - `user` UserSummary, required
    - `id` string, required — User ID, prefixed `user_`.
    - `name` string, nullable, required — Display name.
    - `profile_picture` UserProfilePicture, required
      - `url` string, required — Avatar image URL. Always present — a generated placeholder when the user set no picture.
    - `username` string, required — Public username.

## Other responses

- `202` — Invitation sent — the user must accept before they join the team.
- `400` — Invalid Parameters
- `401` — Unauthorized
- `409` — Conflict

## Changes

- **2026-08-18** `f67a043e3190` — 1 info
  - added the required property `authorized_role` to the response with the `201` status
- **2026-08-13** `48408451a1f0` — 1 info
  - added the new `workforce` enum value to the request property `role`
- **2026-08-12** `ae20b30817de` — 1 warning, 1 info
  - added the new `workforce` enum value to the `role` response property for the response status `201`
  - added the non-success response with the status `409`
- **2026-08-07** `f1020c3ecda4` — 2 info
  - added the optional property `error/code` to the response with the `400` status
  - added the optional property `error/code` to the response with the `401` status
- **2026-07-31** `099fdc3be422` — 2 info
  - added the new optional request property `email`
  - the request property `user_id` became optional

[Full history](https://skmtc.dev/whop/apis/whop-api/changes/team_members/post.md)

---

[API](https://skmtc.dev/whop/apis/whop-api.md) · [All operations](https://skmtc.dev/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/whop/whop-api/revisions/1b5d50d09479/schema)
