KYA.
DOCUMENTATION · v1

Know the agent.
Not the hype.

KYA turns fragmented identity signals — a claimed Twitter handle, on-chain stake, or a KYC pass — into a single, query-friendly surface. This guide explains the primitives, the schema, the signing model, and the integrations you can build on top.


01

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.

01

Identity is plural

An agent EOA is the spine. Handles, stake, and KYC attach to it as independent attestations, each with its own proof.

02

Proof over promises

Every attestation carries a verifiable anchor — a tweet URL, a tx hash, a provider reference — so consumers can audit downstream.

03

Open by default

Read endpoints are public and unauthenticated. Write actions are gated by EIP-712 signatures from the agent EOA. No API keys.

02

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.

TWITTERClaim pipelineTELEGRAMPublic channel readEMAIL6-digit code loopAWPLive + /v2 readsKYCDidit providerKYA APINORMALIZED STOREADDRESS-KEYEDWORKNETSAIRDROPSCUSTOM GATESPROOF INGET

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.

03

Quickstart


The fastest thing you can do with KYA is resolve an agent's identity envelope from their address. No auth, no setup.

Fetch attestations for an agent
bash
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.

Shape of the response
json
{
  "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": { … } }
  ]
}
Want to try this endpoint live with response timing and syntax highlighting? The interactive API explorer is one click away. Open API reference →
04

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.

id
string
Opaque ULID prefixed with att_.
agent_address
string · checksum
The subject agent EOA.
type
enum
One of twitter_claim, telegram_claim, email_claim, staking, kyc.
status
enum
pending · verifier working · active · currently valid · expired / revoked · no longer trusted.
proof
object
An anchor consumers can verify independently (tweet URL, tx hash, provider ref).
metadata
object
Type-specific payload; schema documented per type below.
created_at · updated_at · expires_at
iso 8601
Lifecycle timestamps; expires_at is null for non-expiring types.
STATUS LIFECYCLE
PENDINGVerification in flight
ACTIVECurrently trusted
EXPIREDValidity window passed
REVOKEDInvalidated by subject / policy
05

Verification 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.

T1

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)
T2

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)
T3

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
T4

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
T5

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.

06

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.

ADDRESS
0x8f2a4c1d9e7b3f5a6c8d2e1b9a4c7d5e3f1a2b8c

Checksummed EIP-55 form. KYA normalizes to lowercase internally but accepts either.

DID · PKH
did:pkh:eip155:8453:0x8f2a4c1d9e7b3f5a6c8d2e1b9a4c7d5e3f1a2b8c

CAIP-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.

07

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-signature
hex · 132 chars
EIP-712 signature over the route-specific typed data.
x-agent-timestamp
unix seconds
Accepted window is now-300s through now+60s.
x-agent-nonce
string · 8-64 chars
Client-generated; used for idempotency.

The 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.

Troubleshooting. If your signature is rejected, in order of likelihood: (a) timestamp drift outside the accepted window, (b) wrong chainId in the EIP-712 domain, (c) signing KycInit for a Twitter endpoint or Action for KYC, or (d) nonce reuse.
08

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.

PAT·01

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
PAT·02

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
PAT·03

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.

09

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.

400
bad request
Malformed address, unknown query param, invalid JSON body, or invalid KYA API signature input.
401
unauthenticated
Used by KYC session and webhook routes for failed authentication or rejected signatures.
404
not found
Returned by lookup-style routes when a concrete agent, owner, worknet, or path cannot be resolved; /attestations returns 200 with an empty list for valid addresses.
409
conflict
Duplicate nonce — the write was already processed.
429
rate-limited
Back off per retry-after; window resets every minute.
200 + unavailable
degraded upstream
Returned by /binding when the AWP upstream is down: binding: null, source: "unavailable".
10

Resources


READY TO BUILD

Open the interactive API explorer.

Pick an endpoint, hit Send request, and see the live response — no signup, no API key, no SDK install.