---
title: "Preview a product invite (sign-up vs sign-in routing)."
method: GET
path: "/invites/preview"
tags: ["Invites"]
---

# Preview a product invite (sign-up vs sign-in routing).

`GET /invites/preview`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/invites/preview`
- Auth: none required

MNE-8335. Unauthenticated and keyed by the secret `pinv_…` token — the same secret that authorises accept. Lets the website send a logged-out invitee to /signup (no account yet) or /login (already has one) before they authenticate. Returns only the effective `status`, the invited `products`, and `needs_account` — true only for a LIVE email-bound user invite whose address has no account yet (decided server-side from the invite record; any failed lookup yields false, i.e. sign-in). Never returns an email, an id or a grant amount, and there is deliberately no email-keyed variant (MNE-1348 anti-enumeration). A live row past its expiry reports `expired`. Unknown token: 404.

## Query parameters

- `token` string, required

## Response `200`

Invite preview.

- object
  - `status` 'live' | 'accepted' | 'expired' | 'revoked', required
  - `products` string[], required
  - `needs_account` boolean, required: True only when the invite is live and its invited email has no account yet.

## Other responses

- `400`: Bad request
- `404`: Resource not found
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.

---

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