Register a new member
Registration is magic-link only — there is no password-at-signup. A registration request sends a magic link email with a verify-and-sign-in link. The response is always202 Accepted regardless of whether the email already exists (enumeration-safe).
Provide either team_id or slug — exactly one is required.
| Attribute | Type | Required | Notes |
|---|---|---|---|
email | string | Yes | The member’s email address |
slug | string | One of | Hub slug (URL-friendly handle) |
team_id | string | One of | Team UUID — use when you already have it |
redirect_url | string | No | Deep-link for the magic-link email. Requires slug — there is no per-hub allowlist to validate against on the team_id path. Validated against the hub’s settings.auth.allowed_redirect_origins allowlist; an unlisted URL returns 422. |
slug and team_id, or neither, returns 422.
Sending a password field returns 422. Password setup is done after sign-in via POST /api/v1/contact-auth/me/password.
The response is always 202 Accepted with no body — even when the email is already registered or no hub with the given slug/team_id exists.
Request a magic link
Use a hub slug when you do not have the hub id yet.redirect_url.
Consume a magic link token
The hosted/m page consumes fragment-delivered magic links for the default flow. Custom frontends can call the consume endpoint directly: