---
title: "Register Via Join Link"
method: POST
path: "/v1/join/{token}"
tags: ["join"]
---

# Register Via Join Link

`POST /v1/join/{token}`

Register a participant (name + email) and hand over to the booking flow.

First registration under an email returns the personal booking link
directly (status "registered"). If the email already belongs to a contact
on this campaign — an earlier self-registration or a roster invitee — the
link is re-sent to that inbox instead and the response carries only status
"email_sent": knowing an address must never yield that contact's booking
token, which is their bearer credential for booking, their conversation,
and their results. Registrations that may create a contact serialize on
the interview row.

Email is otherwise unverified — registering under someone else's unused
address creates a contact in their name (equivalent to using any made-up
address, bounded by MAX_JOIN_CONTACTS). The "email_sent" branch does
reveal that an address is already on the campaign to anyone holding the
join link; accepted as the cost of handing first-time registrants their
link without an email round-trip.

## Path parameters

- `token` string, required

## Request body

- JoinRegisterRequest
  - `name` string, required
  - `email` string, email, required

## Response `200`

Successful Response

- JoinRegisterResponse
  - `status` 'registered' | 'email_sent' | 'already_participated'
  - `booking_token` string, nullable
  - `booking_url` string, nullable
  - `retry_after_seconds` integer, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/ontora/apis/ontora-api.md) · [All operations](https://skmtc.dev/ontora/apis/ontora-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/ontora/ontora-api/revisions/7f57037fd94b/schema)
