KYC Proofs
List Proofs
The claim slots on an identity and which proof backs each one
GET
/
customers
/
api
/
identity
/
proofs
/
{walletAddress}
curl "https://api.trusset.org/customers/api/identity/proofs/0xabCDeF0123456789AbcdEf0123456789aBCDEF01" \
-H "X-API-Key: trusset_your_key_here"
const wallet = '0xabCDeF0123456789AbcdEf0123456789aBCDEF01';
const res = await fetch(`https://api.trusset.org/customers/api/identity/proofs/${wallet}`, {
headers: { 'X-API-Key': 'trusset_your_key_here' }
});
const { data } = await res.json();
if (data.chainUnavailable) throw new Error('Registry unreadable, retry later');
const stale = data.proofs.filter((p: any) => p.source === 'proof' && !p.rootCurrent);
{
"success": true,
"data": {
"walletAddress": "0xabCDeF0123456789AbcdEf0123456789aBCDEF01",
"rootHash": "0x7c3a9f1d8b2e64057af13c9e0d5b8a4726f1c0e93d8b5a2740c6e19fb3d47a58",
"verified": true,
"frozen": false,
"chainUnavailable": false,
"ledgerUnavailable": false,
"proofs": [
{
"claimType": 3,
"claimTypeLabel": "RESIDENCY",
"fieldName": "country",
"circuit": "set_membership",
"proofDigest": "0x2f74c8a1b09d3e6754108bfa2c9d70e3b5148af6209c73de815b40a92c6ef31d",
"bundleRoot": "0x7c3a9f1d8b2e64057af13c9e0d5b8a4726f1c0e93d8b5a2740c6e19fb3d47a58",
"rootCurrent": true,
"source": "proof",
"dataHash": "0x41d8b7e05a3164c2870fbd935e1a4c7802db6135ea9048f7c21b5d3ea41b9f2c",
"issuer": "0x1234f9a07C6B53d81e2A4F70C9b385d6014a7E52",
"issuedAt": 1788696000,
"expiry": 1820246400,
"txHash": "0x9f2c41d8b7e05a3164c2870fbd935e1a4c7802db6135ea9048f7c21b5d3ea41b"
}
]
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-06T12:00:00.000Z"
}
}
Returns the subject’s on-chain root and every active claim slot, joined with the ledger row that records which proof filed it. It answers the question a reviewer asks: what does this identity assert, and where did each assertion come from.
Path Parameters
string
required
The subject’s wallet address.
Response Fields
object
Show child attributes
Show child attributes
string
The subject, checksummed.
string
The root the registry holds for this identity, lowercased, or
null when there is none.boolean
Whether the registry holds a verified identity.
boolean
Whether the identity is frozen. Always
false on an ERC-3643 register, which keeps no freeze.boolean
true when the identity could not be read. The rest of the response is then not a statement about the identity. A failed read of the claims alone is not flagged, and proofs then comes back empty.boolean
true when the proof ledger could not be read.array
One entry per active claim slot on chain. See below.
array
Show child attributes
Show child attributes
integer
Slot index, 0 to 7.
string
Its name, for example
RESIDENCY.string
The bundle field that filed it, or
null when no ledger row matches this claim’s hash.string
The circuit that proved it, or
null.string
Digest of the STARK behind it, or
null.string
The root of the bundle that filed it, or
null.boolean
Whether that bundle’s root is still the one on chain.
false means the claim was filed from a bundle the identity has since rotated away from, or that no ledger row matches.string
proof when a ledger row with this hash backs it, manual when none does, null when the ledger could not be read. Only Attest Proofs writes ledger rows. A claim filed by Add Claims from Proof or Add Claim shows as manual.string
The hash the claim carries on chain, lowercased.
string
Who wrote the claim on chain. On an ERC-3643 register, the trusted issuer contract that signed it.
integer
Unix seconds.
0 on an ERC-3643 register.integer
Unix seconds, or
0 for no expiry. Always 0 on an ERC-3643 register.string
The transaction that filed it, from the ledger, or
null.rootCurrent: false on a source: "proof" entry is the one to watch. The claim is still on chain and still readable by a token contract. But the bundle it came from no longer matches the identity’s root, so the proof behind it can no longer be checked against the chain. Re-attest from the current bundle.The chain is the source of truth here and the ledger only supplies labels. When the ledger cannot be read,
ledgerUnavailable is true, source is null on every entry and the per-proof fields are null, but the root and the claims still render.curl "https://api.trusset.org/customers/api/identity/proofs/0xabCDeF0123456789AbcdEf0123456789aBCDEF01" \
-H "X-API-Key: trusset_your_key_here"
const wallet = '0xabCDeF0123456789AbcdEf0123456789aBCDEF01';
const res = await fetch(`https://api.trusset.org/customers/api/identity/proofs/${wallet}`, {
headers: { 'X-API-Key': 'trusset_your_key_here' }
});
const { data } = await res.json();
if (data.chainUnavailable) throw new Error('Registry unreadable, retry later');
const stale = data.proofs.filter((p: any) => p.source === 'proof' && !p.rootCurrent);
{
"success": true,
"data": {
"walletAddress": "0xabCDeF0123456789AbcdEf0123456789aBCDEF01",
"rootHash": "0x7c3a9f1d8b2e64057af13c9e0d5b8a4726f1c0e93d8b5a2740c6e19fb3d47a58",
"verified": true,
"frozen": false,
"chainUnavailable": false,
"ledgerUnavailable": false,
"proofs": [
{
"claimType": 3,
"claimTypeLabel": "RESIDENCY",
"fieldName": "country",
"circuit": "set_membership",
"proofDigest": "0x2f74c8a1b09d3e6754108bfa2c9d70e3b5148af6209c73de815b40a92c6ef31d",
"bundleRoot": "0x7c3a9f1d8b2e64057af13c9e0d5b8a4726f1c0e93d8b5a2740c6e19fb3d47a58",
"rootCurrent": true,
"source": "proof",
"dataHash": "0x41d8b7e05a3164c2870fbd935e1a4c7802db6135ea9048f7c21b5d3ea41b9f2c",
"issuer": "0x1234f9a07C6B53d81e2A4F70C9b385d6014a7E52",
"issuedAt": 1788696000,
"expiry": 1820246400,
"txHash": "0x9f2c41d8b7e05a3164c2870fbd935e1a4c7802db6135ea9048f7c21b5d3ea41b"
}
]
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-06T12:00:00.000Z"
}
}
Error Codes
| Code | HTTP | Cause |
|---|---|---|
INVALID_ADDRESS | 400 | walletAddress is not a valid address |
INSTANCE_NOT_FOUND | 404 | The instance behind your key no longer exists |
OWN_REGISTRY_NOT_CONFIGURED | 409 | The instance is bound to its own register but has no valid register address |
PROOFS_FAILED | 500 | The proof tree could not be assembled |
⌘I
curl "https://api.trusset.org/customers/api/identity/proofs/0xabCDeF0123456789AbcdEf0123456789aBCDEF01" \
-H "X-API-Key: trusset_your_key_here"
const wallet = '0xabCDeF0123456789AbcdEf0123456789aBCDEF01';
const res = await fetch(`https://api.trusset.org/customers/api/identity/proofs/${wallet}`, {
headers: { 'X-API-Key': 'trusset_your_key_here' }
});
const { data } = await res.json();
if (data.chainUnavailable) throw new Error('Registry unreadable, retry later');
const stale = data.proofs.filter((p: any) => p.source === 'proof' && !p.rootCurrent);
{
"success": true,
"data": {
"walletAddress": "0xabCDeF0123456789AbcdEf0123456789aBCDEF01",
"rootHash": "0x7c3a9f1d8b2e64057af13c9e0d5b8a4726f1c0e93d8b5a2740c6e19fb3d47a58",
"verified": true,
"frozen": false,
"chainUnavailable": false,
"ledgerUnavailable": false,
"proofs": [
{
"claimType": 3,
"claimTypeLabel": "RESIDENCY",
"fieldName": "country",
"circuit": "set_membership",
"proofDigest": "0x2f74c8a1b09d3e6754108bfa2c9d70e3b5148af6209c73de815b40a92c6ef31d",
"bundleRoot": "0x7c3a9f1d8b2e64057af13c9e0d5b8a4726f1c0e93d8b5a2740c6e19fb3d47a58",
"rootCurrent": true,
"source": "proof",
"dataHash": "0x41d8b7e05a3164c2870fbd935e1a4c7802db6135ea9048f7c21b5d3ea41b9f2c",
"issuer": "0x1234f9a07C6B53d81e2A4F70C9b385d6014a7E52",
"issuedAt": 1788696000,
"expiry": 1820246400,
"txHash": "0x9f2c41d8b7e05a3164c2870fbd935e1a4c7802db6135ea9048f7c21b5d3ea41b"
}
]
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-06T12:00:00.000Z"
}
}
