Turning it on
Setverification_method on a recipient when you create the envelope, with
POST /api/v1/envelopes, a row of
POST /api/v1/envelopes/batches, or
POST /api/v1/envelopes/one-off:
noneis the default. A request that does not name the field creates the recipient it always did.email_codeasks for a code sent to the recipient’semail.- It is decided per recipient, so one envelope can ask one signer for a code and not another. A template has no setting for it: the request decides, every time.
- It is fixed once the envelope is sent, like the rest of the recipient. See what cannot change after sending.
- Every recipient the API describes carries
verification_method, so you can read back what you asked for withGET /api/v1/envelopes/{envelopeId}.
sms_code is in the published list and is not available yet: codes by text
message come later, and mobile is reserved for them.
Who cannot be asked
- An embedded recipient cannot be asked for an email code. Vumasign never
emails an embedded recipient, so the code could never reach them. Your application signed them in, and
that is the check. Use
none. - A recipient on a
ccrole cannot be asked for anything. A copied-in reader never opens a signing page, so there is nothing for them to verify.
What the signer sees
When they open their link, they see a short screen instead of the document. It names who sent it and the address the code will go to, partly hidden. They choose to have the code emailed, then type it in.- A code can be entered for 10 minutes after it is sent.
- A new code can be asked for after 30 seconds. Asking for one replaces the last.
- They are asked once per signing session, not once per page. The session lasts 4 hours in that browser, and never longer than the link itself. After that, or in another browser, they are asked again.
- Each code allows 5 tries. Once 3 codes have been used up within 1 hour, the recipient is paused: no further code is sent for up to 1 hour, and the screen says when they can try again. The pause ends by itself, and nobody has to lift it. A new link ends it sooner: the sender’s resend from the dashboard, or a reminder, each carry one.
- The pause is not the only limit. How many codes one link, one address or one network can be sent over time is limited too. Those limits also lift by themselves, but a new link does not lift the ones on the address or the network.
What the certificate says
The certificate of completion states a code only where the audit trail records the code being entered. It does not read the setting on the recipient to decide. So a recipient who was asked for a code and never signed is not described as verified, and a signature always names the verification that let it happen.
Where the audit trail records a one-time code being entered, the line goes on to say so — for example “Email link with expiring token, plus a one-time code by email to j•••@example.com, entered 01 Oct 2026, 12:02:11”. On a test document, whose code is shown on screen rather than sent, it reads “Email link with expiring token, plus a one-time code shown on screen (test document: nothing was sent), entered 01 Oct 2026, 12:02:11”.
An emailed code shows that the person signing had the mailbox when they signed, not only when the link was
sent. It is not a second factor: it reaches the same mailbox as the link.
Refusals
Each refusal names the recipient by its path in your request, for examplerecipients[1] or
rows[3].recipients[0]. Nothing is created, and in a batch no row is created.
recipient_verification_not_allowed: an email code for an embedded recipient, or any code for acc.recipient_verification_unavailable:sms_code, until codes by text message are available.recipient_mobile_unused: amobilewas given. No method that sends to one is available yet, so it is refused rather than stored.
The webhook
Subscribe torecipient.verification_locked to hear when a recipient is paused. Its body
carries recipient_id and locked_until, the time the pause ends. That is not a promise that a code will be
sent then: the other limits above can still refuse one, and they publish nothing. It fires once per pause,
and not for a recipient who has already signed and is only entering a code to download what they signed.
It is the only verification event published: wrong codes and codes sent stay in the audit
trail, and you hear that the recipient got in from recipient.completed when they finish.
See webhooks for the body and how to verify it.
A paused embedded recipient would be stuck with only you able to help, which is why the event exists. In
this release an embedded recipient cannot be asked for a code, so every paused recipient is one who was
emailed: they can wait, or the sender can resend their invitation from the dashboard.