Document ID signing (v3)
Identity verification combined with electronic signature, with cancellation routing (v3)
Extends Document ID signing (v2) with an explicit cancelled output route that lets flows handle user-initiated or agent-initiated session cancellations without throwing an error. Use DOC_ID_SIGNING:v3 when you want to route cancelled sessions to a RETRY_PROMPT:v1 step or to a rejection end node, rather than relying on the generic error path.
Key features
- All capabilities of Document ID signing (v2) — QES and contract signing modes, document verification, unified
Verificationdata block, signed documents package. - Explicit cancellation routing: Cancelled sessions always exit via the
cancelledroute instead of throwing, enabling flow-level handling (retry prompts, rejection paths). - Configurable capture: Selectively disable biometric sample or document image capture to reduce data collection scope.
Configuration
| Option | Type | Required | Description |
|---|---|---|---|
signingMode | string (enum) | Yes | Signing mode: QES (Qualified Electronic Signature) or CONTRACT_SIGNING (standard contract signing). |
config.live.shortname | string | Yes | DocIDV shortname for the live environment. Provided by IDnow during onboarding. |
config.staging.shortname | string | Yes | DocIDV shortname for the staging environment. Provided by IDnow during onboarding. |
inputSources.basicIdentity | string | Yes | ID of an upstream step whose BasicIdentity output provides identity data for verification and signing. |
inputSources.documentsToSign | string | Conditional | ID of an upstream step whose DocumentsToSign output provides the documents to sign. Required when signingMode is CONTRACT_SIGNING; not required for QES. |
handoff | boolean | No | When true, redirects the player immediately when the identification enters a pending review state and resumes polling in the background. Uses the session redirectUrl if configured; otherwise shows a submission-complete message. Default: false. |
webJourneyOnly | boolean | No | When true, the redirect URL is constructed as the DocIDV web journey URL instead of the channel chooser URL. Default: false. |
capture.biometricSample | boolean | No | When false, the biometric sample (selfie) capture step is skipped and the BiometricSamples data block is not produced. Default: true. |
capture.documentImages | boolean | No | When false, the document image capture step is skipped and the DocumentImages data block is not produced. Default: true. |
Example
QES mode:
{
"signingMode": "QES",
"config": {
"live": { "shortname": "acme-live" },
"staging": { "shortname": "acme-staging" }
},
"inputSources": {
"basicIdentity": "SPHINX"
}
}
Contract signing mode:
{
"signingMode": "CONTRACT_SIGNING",
"config": {
"live": { "shortname": "acme-live" },
"staging": { "shortname": "acme-staging" }
},
"inputSources": {
"basicIdentity": "SPHINX",
"documentsToSign": "COLLECT_DOCUMENTS"
}
}
Wiring cancellation routing with a retry prompt
[
{
"id": "DOC_ID_SIGNING",
"type": "DOC_ID_SIGNING:v3",
"options": {
"signingMode": "QES",
"inputSources": { "basicIdentity": "SPHINX" },
"config": { "live": { "shortname": "acme-live" }, "staging": { "shortname": "acme-staging" } }
},
"next": [
{ "port": "verified", "id": "END_ACCEPTED" },
{ "port": "fraud_detected", "id": "END_REJECTED" },
{ "port": "cancelled", "id": "RETRY_PROMPT" }
]
},
{
"id": "RETRY_PROMPT",
"type": "RETRY_PROMPT:v1",
"options": {},
"next": [
{
"port": "retry",
"id": "DOC_ID_SIGNING",
"type": "rollback",
"rollback": { "maxAttempts": 3 }
}
]
}
]
Input data blocks
| Data block | Required | Mode | Description |
|---|---|---|---|
BasicIdentity | Yes | Both | Identity data from the upstream node (typically DocIDV). Used for verification and as signer identification in the signature process. |
DocumentsToSign | Conditional | CONTRACT_SIGNING | Documents to sign. Required when signingMode is CONTRACT_SIGNING; not required for QES. |
Each file referenced in DocumentsToSign must not exceed 20 MB. Exceeding this limit returns HTTP 422 with error code FILE_TOO_LARGE at session creation.
Routes
| Route | Condition | Description |
|---|---|---|
verified | Always available | Identity verification succeeded and documents were signed successfully. Status from the signature service is either SUCCESS or SUCCESS_DATA_CHANGED. |
fraud_detected | Always available | Identity verification failed due to fraud detection. Fraud was detected and confirmed after review. Identity data and verification information may be available for further analysis. |
cancelled | Always available | Session cancelled by the user or agent. Carries a Verification data block; identity data blocks present only on agent-initiated cancellations. |
Output data blocks
| Route | Data blocks produced | Notes |
|---|---|---|
verified | BasicIdentity, ExtendedIdentity, DocumentData, Verification, SignedDocumentsPackage, DocumentImages (unless capture.documentImages: false), BiometricSamples (unless capture.biometricSample: false) | All blocks populated; signed documents and audit trail returned in SignedDocumentsPackage. |
fraud_detected | BasicIdentity, ExtendedIdentity, DocumentData, Verification, DocumentImages (unless capture.documentImages: false), BiometricSamples (unless capture.biometricSample: false) | SignedDocumentsPackage not produced on the fraud path. |
cancelled | Verification | Identity data blocks populated only when an agent cancelled with a business reason. |
The DocumentImages produced by DOC_ID_SIGNING:v3 are ID-category images (passport, driving licence, etc.). They cannot be used as input to IBAN_VERIFICATION:v1 or PROOF_OF_ADDRESS:v1, which require bank or address documents respectively.
Relationship to Document ID signing (v2)
DOC_ID_SIGNING:v3 is a superset of DOC_ID_SIGNING:v2. Existing DOC_ID_SIGNING:v2 flows do not need to migrate — use DOC_ID_SIGNING:v3 for new flows that require explicit cancellation handling.
Example payloads
BasicIdentity — verified
{
"dataBlockId": "01960000-0000-7000-8000-000000000001",
"type": "BasicIdentity",
"givenName": "Jean",
"familyName": "Dupont",
"name": "Jean Dupont",
"birthDate": "1985-03-22",
"birthPlace": "Paris"
}
ExtendedIdentity — verified
{
"dataBlockId": "01960000-0000-7000-8000-000000000002",
"type": "ExtendedIdentity",
"portrait": { "$ref": "vault", "$id": "01960000-43d8-7000-8000-6814c0bdc35a" },
"nationality": "FRA",
"personalAdministrativeNumber": null,
"familyNameBirth": "Dupont",
"givenNameBirth": "Jean",
"sex": 1,
"emailAddress": null,
"mobilePhoneNumber": null,
"residentAddress": "24 RUE DANTON 35700 RENNES FRANCE",
"residentStreet": "RUE DANTON",
"residentHouseNumber": "24",
"residentHouseName": null,
"residentCountry": "FR",
"residentState": "Bretagne",
"residentCity": "RENNES",
"residentPostalCode": "35700"
}
DocumentData — verified
{
"dataBlockId": "01960000-0000-7000-8000-000000000003",
"type": "DocumentData",
"documentType": "ID",
"documentNumber": "D123456789",
"expiryDate": "2030-06-15",
"issuanceDate": "2020-06-15",
"issuingCountry": "FR",
"issuingAuthority": "Préfecture de Paris"
}
Verification — verified
{
"dataBlockId": "01960000-0000-7000-8000-000000000004",
"type": "Verification",
"status": "verified",
"terminationReason": null,
"methods": [
{
"type": "documentCheck",
"checks": [
{ "checkType": "dataIntegrity", "result": "passed" },
{ "checkType": "documentAuthenticity", "result": "passed" }
]
},
{
"type": "electronicSignature",
"signatureLevel": "QES",
"signingStatus": "SUCCESS"
}
],
"provider": "IDnow",
"trustFramework": "eidas",
"assuranceLevel": "high",
"verifiedAt": "2026-02-10T14:00:01.000Z",
"verificationProcessId": "txn-abc123"
}
SignedDocumentsPackage — verified
{
"dataBlockId": "01960000-0000-7000-8000-000000000005",
"type": "SignedDocumentsPackage",
"package": { "$ref": "vault", "$id": "01960000-7a2b-7000-8000-3f8e91c047d2" }
}
Verification — fraud_detected
{
"dataBlockId": "01960000-0000-7000-8000-000000000006",
"type": "Verification",
"status": "fraudDetected",
"terminationReason": {
"code": "FRAUD_SUSPICION_CONFIRMED",
"message": "Document fraud confirmed after review"
},
"methods": [
{
"type": "documentCheck",
"checks": [{ "checkType": "documentAuthenticity", "result": "failed" }]
}
],
"provider": "IDnow",
"trustFramework": "eidas",
"assuranceLevel": null,
"verifiedAt": "2026-02-10T14:05:33.000Z",
"verificationProcessId": "txn-def456"
}
Verification — cancelled
{
"dataBlockId": "01960000-0000-7000-8000-000000000007",
"type": "Verification",
"status": "canceled",
"terminationReason": {
"code": "USER_CANCELLED",
"message": null
},
"methods": [],
"provider": "IDnow",
"trustFramework": null,
"assuranceLevel": null,
"verifiedAt": "2026-02-10T14:02:15.000Z",
"verificationProcessId": "txn-ghi789"
}