curl -X POST \
https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3/cancel/ \
-H 'x-api-key: YOUR_API_KEY'import requests
response = requests.post(
"https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3/cancel/",
headers={"x-api-key": "YOUR_API_KEY"},
)
response.raise_for_status()
print(response.json())const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
fetch('https://verification.didit.me/v3/session/{sessionId}/features/overrides/{overrideId}/cancel/', 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}/features/overrides/{overrideId}/cancel/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/session/{sessionId}/features/overrides/{overrideId}/cancel/"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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}/features/overrides/{overrideId}/cancel/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/features/overrides/{overrideId}/cancel/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3",
"node_id": "feature_liveness_1",
"feature_type": "",
"feature_model": "Face",
"previous_status": "Declined",
"new_status": "Approved",
"state": "cancelled",
"forced": false,
"reason": "Liveness retried with a reviewer present.",
"requested_by": {
"email": "reviewer@example.com",
"name": "Alex Reviewer",
"type": "CONSOLE_USER"
},
"requested_at": "2026-10-13T09:15:00Z",
"applied_at": null,
"cancelled_at": "2026-10-13T09:20:00Z",
"cancel_reason": "cancelled_by_reviewer"
}Cancel Feature Override
Cancel a step status override that still waits for the person to finish the flow, so it never applies and the step keeps its status.
curl -X POST \
https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3/cancel/ \
-H 'x-api-key: YOUR_API_KEY'import requests
response = requests.post(
"https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3/cancel/",
headers={"x-api-key": "YOUR_API_KEY"},
)
response.raise_for_status()
print(response.json())const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
fetch('https://verification.didit.me/v3/session/{sessionId}/features/overrides/{overrideId}/cancel/', 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}/features/overrides/{overrideId}/cancel/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/session/{sessionId}/features/overrides/{overrideId}/cancel/"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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}/features/overrides/{overrideId}/cancel/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/features/overrides/{overrideId}/cancel/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3",
"node_id": "feature_liveness_1",
"feature_type": "",
"feature_model": "Face",
"previous_status": "Declined",
"new_status": "Approved",
"state": "cancelled",
"forced": false,
"reason": "Liveness retried with a reviewer present.",
"requested_by": {
"email": "reviewer@example.com",
"name": "Alex Reviewer",
"type": "CONSOLE_USER"
},
"requested_at": "2026-10-13T09:15:00Z",
"applied_at": null,
"cancelled_at": "2026-10-13T09:20:00Z",
"cancel_reason": "cancelled_by_reviewer"
}defer_until_flow_finishes: true while the person is still in the flow, the override waits and applies when the flow finishes.
Cancel it here if you no longer want it to apply.
The check keeps its current status.
The cancellation is recorded in the session’s activity as FEATURE_OVERRIDE_CANCELLED, and no webhook is sent.
The response is the override with state: cancelled and cancel_reason: cancelled_by_reviewer.
Find the override ID
Use theid of the override object returned by Update Feature Status, or list the session’s overrides with List Feature Overrides and pick one whose state is pending_until_flow_finishes.
When cancelling fails
An override that already applied or was cancelled returns409 with the code feature_override_not_pending.
To change a check after its override applied, send a new Update Feature Status request instead.
Related
- Update Feature Status: override one step’s status, now or once the flow finishes.
- List Feature Overrides: every override of a session and its state.
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. Accepts both user (KYC) and business (KYB) session IDs.
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
The id of the override to cancel.
"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3"
Response
The override is cancelled and will never apply.
One override of a check (feature) status made with PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/: what it changes, whether it applied or still waits for the person to finish the flow, who asked and why.
Identifier of the override. Pass it to the cancel endpoint.
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
The workflow node the request named (default for a step without a node).
"feature_ocr_1"
The feature_type the request passed, or an empty string when it passed none.
""
The kind of check that was overridden, for example KYC, Face, AML or GeolocationCheck.
"KYC"
The check's status when the override was requested.
Not Finished, Approved, Declined, In Review, Resub Requested "In Review"
The status the override sets.
Approved, Declined, In Review "Approved"
applied: the check has the new status. pending_until_flow_finishes: the override waits and applies when the person finishes the flow. cancelled: it waited and never applied (see cancel_reason).
applied, pending_until_flow_finishes, cancelled "applied"
true when the override applied at once while the person was still in the flow.
false
The comment sent with the request, or null.
"Document manually verified by compliance."
Who requested the override, or null when that is not known.
Show child attributes
Show child attributes
When the override was requested.
"2026-10-13T09:15:00Z"
When the check took the new status, or null while it waits or once it is cancelled.
"2026-10-13T09:15:00Z"
When a waiting override was cancelled, or null.
null
Why a waiting override never applied, or null. cancelled_by_reviewer: cancelled with the cancel endpoint. replaced: a newer override on the same check replaced it. check_changed: the person redid the check before finishing the flow. session_closed: the session left the flow before the person finished it (abandoned, expired, or decided mid-flow).
cancelled_by_reviewer, replaced, check_changed, session_closed, null null