---
title: "Preview an invitation"
method: POST
path: "/internal/api/invites/preview"
tags: ["INVITES"]
---

# Preview an invitation

`POST /internal/api/invites/preview`

## Request

- Base URL: `https://api.signalshq.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.signalshq.io/internal/api/invites/preview`
- Auth: none declared

POST rather than GET because the token is in the body, not the path — see the module docstring. Returns 410 with a specific error_type for expired / revoked / already-accepted invites so the page can tell the invitee what to do next, and 404 when the token doesn't resolve at all (typically because a resend replaced it).

## Request body

- InvitePreviewRequest: Body of the public preview call. Token in the body, never the path.
  - `token` string, required

## Response `200`

Successful Response

- InvitePreviewResponse: What the unauthenticated acceptance page may see. Intentionally minimal: firm name, the invited address, and the role. No inviter email, no member counts, no tenant id — this endpoint is reachable by anyone holding a URL.
  - `tenant_name` string, required
  - `email` string, required
  - `role` 'OWNER' | 'ADMIN' | 'USER' | 'SUPER_ADMIN' | 'REVIEWER' | 'PREPARER' | 'MANAGER', required
  - `expires_at` string, date-time, required
  - `invited_by_name` string, nullable

## Other responses

- `422`: Validation Error

---

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