Send a sign-in link and code, or Stytch's link, to an address. The response is the same whether or not the address has an account.
POST
/auth/email/start
const url = 'https://api.siteqwality.com/auth/email/start';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"email":"example","turnstile_response":"example","redirect_path":"example","promotekit_referral":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.siteqwality.com/auth/email/start \ --header 'Content-Type: application/json' \ --data '{ "email": "example", "turnstile_response": "example", "redirect_path": "example", "promotekit_referral": "example" }'Request Body required
Section titled “Request Body required ” Media type application/json
POST /auth/email/start.
object
email
required
string
turnstile_response
string | null
redirect_path
Where to land after sign-in; silently dropped unless allowlisted.
string | null
promotekit_referral
string | null
Example generated
{ "email": "example", "turnstile_response": "example", "redirect_path": "example", "promotekit_referral": "example"}Responses
Section titled “ Responses ”Email sent (or claimed sent, so account existence is not leaked)
Media type application/json
Same body whoever sent the email, so it never reveals whether an account exists.
object
sent
required
boolean
challenge_handle
Null when Stytch sent its own link (no code box).
string | null
expires_in
Seconds until the link and code expire.
integer | null format: int64
code_length
integer | null format: int32
Example generated
{ "sent": true, "challenge_handle": "example", "expires_in": 1, "code_length": 1}Invalid email, or turnstile_required
rate_limited
Internal server error
email_send_failed or auth_unavailable