Start password reset — send a code to the email
const url = 'https://api.flotera.com/api/v1/auth/password-reset/start';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"email":"hello@example.com","turnstile_token":"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.flotera.com/api/v1/auth/password-reset/start \ --header 'Content-Type: application/json' \ --data '{ "email": "hello@example.com", "turnstile_token": "example" }'Same code mechanism as signup, purpose-scoped separately: a signup
ticket cannot reset a password and vice versa. Protected by the same
rate limits and Turnstile challenge. Always answers 202: an email
without an account stores an inert pending row (so the resend
cooldown behaves identically) and no email is sent — account
existence is not observable from this operation (05 §8.3). Not gated
by ERMEON_SIGNUP_ENABLED: existing accounts must be able to recover
a password even where public signup is closed.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Cloudflare Turnstile response token from the widget. Optional in the schema because the challenge is deployment-configurable, but required in practice whenever GET /auth/config reports turnstile.enabled; omitting it then returns 403. Single-use.
Examplegenerated
{ "email": "hello@example.com", "turnstile_token": "example"}Responses
Section titled “Responses”Code dispatch accepted (identical for any email). The body reports the resend cooldown for the UI countdown.
object
Seconds until another code may be requested for the same email — drives the UI resend countdown.
Examplegenerated
{ "resend_cooldown_seconds": 1}Turnstile challenge missing, rejected by Cloudflare, or impossible to verify (fail closed). code=forbidden, detail="captcha verification failed". The body never depends on the submitted credentials; the token is single-use, so the widget must be reset before retrying.
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}Request failed validation (code=validation_failed), with per-field errors.
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}Rate limit exceeded (code=rate_limited).
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}Headers
Section titled “Headers”Seconds to wait before retrying.
A dependency the endpoint needs is not configured or is temporarily unavailable (code=unavailable). The rest of the API keeps working — an absent external integration must not take the service down.
RFC 9457 problem document with a stable machine code.
object
Stable machine-readable error code (03 §2.4).
UUID (v7 for new entities; v4 accepted during migration).
object
JSON Pointer to the offending field.
Example
{ "type": "https://ermeon.com/problems/validation", "code": "unauthorized"}