---
title: "Invite Staff User"
method: POST
path: "/admin/staff/invite"
tags: ["Admin"]
---

# Invite Staff User

`POST /admin/staff/invite`

## Request

- Base URL: `https://api.openintake.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.openintake.ai/admin/staff/invite`
- Auth: none declared

Invite a new staff user to the current customer.
Creates a user and sends them an invite email with a sign-in link.
Requires admin authentication.

## Request body

- InviteStaffUserRequest: Request to invite a new staff user
  - `email` string, required
  - `first_name` string, required
  - `last_name` string, required
  - `user_type` 'admin' | 'staff' | 'referral_partner': Enum for user types. NOTE: SQLEnum(UserType) persists the member NAME, so each name must equal its value or writes break. admin/staff are internal firm users with dashboard access. referral_partner is an EXTERNAL user (an outside referrer: an individual, organization, or attorney who sends the firm cases) whose only surface is the branded referral portal — see get_portal_user in app.auth.dependencies; get_user deliberately rejects this type so no internal endpoint is reachable.
  - `role_id` string, uuid, nullable
  - `login_methods` string[], nullable
  - `password` string, nullable
  - `skip_invite_email` boolean

## Response `201`

Successful Response

- InviteStaffUserResponse: Response after inviting a staff user
  - `id` string, required
  - `email` string, required
  - `first_name` string, required
  - `last_name` string, required
  - `user_type` 'admin' | 'staff' | 'referral_partner', required: Enum for user types. NOTE: SQLEnum(UserType) persists the member NAME, so each name must equal its value or writes break. admin/staff are internal firm users with dashboard access. referral_partner is an EXTERNAL user (an outside referrer: an individual, organization, or attorney who sends the firm cases) whose only surface is the branded referral portal — see get_portal_user in app.auth.dependencies; get_user deliberately rejects this type so no internal endpoint is reachable.
  - `message` string, required

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-28** `05472eabc78d`: 1 info
  - added the new optional request property `role_id`
- **2026-09-17** `0afcd7c31ce2`: 1 warning, 1 info
  - added the new `referral_partner` enum value to the `user_type` response property for the response status `201`
  - added the new `referral_partner` enum value to the request property `user_type`

[Operation history](https://skmtc.dev/openintake/apis/openintake-api/changes/admin/staff/invite/post.md)

---

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