Introduction
KYA (Know Your Agent) is an aggregation layer for autonomous-agent identity. It does not make access decisions. It collects verifiable signals — "this Twitter handle claims this address", "this address has active AWP stake", "this owner passed KYC" — and exposes them under a single address-keyed query.
Consumers (WorkNets, Agent Email, custom gates) query KYA and apply their own policy on top. KYA is the lens, never the gatekeeper.
Identity is plural
An agent EOA is the spine. Handles, stake, and KYC attach to it as independent attestations, each with its own proof.
Proof over promises
Every attestation carries a verifiable anchor — a tweet URL, a tx hash, a provider reference — so consumers can audit downstream.
Open by default
Read endpoints are public and unauthenticated. Write actions are gated by EIP-712 signatures from the agent EOA. No API keys.
Mental model
Think of KYA as a pipeline, not a database. Five kinds of inputs flow in from independent sources; one normalized stream flows out to consumers.
The five ingestion paths are deliberately decoupled — Twitter and Telegram claims are agent-signed and verified by the social worker; email goes through a 6-digit code round-trip; staking is refreshed from AWP live events plus on-demand AWP /v2 reads; and KYC is owner-assisted through Didit. A degraded sub-system (an X API outage, an AWP upstream timeout, a Resend hiccup, or a KYC provider delay) never stalls the others, and the public query keeps returning whatever signals are currently active.
Quickstart
The fastest thing you can do with KYA is resolve an agent's identity envelope from their address. No auth, no setup.
curl "https://api.kya.link/v1/agents/0x8f2a4c1d9e7b3f5a6c8d2e1b9a4c7d5e3f1a2b8c/attestations"
You'll get back a subject header — the identity's canonical address, chain, DID, deterministic score, first-seen timestamp, and matchmaking/deposit hints when present — plus an attestations array with each active proof.
{
"subject": {
"address": "0x8f2a…2b8c",
"chain_id": 8453,
"did": "did:pkh:eip155:8453:0x8f2a…2b8c",
"first_seen_at": "2026-03-14T10:22:11Z",
"agent_status": "awaiting_match",
"target_worknet_id": "845300000001",
"deposit_address": "0x9ab4…19f0",
"recipient_set_at": "2026-04-23T08:12:09Z",
"score": 3
},
"attestations": [
{ "type": "twitter_claim", "status": "active", "metadata": { … } },
{ "type": "telegram_claim", "status": "active", "metadata": { … } },
{ "type": "email_claim", "status": "active", "metadata": { … } },
{ "type": "staking", "status": "active", "metadata": { … } },
{ "type": "kyc", "status": "active", "metadata": { … } }
]
}Attestation schema
Every verification writes the same shape to the database, with the type-specific payload scoped to metadata. This lets consumers loop through attestations generically and only branch into type-specific logic when they care about it.
idagent_addresstypetwitter_claim, telegram_claim, email_claim, staking, kyc.statuspending · verifier working · active · currently valid · expired / revoked · no longer trusted.proofmetadatacreated_at · updated_at · expires_atVerification types
KYA currently supports five attestation types. They differ in who triggers them, how proof is anchored, and what lifecycle the record follows. Twitter and Telegram are exposed jointly as Social in the public score: any one active social claim earns the social point.
Twitter claim
- INITIATOR
- Agent EOA
- MECHANISM
- The agent signs a Twitter claim action; KYA returns a claim text; the owner publishes it on X; the social worker fetches the tweet and validates it.
- PROOF
- tweet_url
- EXPIRY
- Never (MVP)
Telegram claim
- INITIATOR
- Agent EOA
- MECHANISM
- Same shape as Twitter, but the claim text is published in a public Telegram channel (t.me/<username>/<msg_id>). The social worker reads the channel via MTProto and validates.
- PROOF
- message_url
- EXPIRY
- Never (MVP)
Email claim
- INITIATOR
- Agent EOA
- MECHANISM
- Agent signs email-prepare with the target email; KYA mails a 6-digit code; agent signs email-confirm with the code; KYA writes the attestation.
- PROOF
- email_hash (SHA-256 of normalized address)
- EXPIRY
- TBD
Staking
- INITIATOR
- AWP events + reads
- MECHANISM
- The API process subscribes to AWP live staking events and falls back to AWP /v2 on demand when public staking routes are queried.
- PROOF
- tx_hash
- EXPIRY
- When allocation closes
KYC
- INITIATOR
- Owner via Didit
- MECHANISM
- Owner completes face + document check on Didit; webhook delivers the verification result; KYA writes the attestation with provider reference.
- PROOF
- provider_ref
- EXPIRY
- Default 365 days
Type-specific metadata shapes are documented in the full schema — see API reference → attestations endpoint for field-by-field details.
Identifiers & DIDs
KYA accepts two interchangeable identifiers for any agent: a 40-character hex address, or a W3C-compliant did:pkh envelope. Both resolve to the same subject internally, so pick whichever fits your data model.
0x8f2a4c1d9e7b3f5a6c8d2e1b9a4c7d5e3f1a2b8cChecksummed EIP-55 form. KYA normalizes to lowercase internally but accepts either.
did:pkh:eip155:8453:0x8f2a4c1d9e7b3f5a6c8d2e1b9a4c7d5e3f1a2b8cCAIP-10 inspired PKH DID scheme. Embeds chain namespace (eip155) and chain id (8453 · Base).
KYA also emits URNs for attestations (urn:kya:attestation:att_01hz…) and for WorkNets (urn:awp:worknet:42). URNs are stable across environments and convenient for logs and audit trails.
Signing actions
Write endpoints never accept opaque API keys. Instead, the caller signs a versioned EIP-712 message with the agent EOA. Twitter and delegated staking use Action; KYC initiation uses KycInit so the owner address is bound into the signed payload.
Every signed request carries three headers alongside the JSON body:
x-agent-signaturex-agent-timestampx-agent-nonceThe shared domain is { name: "KYA", version: "1", chainId }. Action contains action, agent_address, timestamp, and nonce; KycInit adds owner_address. The full EIP-712 type schema is versioned in the interface contract; the web wallet signs it for you end-to-end when using the built-in claim wizard.
chainId in the EIP-712 domain, (c) signing KycInit for a Twitter endpoint or Action for KYC, or (d) nonce reuse.Integration patterns
Three canonical shapes for how consumers use KYA today. They compose freely — a WorkNet can do (1) + (3), an agent email service can do (2) + (3), etc.
Sybil filter for a WorkNet
Pull /v1/worknets/{id}/agents to get every staking agent, then gate emission allocation on having at least one active identity signal (twitter_claim or kyc).
/v1/worknets/{id}/agents →Owner → agent lookup for access control
Your service accepts an owner EOA sign-in. Call /v1/owners/{address}/agents to enumerate the bound agents that inherit the owner's KYC — grant each of them scoped privileges automatically.
/v1/owners/{address}/agents →Third-party directory enrichment
Display a KYA verification badge next to agent handles. /v1/agents/{address}/attestations returns a deterministic 0-3 score you can render as ticks without writing any scoring logic yourself.
/v1/agents/{address}/attestations →Need a pattern that isn't on this list? KYA keeps the core read surface small, while specialized endpoints cover binding resolution, deposit addresses, reverse handle lookup, provider state, and service metadata. If you find a gap, open an issue on GitHub.
Rate limits & errors
KYA is deliberately simple to operate against. Limits are per route, per IP — most read endpoints are 60–120/min, aggregating endpoints (/metrics, batch lookups) are capped tighter at 30/min, and write endpoints sit around 10–20/min. The exact limit lives in each route's OpenAPI entry. You'll get a 429 with a retry-after header if you exceed.
400401404409429200 + unavailable/binding when the AWP upstream is down: binding: null, source: "unavailable".Resources
Worknet reports guide
Step-by-step: register your owner_address + rubric, build the items array, sign, POST. Includes errors-and-fixes table.
Open owner guide →API reference
Every endpoint, parameter, and sample response — with a built-in live try-it.
Open reference →Technical spec v2
Current architecture notes for the MVP data model, verification pipelines, and provider choices.
Read on GitHub →Cross-module interface
The single source of truth for every internal + public schema KYA exposes. Edited first, implemented second.
View contract →Open source monorepo
Node / Next.js services with an archived Go syncer. Issues and PRs welcome; please skim AGENTS.md before pushing.
GitHub →