---
title: "Preview Invite"
method: GET
path: "/v2/invites/{invite_id}/preview"
tags: ["v2 - Team Invites"]
---

# Preview Invite

`GET /v2/invites/{invite_id}/preview`

## Request

- Base URL: `https://api.jubjubapp.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.jubjubapp.com/v2/invites/{invite_id}/preview`
- Auth: HTTP bearer

Public, UNAUTHENTICATED preview of an invite.

NO auth dependency, deliberately: the invitee opens this link before they
have an account or a session, so any `get_current_user` here would break
the whole email flow. The invite_id itself is the credential.

Returns an explicit allowlist (InvitePreviewResponse) — see that model for
what is withheld and why.

A dead or consumed invite answers 200 with `actionable: false` and NO team
or inviter detail, so the page can say "this invite has expired" instead of
a generic error, while a guessed or reused id reveals nothing. Only an
unknown id is a 404.

## Path parameters

- `invite_id` string, required

## Response `200`

Successful Response

- InvitePreviewResponse: What a LOGGED-OUT visitor may learn from an invite link. AN EXPLICIT ALLOWLIST, BUILT FIELD BY FIELD — never a serialised TeamInvite with fields stripped. The invite_id is a 48-bit bearer capability delivered by email (team_invite_routes.py:295), so anyone holding the link reaches this. Constructing the response positively means a field added to TeamInvite cannot leak here by default; it would have to be added below. DELIBERATELY ABSENT, and each for its own reason: invitee_email product ruling. The link arrived in that person's inbox, so they already know the address; anyone ELSE holding the id must not learn it. inviter_email an address the holder has no claim to. team_id, inviter_profile_id, invitee_profile_id internal identifiers, useful only for probing other endpoints. custom_permissions describes the team's authorisation model. any roster or member count. Every display field is Optional because a dead or consumed invite reveals NONE of them — see `status`/`actionable` below.
  - `team_name` string, nullable
  - `team_avatar_url` string, nullable
  - `inviter_name` string, nullable
  - `role` string, nullable
  - `status` string, required
  - `expires_at` string, date-time, nullable
  - `actionable` boolean, required
  - `email_dispatched` boolean, nullable
  - `email_sent_at` string, date-time, nullable

## Other responses

- `422`: Validation Error

---

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