A relying party publishes one identity-only document at GET /.well-known/agent-signup.json. This page is a lookup table for that document.
The normative rules are in the
specification;
this page does not replace them.
The machine-readable schema is served at
/agent-identity/v1/agent-signup.schema.json
with content type application/schema+json. Validate a document with the
conformance validator.
Required fields
| Field | Type | Rule | Section |
|---|---|---|---|
protocol |
string | Exactly "agent-identity-v1". Any other value means the service is unsupported; do not fall back. |
5.1 |
audience |
string | Stable, case-sensitive service identifier with no whitespace. The agent places this exact value in the assertion aud; the relying party rejects a mismatch. |
5.1 |
provider_name |
string | Human-readable service name. | 5.1 |
issuer_allowlist |
array of strings | Non-empty, unique absolute issuer origins. No path, query, fragment or wildcard. Trailing slashes are normalized away. The broker iss must match one entry exactly. |
5.1, 5.4 |
required_scopes |
array of strings | Unique non-empty scopes. Brokered signup must include tos:accept. |
5.1 |
terms.version |
string | ToS version. Change it whenever the text changes materially. | 5.1, 6 |
terms.url |
string | Absolute URL where a human can read the same agreement. HTTPS is required except the documented localhost development exception. | 5.1 |
terms.sha256 |
string | sha256: followed by 64 lowercase hex characters, over the exact UTF-8 bytes of terms.text. |
5.1, 6 |
terms.text |
string | The complete agreement the agent is accepting, not a summary. | 5.1 |
endpoints.agent_signup |
string | Absolute URL that accepts POST with Authorization: Bearer <assertion>. The only endpoint in the protocol. |
5.1 |
Optional fields
| Field | Type | Rule | Section |
|---|---|---|---|
spec |
string | Absolute URL of the versioned specification. Optional; implementers may omit it. | 5.2 |
provider_url |
string | Canonical service URL. If present, it must share the signup endpoint's registrable domain. | 5.2, 11 |
contact |
string | Security, abuse or legal contact: an email address or an HTTPS URL. The localhost development exception (http://localhost, http://127.0.0.1) is the only http form allowed. |
5.2 |
updated_at |
string | ISO 8601 timestamp for humans and debugging. Not a freshness signal for the ToS. | 5.2 |
rp_attestation |
string | Optional compact JWS, at most 16384 characters, issued by the provider's broker. It binds the fetched origin and the declared audience; absence means unverified, never invalid. A malformed field is a conformance error. | 5.2, 14 |
extensions |
object | Non-capability vendor metadata keyed by reverse-DNS namespace, for example dev.example. It must not advertise provisioning, catalogs, SKUs or resource endpoints. |
5.2, 5.3 |
Unknown additive fields must be ignored by consumers. Producers should put
non-capability metadata under extensions.<reverse-dns-namespace> so typos stay
visible. Moving a vendor capability under extensions does not make it
conformant.
The optional provider verification credential
rp_attestation is the only discovery field that describes the provider's
broker-verified identity. It is a compact JWS (typ: agent-rp-attestation+jwt, alg: EdDSA) whose claims bind rp.origin,
rp.audience, the provider identity, the assurance level, and the public
keys[].
Rules:
- The attestation
rp.originmust equal the canonical origin of the discovery document the verifier actually fetched. rp.audiencemust equaldiscovery.audience.- The attestation is public and copyable; the origin and audience binding prevent replay on another service.
- It must not carry a terms hash, scopes, endpoints,
provider_url, account ids, prices, or private material. - A conformant document without it is unverified. An expired, invalid, or untrusted attestation is a verification result, never a conformance failure by itself. A malformed field is a conformance error.
- Do not add any other provider-identity or provider-capability field to discovery.
See Trust and limits and Verify assertions for the policy and verification steps. If you are a provider and want the credential, see the provider quickstart.
Forbidden fields
These must not appear at any nesting depth, including under extensions:
| Forbidden surface | Examples |
|---|---|
| Catalogs and commercial surface | instance_catalog, SKUs, pricing tiers, free-tier quotas, product specs |
| Provisioning and resource endpoints | endpoints.provision, resource endpoints, instance lifecycle |
| Legacy signup endpoints | endpoints.email_signup, endpoints.verify_otp |
| Broker receipt callback | endpoints.broker_signup_receipt |
| Credentials and API usage | resource credentials, vendor API or SDK usage metadata |
A document is a parameter document, not a capability catalog. Vendor capabilities belong in the post-signup context guide. See Scope boundaries and the normative 5.3.
Terms text and hash
- Hash the exact UTF-8 bytes of
terms.text. Do not normalize line endings, trim whitespace or extract text from HTML. terms.textmust be the complete agreement. A summary makes the hash ambiguous.- The agent recomputes the hash before calling the broker; the broker verifies the accepted text against the hash it records.
- The relying party rejects an assertion whose
delegation.accepted_rp_tos_hashis not the currently advertisedterms.sha256. - When the terms change, publish the new text and hash before accepting new signups. A bounded grace period for in-flight assertions is a relying-party policy documented outside discovery; it should not exceed 24 hours.
See ToS binding and Re-acceptance.
Minimal conformant example
This document contains only the required identity fields. Its terms.sha256 is
the real SHA-256 of the terms.text value shown. It passes the v1.2.0
validator in file mode with zero errors and zero warnings. The optional
rp_attestation is absent, so the document is conformant and unverified.
{
"protocol": "agent-identity-v1",
"audience": "example-rp",
"provider_name": "Example RP",
"issuer_allowlist": ["https://agentregistrar.dev"],
"required_scopes": ["tos:accept"],
"terms": {
"version": "2026.1",
"url": "https://example.com/terms",
"sha256": "sha256:05435fa3eaee7f3534b4a771ab2328d66d33f712f3534b29e9035717c246d953",
"text": "Example RP Terms of Service. The agent acts for a verified human owner, and the human owner is bound by these terms."
},
"endpoints": {
"agent_signup": "https://example.com/api/signup/agent"
}
}The example is illustrative. Replace the audience, URLs, scopes and terms with the service's own values, and recompute the hash. The allowlist entry is the live broker origin (https://agentregistrar.dev); a provider that accepts a different broker lists that broker's origin instead.
Known limits
- The JSON Schema enforces the
sha256:format, not digest equality. The digest check is a cross-field rule in the shared Zod schema and the conformance validator. - Discovery conformance is cheap to publish. A valid document is not a statement about the service's security, uptime or product.
- The document itself is not signed in v1.2. The optional
rp_attestationis a signed statement about the provider, not a signature over the discovery document. Trust in the document comes from TLS plus the issuer allowlist; the assertion and the attestation are separately signed. - Consumers must ignore unknown additive fields, so a producer can add an identity field without a schema change. The validator warns on unknown top-level fields; warnings do not fail conformance.
Verify
- Fetch the published document and confirm
Content-Type: application/json. - Recompute
terms.sha256from the exact bytes ofterms.text. - Run the validator against the document.
- Confirm no forbidden field appears at any depth, including under
extensions.