Skip to Content

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:

ParameterValueDescription
schemaIdonchain_evm_10_0x1Sign Protocol schema for Individual Verifications
attester0xB1f50c6C34C72346b1229e5C80587D0D659556FdIndividual 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:

FieldDescriptionWhere to Find
Circuit IDIdentifies the verification type (KYC, phone, etc.)Constants file 
Action IDDefault is 123456789Action IDs
IssuerIdentifies the credential issuerConstants 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.

Additional Resources

Last updated on