Individual Verifications — API Reference
The Individual Verifications API enables developers to check whether users have completed specific identity verifications (government ID, phone, biometrics) and query their verification status.
Try out these endpoints interactively in the API Reference Playground .
In the examples below, replace the following placeholder values with your actual data:
{network}- The blockchain network (optimismorbase-sepolia){address}- The user’s blockchain address{action-id}- Your action ID for sybil resistance (default:123456789)
Base URL
https://api.holonym.ioAction IDs
Action IDs enable sybil resistance. Use the default action ID 123456789 for most use cases - it provides universal uniqueness across all applications.
Custom action IDs are available for specific use cases. Contact us  to discuss your requirements.
Available Endpoints
| Endpoint Action | Endpoint |
|---|---|
| Check government ID verification | GET /sybil-resistance/gov-id/{network} |
| Check phone verification | GET /sybil-resistance/phone/{network} |
| Check biometrics verification | GET /sybil-resistance/biometrics/{network} |
| Query Proof of Clean Hands attestations | Sign Protocol API |
| Proof of Clean Hands SBTs (Sui) | GET /attestation/sbts/clean-hands |
Check Government ID Verification
Returns whether a user has completed government ID (KYC) verification and has a unique proof for the specified action.
GET /sybil-resistance/gov-id/{network}
Query Parameters
| Name | Required | Description |
|---|---|---|
user | Yes | The user’s blockchain address |
action-id | Yes | Your action ID for sybil resistance. Use 123456789 for the default action ID, or a custom value for app-specific uniqueness. |
curl --request GET \
'https://api.holonym.io/sybil-resistance/gov-id/optimism?user={address}&action-id=123456789'{
"result": true,
"expirationDate": 1770922106
}{
"result": false
}Response
| Field | Type | Description |
|---|---|---|
result | boolean | true if the user has a valid verification, false otherwise |
expirationDate | number | Unix timestamp when the verification expires (only present when result is true) |
Check Phone Verification
Returns whether a user has completed phone verification and has a unique proof for the specified action.
GET /sybil-resistance/phone/{network}
Query Parameters
| Name | Required | Description |
|---|---|---|
user | Yes | The user’s blockchain address |
action-id | Yes | Your action ID for sybil resistance |
curl --request GET \
'https://api.holonym.io/sybil-resistance/phone/optimism?user={address}&action-id=123456789'{
"result": true,
"expirationDate": 1770922106
}Check Biometrics Verification
Returns whether a user has completed biometric verification (face uniqueness and liveness check).
GET /sybil-resistance/biometrics/{network}
Query Parameters
| Name | Required | Description |
|---|---|---|
user | Yes | The user’s blockchain address |
action-id | Yes | Your action ID for sybil resistance |
curl --request GET \
'https://api.holonym.io/sybil-resistance/biometrics/optimism?user={address}&action-id=123456789'{
"result": true,
"expirationDate": 1780661994
}Snapshot Strategy Endpoints
These endpoints are designed for integration with Snapshot governance voting.
Configuring Snapshot
To use Individual Verifications with Snapshot, configure the “api” strategy  with the following parameters:
{
"api": "https://api.holonym.io",
"symbol": "",
"decimals": 0,
"strategy": "snapshot-strategies/sybil-resistance/gov-id",
"additionalParameters": "action-id=123456789"
}{
"api": "https://api.holonym.io",
"symbol": "",
"decimals": 0,
"strategy": "snapshot-strategies/sybil-resistance/phone",
"additionalParameters": "action-id=123456789"
}We recommend using the default action ID 123456789. Contact us  if you need a custom action ID.
Snapshot: Government ID Sybil Resistance
GET /snapshot-strategies/sybil-resistance/gov-id
Query Parameters
| Name | Required | Description |
|---|---|---|
network | Yes | Chain ID |
snapshot | Yes | Block height |
addresses | Yes | Comma-separated list of blockchain addresses |
action-id | Yes | Your action ID for sybil resistance |
curl --request GET \
'https://api.holonym.io/snapshot-strategies/sybil-resistance/gov-id?network=10&snapshot=12345678&addresses={address1},{address2}&action-id=123456789'{
"score": [
{ "address": "0x123...", "score": 1 },
{ "address": "0x456...", "score": 0 }
]
}Snapshot: Phone Sybil Resistance
GET /snapshot-strategies/sybil-resistance/phone
Uses the same parameters and response format as the Government ID Snapshot endpoint.
Snapshot: Biometrics Sybil Resistance
GET /snapshot-strategies/sybil-resistance/biometrics
Uses the same parameters and response format as the Government ID Snapshot endpoint.
Proof of Clean Hands (PoCH)
Proof of Clean Hands verification proves that a user is not on sanctions or PEP (Politically Exposed Persons) lists. This enables regulatory compliance while preserving user privacy.
Query Proof of Clean Hands Attestations via Sign Protocol
Proof of Clean Hands attestations are issued through Sign Protocol. Query a user’s attestation status using the Sign Protocol API.
GET https://mainnet-rpc.sign.global/api/scan/addresses/\{address\}/attestations 
curl --request GET \
'https://mainnet-rpc.sign.global/api/scan/addresses/{address}/attestations'{
"data": {
"rows": [
{
"fullSchemaId": "onchain_evm_10_0x8",
"attester": "0xB1f50c6C34C72346b1229e5C80587D0D659556Fd",
"isReceiver": true,
"revoked": false,
"validUntil": 1735689600
}
]
}
}Validating a Proof of Clean Hands Attestation
To confirm a user has a valid Proof of Clean Hands attestation, verify all of the following conditions:
| Field | Required Value | Description |
|---|---|---|
fullSchemaId | onchain_evm_10_0x8 | The schema ID for Proof of Clean Hands attestations on Optimism |
attester | 0xB1f50c6C34C72346b1229e5C80587D0D659556Fd | The authorized attester address |
isReceiver | true | Confirms the queried address is the attestation recipient |
revoked | false | Attestation has not been revoked |
validUntil | Greater than current timestamp | Attestation has not expired |
function hasValidCleanHandsAttestation(attestations: any[]): boolean {
const now = Math.floor(Date.now() / 1000);
return attestations.some(att =>
att.fullSchemaId === 'onchain_evm_10_0x8' &&
att.attester === '0xB1f50c6C34C72346b1229e5C80587D0D659556Fd' &&
att.isReceiver === true &&
att.revoked === false &&
att.validUntil > now
);
}Proof of Clean Hands SBTs (Sui)
For Sui blockchain integration, query Proof of Clean Hands SBT status directly.
GET /attestation/sbts/clean-hands
Query Parameters
| Name | Required | Description |
|---|---|---|
address | Yes | The user’s Sui address |
action-id | Yes | Your action ID |
curl --request GET \
'https://api.holonym.io/attestation/sbts/clean-hands?address={sui_address}&action-id=123456789'{
"isUnique": true,
"signature": "0x...",
"circuitId": 12345
}{
"isUnique": false
}Response
| Field | Type | Description |
|---|---|---|
isUnique | boolean | true if the user has a valid Proof of Clean Hands attestation, false otherwise |
signature | string | Cryptographic signature for on-chain verification (only present when isUnique is true) |
circuitId | number | The circuit identifier used for the attestation (only present when isUnique is true) |
Proof of Clean Hands verification combines KYC data with AML (Anti-Money Laundering) checks. The user’s identity information is encrypted and can only be decrypted by authorized parties in case of regulatory requirements.
Supported Networks
| Network | Path Value | Supported Endpoints |
|---|---|---|
| Optimism (Mainnet) | optimism | All endpoints |
| Base Sepolia (Testnet) | base-sepolia | All endpoints |
For more details on integration patterns, see the Developer Quick Start .