It is free, and it always will be. No authentication method sits behind a
paid plan here — charging for the second factor makes the free tier a trap and
security an upsell.
The decision worth knowing about
It is enforced wherever a session is minted. Password sign-in, magic link, email code, the verification link and social sign-in all stop at the same challenge. A second factor you can route around by clicking “continue with Google” is a checkbox, not a control — and the person who turned it on has no way of knowing which doors it actually covers. So it covers all of them.Enrolling
Two calls, from a signed-in contact session.1
Setup
200
2
Enable
200
Signing in
Whichever door they came through, a contact with two-factor on gets a challenge instead of a session:200
uk_ct_… token,
expiry, verified. That last field carries whatever the first factor earned
— a magic link and a social callback both prove the identity before the code is
asked for, and that proof rides on the challenge rather than being recomputed
after it.
A recovery code goes in the same code field. It is spent when used, and a
notice goes to the inbox — somebody using a backup code is worth noticing.
A wrong code does not consume the challenge; fat fingers on six digits are
the common case. It does spend one of the challenge’s ten attempts, and a
challenge that runs out answers invalid_challenge from then on, whatever code
arrives — the rate limit counts per address, and an attacker spreads guesses
across addresses, so the budget is what actually bounds guessing a six-digit
number. Ten is well above what a person mistypes; a person who hits it starts a
new sign-in.
Turning it off
POST /v1/contact/two-factor/recovery-codes replaces the whole set the same
way. Every previous code stops working — a partially-known set is worse than a
fresh one.
Hosted mode only
Enrolling in a federated environment answers409 environment_not_hosted.
There, your own server authenticates and boot asserts the result: there is no
moment we could interrupt to ask for a code. Two-factor is ours to enforce only
where the sign-in is ours to run — if your product has its own MFA, that is
where it belongs.