Recover an account with the emailed token and a recovery code.
const url = 'https://api.opdns.io/v1/auth/recover/finish';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"token":"example","recovery_code":"example","password":"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.opdns.io/v1/auth/recover/finish \ --header 'Content-Type: application/json' \ --data '{ "token": "example", "recovery_code": "example", "password": "example" }'The token from the recovery email plus one unused recovery code set a new
password. The code is consumed, TOTP is removed (enrol a second factor again;
passkeys are kept), every session is revoked and the cookie cleared, other
recovery and reset links stop working, and a notice is emailed. Audited
(auth.account_recovered, auth.recovery_failed). A wrong or used code is
401 invalid_recovery_code and leaves the token usable; failed codes are
limited per account (429). Token failures are 400 invalid_token,
token_expired or token_used.
Request Bodyrequired
Section titled “Request Bodyrequired”object
One of the account’s recovery codes, as shown (xxxx-xxxx-xxxx-xxxx; case, spaces and dashes are ignored).
12 to 128 characters (Unicode code points), no composition rules.
Examplegenerated
{ "token": "example", "recovery_code": "example", "password": "example"}Responses
Section titled “Responses”Account recovered; sign in with the new password.
object
Example
{ "status": "recovered"}Malformed request.
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/bad_request", "title": "Bad Request", "status": 400, "code": "bad_request", "detail": "invalid JSON body", "request_id": "5f2c9a0e7b1d4c38"}Not authenticated.
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/unauthenticated", "title": "Unauthorized", "status": 401, "code": "unauthenticated", "detail": "authentication required", "request_id": "5f2c9a0e7b1d4c38"}The request failed validation (validation_failed), or the new password was
refused: password_too_short (under 12 characters), password_too_long (over
128). Length is counted in Unicode code points and the password is used as
sent (no normalisation). A password problem alongside other invalid fields is
validation_failed listing them all. errors names the password field.
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/password_too_short", "title": "Unprocessable Content", "status": 422, "code": "password_too_short", "detail": "the password must be at least 12 characters", "errors": [ { "field": "password", "message": "at least 12 characters" } ], "request_id": "5f2c9a0e7b1d4c38"}Rate limited (rate_limited).
object
Stable machine code.
object
Seconds, repeating the Retry-After header (rate limits, offline nodes).
Example
{ "type": "https://opdns.io/problems/rate_limited", "title": "Too Many Requests", "status": 429, "code": "rate_limited", "detail": "too many requests", "request_id": "5f2c9a0e7b1d4c38", "retry_after": 6}