Skip to main content
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"
        }
      }
    }
  }
}
Source of truth: AFAuthHQ/spec/schemas/well-known.json.