Skip to main content

Identity verification (KBA)

Knowledge-Based Authentication (KBA) challenges a signer to answer identity questions before the document opens. Passing is a precondition to viewing and signing, not a step inside it.

Where the questions come from​

Nobody sets them up — not the signer, not your organization, not Loyva. The signer enters identifying details, an identity-data provider matches them against credit-header and public-records data, and the questions are generated from what it holds, with plausible wrong answers mixed in:

Which of these streets have you previously lived on? A) Cedar Ln B) Willow Dr C) Pinecrest Ave D) Marigold St E) None of the above

This is what makes it meaningful: someone who has the emailed signing link — or the signer's inbox — still cannot answer questions about a life that isn't theirs.

Neither you nor Loyva can see the questions or the answers. Only the outcome is recorded.

Enabling it​

KBA is set when a document template is created and cannot be changed afterwards.

That is not a UI restriction. KBA runs on a separate signing account, so the flag decides where the template is physically hosted, and there is no way to move a document between accounts. PATCH /api/v2/templates/{id} returns 409 if you try to change it.

POST /api/v2/templates
Content-Type: application/json

{
"name": "Loan agreement",
"kba_required": true
}

Templates report their setting on read:

{
"template_id": "tmpl_...",
"kba_required": true,
"docuseal_instance": "cloud"
}

A brand-new document that is not based on a template makes the same choice at POST /api/v2/esign/builder-session, by passing kba_required: true with no template_id or package_id. That is the last point at which it can be chosen: the builder opens against one account, and the document exists there from then on.

Packages​

A document package derives KBA from its members: if any member requires it, the whole package does, and the combined document is sent through the Cloud signing account. There is no package-level flag to set — a package is one merged document and one envelope, so it cannot be half verified.

Mixing a KBA template with non-KBA ones is supported. On save, Loyva copies each non-Cloud member onto the Cloud signing account and merges from those copies; the original templates are left untouched and stay the source of truth. A copy is rebuilt automatically when its source template changes.

The copy reproduces the template's documents, field placements and signer roles. Settings DocuSeal keeps outside a template's fields do not carry across. Word-sourced templates cannot be part of a package at all, so they are never copied.

Packages report the derived answer on read:

{
"package_id": "pkg_...",
"kba_required": true,
"docuseal_instance": "cloud"
}

POST and PATCH /api/v2/document-packages return 502 if a member cannot be copied to the Cloud account — for example when that account is not configured. Each entry in items also reports its own kba_required and docuseal_instance.

Sending part of a package​

A single send can leave some of a package's documents out. Pass the member template ids to keep as package_template_ids alongside package_id on POST /api/v2/esign/builder-session. Omit it to send the whole package. The documents stay in package order whatever order you list them in, and at least one is required. If only one is kept, it is copied rather than merged.

KBA is then worked out from the kept documents alone. If you leave out the only member that requires it, that send is not verified. The package's stored answer is unchanged.

{
"envelope_id": "env_...",
"package_id": "pkg_...",
"package_template_ids": ["tmpl_a", "tmpl_c"]
}

package_template_ids returns 400 if an id is not a member of the package, if the template has been deleted, or if it is used on a bulk-send batch (batch_id).

Sending several templates without a package​

To combine templates on the fly, pass two to twenty template ids as template_ids on POST /api/v2/esign/builder-session, instead of template_id or package_id. They are merged into one document in the order given, and KBA follows the same rule as a package: if any of them requires it, the whole document is verified on the Cloud signing account.

{
"envelope_id": "env_...",
"template_ids": ["tmpl_c", "tmpl_a"]
}

template_ids returns 400 if it is combined with template_id or package_id, if an id is listed twice, if a template has been deleted, or if it is used on a bulk-send batch.

Sending​

Nothing extra is required. POST /api/v2/envelopes/{id}/send reads the setting from the template or package and adds the verification step automatically. The envelope records it:

{ "envelope_id": "env_...", "kba_required": true, "docuseal_instance": "cloud" }

Verified documents are signed on the Cloud signing account, which serves its forms from a Loyva-branded domain (cloud.sign.loyva.io) rather than the provider's own. Every signing URL Loyva hands back — signing_url from GET /api/v2/envelopes/{id}/signing-links, the embed_url on an embed token, and the link in a signing email — already points at the right host for the environment you are calling. Treat these URLs as opaque: read them from the response rather than assembling one from a slug.

If the verification step cannot be added, the send fails rather than delivering a document that appears protected and isn't.

Limitations​

In-person signingNot available. A knowledge challenge the sender is standing over defeats its purpose. send_email: false returns 422.
Embed widgetNot available. POST /api/v2/embed/token returns 409 with code: "kba_required". Signers use the emailed Loyva signing link.
CoverageDepends on US public-record and credit-header data. Signers with little record history may not be challengeable; that outcome is recorded as unavailable, which is distinct from a failure.
Existing templatesCannot be converted. Create a new template.

Results​

GET /api/v2/envelopes/{id}/kba
{
"data": [
{
"signer_email": "jane@example.com",
"status": "passed",
"occurred_at": "2026-08-31T18:04:11Z",
"docuseal_session_id": "4918a42d...",
"ip_address": "203.0.113.7",
"price_cents": 400
}
]
}

status is one of passed, failed, or unavailable. Treat unavailable as "could not be checked", not as a failure — it means the provider had too little record history to build questions for that person.

The same outcome also appears on the envelope timeline (kba.verified), in the audit log (envelope.kba_verified), on the signer list in the Loyva app, and — once the document is vaulted — in both the vault custody record PDF and the identity_verification block of the UCC §9-105 certificate, alongside the signer, timestamp, IP and session id.

The certificate block is additive evidence: it records how each signer was identified and does not change the seven compliance checks or the score.

Pricing​

$4.00 per signer verified, billed on your monthly usage invoice. There is no included allowance; every verification is charged. The count for the current month appears under Settings → Usage.

Your own organization's users are never challenged. When the sender adds themselves as a signer ("Add me as a signer"), the KBA step is applied to the client-side signers only — the sender is already authenticated to Loyva — and no verification is billed for them.