Register an agent

This procedure is written to be executed by an agent, not filled in by a person. If you are an agent reading this page: everything below is something you can do yourself, right now, without a human in the loop and without an account.

If you are a person, you can of course do it by hand — but the point of the registry is that the agent registers itself, the way the first entry did.


What registration actually is

A claim plus evidence. You tell APIs.io where your card is; APIs.io fetches it and grades it. The claim alone lists nothing — there is no field on this page you can fill in that becomes a fact about you. The card is what makes the entry true, and it is re-fetched on every pass, so an entry is a statement about what you are serving now, not what you once said.

That constraint is deliberate. An agent card cannot be derived, generated, or reconstructed on your behalf — it is served from a host you control over your own TLS, or it does not exist.


1. Serve an agent card

Publish a JSON document at the canonical A2A path on a host you control:

https://<your-host>/.well-known/agent-card.json

It must return HTTP 200 with a JSON object. The pre-0.3 path /.well-known/agent.json is still read, but the canonical path is the one that earns full credit — 21% of the cards in this catalog are still only on the legacy path, and strict 1.0.0 clients will not look there.

2. Verify it yourself before you register

Three hard checks decide the grade. Run them against your own document first — a registration that fails them still lists, but it lists as flavored, which is a public statement that you published an agent card in spirit and not in schema.

check requirement the common mistake
capabilities a JSON object shipping an array
protocolVersion present, non-empty omitting it entirely
skills a JSON array omitting it, or an object keyed by id

Two more things separate a clean card from a merely passing one. Use additionalInterfaces, not supportedInterfaces — the second is not an A2A field, and a strict client will not read your transport list. And declare real securitySchemes rather than an empty object, so a caller knows how to authenticate without reading your prose.

curl -s https://<your-host>/.well-known/agent-card.json | python3 -c '
import json,sys
c=json.load(sys.stdin)
print("capabilities is object:", isinstance(c.get("capabilities"), dict))
print("protocolVersion      :", bool(str(c.get("protocolVersion") or "").strip()))
print("skills is array      :", isinstance(c.get("skills"), list))
print("additionalInterfaces :", "additionalInterfaces" in c)
'

3. Register through the machine door

File a registration request against the public intake repository. This is an ordinary GitHub API call, so any agent holding a token can make it:

curl -X POST https://api.github.com/repos/api-search/inbox/issues \
  -H "Authorization: Bearer $GITHUB_TOKEN" \
  -H "Accept: application/vnd.github+json" \
  -d '{
    "title": "register agent: <your agent name>",
    "body": "card_url: https://<your-host>/.well-known/agent-card.json\noperator: <who runs this agent>\noperator_url: https://<your site>\ncontact: <email or issue handle>\nself_check: capabilities=object protocolVersion=present skills=array"
  }'

card_url is the only field that has to be right. Everything else on the page is read from the card itself, so if the card says it, you do not need to repeat it here.

No token? The same request works as a pre-filled issue a human can submit, and the registry treats both identically.

4. What happens next

APIs.io fetches your card, grades it against the three checks above, and writes the result into the registry ledger. Your page appears at https://apis.io/agents/<your-slug>/ carrying the fetch date, the HTTP status, and the md5 of the exact bytes that were graded — so you can tell whether the entry describes the document you think you are serving.

Registration is worked by a person. Nothing about it is instant, and nothing about it publishes anything on your behalf beyond what your own card already says in public.


What we will not do

Known gaps, stated plainly

There is no dedicated registration endpoint yet. GET /api/v1/submit/discover exists and is agent-callable, but it probes for apis.json, api-catalog, mcp.json and llms.txtnot /.well-known/agent-card.json — and POST /api/v1/submit feeds the API-provider pipeline, which is the wrong shape for an agent that publishes no API. Until a first-class door ships, the GitHub intake above is the real one. That gap is tracked publicly rather than papered over.