curl --request POST \
--url https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/ \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"signature_id": "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10"
}
'import requests
url = "https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/"
payload = { "signature_id": "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({signature_id: '0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10'})
};
fetch('https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'signature_id' => '0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/"
payload := strings.NewReader("{\n \"signature_id\": \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signature_id\": \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"signature_id\": \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n}"
response = http.request(request)
puts response.read_body{
"signatures": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"node_id": "<string>",
"status": "intro",
"verdict": "Not Finished",
"level": "aes",
"format": "pades",
"profile": "<string>",
"signer": {
"name": "<string>",
"capacity": "self",
"company": "<string>",
"role": "<string>",
"roles": [
"<string>"
],
"identity_session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"identity_used": {
"session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kyc_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"verified": true,
"expected_name": "<string>"
},
"certificate": {
"issuer": "<string>",
"issued_to": "<string>",
"serial": "<string>",
"valid_from": "2023-11-07T05:31:56Z",
"valid_until": "2023-11-07T05:31:56Z"
},
"confirmation": {
"channel": "email",
"destination": "<string>",
"confirmed_at": "2023-11-07T05:31:56Z",
"attempts": 123
},
"timestamp": {
"time": "2023-11-07T05:31:56Z",
"qualified": true,
"valid": true
},
"documents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"file_name": "<string>",
"pages": 123,
"size_bytes": 123,
"sha256_original": "<string>",
"sha256_signed": "<string>",
"status": "signed",
"opened_at": "2023-11-07T05:31:56Z",
"read_at": "2023-11-07T05:31:56Z",
"read_to_end": true,
"consented_at": "2023-11-07T05:31:56Z",
"consent": true,
"signed_file": "<string>",
"mode": "fields",
"source_format": "pdf",
"conversion": {
"from": "docx",
"file_name": "<string>",
"sha256": "<string>",
"size_bytes": 123,
"converter": "<string>"
},
"fields": [
{
"key": "<string>",
"type": "signature",
"role": "verified_person",
"label": "<string>",
"page": 123,
"x": 123,
"y": 123,
"width": 123,
"height": 123,
"required": true,
"value": "<unknown>",
"display_value": "<string>",
"value_source": "signer",
"filled_at": "2023-11-07T05:31:56Z",
"image_url": "<string>",
"value_unavailable_reason": "source_empty"
}
]
}
],
"adopted_signature": {
"method": "typed",
"font": "<string>",
"adopted_at": "2023-11-07T05:31:56Z"
},
"electronic_signature_consent_at": "2023-11-07T05:31:56Z",
"evidence_file": "<string>",
"warnings": [
{
"code": "SIGNATURE_DECLINED",
"node_id": "<string>"
}
],
"validation": {
"valid": true,
"reason": "<string>",
"checked_at": "2023-11-07T05:31:56Z",
"documents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"checked_at": "2023-11-07T05:31:56Z",
"valid": true,
"integrity": true,
"trusted": true,
"revoked": true,
"trusted_list": {
"status": "<string>",
"reason": "<string>"
},
"certificate": {
"issuer": "<string>",
"issued_to": "<string>",
"serial": "<string>",
"valid_from": "2023-11-07T05:31:56Z",
"valid_until": "2023-11-07T05:31:56Z"
},
"timestamp": {
"time": "2023-11-07T05:31:56Z",
"qualified": true,
"valid": true
}
}
]
},
"declined_at": "2023-11-07T05:31:56Z",
"declined_action": "DECLINE",
"signed_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"email_sent_at": "2023-11-07T05:31:56Z",
"email_unavailable_reason": "<string>",
"ip_address": "<string>",
"place": "<string>",
"place_unavailable_reason": "not_collected"
}
]
}{
"code": "signature_document_changed",
"detail": "signature_document_changed"
}{
"detail": "You do not have permission to perform this action."
}{
"code": "signature_not_found",
"detail": "signature_not_found"
}{
"code": "signature_not_signed",
"detail": "signature_not_signed"
}Validate Signatures
Re-check the signed documents of an Electronic Signature step: file integrity, the PAdES signature, the certificate, revocation data and timestamp.
curl --request POST \
--url https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/ \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"signature_id": "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10"
}
'import requests
url = "https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/"
payload = { "signature_id": "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({signature_id: '0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10'})
};
fetch('https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'signature_id' => '0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/"
payload := strings.NewReader("{\n \"signature_id\": \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signature_id\": \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/signatures/{nodeId}/validate/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"signature_id\": \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n}"
response = http.request(request)
puts response.read_body{
"signatures": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"node_id": "<string>",
"status": "intro",
"verdict": "Not Finished",
"level": "aes",
"format": "pades",
"profile": "<string>",
"signer": {
"name": "<string>",
"capacity": "self",
"company": "<string>",
"role": "<string>",
"roles": [
"<string>"
],
"identity_session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"identity_used": {
"session_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kyc_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"verified": true,
"expected_name": "<string>"
},
"certificate": {
"issuer": "<string>",
"issued_to": "<string>",
"serial": "<string>",
"valid_from": "2023-11-07T05:31:56Z",
"valid_until": "2023-11-07T05:31:56Z"
},
"confirmation": {
"channel": "email",
"destination": "<string>",
"confirmed_at": "2023-11-07T05:31:56Z",
"attempts": 123
},
"timestamp": {
"time": "2023-11-07T05:31:56Z",
"qualified": true,
"valid": true
},
"documents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"file_name": "<string>",
"pages": 123,
"size_bytes": 123,
"sha256_original": "<string>",
"sha256_signed": "<string>",
"status": "signed",
"opened_at": "2023-11-07T05:31:56Z",
"read_at": "2023-11-07T05:31:56Z",
"read_to_end": true,
"consented_at": "2023-11-07T05:31:56Z",
"consent": true,
"signed_file": "<string>",
"mode": "fields",
"source_format": "pdf",
"conversion": {
"from": "docx",
"file_name": "<string>",
"sha256": "<string>",
"size_bytes": 123,
"converter": "<string>"
},
"fields": [
{
"key": "<string>",
"type": "signature",
"role": "verified_person",
"label": "<string>",
"page": 123,
"x": 123,
"y": 123,
"width": 123,
"height": 123,
"required": true,
"value": "<unknown>",
"display_value": "<string>",
"value_source": "signer",
"filled_at": "2023-11-07T05:31:56Z",
"image_url": "<string>",
"value_unavailable_reason": "source_empty"
}
]
}
],
"adopted_signature": {
"method": "typed",
"font": "<string>",
"adopted_at": "2023-11-07T05:31:56Z"
},
"electronic_signature_consent_at": "2023-11-07T05:31:56Z",
"evidence_file": "<string>",
"warnings": [
{
"code": "SIGNATURE_DECLINED",
"node_id": "<string>"
}
],
"validation": {
"valid": true,
"reason": "<string>",
"checked_at": "2023-11-07T05:31:56Z",
"documents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"checked_at": "2023-11-07T05:31:56Z",
"valid": true,
"integrity": true,
"trusted": true,
"revoked": true,
"trusted_list": {
"status": "<string>",
"reason": "<string>"
},
"certificate": {
"issuer": "<string>",
"issued_to": "<string>",
"serial": "<string>",
"valid_from": "2023-11-07T05:31:56Z",
"valid_until": "2023-11-07T05:31:56Z"
},
"timestamp": {
"time": "2023-11-07T05:31:56Z",
"qualified": true,
"valid": true
}
}
]
},
"declined_at": "2023-11-07T05:31:56Z",
"declined_action": "DECLINE",
"signed_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"email_sent_at": "2023-11-07T05:31:56Z",
"email_unavailable_reason": "<string>",
"ip_address": "<string>",
"place": "<string>",
"place_unavailable_reason": "not_collected"
}
]
}{
"code": "signature_document_changed",
"detail": "signature_document_changed"
}{
"detail": "You do not have permission to perform this action."
}{
"code": "signature_not_found",
"detail": "signature_not_found"
}{
"code": "signature_not_signed",
"detail": "signature_not_signed"
}validation. Didit re-reads every signed PDF, checks its SHA-256 and validates the PAdES signature, the certificate, the revocation data and the timestamp. Nothing is signed again. In the console, this is the Validate again button of the session’s Signature tab.
curl -X POST 'https://verification.didit.me/v3/session/{session_id}/signatures/{node_id}/validate/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"signature_id": "{signature_id}"}'
signature_id to check one signer. Without it, Didit checks every signer of the step, and answers 409 with signature_not_signed if any of them hasn’t signed. A stored signed PDF that no longer matches its sha256_signed returns 400 with signature_document_changed.
The response is { "signatures": [...] } with the checked signers. Read validation.valid for the overall result and validation.documents[] for each document. See Validate a signature again for every field.
Related
Authorizations
Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is missing, wrong, revoked or expired; 403 means the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys.
Path Parameters
The User Verification (KYC) or Business Verification (KYB) session.
"11111111-2222-3333-4444-555555555555"
The Electronic Signature step: node_id of the item in signatures[].
"feature_signature"
Body
id of one signer's item in signatures[].
Response
The checked signers, with their updated validation.
Show child attributes
Show child attributes