---
title: "Invite Member"
method: POST
path: "/workspaces/{workspace_id}/members"
tags: ["workspaces"]
---

# Invite Member

`POST /workspaces/{workspace_id}/members`

## Request

- Base URL: `https://api.reeldrop.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.reeldrop.io/workspaces/{workspace_id}/members`
- Auth: HTTP bearer

Invite someone into the workspace by email. Requires admin or owner role.

Always a pending WorkspaceInvite plus an emailed accept link — including
for an email that already has a ReelDrop account. Adding existing accounts
outright put a workspace in someone's switcher with no notice and no say,
and answering 201 for "has an account" vs 202 for "doesn't" let any admin
probe which emails are registered. See routers/invites.py for the accept
side (and the switcher's Invitations list, for people already signed in).

Seats are checked against members plus invites that can still be accepted,
so a workspace can't oversell seats by sending more invites than it holds.

## Path parameters

- `workspace_id` string, required

## Request body

- MemberInvite
  - `email` string, required
  - `role` 'owner' | 'admin' | 'member'

## Response `202`

Successful Response

- InviteOut
  - `id` string, required
  - `email` string, required
  - `role` 'owner' | 'admin' | 'member', required
  - `status` 'pending' | 'accepted' | 'revoked' | 'declined', required
  - `invited_by` string, required
  - `created_at` string, date-time, required
  - `expires_at` string, date-time, required
  - `expired` boolean, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/reeldrop/apis/reeldrop-api.md) · [All operations](https://skmtc.dev/reeldrop/apis/reeldrop-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reeldrop/apis/reeldrop-api/revisions/d3b2a338556c?raw)
