Skip to content

Request Magic Link

POST
/api/auth/magic-link/request
curl --request POST \
--url https://example.com/api/auth/magic-link/request \
--header 'Content-Type: application/json' \
--data '{ "email": "example", "redirect_url": "example", "signup": false, "display_name": "example", "invite_code": "example" }'

Request a magic link email.

Rate-limited to 3 requests per email per 15-minute window. Returns 202 on success (link queued/sent), 503 if the email transport is down. Response does not reveal whether the email address is registered.

When signup=True (sign-up flow), the link is only sent if a pending invite (deal or org) exists for this email. This enforces invite-only registration without revealing invite existence to the caller (always returns 202).

Body: email: Target email address redirect_url: Optional URL to redirect after successful login signup: If True, gate on pending invite existence display_name: Optional display name for new account creation

Returns: {“message”: ”…”}

Media type application/json
MagicLinkRequestBody
object
email
required
Email
string
redirect_url
Any of:
string
signup
Signup
boolean
display_name
Any of:
string
invite_code
Any of:
string

Successful Response

Media type application/json
MessageResponse

Generic {"message": str} response — used by magic-link request, email confirmation request, and other intentionally-vague endpoints that want to avoid leaking whether an email is registered.

object
message
required
Message
string
Example generated
{
"message": "example"
}

Validation Error

Media type application/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Example generated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}