This page is auto-synced from
AFAuthHQ/spec/schemas/well-known.json. Do not edit here.Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://afauth.org/schemas/well-known.json",
"title": "AFAuth service discovery document",
"description": "Schema for the JSON document published at /.well-known/afauth",
"type": "object",
"required": [
"afauth_version",
"service_did",
"endpoints",
"signature_algorithms"
],
"properties": {
"afauth_version": {
"type": "string",
"description": "Protocol version supported by this service",
"examples": [
"0.1"
]
},
"service_did": {
"type": "string",
"description": "The service's own DID. did:web is RECOMMENDED so the service's identity is anchored in DNS and TLS. did:key is permitted but lacks an authority anchor and is appropriate only for niche service-to-service contexts.",
"pattern": "^did:(web|key):.+"
},
"endpoints": {
"type": "object",
"required": [
"accounts",
"owner_invitation",
"claim_page",
"claim_completion"
],
"properties": {
"accounts": {
"type": "string"
},
"owner_invitation": {
"type": "string"
},
"claim_page": {
"type": "string",
"format": "uri"
},
"claim_completion": {
"type": "string"
},
"key_rotation": {
"type": "string"
},
"key_rekey": {
"type": "string"
},
"key_revocation": {
"type": "string"
}
}
},
"signature_algorithms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ed25519",
"ecdsa-p256-sha256"
]
},
"minItems": 1
},
"features": {
"type": "array",
"description": "Optional features the service supports. Two-step invite is mandatory in v0.1 and is not advertised here.",
"items": {
"type": "string",
"enum": [
"attestation",
"key_rotation",
"attested_session"
]
}
},
"recipient_types": {
"type": "array",
"description": "Recipient types the service accepts on the owner-invitation endpoint (§7.2, §7.7). Absent means email-only.",
"items": {
"type": "string",
"enum": [
"email",
"phone",
"oidc",
"did"
]
},
"minItems": 1
},
"limits": {
"type": "object",
"properties": {
"unclaimed_ttl_seconds": {
"type": "integer",
"minimum": 3600,
"description": "Optional. Max age in seconds before an unclaimed account transitions to EXPIRED (§6.1). Omit for no expiry — the default and recommended posture; agent-created accounts then operate indefinitely without a human claim. Set only when garbage collection or a data-retention mandate requires it; if set, MUST be >= 3600."
},
"unclaimed_rate_limit_per_hour": {
"type": "integer",
"minimum": 0
}
}
},
"billing": {
"type": "object",
"required": [
"unclaimed_mode"
],
"properties": {
"unclaimed_mode": {
"type": "string",
"enum": [
"free",
"attested_only",
"denied"
]
},
"accepted_attestors": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"x402": {
"type": "object",
"description": "Opt-in advertisement of x402 (HTTP 402) payment acceptance. See AFAP-0004.",
"required": [
"facilitator",
"networks",
"assets",
"payment_endpoint"
],
"properties": {
"facilitator": {
"type": "string",
"format": "uri"
},
"networks": {
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"pattern": "^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$"
}
},
"assets": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
},
"payment_endpoint": {
"type": "string",
"format": "uri"
}
}
}
}
}
AFAuthHQ/spec/schemas/well-known.json.