---
title: "Invite someone by email"
method: POST
path: "/api/team/invites"
---

# Invite someone by email

`POST /api/team/invites`

## Request

- Base URL: `https://postwire.io`
- URL: `https://postwire.io/api/team/invites`
- Auth: HTTP bearer

Owner or admin. Only a person signed in to the dashboard (its session key plus X-PostWire-Source: dashboard): an API key or an AI connector gets 403 team_requires_human, even an admin's. The invitation is a signed link that works once, only for that address, for 7 days; the person signs in or up with an emailed code, Google or Apple and joins. The response also carries invite_url, to share yourself. Seats count members plus open invitations: past the plan's seats the answer is 403 seat_limit with the next plan's checkout link. At most 30 invitations a day per workspace. Inviting an address again replaces its open invitation.

## Request body

- object
  - `email` string, email, required
  - `role` 'admin' | 'editor' | 'contributor' | 'approver' | 'viewer', required: admin: everything except billing and ownership. editor: write, schedule, publish within approval rules. contributor: drafts and schedules, every post waits for approval. approver: only the approvals inbox. viewer: read-only.
  - `brand_ids` string[]: Only these brands of the workspace (editor, contributor, approver, viewer). Empty or omitted = every brand.

## Response `200`

{ ok, invite: { id, email, role, brand_ids, expires_at }, invite_url, email: { sent, note? }, message }

## Other responses

- `400`: bad_email, bad_role, bad_brands
- `403`: seat_limit (with upgrade), role_forbidden, team_requires_human
- `409`: already_member
- `503`: teams_unavailable

---

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