Identity Verification
Identity Status
Query both on-chain and off-chain identity status for a wallet
GET
/
customers
/
api
/
identity
/
status
/
{walletAddress}
curl "https://api.trusset.org/customers/api/identity/status/0xaBc123DEf456789012345678901234567890aBCD" \
-H "X-API-Key: trusset_your_key_here"
const address = '0xaBc123DEf456789012345678901234567890aBCD';
const response = await fetch(
`https://api.trusset.org/customers/api/identity/status/${address}`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await response.json();
if (data.onChain.unavailable) {
throw new Error(`Register unreadable: ${data.onChain.unavailableReason}`);
}
if (data.onChain.isVerified && data.offChain?.status !== 'verified') {
console.warn('Verified on the register but not in your records');
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 2,
"kycProvider": "0x51A4F0c3B2e8d7A6c5B4e3f2A1d0c9b8e7f6A5D4",
"timestamp": 1790769900,
"softExpiry": 1822305600,
"hardExpiry": 1853841600,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 2,
"kycProvider": "0x5Ad87a0621175206b72d10E4b8577b192e7F40aB",
"timestamp": 1791605136,
"softExpiry": 1822305600,
"hardExpiry": 1853841600,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true,
"migration": {
"previousRegistry": "0xe9114c40934f6fb6bb317935156b731f7a86d006",
"originalKycProvider": "0x51a4f0c3b2e8d7a6c5b4e3f2a1d0c9b8e7f6a5d4",
"originalKycProviderName": "Trusset Test KYC",
"originalTimestamp": 1774083600,
"originalSoftExpiry": 1822305600,
"softExpiryRefreshed": false,
"migratedAt": 1791605136,
"migrator": "0x5ad87a0621175206b72d10e4b8577b192e7f40ab",
"migratorName": "Trusset register migration",
"migrationTxHash": "0xced5047cbdbf04b91d4e82405f905f36868843ac4d0aa6e7c0f8926ef5f37cea"
}
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-03-21T09:00:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-10-10T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 0,
"kycProvider": "0x9a8B7c6d5e4f30211203F4E5d6c7B8a998877665",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true,
"registerKind": "TREX",
"onchainId": "0x7d3e2c1b0A9F8E7D6C5b4A39281706f5E4d3C2b1",
"country": "DEU"
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0x1234567890AbcdEF1234567890aBcdef12345678",
"onChain": {
"kycHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"investorType": 0,
"kycProvider": "0x0000000000000000000000000000000000000000",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "revoked",
"statusCode": 3,
"frozen": false,
"isVerified": false
},
"offChain": null
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"investorType": 0,
"kycProvider": "0x0000000000000000000000000000000000000000",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "none",
"statusCode": 3,
"frozen": false,
"isVerified": false,
"unavailable": true,
"unavailableReason": "SERVER_ERROR"
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
Returns the current identity state from two sources: the identity register your instance writes to, and your customer record. Comparing them shows where chain state and your records disagree.
A register that cannot be read does not fail this call. It answers
200 with onChain.unavailable: true and a zeroed record whose isVerified is false. Check unavailable before you read isVerified, or an outage reads as a customer who is not verified.Path Parameters
string
required
The wallet to query. Checksummed or lowercase.
Response Fields
object
Show child attributes
Show child attributes
string
The wallet, checksummed.
object
The identity as the register reports it. Always an object, never
null: a wallet the register does not know reads as a zeroed record.Show child attributes
Show child attributes
string
The registered KYC hash. On an ERC-3643 register, the data of the wallet’s KYC claim. All zeros when there is none.
integer
1 retail, 2 professional, 3 eligible counterparty, 0 none. Always 0 on an ERC-3643 register.string
The wallet that last wrote the identity. On an ERC-3643 register, the trusted issuer of the KYC claim. The zero address when there is none.
integer
Unix seconds of the last write. Always
0 on an ERC-3643 register.integer
Unix seconds, or
0. Always 0 on an ERC-3643 register.integer
Unix seconds, or
0. Always 0 on an ERC-3643 register.string
On a Trusset register,
active, soft_expired, hard_expired or revoked. A wallet that was never verified also reads revoked, with an all-zero kycHash. On an ERC-3643 register, active when verified, revoked when on the register but not verified, none when not on it.integer
0 active, 1 soft expired, 2 hard expired, 3 revoked or none.boolean
Whether the register freezes the wallet. Always
false on an ERC-3643 register, where freezing lives on each token.boolean
Whether the register counts the wallet as verified.
string
ERC-3643 only. Always
TREX.string
ERC-3643 only. The wallet’s ONCHAINID, or
null.string
ERC-3643 only. The wallet’s country on the register, in alpha-3, or
null.boolean
Present, and
true, only when the register could not be read. Every other field is then zeroed and status is none.string
Present with
unavailable. The code of the failed read, or READ_FAILED.object
Present only on the Trusset ID Register, for an identity the register move of 10 October 2026 copied and nobody has rewritten since. See The Trusset ID Register.
Show child attributes
Show child attributes
string
The register the identity was copied from, lowercased.
string
The wallet that verified the identity on the previous register, lowercased.
string
That wallet’s name as the previous register records it, such as
Trusset Test KYC, or null.integer
Unix seconds of the original verification.
integer
The soft expiry on the previous register, Unix seconds, or
null when it had none.boolean
true when that soft expiry had passed and the copy moved it to one hour after the copy. softExpiry above holds the moved value.integer
Unix seconds of the copy. The same value as
timestamp.string
The migration key that wrote the copy, lowercased. The same wallet as
kycProvider.string
Trusset register migration.string
The transaction that wrote the copy, or
null.object
Your customer record for the wallet, or
null when there is none or it is archived.On an identity copied in the register move,
kycProvider and timestamp show the copy: the migration key and 10 October 2026. The original verifier and the date of the original verification are in migration. Read them from there when you report who verified the customer and when.curl "https://api.trusset.org/customers/api/identity/status/0xaBc123DEf456789012345678901234567890aBCD" \
-H "X-API-Key: trusset_your_key_here"
const address = '0xaBc123DEf456789012345678901234567890aBCD';
const response = await fetch(
`https://api.trusset.org/customers/api/identity/status/${address}`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await response.json();
if (data.onChain.unavailable) {
throw new Error(`Register unreadable: ${data.onChain.unavailableReason}`);
}
if (data.onChain.isVerified && data.offChain?.status !== 'verified') {
console.warn('Verified on the register but not in your records');
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 2,
"kycProvider": "0x51A4F0c3B2e8d7A6c5B4e3f2A1d0c9b8e7f6A5D4",
"timestamp": 1790769900,
"softExpiry": 1822305600,
"hardExpiry": 1853841600,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 2,
"kycProvider": "0x5Ad87a0621175206b72d10E4b8577b192e7F40aB",
"timestamp": 1791605136,
"softExpiry": 1822305600,
"hardExpiry": 1853841600,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true,
"migration": {
"previousRegistry": "0xe9114c40934f6fb6bb317935156b731f7a86d006",
"originalKycProvider": "0x51a4f0c3b2e8d7a6c5b4e3f2a1d0c9b8e7f6a5d4",
"originalKycProviderName": "Trusset Test KYC",
"originalTimestamp": 1774083600,
"originalSoftExpiry": 1822305600,
"softExpiryRefreshed": false,
"migratedAt": 1791605136,
"migrator": "0x5ad87a0621175206b72d10e4b8577b192e7f40ab",
"migratorName": "Trusset register migration",
"migrationTxHash": "0xced5047cbdbf04b91d4e82405f905f36868843ac4d0aa6e7c0f8926ef5f37cea"
}
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-03-21T09:00:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-10-10T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 0,
"kycProvider": "0x9a8B7c6d5e4f30211203F4E5d6c7B8a998877665",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true,
"registerKind": "TREX",
"onchainId": "0x7d3e2c1b0A9F8E7D6C5b4A39281706f5E4d3C2b1",
"country": "DEU"
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0x1234567890AbcdEF1234567890aBcdef12345678",
"onChain": {
"kycHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"investorType": 0,
"kycProvider": "0x0000000000000000000000000000000000000000",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "revoked",
"statusCode": 3,
"frozen": false,
"isVerified": false
},
"offChain": null
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"investorType": 0,
"kycProvider": "0x0000000000000000000000000000000000000000",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "none",
"statusCode": 3,
"frozen": false,
"isVerified": false,
"unavailable": true,
"unavailableReason": "SERVER_ERROR"
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
Error Codes
| Code | HTTP | Cause |
|---|---|---|
INVALID_ADDRESS | 400 | walletAddress is not a valid address |
STATUS_FAILED | 500 | The customer record could not be read, or no register is configured for the instance’s network |
⌘I
curl "https://api.trusset.org/customers/api/identity/status/0xaBc123DEf456789012345678901234567890aBCD" \
-H "X-API-Key: trusset_your_key_here"
const address = '0xaBc123DEf456789012345678901234567890aBCD';
const response = await fetch(
`https://api.trusset.org/customers/api/identity/status/${address}`,
{ headers: { 'X-API-Key': 'trusset_your_key_here' } }
);
const { data } = await response.json();
if (data.onChain.unavailable) {
throw new Error(`Register unreadable: ${data.onChain.unavailableReason}`);
}
if (data.onChain.isVerified && data.offChain?.status !== 'verified') {
console.warn('Verified on the register but not in your records');
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 2,
"kycProvider": "0x51A4F0c3B2e8d7A6c5B4e3f2A1d0c9b8e7f6A5D4",
"timestamp": 1790769900,
"softExpiry": 1822305600,
"hardExpiry": 1853841600,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 2,
"kycProvider": "0x5Ad87a0621175206b72d10E4b8577b192e7F40aB",
"timestamp": 1791605136,
"softExpiry": 1822305600,
"hardExpiry": 1853841600,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true,
"migration": {
"previousRegistry": "0xe9114c40934f6fb6bb317935156b731f7a86d006",
"originalKycProvider": "0x51a4f0c3b2e8d7a6c5b4e3f2a1d0c9b8e7f6a5d4",
"originalKycProviderName": "Trusset Test KYC",
"originalTimestamp": 1774083600,
"originalSoftExpiry": 1822305600,
"softExpiryRefreshed": false,
"migratedAt": 1791605136,
"migrator": "0x5ad87a0621175206b72d10e4b8577b192e7f40ab",
"migratorName": "Trusset register migration",
"migrationTxHash": "0xced5047cbdbf04b91d4e82405f905f36868843ac4d0aa6e7c0f8926ef5f37cea"
}
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-03-21T09:00:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-10-10T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0xffb1f8c219725bd62205597cd7247c85cafeca20ac0a59f8ec6a7b979eaf672c",
"investorType": 0,
"kycProvider": "0x9a8B7c6d5e4f30211203F4E5d6c7B8a998877665",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "active",
"statusCode": 0,
"frozen": false,
"isVerified": true,
"registerKind": "TREX",
"onchainId": "0x7d3e2c1b0A9F8E7D6C5b4A39281706f5E4d3C2b1",
"country": "DEU"
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0x1234567890AbcdEF1234567890aBcdef12345678",
"onChain": {
"kycHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"investorType": 0,
"kycProvider": "0x0000000000000000000000000000000000000000",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "revoked",
"statusCode": 3,
"frozen": false,
"isVerified": false
},
"offChain": null
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
{
"success": true,
"data": {
"walletAddress": "0xaBc123DEf456789012345678901234567890aBCD",
"onChain": {
"kycHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"investorType": 0,
"kycProvider": "0x0000000000000000000000000000000000000000",
"timestamp": 0,
"softExpiry": 0,
"hardExpiry": 0,
"status": "none",
"statusCode": 3,
"frozen": false,
"isVerified": false,
"unavailable": true,
"unavailableReason": "SERVER_ERROR"
},
"offChain": {
"status": "verified",
"country": "DEU",
"investorType": "PROFESSIONAL",
"verifiedAt": "2026-09-30T12:05:00.000Z"
}
},
"error": null,
"metadata": {
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-09-30T12:10:00.000Z"
}
}
