curl --request POST \
--url https://api.proofage.net/v1/verifications/{verification}/test-outcome \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-HMAC-Signature: <api-key>' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.proofage.net/v1/verifications/{verification}/test-outcome"
payload = { "reason": "<string>" }
headers = {
"X-API-Key": "<api-key>",
"X-HMAC-Signature": "<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>',
'X-HMAC-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({reason: '<string>'})
};
fetch('https://api.proofage.net/v1/verifications/{verification}/test-outcome', 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://api.proofage.net/v1/verifications/{verification}/test-outcome",
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([
'reason' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>",
"X-HMAC-Signature: <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://api.proofage.net/v1/verifications/{verification}/test-outcome"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-HMAC-Signature", "<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://api.proofage.net/v1/verifications/{verification}/test-outcome")
.header("X-API-Key", "<api-key>")
.header("X-HMAC-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proofage.net/v1/verifications/{verification}/test-outcome")
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["X-HMAC-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"external_id": "user-123",
"external_metadata": null,
"redirect_url": "https://example.com/callback",
"status": "approved",
"reason": null,
"duplicate_check": {
"checked": false,
"duplicate_count": 0,
"duplicates": []
},
"erasure": null,
"consent_accepted_at": null,
"created_at": "2026-03-19T12:00:00+00:00",
"updated_at": "2026-03-19T12:00:05+00:00"
}{
"error": {
"code": "TEST_WORKSPACE_ONLY",
"message": "The outcome can only be set in a test workspace."
}
}{
"message": "<string>"
}{
"error": {
"code": "INVALID_STATUS",
"message": "The verification is already approved, a final status."
}
}Set a test outcome
Test workspaces only: finishes a verification with the given status without a person going
through the widget, so an integration’s handling of each outcome can be tested end to end.
A verification nobody has opened is moved through started and submitted first, as a
person’s submission would move it, so the outcome is the only decision webhooks are sent for.
Works from created, started, submitted, review and resubmission_requested.
Answers with the verification, as Get verification status does.
curl --request POST \
--url https://api.proofage.net/v1/verifications/{verification}/test-outcome \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-HMAC-Signature: <api-key>' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.proofage.net/v1/verifications/{verification}/test-outcome"
payload = { "reason": "<string>" }
headers = {
"X-API-Key": "<api-key>",
"X-HMAC-Signature": "<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>',
'X-HMAC-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({reason: '<string>'})
};
fetch('https://api.proofage.net/v1/verifications/{verification}/test-outcome', 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://api.proofage.net/v1/verifications/{verification}/test-outcome",
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([
'reason' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>",
"X-HMAC-Signature: <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://api.proofage.net/v1/verifications/{verification}/test-outcome"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-HMAC-Signature", "<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://api.proofage.net/v1/verifications/{verification}/test-outcome")
.header("X-API-Key", "<api-key>")
.header("X-HMAC-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proofage.net/v1/verifications/{verification}/test-outcome")
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["X-HMAC-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"external_id": "user-123",
"external_metadata": null,
"redirect_url": "https://example.com/callback",
"status": "approved",
"reason": null,
"duplicate_check": {
"checked": false,
"duplicate_count": 0,
"duplicates": []
},
"erasure": null,
"consent_accepted_at": null,
"created_at": "2026-03-19T12:00:00+00:00",
"updated_at": "2026-03-19T12:00:05+00:00"
}{
"error": {
"code": "TEST_WORKSPACE_ONLY",
"message": "The outcome can only be set in a test workspace."
}
}{
"message": "<string>"
}{
"error": {
"code": "INVALID_STATUS",
"message": "The verification is already approved, a final status."
}
}Authorizations
Your workspace public key (pk_test_… or pk_live_…).
HMAC-SHA256 of the request, hex-encoded, keyed with the workspace secret key. See API authentication.
Path Parameters
The verification ID
Body
The outcome to set: approved, declined, review or resubmission_requested.
approved, declined, review, resubmission_requested A note kept with a resubmission_requested outcome in the verification's history. It is not the decision reason code.
1000Response
The verification with its new status.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes