Sign in with a provider
Google or Apple ID token, verified against the provider's keys. A verified email that already has an account links to it; an unknown one signs up.
provider*string"google""apple"application/json- body
idToken*stringthe OIDC ID token the provider's SDK handed the app
16 <= length <= 4096displayName?stringApple never puts the name in the token: the app sends it on the first sign-in
1 <= length <= 120Access JWT in the envelope; refresh token in an httpOnly cookie
application/json- response
success*truetruedata*curl -X POST 'http://localhost:3000/auth/providers/google/login' \ -H 'Content-Type: application/json' \ -d '{ "idToken": "stringstringstri"}'{ "success": true, "data": { "accessToken": "string", "expiresAtMs": "string" }}Mail a new magic link from a dead one POST
The dead link's token says where the new link goes — the caller never names an address. Voids any live code or link and mails a fresh link to the same account. Always 202: `emailMasked` is null when the token is not a link we sent or is older than OTP_RESEND_MAX_AGE_HOURS (default 168), and a disabled account is answered the same and mailed nothing. Limits: RATE_OTP_RESEND_PER_LINK (default 3 per hour), the address's RATE_OTP_REQUEST_PER_EMAIL budget (shared with /auth/otp/request) and RATE_OTP_REQUEST_PER_IP.
Refresh POST
Trades the refresh cookie for a fresh access JWT. A dead cookie is cleared on refusal.
