---
title: "One-step magic-link signup: application fields + email in a single request"
method: POST
path: "/api/public/signup"
tags: ["public"]
---

# One-step magic-link signup: application fields + email in a single request

`POST /api/public/signup`

## Request

- Base URL: `https://api.signalraven.ai`
- URL: `https://api.signalraven.ai/api/public/signup`
- Auth: none declared

Replaces the retired two-step flow (auth, then POST /api/me/signup/linkedin). Creates the user and the signup_requests row together, dispatches a sign-in link, and puts the application in the admin review queue immediately. Email verification is enforced at APPROVAL, not here. The OAuth variant does not use this endpoint — those users authenticate first and submit fields via the authenticated POST /api/me/signup. Turnstile-gated + per-IP rate limited.

## Request body

- PublicSignupBody
  - `email` string, email, required
  - `contactName` string, required
  - `contactTitle` string, required
  - `websiteUrl` string, required
  - `linkedinUrl` string, required
  - `referralCode` string
  - `turnstileToken` string

## Response `200`

Sign-in link dispatched (uniform response — reveals nothing about account state)

- PublicSignupResponse
  - `sent` true, required

## Other responses

- `400`: Validation or Turnstile failure
- `429`: Rate limited (per-IP, per-email, or per-LinkedIn-URL)

---

[API](https://skmtc.dev/signalraven/apis/zygnal-api.md) · [All operations](https://skmtc.dev/signalraven/apis/zygnal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/signalraven/apis/zygnal-api/revisions/36e1d9b9d604?raw)
