curl --request GET \
--url https://api.proofage.net/v1/verifications/{verification}/document \
--header 'X-API-Key: <api-key>' \
--header 'X-HMAC-Signature: <api-key>'import requests
url = "https://api.proofage.net/v1/verifications/{verification}/document"
headers = {
"X-API-Key": "<api-key>",
"X-HMAC-Signature": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-API-Key': '<api-key>', 'X-HMAC-Signature': '<api-key>'}
};
fetch('https://api.proofage.net/v1/verifications/{verification}/document', 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}/document",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.proofage.net/v1/verifications/{verification}/document"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-HMAC-Signature", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.proofage.net/v1/verifications/{verification}/document")
.header("X-API-Key", "<api-key>")
.header("X-HMAC-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proofage.net/v1/verifications/{verification}/document")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
request["X-HMAC-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"document": {
"type": "passport",
"issuing_country": "DE",
"issuing_subdivision": null,
"fields": {
"first_name": "JANE",
"middle_name": null,
"last_name": "DOE",
"date_of_birth": "1990-04-12",
"gender": "F",
"nationality": "DE",
"place_of_birth": "BERLIN",
"address": null,
"document_number": "C01X00T47",
"issue_date": "2020-04-14",
"expiry_date": "2030-04-13"
}
},
"media": [
{
"id": "019de7a0-c11b-7373-9289-b0aa1ba08d13",
"type": "selfie",
"url": "https://api.proofage.net/v1/verifications/019de7a0-c11b-7373-9289-b0aa1ba08d13/media/019de7a0-c11b-7373-9289-b0aa1ba08d13"
},
{
"id": "019de7a0-c129-7259-8a08-bc10390ecbdb",
"type": "document_front",
"url": "https://api.proofage.net/v1/verifications/019de7a0-c11b-7373-9289-b0aa1ba08d13/media/019de7a0-c129-7259-8a08-bc10390ecbdb"
}
],
"meta": {
"attempt_id": "019de7a2-0305-7269-9cff-1715c71b19ae"
}
}{
"message": "<string>"
}{
"message": "<string>",
"errors": {}
}Get verification document result
Returns what was read from the identity document of the most relevant attempt,
normalised: dates as YYYY-MM-DD, countries as ISO 3166-1 alpha-2 (XK for Kosovo), and null for
anything the document did not yield or does not print. On identity (KYC)
workspaces fields carries eleven keys; on age verification workspaces only
first_name, last_name, date_of_birth and document_number are returned.
Each media item carries a url for the download endpoint, or null when the
media has been purged or has passed its retention window.
curl --request GET \
--url https://api.proofage.net/v1/verifications/{verification}/document \
--header 'X-API-Key: <api-key>' \
--header 'X-HMAC-Signature: <api-key>'import requests
url = "https://api.proofage.net/v1/verifications/{verification}/document"
headers = {
"X-API-Key": "<api-key>",
"X-HMAC-Signature": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-API-Key': '<api-key>', 'X-HMAC-Signature': '<api-key>'}
};
fetch('https://api.proofage.net/v1/verifications/{verification}/document', 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}/document",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.proofage.net/v1/verifications/{verification}/document"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-HMAC-Signature", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.proofage.net/v1/verifications/{verification}/document")
.header("X-API-Key", "<api-key>")
.header("X-HMAC-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.proofage.net/v1/verifications/{verification}/document")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
request["X-HMAC-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"document": {
"type": "passport",
"issuing_country": "DE",
"issuing_subdivision": null,
"fields": {
"first_name": "JANE",
"middle_name": null,
"last_name": "DOE",
"date_of_birth": "1990-04-12",
"gender": "F",
"nationality": "DE",
"place_of_birth": "BERLIN",
"address": null,
"document_number": "C01X00T47",
"issue_date": "2020-04-14",
"expiry_date": "2030-04-13"
}
},
"media": [
{
"id": "019de7a0-c11b-7373-9289-b0aa1ba08d13",
"type": "selfie",
"url": "https://api.proofage.net/v1/verifications/019de7a0-c11b-7373-9289-b0aa1ba08d13/media/019de7a0-c11b-7373-9289-b0aa1ba08d13"
},
{
"id": "019de7a0-c129-7259-8a08-bc10390ecbdb",
"type": "document_front",
"url": "https://api.proofage.net/v1/verifications/019de7a0-c11b-7373-9289-b0aa1ba08d13/media/019de7a0-c129-7259-8a08-bc10390ecbdb"
}
],
"meta": {
"attempt_id": "019de7a2-0305-7269-9cff-1715c71b19ae"
}
}{
"message": "<string>"
}{
"message": "<string>",
"errors": {}
}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
Response
Verification document result. type and gender are open enums: handle values not listed here. gender is F, M or X, where X means the document states that the sex is unspecified. other in type is a readable document that is not an identity card, passport, driving licence or residence permit, such as a health insurance card. Countries are ISO 3166-1 alpha-2 (XK for Kosovo). A document that prints only the month or year of expiry reports the last day of that period; a partially printed birth or issue date is null. On a Mexican voter card or driving licence created before 20 August 2026 17:00 UTC, gender is null. The German identity card prints no sex, so gender is null there. A permanent document (for example PERMANENTE or INDEFINIDA) reads as a null expiry_date. type id is the same value the upload endpoint takes. issuing_country and nationality can differ, for example on a residence permit. issuing_subdivision is the state or province that issued the document, as a bare code beside issuing_country (for example FL with US), or null; today it is filled for US driving licences and ID cards. place_of_birth is the printed text, not normalised. address is the printed text as read, not parsed and not normalised, and may contain line breaks.