curl --request POST \
--url https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/ \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"email_address": "user@example.com",
"nodes_to_resubmit": [
{
"node_id": "feature_ocr",
"feature": "OCR"
}
],
"email_language": "en"
}
'import requests
url = "https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/"
payload = {
"email_address": "user@example.com",
"nodes_to_resubmit": [
{
"node_id": "feature_ocr",
"feature": "OCR"
}
],
"email_language": "en"
}
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({
email_address: 'user@example.com',
nodes_to_resubmit: [{node_id: 'feature_ocr', feature: 'OCR'}],
email_language: 'en'
})
};
fetch('https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/', 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}/resubmission-preview/",
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([
'email_address' => 'user@example.com',
'nodes_to_resubmit' => [
[
'node_id' => 'feature_ocr',
'feature' => 'OCR'
]
],
'email_language' => 'en'
]),
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}/resubmission-preview/"
payload := strings.NewReader("{\n \"email_address\": \"user@example.com\",\n \"nodes_to_resubmit\": [\n {\n \"node_id\": \"feature_ocr\",\n \"feature\": \"OCR\"\n }\n ],\n \"email_language\": \"en\"\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}/resubmission-preview/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email_address\": \"user@example.com\",\n \"nodes_to_resubmit\": [\n {\n \"node_id\": \"feature_ocr\",\n \"feature\": \"OCR\"\n }\n ],\n \"email_language\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/")
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 \"email_address\": \"user@example.com\",\n \"nodes_to_resubmit\": [\n {\n \"node_id\": \"feature_ocr\",\n \"feature\": \"OCR\"\n }\n ],\n \"email_language\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"recipient": "jsmith@example.com",
"sender": "<string>",
"subject": "<string>",
"html": "<string>",
"nodes_to_resubmit": [
{
"node_id": "feature_ocr",
"feature": "OCR"
}
],
"requires_user_action": true,
"preview_token": "<string>"
}Preview Resubmission Email
Review the recipient, sender, localized message and verification link before requesting resubmission.
curl --request POST \
--url https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/ \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"email_address": "user@example.com",
"nodes_to_resubmit": [
{
"node_id": "feature_ocr",
"feature": "OCR"
}
],
"email_language": "en"
}
'import requests
url = "https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/"
payload = {
"email_address": "user@example.com",
"nodes_to_resubmit": [
{
"node_id": "feature_ocr",
"feature": "OCR"
}
],
"email_language": "en"
}
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({
email_address: 'user@example.com',
nodes_to_resubmit: [{node_id: 'feature_ocr', feature: 'OCR'}],
email_language: 'en'
})
};
fetch('https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/', 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}/resubmission-preview/",
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([
'email_address' => 'user@example.com',
'nodes_to_resubmit' => [
[
'node_id' => 'feature_ocr',
'feature' => 'OCR'
]
],
'email_language' => 'en'
]),
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}/resubmission-preview/"
payload := strings.NewReader("{\n \"email_address\": \"user@example.com\",\n \"nodes_to_resubmit\": [\n {\n \"node_id\": \"feature_ocr\",\n \"feature\": \"OCR\"\n }\n ],\n \"email_language\": \"en\"\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}/resubmission-preview/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email_address\": \"user@example.com\",\n \"nodes_to_resubmit\": [\n {\n \"node_id\": \"feature_ocr\",\n \"feature\": \"OCR\"\n }\n ],\n \"email_language\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/resubmission-preview/")
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 \"email_address\": \"user@example.com\",\n \"nodes_to_resubmit\": [\n {\n \"node_id\": \"feature_ocr\",\n \"feature\": \"OCR\"\n }\n ],\n \"email_language\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"recipient": "jsmith@example.com",
"sender": "<string>",
"subject": "<string>",
"html": "<string>",
"nodes_to_resubmit": [
{
"node_id": "feature_ocr",
"feature": "OCR"
}
],
"requires_user_action": true,
"preview_token": "<string>"
}preview_token as email_preview_token.
The receipt expires after 15 minutes.
A changed or expired receipt returns 409 before the session is changed or an email is sent.
Generate a fresh preview after a conflict.
Existing API integrations may omit the receipt; the console supplies it when confirming a preview.
The sender and branding follow your existing white-label configuration.
Message content comes from the translated verification template; arbitrary subjects, message bodies and action URLs are not accepted as template inputs.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
UUID of the verification session to update. Accepts both user (KYC) and business (KYB) session IDs — the service resolves the ID across both session types.
"11111111-2222-3333-4444-555555555555"
Body
Recipient shown in the preview. No email is sent.
"user@example.com"
Steps to preview, using the same validation, selection and workflow ordering as a resubmission. Omit to auto-select recorded attempts needing resubmission.
Show child attributes
Show child attributes
Language for the notification email. Accepts any string at schema level; unsupported codes silently fall back to English (en).
"en"
Response
Preview only. The session is unchanged and no email is sent.
Rendered email. Inline image attachments use data URLs for preview.
Show child attributes
Show child attributes
Whether at least one selected check requires user interaction. This does not predict the final workflow outcome.
Signed confirmation receipt, valid for 15 minutes. Pass it as email_preview_token when confirming the same message.