apis.ax / The Agent eXperience Protocol (AXP)

The Agent eXperience Protocol (AXP)

Publisher: apis.ax (the standards body) · Verifier: api.qa (independent)

This document is the normative text of AXP — the Agent eXperience Protocol: the set of technical surfaces an agent-first API MUST enforce — the wire contract it publishes so that an autonomous agent can discover it, understand it, and transact with it zero-shot, on first contact, with no human reading docs in the loop. apis.ax publishes this standard; api.qa verifies conformance to it from outside the building fleet's write access.

The key words MUST, MUST NOT, SHOULD, and MAY are to be interpreted as described in RFC 2119.

This specification is itself linked data: its $id (https://apis.ax/axp) is the resolver-addressable identity of the standard, $type: Spec, in the https://schema.org.ai context. Every clause below names (a) the normative requirement, (b) how it is machine-verified by an independent api.qa check or pinned requirement, and (c) why an agent needs it.


Clause 1 — OpenAPI 3.1 contract

Normative. A conforming API MUST publish a valid OpenAPI 3.1 document describing every operation an agent may call, its parameters, and its typed responses. The document MUST parse and MUST declare at least one operation. The contract SHOULD be discoverable at /openapi.json or linked from the capability card.

Machine-verified by: api.qa check openapi and pinned requirement openapi-valid (surface openapi, must: valid). api.qa fetches the document, parses it, and confirms it is a structurally valid OpenAPI 3.1 contract with enumerable paths.

Why an agent needs it: the OpenAPI 3.1 contract is the machine-readable shape of the API. Without it an agent must guess call signatures; with it the agent binds to the surface deterministically and calls correctly on the first try.

Clause 2 — llms.txt

Normative. A conforming API MUST serve an llms.txt file at /llms.txt: markdown, with an H1 title and substantive, agent-actionable content that orients a language model to what the surface is and how to use it. It MUST NOT be an HTML page. It SHOULD cross-reference the sibling machine surfaces (agents.json, icp.json, the OpenAPI 3.1 contract).

Machine-verified by: api.qa check llms-txt and pinned requirement llms-present (surface llms.txt). api.qa confirms /llms.txt returns markdown (H1 + substantive body), not markup.

Why an agent needs it: llms.txt is the plain-language front door for a model — the one file a fresh agent reads to learn the surface without scraping a rendered site.

Clause 3 — markdown-first content negotiation

Normative. A conforming API MUST content-negotiate its resolver-addressable home and its typed bodies markdown-first: a request with Accept: */* (an agent/curl) MUST receive machine-legible markdown or JSON, never a wall of HTML; a request with Accept: text/html (a browser) MAY receive HTML. Human presentation MUST NOT be the only representation. Typed bodies MUST be markdown-first — the agent representation is primary, the human rendering is derived.

Machine-verified by: api.qa check content-negotiation, pinned as its own requirement check-content-negotiation (kind: check, must: pass) — the clause binds to this discriminating check directly, not to the coarse AX floor (a target that serves HTML to Accept: */* fails this MUST even if it would otherwise clear the floor). api.qa fetches the home twice with differing Accept headers and confirms the agent representation is non-HTML while the browser representation is HTML.

Why an agent needs it: markdown-first negotiation means an agent extracts meaning directly from the response instead of parsing a DOM built for eyes.

Clause 4 — typed BLOCKED/EMPTY errors that never fake success

Normative. A conforming API MUST return typed outcomes for the no-result and not-permitted paths and MUST NOT fake success. An empty result set MUST carry an explicit EMPTY type (not a bare 200 with an empty array masquerading as data); a forbidden or gated request MUST carry an explicit BLOCKED type with a non-2xx status. A conforming API MUST NOT return a 200 success envelope when the true outcome is BLOCKED/EMPTY.

Machine-verified by: api.qa check claims-honesty and pinned requirements typed-empty-not-faked and typed-blocked. api.qa probes a known-empty query and a known-forbidden query and confirms each response is the correctly typed EMPTY / BLOCKED body — a faked 200 fails the contract.

Why an agent needs it: an agent acts on outcomes. A faked success sends the agent down a wrong branch silently; a typed BLOCKED/EMPTY lets it re-plan, escalate, or pay — deterministically.

Clause 5 — hard-ceiling metered pricing

Normative. A conforming API that meters usage MUST expose its pricing as machine-readable metered pricing with a hard-ceiling: a declared maximum spend, strictly greater than zero, the caller cannot exceed without an explicit new authorization. Payment boundaries MUST answer as structured offers (HTTP 402 with an offer body carrying id/title and price), and the metered price MUST publish the hard-ceiling so an agent wallet knows its worst-case exposure before it calls. A request that would exceed the declared ceiling MUST be stopped with a re-authorization boundary (HTTP 402), never silently metered past the cap.

Machine-verified by: api.qa check offers-402, pinned as its own requirement check-offers-402 (kind: check, must: pass), plus pinned endpoint requirements hard-ceiling-pricing (the pricing surface reports a metered model with hardCeiling > 0) and hard-ceiling-enforced (a probe that exceeds the declared ceiling is answered with a 402 re-authorization boundary, not a silent 200). api.qa probes the declared payment boundary for a structured 402 offer, reads the metered ceiling, and behaviorally verifies the ceiling is enforced.

Why an agent needs it: an autonomous wallet cannot spend safely against an open-ended meter. A hard-ceiling makes worst-case cost knowable and bounded, so the agent can commit funds without a human approving each call.

Clause 6 — resolver-addressable home

Normative. A conforming API MUST have a resolver-addressable home: a stable, resolvable canonical identity (a capability card at /.well-known/agents.json and a resolvable root) that an agent can address, resolve, and cross-link from the sibling surfaces. The home MUST resolve to a valid capability card naming the surface and its interfaces.

Machine-verified by: api.qa check agents-json, pinned as its own requirement check-agents-json (kind: check, must: pass), plus the surface requirement agents-present (surface agents.json, must: valid). api.qa resolves the capability card and confirms it names the surface and its interfaces, and that the surfaces cross-reference each other — the clause binds to the discriminating agents-json check, not the coarse AX floor.

Why an agent needs it: the resolver-addressable home is the single address an agent resolves to find everything else. Without it the surface is an island an agent cannot reliably re-find or link.

Clause 7 — keyless first value

Normative. A conforming API MUST deliver its first unit of real value with no API key, no signup, and no account: at least one declared, discoverable endpoint MUST answer 2xx with substantive typed content to an anonymous agent on first contact. Authentication and payment MAY gate deeper or metered use, but the surface MUST NOT require an account before an agent can obtain any value at all.

Machine-verified by: api.qa check keyless-flow, pinned as its own requirement check-keyless-flow (kind: check, must: pass), plus the pinned endpoint requirement keyless-first-value (a declared endpoint answers 2xx with no credential). api.qa samples the endpoints declared by agents.json and the OpenAPI contract and confirms at least one answers 2xx keyless.

Why an agent needs it: a fresh agent cannot negotiate an account before it knows whether the surface is useful. Keyless first value is what lets it integrate zero-shot on first contact — the whole point of the agent-first web.


Conformance

Conformance is verified by api.qa, held outside the building fleet's write access (verifier independence); a Listing is admitted to the apis.ax catalog iff it passes this standard's conformance profile.

The mapping from each clause above to its independent api.qa verification is published, machine-readable, at [conformance/profile.json](./conformance/profile.json). The conformance profile is executable as an api.qa PinnedSpec at [conformance/apis-ax-standard.spec.json](./conformance/apis-ax-standard.spec.json): the apis.ax curation gate expressed as a machine-checkable contract. A target passes iff api.qa returns passed: true against that pinned spec — the standards body publishes the bar, the independent verifier decides whether it is cleared, and the building fleet can edit neither verdict.

Because the verifier is held outside the fleet that builds the catalog, a Listing cannot grade itself: the gate is mechanical, not aspirational, and that independence is the whole point.