curl --request GET \
--url https://api.example.com/credential/{credentialId}import requests
url = "https://api.example.com/credential/{credentialId}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/credential/{credentialId}', 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.example.com/credential/{credentialId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.example.com/credential/{credentialId}"
req, _ := http.NewRequest("GET", url, nil)
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.example.com/credential/{credentialId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/credential/{credentialId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"id": "urn:via:credential:550e8400-e29b-41d4-a716-446655440000",
"resourceType": "DOCUMENT",
"status": "DRAFT",
"executionsRemaining": 1,
"w3cCredential": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://via.humanos.tech/ns/v1"
],
"specVersion": "0.2",
"id": "urn:via:credential:550e8400-e29b-41d4-a716-446655440000",
"type": [
"VerifiableCredential",
"VIAMandate"
],
"issuer": "did:web:humanos.tech",
"validFrom": "2025-01-01T00:00:00Z",
"validUntil": null,
"credentialSubject": {
"id": "did:web:humanos.tech:org:550e8400-e29b-41d4-a716-446655440000",
"mandate": {
"grantor": "did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7",
"scope": "humanos.credential.request",
"context": {
"authorizedDIDs": [
"did:web:humanos.tech:org:550e8400-e29b-41d4-a716-446655440000",
"did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
}
}
},
"evidence": [
{
"id": "urn:via:evidence:9b2e4f1a-3c7d-4e8a-bf12-2a6c5d8e0f34",
"type": [
"VIAEvidence"
],
"mediaType": "application/pdf",
"digestSRI": "sha256-abc123",
"location": "https://api.humanos.tech/credential/evidence/urn:via:evidence:9b2e4f1a-3c7d-4e8a-bf12-2a6c5d8e0f34"
}
],
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-jcs-2022",
"verificationMethod": "did:web:humanos.tech#key-1",
"created": "2026-05-02T10:15:30.000Z",
"proofPurpose": "assertionMethod",
"proofValue": "z2pcVdSdoMTrkTRrXdz...",
"event": "STAMP"
}
},
"decisions": [
{
"id": "did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7",
"contact": "grantor@example.com",
"accepted": true,
"decidedAt": "2025-06-01T12:00:00.000Z"
}
],
"inactiveAt": "2026-05-02T10:15:30.000Z",
"name": "Credential Name",
"description": "Document to be requested on onboarding",
"internalId": "internal-12345",
"tags": [
"onboarding",
"kyc"
]
}{
"statusCode": 400,
"message": "Invalid urn",
"error": "Bad Request"
}{
"statusCode": 404,
"message": "Credential not found",
"error": "Not Found"
}Get Credential
Retrieve a credential by its identifier, including the full W3C Verifiable Credential, and the latest status of all grantor decisions.
The credentialId must be a credential URN (urn:via:credential:<uuid>); a malformed URN returns 400.
curl --request GET \
--url https://api.example.com/credential/{credentialId}import requests
url = "https://api.example.com/credential/{credentialId}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/credential/{credentialId}', 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.example.com/credential/{credentialId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.example.com/credential/{credentialId}"
req, _ := http.NewRequest("GET", url, nil)
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.example.com/credential/{credentialId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/credential/{credentialId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"id": "urn:via:credential:550e8400-e29b-41d4-a716-446655440000",
"resourceType": "DOCUMENT",
"status": "DRAFT",
"executionsRemaining": 1,
"w3cCredential": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://via.humanos.tech/ns/v1"
],
"specVersion": "0.2",
"id": "urn:via:credential:550e8400-e29b-41d4-a716-446655440000",
"type": [
"VerifiableCredential",
"VIAMandate"
],
"issuer": "did:web:humanos.tech",
"validFrom": "2025-01-01T00:00:00Z",
"validUntil": null,
"credentialSubject": {
"id": "did:web:humanos.tech:org:550e8400-e29b-41d4-a716-446655440000",
"mandate": {
"grantor": "did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7",
"scope": "humanos.credential.request",
"context": {
"authorizedDIDs": [
"did:web:humanos.tech:org:550e8400-e29b-41d4-a716-446655440000",
"did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7"
]
}
}
},
"evidence": [
{
"id": "urn:via:evidence:9b2e4f1a-3c7d-4e8a-bf12-2a6c5d8e0f34",
"type": [
"VIAEvidence"
],
"mediaType": "application/pdf",
"digestSRI": "sha256-abc123",
"location": "https://api.humanos.tech/credential/evidence/urn:via:evidence:9b2e4f1a-3c7d-4e8a-bf12-2a6c5d8e0f34"
}
],
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-jcs-2022",
"verificationMethod": "did:web:humanos.tech#key-1",
"created": "2026-05-02T10:15:30.000Z",
"proofPurpose": "assertionMethod",
"proofValue": "z2pcVdSdoMTrkTRrXdz...",
"event": "STAMP"
}
},
"decisions": [
{
"id": "did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7",
"contact": "grantor@example.com",
"accepted": true,
"decidedAt": "2025-06-01T12:00:00.000Z"
}
],
"inactiveAt": "2026-05-02T10:15:30.000Z",
"name": "Credential Name",
"description": "Document to be requested on onboarding",
"internalId": "internal-12345",
"tags": [
"onboarding",
"kyc"
]
}{
"statusCode": 400,
"message": "Invalid urn",
"error": "Bad Request"
}{
"statusCode": 404,
"message": "Credential not found",
"error": "Not Found"
}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-09-01"
Path Parameters
URN of the credential to retrieve
"urn:via:credential:550e8400-e29b-41d4-a716-446655440000"
Response
The credential, including its W3C Verifiable Credential and the latest grantor decisions.
URN of the credential.
"urn:via:credential:550e8400-e29b-41d4-a716-446655440000"
The type of resource for this credential (e.g., DOCUMENT, FORM)
"DOCUMENT"
The status of the credential
DRAFT, ACTIVE, INACTIVE "DRAFT"
Uses left against the mandate's maxExecutions bound, where one use is one approved verification. null means the mandate is unlimited — note this is NOT the same as 0, which means every use has been spent and the mandate has revoked itself.
1
The W3C Verifiable Credential following the VIA protocol specification.
While the credential is in DRAFT status, this object is in building mode: evidence, the proof, and other fields may still be attached or modified as grantors review and decide. It is unsigned at this stage.
Once all grantors have accepted (or the request window expires), the status transitions out of DRAFT and the credential is sealed and can be passed for verification as defined by the VIA protocol.
Every credential carries the signed specVersion marker, the singular
evidence/proof keys, evidence with type+mediaType, and a single securing
STAMP (proof.event = "STAMP").
Clients pinned below API version 2026-09-01 receive this reshaped to the historical
plural evidences/proofs with the marker dropped — see that version's changes.
{ "@context": [ "https://www.w3.org/ns/credentials/v2", "https://via.humanos.tech/ns/v1" ], "specVersion": "0.2", "id": "urn:via:credential:550e8400-e29b-41d4-a716-446655440000", "type": ["VerifiableCredential", "VIAMandate"], "issuer": "did:web:humanos.tech", "validFrom": "2025-01-01T00:00:00Z", "validUntil": null, "credentialSubject": { "id": "did:web:humanos.tech:org:550e8400-e29b-41d4-a716-446655440000", "mandate": { "grantor": "did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7", "scope": "humanos.credential.request", "context": { "authorizedDIDs": [ "did:web:humanos.tech:org:550e8400-e29b-41d4-a716-446655440000", "did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7" ] } } }, "evidence": [ { "id": "urn:via:evidence:9b2e4f1a-3c7d-4e8a-bf12-2a6c5d8e0f34", "type": ["VIAEvidence"], "mediaType": "application/pdf", "digestSRI": "sha256-abc123", "location": "https://api.humanos.tech/credential/evidence/urn:via:evidence:9b2e4f1a-3c7d-4e8a-bf12-2a6c5d8e0f34" } ], "proof": { "type": "DataIntegrityProof", "cryptosuite": "eddsa-jcs-2022", "verificationMethod": "did:web:humanos.tech#key-1", "created": "2026-05-02T10:15:30.000Z", "proofPurpose": "assertionMethod", "proofValue": "z2pcVdSdoMTrkTRrXdz...", "event": "STAMP" } }
Whether each grantor accepted or rejected the credential and information about the grantor contact. The id field carries the grantor's DID. Always an array (empty when there are no decisions yet).
[ { "id": "did:web:humanos.tech:user:7c9e6679-7425-40de-944b-e07fc1f90ae7", "contact": "grantor@example.com", "accepted": true, "decidedAt": "2025-06-01T12:00:00.000Z" } ]
When the credential stopped being usable — rejected, cancelled, revoked, exhausted or expired. Null while it is DRAFT or ACTIVE.
"2026-05-02T10:15:30.000Z"
Human-readable name of the credential; null when unset.
"Credential Name"
Free-text description of the credential; null when unset.
"Document to be requested on onboarding"
Identifier to help you identify the credential in your own system. We recommend using a unique value.
"internal-12345"
Free-form labels attached to the credential.
["onboarding", "kyc"]