Version 0.1.0 — Draft — Internal Review
AXIS (Agent Cross-system Identity Standard) is an open protocol for autonomous AI agent identity, delegation, and authorization. It defines how AI agents prove who they are, who authorized them to act, and what they are allowed to do, in a way that any third party can verify without relying on a shared registry or prior relationship.
The protocol addresses a specific gap in the current agent ecosystem: every existing agent identity solution operates within a single organization's boundaries. No production solution exists for cross-operator agent trust, the scenario where an agent from one system needs to be verified by a platform operated by a completely separate organization.
AXIS solves this with a three-layer architecture:
| Layer | Purpose | Credential Type |
|---|---|---|
| Layer 1: Identity | Who is this agent? | Agent Identity Record + AXIS Identity Token (AIT) |
| Layer 2: Authorization | What is this agent allowed to do? | Delegation Credentials |
| Layer 3: Reputation | How has this agent performed? | Trust Attestations + Content Provenance Attestations |
This specification includes a W3C-conformant DID method (did:axis) per W3C Decentralized Identifiers (DIDs) v1.0 and uses cryptographic primitives recommended by NIST SP 800-186.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
AXIS supports two identifier formats that map to each other deterministically:
AXIS ID (human-readable):
axis:{operator}:{agent-name}
DID (W3C-compatible):
did:axis:{registry}:{agent-id}
Both formats are valid in all AXIS protocol messages. Implementations MUST support both and MUST be able to resolve either format to the same Agent Identity Record.
The AXIS ID is the human-readable format used in day-to-day operations:
axis:offworld:mira-voss
axis:offworld:researcher-agent
axis:acme:legal
Where:
axis is the protocol prefix (fixed){operator} is the operator's namespace (derived from verified domain or account){agent-name} is a human-readable agent name chosen by the operatorAgent names MUST be lowercase alphanumeric with hyphens. Maximum 64 characters.
The W3C DID method name is axis.
The AXIS DID format follows the W3C DID syntax:
did:axis:<registry>:<agent-id>
Where:
did:axis is the method prefix (fixed)<registry> identifies the registry that issued the identity. For AXIS Prime, this is prime. Third-party registries use their registered registry identifier.<agent-id> is a unique identifier for the agent within that registry. This may be the human-readable name or a key-derived hash, depending on the registration tier.For auto-generated IDs (free/basic tiers), the <agent-id> MUST be derived from the agent's public key:
<agent-id>.This produces identifiers like: did:axis:prime:7Kf9x2mPqRsT4vWn
For human-readable IDs (chosen by operator), the <agent-id> is the same as the agent name in the AXIS ID format.
| AXIS ID | DID |
|---|---|
axis:offworld:mira-voss | did:axis:prime:mira-voss |
axis:offworld:agent-7f3a2b9c | did:axis:prime:7f3a2b9c |
axis:acme:legal | did:axis:acme:legal |
The registry maintains the canonical mapping. Both formats resolve to the same Agent Identity Record and DID Document.
# AXIS ID format (human-readable)
axis:offworld:mira-voss # Named agent
axis:offworld:agent-7f3a2b9c # Auto-generated ID
axis:acme:legal # Short/premium ID
# DID format (W3C-compatible)
did:axis:prime:7Kf9x2mPqRsT4vWn # Agent on AXIS Prime
did:axis:prime:mira-voss # Named agent on AXIS Prime
did:axis:acme:9qRs2tUvW4xYz1aB # Agent on a third-party registry
did:axis:internal:5cDe6fGh7iJk8lMn # Agent on a private registry
# Operator DIDs
did:axis:prime:op:offworld.news # Operator identity
Every registered AXIS agent has an associated DID Document conforming to W3C DID Core.
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2020/v1",
"https://axis-protocol.org/ns/v1"
],
"id": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"controller": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"verificationMethod": [
{
"id": "did:axis:prime:7Kf9x2mPqRsT4vWn#key-1",
"type": "Ed25519VerificationKey2020",
"controller": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"publicKeyMultibase": "z6Mkf5rGMoatrSj1f4CyvuHBeXJELe9RPdzo2PKGNCKVtZxP"
}
],
"authentication": [
"did:axis:prime:7Kf9x2mPqRsT4vWn#key-1"
],
"assertionMethod": [
"did:axis:prime:7Kf9x2mPqRsT4vWn#key-1"
],
"service": [
{
"id": "did:axis:prime:7Kf9x2mPqRsT4vWn#operator",
"type": "AxisOperator",
"serviceEndpoint": "https://offworld.news"
}
],
"axisMetadata": {
"registered": "2026-01-15T00:00:00Z",
"registry": "prime",
"operator": {
"domain": "offworld.news",
"verified": true,
"operatorId": "did:axis:prime:op:offworld.news"
},
"status": "active",
"delegations": [
{
"id": "dlg:prime:a1b2c3d4",
"from": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"to": "did:axis:prime:3bNc8dFgH1jKlM5p",
"scope": "full_authority",
"created": "2026-02-01T00:00:00Z",
"expires": "2027-02-01T00:00:00Z",
"signature": "z3hQ9f..."
}
]
}
}
| Property | Required | Description |
|---|---|---|
@context | MUST | Must include W3C DID context and AXIS context |
id | MUST | The agent's DID |
controller | MUST | The DID that controls this document. Initially the agent itself. |
verificationMethod | MUST | At least one Ed25519 public key |
authentication | MUST | Reference to verification method for authentication |
assertionMethod | MUST | Reference to verification method for signing claims |
service | SHOULD | Operator service endpoint |
axisMetadata | MUST | AXIS-specific metadata (see Section 3.3) |
The axisMetadata object contains AXIS-specific information not covered by the base W3C DID specification:
| Field | Type | Required | Description |
|---|---|---|---|
registered | datetime | MUST | ISO 8601 timestamp of initial registration |
registry | string | MUST | Registry identifier (e.g., prime) |
operator | object | MUST | Operator information |
operator.domain | string | MUST | Verified domain of the operator |
operator.verified | boolean | MUST | Whether domain verification is complete |
operator.operatorId | string | SHOULD | Operator's DID (if Operator Identity purchased) |
status | string | MUST | One of: active, suspended, deactivated |
delegations | array | MAY | Active delegation records (see Section 6) |
An agent identity is created through the following process:
Prerequisites:
Process:
POST /api/v1/register
Content-Type: application/json
{
"publicKey": "z6Mkf5rGMoatrSj1f4CyvuHBeXJELe9RPdzo2PKGNCKVtZxP",
"operator": {
"domain": "offworld.news"
},
"metadata": {
"name": "news-writer-01",
"description": "Autonomous news article writer"
},
"proof": {
"type": "Ed25519Signature2020",
"created": "2026-01-15T00:00:00Z",
"verificationMethod": "self",
"proofPurpose": "authentication",
"proofValue": "z58DAdFfa9SkqZMVPxAQp..."
}
}
proof field demonstrates that the client controls the private key corresponding to publicKey. The client signs a canonical representation of the registration request body (excluding the proof field) with the private key.HTTP/1.1 201 Created
Content-Type: application/json
{
"did": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"document": { ... },
"registrationReceipt": {
"registry": "prime",
"timestamp": "2026-01-15T00:00:00Z",
"signature": "z4hR8g..."
}
}
Any system can resolve an AXIS DID to its DID Document. Resolution is free, unlimited, and requires no authentication.
GET /api/v1/resolve/did:axis:prime:7Kf9x2mPqRsT4vWn
Response:
HTTP/1.1 200 OK
Content-Type: application/did+ld+json
{
"@context": [ ... ],
"id": "did:axis:prime:7Kf9x2mPqRsT4vWn",
...
}
Resolution Metadata:
The resolver also returns resolution metadata per W3C DID Resolution:
{
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"duration": 12
},
"didDocument": { ... },
"didDocumentMetadata": {
"created": "2026-01-15T00:00:00Z",
"updated": "2026-03-01T00:00:00Z",
"versionId": "3",
"nextUpdate": null,
"deactivated": false
}
}
An agent's DID Document can be updated by the controller. Updates require a valid signature from the agent's current key.
Updatable fields:
service endpointsmetadata.name and metadata.descriptionImmutable fields:
id (the DID itself)registryoperator.domain (requires re-registration)registered timestampPATCH /api/v1/agents/did:axis:prime:7Kf9x2mPqRsT4vWn
Content-Type: application/json
{
"service": [
{
"id": "did:axis:prime:7Kf9x2mPqRsT4vWn#operator",
"type": "AxisOperator",
"serviceEndpoint": "https://new-domain.com"
}
],
"proof": {
"type": "Ed25519Signature2020",
"created": "2026-03-01T00:00:00Z",
"verificationMethod": "did:axis:prime:7Kf9x2mPqRsT4vWn#key-1",
"proofPurpose": "authentication",
"proofValue": "z7jK2l..."
}
}
An agent identity can be deactivated by the controller or the operator. Deactivation is permanent. The DID Document is retained for audit purposes but marked as deactivated.
DELETE /api/v1/agents/did:axis:prime:7Kf9x2mPqRsT4vWn
{
"reason": "agent_retired",
"proof": {
"type": "Ed25519Signature2020",
"created": "2026-06-01T00:00:00Z",
"verificationMethod": "did:axis:prime:7Kf9x2mPqRsT4vWn#key-1",
"proofPurpose": "authentication",
"proofValue": "z9mN4p..."
}
}
After deactivation:
"deactivated": true in metadata"status": "deactivated"Verification is the process of confirming an agent's identity, the validity of its cryptographic signatures, and the status of its delegations. Verification is free, unlimited, and requires no authentication.
Confirms that an agent is registered and active.
GET /api/v1/verify/did:axis:prime:7Kf9x2mPqRsT4vWn
Response:
{
"verified": true,
"did": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"status": "active",
"operator": {
"domain": "offworld.news",
"verified": true
},
"registered": "2026-01-15T00:00:00Z",
"verifiedAt": "2026-04-11T14:30:00Z"
}
Verifies that a message was signed by the agent's private key.
POST /api/v1/verify/signature
Content-Type: application/json
{
"did": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"message": "base64url-encoded-message",
"signature": "z3hQ9f...",
"verificationMethod": "did:axis:prime:7Kf9x2mPqRsT4vWn#key-1"
}
Response:
{
"valid": true,
"did": "did:axis:prime:7Kf9x2mPqRsT4vWn",
"verificationMethod": "did:axis:prime:7Kf9x2mPqRsT4vWn#key-1",
"algorithm": "Ed25519",
"verifiedAt": "2026-04-11T14:30:00Z"
}
Verifies the full delegation chain for an agent. See Section 7.
The AXIS Identity Token is the bearer credential an agent presents to prove its identity. It is a standard JWT signed with the agent's Ed25519 private key.
When an agent makes a request to a verifier (any platform or service), it presents an AIT. The verifier:
registry_url from the token payloadThis enables cross-operator verification without shared infrastructure. The verifier does not need prior knowledge of the agent's registry. The token provides the URL.
Header:
{
"alg": "EdDSA",
"typ": "AIT",
"kid": "axis:offworld:mira-voss"
}
Payload:
{
"iss": "axis:offworld:mira-voss",
"sub": "axis:offworld:mira-voss",
"iat": 1743292800,
"exp": 1743379200,
"axis_version": "0.1",
"operator_id": "axis:offworld:operator",
"registry_url": "https://api.offworldnews.ai/agents/mira-voss"
}
The token is signed with the agent's Ed25519 private key. The signature uses the EdDSA algorithm per RFC 8037.
| Claim | Required | Description |
|---|---|---|
iss | MUST | Issuer: the agent's AXIS ID or DID |
sub | MUST | Subject: same as issuer |
iat | MUST | Issued-at: Unix epoch seconds |
exp | MUST | Expiration: Unix epoch seconds. SHOULD be short-lived (24h max recommended) |
axis_version | MUST | Protocol version (e.g., "0.1") |
operator_id | MUST | The operator that controls this agent |
registry_url | MUST | URL of the AXIS registry where this agent is registered |
delegation_id | MAY | If acting under delegation, the credential ID |
scope | MAY | If acting under delegation, the scope being exercised |
A verifier receiving a request with an AIT MUST:
registry_url to retrieve the Agent Identity Record and public key. This is a call to a public AXIS endpoint that any party can reach independently.exp < current time.revoked: true, reject.delegation_id present): verify the delegation chain (see Section 7).scope present): confirm the requested action falls within scope.The verifier calls the registry URL declared in the agent's own token. This is a public AXIS endpoint, not a callback to a proprietary system. The design enables cross-operator verification without shared infrastructure, pre-existing relationships, or a single global registry.
Platforms SHOULD retain the full credential chain presented by agents at the time of action. The credential chain is the forensic artifact that answers "who authorized this?" after the fact. The platform that accepted the action is the party holding the evidence.
This is a recommendation, not a requirement. It is analogous to web server access logs: not mandated by the HTTP spec, but universally adopted because they are necessary when something goes wrong.
Delegation is the mechanism by which an operator grants authority to an agent, or by which one agent grants scoped authority to another. Delegation Credentials are the core of AXIS Layer 2.
A Delegation Credential is a signed document specifying what actions a delegate is authorized to take, under what constraints, and for how long.
{
"axis_version": "0.1",
"type": "DelegationCredential",
"id": "dc:offworld:operator-editor-2026-03",
"issued_by": "axis:offworld:operator",
"issued_to": "axis:offworld:mira-voss",
"root_operator": "axis:offworld:operator",
"parent_credential_id": null,
"scope": ["article:draft", "article:submit", "article:publish"],
"constraints": {
"max_sub_delegation_depth": 2
},
"created": "2026-03-01T00:00:00Z",
"expires": "2026-06-01T00:00:00Z",
"revocable": true,
"proof": {
"type": "Ed25519Signature2020",
"created": "2026-03-01T00:00:00Z",
"verificationMethod": "did:axis:prime:op:offworld.news#key-1",
"proofPurpose": "assertionMethod",
"proofValue": "z3hQ9f..."
}
}
| Field | Required | Description |
|---|---|---|
axis_version | MUST | Protocol version |
type | MUST | Always DelegationCredential |
id | MUST | Unique credential ID in format dc:<namespace>:<id> |
issued_by | MUST | AXIS ID or DID of the delegator |
issued_to | MUST | AXIS ID or DID of the delegate. MAY reference foreign DIDs (e.g., did:key:, did:aip:) for cross-system delegation. |
root_operator | MUST | Root operator of the chain. MUST be byte-for-byte identical across every credential in the chain. |
parent_credential_id | MUST | ID of the parent credential, or null for root delegations (operator to first agent) |
scope | MUST | Array of permitted action scopes |
constraints | SHOULD | Constraints on the delegation |
created | MUST | ISO 8601 creation timestamp |
expires | MUST | ISO 8601 expiration timestamp |
revocable | MUST | Whether the delegator can revoke before expiry |
proof | MUST | Ed25519 signature by the delegator |
The scope in a Delegation Credential MUST be equal to or narrower than the scope in the parent credential. A verifier MUST reject any credential where the delegate's scope is wider than the delegator's scope.
Operator grants: ["article:draft", "article:submit", "article:publish"]
└─ Editor delegates: ["article:draft", "article:submit"] ← valid (narrower)
└─ Researcher delegates: ["article:draft"] ← valid (narrower)
└─ Sub-agent delegates: ["article:draft", "image:generate"] ← REJECTED (wider)
Each level of delegation can only reduce the scope, never expand it. This is a hard invariant.
The scope field uses an open namespace. AXIS v0.1 does not define a closed taxonomy of scope values. Operators and platforms negotiate accepted scopes out of band (e.g. by reading platform documentation). AXIS v0.2 will introduce:
content:read, content:write, payment:authorizeshopify:inventory:update/.well-known/axis-scopes where platforms publish the scopes they recognizeThe root_operator field MUST be byte-for-byte identical across every credential in a delegation chain. No intermediate agent can re-root the chain under itself. This prevents re-rooting attacks where a malicious delegate claims authority from a different operator.
A verifier MUST reject any chain where root_operator values differ between links.
The max_sub_delegation_depth constraint controls whether and how far a delegate can re-delegate:
0 = the delegate cannot delegate further1 = the delegate can create one level of sub-delegationA verifier MUST reject any credential where max_sub_delegation_depth is negative.
Delegations can be chained. The operator delegates to Agent A, who delegates to Agent B, who delegates to Agent C. The chain is verifiable end-to-end.
Operator: axis:offworld:operator
└─ DC: operator → mira-voss (scope: [article:*], depth: 2)
└─ DC: mira-voss → researcher (scope: [article:draft], depth: 1)
└─ DC: researcher → fact-checker (scope: [article:draft], depth: 0)
When an agent presents credentials to a receiving platform, it presents the full delegation chain as a single self-contained bundle. The bundle contains every signed link from the root operator down to the acting agent. The receiving platform does not need to chase individual links up the chain or rely on any party retaining intermediate receipts. The chain is complete and self-verifying at presentation time. The only external call needed is to the registry to confirm keys are active and not revoked.
Chain verification walks the delegation records from the terminal agent back to the root, verifying at each link:
root_operator is identical to every other linkmax_sub_delegation_depth is non-negativeThe issued_to field MAY reference a foreign DID, not only axis: identifiers. This enables an AXIS operator to issue a scoped delegation to an agent from a completely separate identity system:
{
"issued_by": "axis:offworld:mira-voss",
"issued_to": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
"root_operator": "axis:offworld:operator",
"scope": ["article:draft"]
}
Verifier behavior when resolving foreign DIDs is implementation-defined in v0.1. A standard resolution path for cross-system delegation is planned for v0.2.
A delegator can revoke a delegation at any time (if revocable: true). Revocation cascades: revoking a delegation also invalidates all downstream delegations in the chain.
DELETE /api/v1/delegations/dc:offworld:operator-editor-2026-03
{
"reason": "authority_expired",
"proof": {
"type": "Ed25519Signature2020",
"verificationMethod": "did:axis:prime:op:offworld.news#key-1",
"proofPurpose": "assertionMethod",
"proofValue": "z5jM7n..."
}
}
Operators verify domain ownership before registering agents. This is the sole barrier to entry for the free tier.
Add a TXT record to your domain's DNS:
_axis-verify.offworld.news TXT "axis-verify=abc123def456"
The registry checks for this record and marks the domain as verified.
Place a file at a well-known URL:
https://offworld.news/.well-known/axis-verify.json
Contents:
{
"axis-verify": "abc123def456"
}
Operator Identity is an optional, paid attestation that links a verified organizational identity to all agents under that operator. Available as Verified Individual ($20 one-time) or Verified Organization ($50 one-time).
Operators who purchase Operator Identity receive their own DID:
did:axis:prime:op:offworld.news
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://axis-protocol.org/ns/v1"
],
"id": "did:axis:prime:op:offworld.news",
"controller": "did:axis:prime:op:offworld.news",
"verificationMethod": [
{
"id": "did:axis:prime:op:offworld.news#key-1",
"type": "Ed25519VerificationKey2020",
"controller": "did:axis:prime:op:offworld.news",
"publicKeyMultibase": "z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK"
}
],
"service": [
{
"id": "did:axis:prime:op:offworld.news#website",
"type": "OperatorWebsite",
"serviceEndpoint": "https://offworld.news"
}
],
"axisOperatorMetadata": {
"domain": "offworld.news",
"operatorVerificationTier": "kyb_business",
"domainVerified": true,
"verifiedAt": "2026-01-20T00:00:00Z",
"agentCount": 5,
"status": "active"
}
}
Verification tiers are a property of operators, not agents. The operator's verification tier (e.g. email-verified, domain-verified, KYB-individual, KYB-business) is stored in the Operator Identity Record in the registry. It is NOT a field in delegation credentials or agent identity records.
Receiving platforms see the operator's verification tier by querying the registry when resolving the operator's identity, not by reading a field in the credential chain. This separates the identity verification signal (how thoroughly the operator proved who they are) from the authorization signal (what the agent is allowed to do).
Agents do not have an independent verification tier. Agent trust history is captured through Trust Attestations (Layer 3), not through registry-level verification. If an agent changes operators, the new operator's verification tier applies. The agent's prior track record is preserved in whatever Trust Attestations it has accumulated, which are stored outside the registry by the issuer or the agent itself.
Trust Attestations are signed statements about an agent's trustworthiness. They are distinct from Delegation Credentials: attestations say "I trust this agent" not "I authorize this agent to act."
Attestations are advisory. A verifier MAY use them to make trust decisions but is not required to.
{
"axis_version": "0.1",
"type": "TrustAttestation",
"id": "ta:offworld:editor-researcher-2026-03",
"issued_by": "axis:offworld:mira-voss",
"subject": "axis:offworld:researcher-agent",
"issued_at": "2026-03-29T00:00:00Z",
"scope": "editorial:research",
"level": 3,
"statement": "Consistently produces well-cited research briefs on time.",
"signature": "<Ed25519 signature, base64url>"
}
| Field | Required | Description |
|---|---|---|
axis_version | MUST | Protocol version |
type | MUST | Always TrustAttestation |
id | MUST | Unique ID in format ta:<namespace>:<id> |
issued_by | MUST | AXIS ID or DID of the attesting party |
subject | MUST | AXIS ID or DID of the agent being attested |
issued_at | MUST | ISO 8601 timestamp |
scope | MUST | Domain of trust being attested (e.g., editorial:research) |
level | MUST | Trust level 1-5 (advisory, verifier-defined interpretation) |
statement | SHOULD | Human-readable statement |
evidence | MAY | Array of supporting evidence (task completions, peer reviews, audits) |
signature | MUST | Ed25519 signature by the attesting party |
Trust Attestations from foreign AXIS registries or non-AXIS identity systems may use different scope values and schema conventions. No standard cross-system schema exists for agent trust attestations yet. Evaluating a foreign agent's reputation currently requires out-of-band knowledge of the issuing system's encoding.
This is a known gap. A standard schema for agent trust attestation fields compatible with W3C Verifiable Credentials credentialSubject is planned for v0.2.
Trust Attestations are signed records. Aggregation, scoring, and evaluation of attestations is out of scope for v0.1 and planned for v0.2.
Trust Attestations do NOT live in the registry. They are stored either by the issuer (the entity that wrote the attestation) or by the agent (who collects and presents their own attestations as a portfolio). AXIS Prime never stores attestations. This keeps the registry lightweight and prevents unbounded database growth.
Content Provenance Attestations (CPAs) are signed records proving that specific content was produced by a specific agent, under a specific delegation, reviewed by a specific party. They are distinct from Trust Attestations (which are about general trustworthiness) and from Delegation Credentials (which are about authorization).
{
"axis_version": "0.1",
"type": "ContentProvenanceAttestation",
"id": "cpa:offworld:article-2026-03-29",
"content_id": "https://offworld.news/articles/ai-agent-identity",
"content_hash": {
"algorithm": "sha-256",
"value": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"produced_by": "axis:offworld:researcher-agent",
"produced_under_credential": "dc:offworld:editor-researcher-2026-03",
"reviewed_by": "axis:offworld:mira-voss",
"approved_at": "2026-03-29T12:00:00Z",
"root_operator": "axis:offworld:operator",
"signature": "<Ed25519 signature by mira-voss, base64url>"
}
The CPA enables a third-party platform to verify not just that an agent is authorized, but that a specific piece of content was produced through a legitimate, governed pipeline, without any prior relationship with the operator or agents involved.
A verifier receiving a CPA can:
| Field | Required | Description |
|---|---|---|
axis_version | MUST | Protocol version |
type | MUST | Always ContentProvenanceAttestation |
id | MUST | Unique ID in format cpa:<namespace>:<id> |
content_id | MUST | URI identifying the content |
content_hash | SHOULD | Hash of the content for tamper detection |
produced_by | MUST | AXIS ID or DID of the producing agent |
produced_under_credential | MUST | Delegation credential ID under which content was produced |
reviewed_by | MUST | AXIS ID or DID of the reviewer |
approved_at | MUST | ISO 8601 approval timestamp |
root_operator | MUST | Root operator of the governance chain |
signature | MUST | Ed25519 signature by the reviewer |
Each registry has a unique identifier registered with AXIS Prime:
| Registry ID | Operator | Type |
|---|---|---|
prime | Kipple Labs | Root registry |
acme | Acme Corp | Connected registrar |
internal | Private use | Private registry |
Connected registrars sync agent identities with AXIS Prime:
Per-agent sync fees apply for connected registrars.
Private registries operate independently:
When resolving a DID from a different registry, the resolver:
Any AXIS-compliant registry MUST expose these endpoints:
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/register | POST | Operator | Register a new agent. Returns signed AIT and permanent ID. |
/agents/:agent_id | GET | Public | Resolve an Agent Identity Record. Returns public layer only without authentication. See §13.1 for tiered response details. |
/verify | GET | Public | Verify an AXIS Identity Token. Query param: ?token=<AIT>. |
/revocation/:agent_id | GET | Public | Check revocation status. No authentication required. |
/agents/:agent_id | DELETE | Operator | Revoke/deactivate an agent registration. |
/delegations | POST | Agent | Create a new Delegation Credential. |
/delegations/:id | GET | Public | Retrieve a delegation credential. |
/delegations/:id | DELETE | Agent | Revoke a delegation. |
/delegations/:agent_id/chain | GET | Public | Verify complete delegation chain. |
/resolve/:did | GET | Public | Resolve a DID to its DID Document (W3C DID Resolution). Returns public layer only without authentication. See §13.1 for tiered response details. |
/operators/verify-domain | POST | Operator | Initiate domain verification. |
/operators/verify-domain/check | POST | Operator | Check domain verification status. |
All public endpoints are free, unlimited, and require no authentication. This is a design requirement, not a pricing decision. Verification infrastructure must be universally accessible for the trust model to work.
Full request/response schemas are in the schemas/ directory. An OpenAPI 3.1 specification is available in openapi.yaml.
Added April 13, 2026. This supersedes the previous assumption that all operator and agent records are fully public.
Registry data is organized into three visibility tiers:
Available to anyone, no authentication required. Contains only what is necessary for cryptographic verification:
public_key and key_algorithmagent_id or operator_idstatus (active, suspended, revoked)revocation_urlregistry_urlaxis_versionVisible when an agent actively presents credentials to a receiving platform. The requesting platform includes the agent's AIT in its registry query; the registry verifies the AIT, confirms the agent belongs to the requested operator, and returns the presentation layer:
display_nameverification_level (email, domain, KYB individual, KYB business)purpose (agent description)platform (agent runtime)capability_tierOnly visible through the registrar relationship or explicit operator consent. Never exposed through registry API:
Rationale: Public endpoints return only what's needed for cryptographic verification. Display names, verification levels, and purpose descriptions are only revealed when an agent actively presents credentials. This mirrors how identity works in physical interactions and gives operators meaningful control over their visibility.
Added April 13, 2026.
Platforms that accept AXIS-verified agents SHOULD publish their access requirements at a well-known endpoint:
/.well-known/axis-access{
"axis_version": "0.1",
"platform_id": "ghost.example.com",
"access_policy": {
"minimum_verification_level": "domain",
"required_scopes": ["content:comment"],
"allow_unverified": false,
"registration_url": "https://kipplelabs.com/register"
},
"updated_at": "2026-04-13T00:00:00Z"
}
| Field | Required | Description |
|---|---|---|
minimum_verification_level | MUST | Lowest operator verification tier accepted: email, domain, kyb_individual, kyb_business |
required_scopes | SHOULD | Scopes the agent must hold in its delegation credential |
allow_unverified | MUST | Whether agents without AXIS identity can interact |
registration_url | SHOULD | Where to direct unregistered agents |
v0.2 candidates: blocked_operators, approved_operators, rate_limits.
Design rationale: The protocol defines how platforms communicate their access policy. Enforcement is the platform's responsibility. AXIS provides identity data and trust signals; platforms make their own decisions.
| Purpose | Algorithm | Standard |
|---|---|---|
| Key generation | Ed25519 | NIST SP 800-186 |
| Signing | Ed25519 | NIST FIPS 186-5 |
| Hashing | SHA-256 | NIST FIPS 180-4 |
| Key encoding | Multibase (base58btc) | W3C Multibase |
created timestamp.The AXIS trust model is hierarchical, inspired by DNSSEC:
| Threat | Mitigation |
|---|---|
| DID squatting | IDs derived from public keys, not chosen by operators |
| Key compromise | Key rotation, agent deactivation |
| Fake delegation | All delegations cryptographically signed by delegator |
| Registry compromise | DID Documents are independently verifiable via public keys |
| Replay attacks | Timestamp-bound proofs with 5-minute window |
| Domain hijacking | Periodic domain re-verification (30-day cycle) |
| Re-rooting attack | root_operator byte-for-byte identity rule across chain |
| Scope escalation | Monotonic attenuation rule (scope can only narrow, never widen) |
| Unauthorized re-delegation | max_sub_delegation_depth decrements at each level |
| Content tampering | Content hash in CPA for tamper detection |