Attestation Protocols
Individual Verifications issue attestations through multiple protocols, allowing you to query and validate verification status in different ways. This page covers how to read attestations from Sign Protocol and Verax.
Sign Protocol
Individual Verifications issue a Sign Protocol attestation for every SBT minted. You can query these attestations to verify a user’s identity status.
Query Attestations
Use the Sign Protocol API to query attestations. Filter by the schema ID and attester address to get attestations issued by Individual Verifications.
curl 'https://mainnet-rpc.sign.global/api/index/attestations?schemaId=onchain_evm_10_0x1&attester=0xB1f50c6C34C72346b1229e5C80587D0D659556Fd'Query Parameters:
| Parameter | Value | Description |
|---|---|---|
schemaId | onchain_evm_10_0x1 | Sign Protocol schema for Individual Verifications |
attester | 0xB1f50c6C34C72346b1229e5C80587D0D659556Fd | Individual Verifications attester address |
To query for a specific recipient, add the recipient parameter with the user’s address.
Response Format
{
"data": {
"page": 1,
"rows": [
{
"attestTimestamp": "1714819085000",
"attestationId": "0x65",
"attester": "0xB1f50c6C34C72346b1229e5C80587D0D659556Fd",
"chainId": "10",
"data": "0x000000...",
"recipients": ["0xEdedf460A77928f59c27f37F73D4853FD8a07984"],
"revoked": false,
"schema": {
"name": "HolonymV3",
"description": "Holonym V3 SBT"
}
}
],
"size": 100,
"total": 195
}
}Validate Attestation
When validating an attestation, verify the circuit ID, action ID, and issuer match your expected values.
Reference Values:
| Field | Description | Where to Find |
|---|---|---|
| Circuit ID | Identifies the verification type (KYC, phone, etc.) | Constants file  |
| Action ID | Default is 123456789 | Action IDs |
| Issuer | Identifies the credential issuer | Constants file  |
const { ethers } = require("ethers");
// Extract attestation data from API response (data.rows[0].data)
const data = "0x000000..."; // attestation data hex string
const decoded = ethers.utils.defaultAbiCoder.decode(
["string", "uint256[]"],
data
);
const circuitId = decoded[0];
const publicValues = decoded[1];
const actionId = publicValues[2];
const issuer = publicValues[4];
// Validate circuit ID matches KYC
if (circuitId !== "0x729d660e1c02e4e419745e617d643f897a538673ccf1051e093bbfa58b0a120b") {
throw new Error("Invalid circuit ID");
}
// Validate action ID
if (actionId.toString() !== "123456789") {
throw new Error("Invalid action ID");
}
// Validate issuer matches KYC issuer
if (issuer.toHexString() !== "0x03fae82f38bf01d9799d57fdda64fad4ac44e4c2c2f16c5bf8e1873d0a3e1993") {
throw new Error("Invalid issuer");
}For most use cases, we recommend using the Individual Verifications API directly rather than querying attestation protocols. The API provides a simpler interface and handles validation automatically.