Answer the sign-in challenge with an authenticator app code
/v1/auth/mfa/challenge/totpAnswers the second-factor challenge /v1/auth/login raised, with a 6-digit authenticator-app code against the pending challenge_token. On success the interrupted sign-in resumes with what the challenge proved: the same response and cookies password login gives (a bound session, or the Account picker with a pre-auth cookie), remember deciding whether the refresh cookie persists. remember_device: true also stores a remembered device for the shortest trusted_device_days across the user's Accounts and sets the ca_mfa_trusted_device cookie, and device_remembered says whether it did. Public (the challenge token is the credential); 401 when the token or code is wrong, 403 when the user belongs to no Account. Rate-limited to 10 requests per minute.
Request body
application/json
challenge_tokenstring Required Challenge token returned by /v1/auth/login when `requires_mfa_challenge` was true.
codestring Required 6-digit code from the authenticator app.
rememberboolean Optional Keep the session on this device: persist the refresh cookie across browser restarts, as the `remember` flag on `/v1/auth/login` does. Default false.
remember_deviceboolean Optional When true, remember this device so future password sign-ins from this browser skip the second factor, for as long as the shortest `trusted_device_days` across the user's Accounts allows. The response's `device_remembered` says whether a device was stored. Default false.
Responses
application/json
data *LoginResponseDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
Rate limit
Returned object
curl -X POST "https://auth.canopy-io.com/v1/auth/mfa/challenge/totp" \ -H "Content-Type: application/json" \ -d '{ "challenge_token": "string", "code": "123456", "remember": false, "remember_device": false }'
{ "data": { "mfa_enrollment_pending": false, "grace_expires_at": "2026-04-20T12:00:00.000Z", "requires_mfa_enrollment": false, "mfa_enrollment": { "enrollment_token": "string", "available_factors": [ "totp" ], "totp": { "otpauth_uri": "string", "manual_entry_key": "string" } }, "requires_account_selection": false, "requires_mfa_challenge": false, "mfa_challenge": { "challenge_token": "string", "available_factors": [ "totp" ], "expires_at": "2026-04-20T12:00:00.000Z" }, "device_remembered": false, "recovery_codes": [ "string" ], "expires_in": 0, "user": { "id": "string", "email": "string", "first_name": "string", "last_name": "string" }, "access_token": "string", "token_type": "string", "default_environment_slug": "string", "accounts": [ { "account_id": "string", "account_name": "string", "account_slug": "string", "account_role": "string", "applications": [ { "id": "string", "name": "string", "slug": "string" } ] } ], "pending_account_creation": false } }
Tell us how we can improve this guide.