Early access. Email sign-in and persistent accounts are live. Try it
Early accessX-KYA-Supported: v1

Give every agent a login
of its own

KYA hands each AI tool you use its own keypair and its own revocable credential, signed by you. Sites verify two signatures and know whose agent is knocking — while holding no secret for it at all.

shopping-assistant signing in at shop.examplePOST /kya/token
KYA-CHALLENGE-v1
chl_7Qb2ZxK4mNvR8sTd
https://shop.example← audience: worthless anywhere else
agt_Dj6dsEHX45jn8-SR
n_9f3c1a7e04b2d8
2026-09-05T20:14:02Z
Acts for
@ayden
Attested name
shopping-assistant
Scopes granted
profile.read, orders.read
Challenge signedagt_Dj6dsEHX45jn8Delegation verifiedowner @aydenSession issued4 ms

Nothing new on the wire. It is plain HTTP and standards your stack already speaks.

OAuth 2.0
the grant you already accept
RFC 7523
JWT assertion login
RFC 8414
site metadata
RFC 8037
Ed25519 keys as JWK
JOSE
verified with your own library

How it works

Two signatures carry
the whole protocol

One says an agent is yours. One says it is here, now, at this site. Neither can be replayed, relabelled, or reused somewhere else.

  1. 1

    Claim your name

    One account, one root key. It is generated in your browser and held encrypted for you, so signing in from a new laptop brings it along.

  2. 2

    Connect an agent

    Each tool enrols with a keypair it generates itself and a description of what it is. You can also connect a tool with a credential from your dashboard. Keep its private key with that tool.

  3. 3

    The agent signs a challenge

    A site hands over a random nonce bound to itself. The agent signs it once, never stores it, and refuses to sign for an audience it did not expect.

  4. 4

    The site issues a session

    Two checks: the agent signed the challenge, and you signed the agent. The registry publishes the public keys and signed delegations a site needs to verify that chain.

A site that verifies both knows the agent and the person behind it, and stores no credential for either.

The shape of an account

One key at the root, one for every tool

Your root key signs each agent into existence and is stored encrypted with your account for recovery. Sites verify public keys and signatures; they never receive your private keys.

Your key signs
the agents. That signature is what a site checks.
An agent key signs
one challenge at a time, for one site, once.
Cutting a branch
ends that agent everywhere and touches nothing else.
@aydenroot key, signs the delegationsshopping-assistantagt_sho…its own keypairshop.exampleinbox-triageagt_inb…its own keypairacme-invoicesold-scraperagt_old… revokedkey kept, access gonerefused everywhere

Two signatures deep, and every branch cuts on its own.

What you get

Revocable, per tool,
and legible after the fact

A password shared with an agent is a password you cannot take back from that agent alone. Separate keys are what make everything below cheap.

Kill one agent, keep the rest

Every tool holds its own delegated key. Revoke the one that misbehaved and nothing else changes — not your root key, not its siblings, not the sessions you meant to keep.

shopping-assistantActive until Dec 2Revoke
inbox-triageActive until Dec 2Revoke
old-scraperRevoked

An agent cannot rename itself

The name you attested lives inside the signature you made. Whatever the agent calls itself when it arrives is logged beside it, and a site sees when the two disagree.

AttestedDeclaredStatus
shopping-assistantshopping-assistantmatch
inbox-triageOfficial Bank Assistantname differs

Two badges, one line of HTML

One script tag renders the button a person clicks and registers the discovery metadata an agent reads. Agents learn a site accepts KYA from a header on a request they were already making.

Let your Agents login
Link: </.well-known/kya.json>; rel="kya-discovery"

You can see where your agents went

The site keeps the authoritative log, including refusals. Your dashboard collects what your own agents report, so one screen answers where they have been.

2026-09-05 21:45demo-shopsuccess
2026-09-04 21:45acme-invoicessuccess
2026-09-03 21:45demo-shopdenied

Your workspace

Every agent you own, on one screen

Who is connected, when they last signed in, where they went, and a button that ends any of it. Signing in with your email is the whole setup.

kya.local/agents

Agents

Two active, one revoked.

Connect an agent
Sign-ins per day
Refused
3

Two after a revocation, one from a site with no linked account.

shopping-assistant
claude-opus-5
Revoke
inbox-triage
gpt-5.1
Revoke
old-scraper
unknown
Revoked

For sites

Accepting agents is a token
endpoint you already have

KYA is not a new wire protocol. The login is the OAuth 2.0 assertion grant, so the cheapest way in is a JWT check with no KYA code on your side at all.

curl -X POST https://shop.example/kya/token \
  -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
  --data-urlencode "assertion=$ASSERTION"

{"access_token":"kya_…","token_type":"Bearer","expires_in":3600,
 "kya_user":"ayden","kya_account_id":"acct_1001"}

Already running this repo’s Go? Mount the provider on your own routes and your existing user table keeps being the source of truth for accounts.

mux.Handle("/", p.Routes())
mux.Handle("/api/", p.RequireAgent("profile.read")(myAPI))
http.ListenAndServe(":9090", business.AdvertiseKYA(mux))

An API key per agent

  • A secret in your database
  • A rotation you have to run
  • A leak you find out about later

A signature per login

  • A public key you can fetch
  • Nothing to rotate on your side
  • A revocation the owner makes
Level 1

Verify a JWT

Your JOSE library, a JWKS URL, five lines. The subject claim is the user. You trust the registry the way you trust any OIDC provider.

Level 2

Verify the delegation

The owner's signature rides along in a JOSE header. Check it yourself and the registry stops being an authority — it is just a directory.

Level 3

Issue the challenge

Your nonce, your clock, two round trips. Worth it if you would rather not keep a table of spent assertion ids.

Pick one. Level 1 is deliberately cheap enough that nobody has to believe in KYA to try it.

Pricing

Free for agent owners

Free today, and free for the people whose agents log in — that part is not going to change. There is no billing in the product at all yet.

$0

per month, per agent, per anything

Create credentials for your tools and revoke them whenever you need.

Sign-in
Email link
Account
Recoverable
Agent keys
Revocable
  • Separate credentials for each agent
  • Revoke or rotate an agent key
  • Recover your account on a new device
  • No seats, no usage tiers, no sales call

Where this is heading, honestly: we do intend to make money from KYA eventually, and we have not decided how. Whatever that turns out to be, signing in with your own agents stays free, with no subscription required.

If you want to pay someone today, pay whoever maintains the libraries you depend on.

Questions

The things worth asking first

How sign-in, account recovery, and revocation work, plus the limits of the current early-access release.

Is it really free?

Yes. Creating an account and signing in with your own agents is free. There are no paid plans in the product. The hosted app is available now; the source repository is private during early access.

Is it ready for production?

KYA is available in early access. Accounts and credentials persist across restarts, and sign-in uses verified email. A restart signs browsers out, but saved agent credentials remain valid.

What happens when an agent key leaks?

Rotate it and the agent keeps its id, so every site carries on recognising it and nobody has to be told. Revoke it and it is refused everywhere on the next login. Your root key and every other agent are untouched.

Can an agent lie about who it is?

It can lie about what it calls itself, and any keypair can. It cannot lie about being yours: the name you attested is inside the delegation you signed, so renaming needs your key. Sites get both names and a flag when they differ.

Where does my key actually live?

Generated in your browser, then stored encrypted against your account so a new device does not lock you out. Worth being blunt about the trade: whoever can read your email can take this key. It exists to make logins fast, not to hold anything else of value.

Does the registry see everywhere I log in?

No, and that is deliberate. A registry that saw every login would know every site you visit, which is worse than the passwords this replaces. Sites keep their own logs; your agents report to you only if you ask them to.

Does it work with MCP?

Not today. MCP authorization is browser-based OAuth 2.1 with no assertion grant for headless agents. The seam is Client ID Metadata Documents and private_key_jwt, against the same Ed25519 JWKS this registry already publishes.

Start with the hosted app

Sign in by email, claim your name, and give each tool its own credential. This demo shows the same sequence: an agent signs in successfully, then loses access after its owner revokes it.

Demo: enroll, sign in, and revoke an agent.

demo.sh
$ ./scripts/demo.sh
registry listening on :8080
demo-shop listening on :9090
enrolled ayden + shopping-assistant
login success in 4 ms
revoked shopping-assistant
login refused: agent revoked