curl --request POST \
--url https://api.humanos.tech/call-proofs/redeem \
--header 'Content-Type: application/json' \
--data '
{
"token": "eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln"
}
'import requests
url = "https://api.humanos.tech/call-proofs/redeem"
payload = { "token": "eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
token: 'eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln'
})
};
fetch('https://api.humanos.tech/call-proofs/redeem', 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.humanos.tech/call-proofs/redeem",
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([
'token' => 'eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.humanos.tech/call-proofs/redeem"
payload := strings.NewReader("{\n \"token\": \"eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.humanos.tech/call-proofs/redeem")
.header("Content-Type", "application/json")
.body("{\n \"token\": \"eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.humanos.tech/call-proofs/redeem")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"token\": \"eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln\"\n}"
response = http.request(request)
puts response.read_body{
"live": true,
"reason": "credential_revoked"
}{
"statusCode": 400,
"message": "signature_invalid",
"error": "Bad Request"
}Redeem a call proof
No API key: holding the decision token is the credential
Answers whether the decision still stands — the mandate it was made on is still live, or the policy version it read is still current. Nothing is spent: it may be asked again until the token lapses
curl --request POST \
--url https://api.humanos.tech/call-proofs/redeem \
--header 'Content-Type: application/json' \
--data '
{
"token": "eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln"
}
'import requests
url = "https://api.humanos.tech/call-proofs/redeem"
payload = { "token": "eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
token: 'eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln'
})
};
fetch('https://api.humanos.tech/call-proofs/redeem', 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.humanos.tech/call-proofs/redeem",
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([
'token' => 'eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.humanos.tech/call-proofs/redeem"
payload := strings.NewReader("{\n \"token\": \"eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.humanos.tech/call-proofs/redeem")
.header("Content-Type", "application/json")
.body("{\n \"token\": \"eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.humanos.tech/call-proofs/redeem")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"token\": \"eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln\"\n}"
response = http.request(request)
puts response.read_body{
"live": true,
"reason": "credential_revoked"
}{
"statusCode": 400,
"message": "signature_invalid",
"error": "Bad Request"
}Headers
Pin request, response, and webhook shapes to a specific dated API version (YYYY-MM-DD). Omit to use the version pinned to your API key (set when the key is created; new keys default to the latest version). New integrations should target the latest version.
^\d{4}-\d{2}-\d{2}$"2026-11-02"
Body
The decision token the call carried (Humanos-Call-Proof, or _meta["tech.humanos/call-proof"]), unchanged.
16384"eyJhbGciOiJFZERTQSIsInR5cCI6InZpYS1jYWxsLXByb29mK2p3dCJ9.eyJpc3MiOiJkaWQ6d2ViOmh1bWFub3MudGVjaCJ9.c2ln"
Response
Whether the decision still stands: the mandate it was made on is still live, or the policy version it read is still the organization's current one.
true
Why it no longer stands, when live is false: the mandate's status (credential_revoked, credential_expired, …), max_executions_reached, mandate_not_found, policy_superseded or policy_not_found.
"credential_revoked"