{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://agentserviceschema.org/schemas/v0.1/service-record.json",
  "title": "Agent Service Schema — Service Record v0.1",
  "type": "object",
  "required": ["schema_version", "endpoint_id", "name", "description", "operator",
               "capabilities", "coverage", "actions", "pricing", "verification",
               "record_updated_at"],
  "properties": {
    "schema_version": {"type": "string", "const": "0.1"},
    "endpoint_id": {"type": "string", "pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$"},
    "name": {"type": "string", "minLength": 1, "maxLength": 120},
    "description": {"type": "string", "minLength": 1, "maxLength": 500},
    "operator": {
      "type": "object",
      "required": ["legal_name", "contact_email", "website"],
      "properties": {
        "legal_name": {"type": "string"},
        "contact_email": {"type": "string", "format": "email"},
        "website": {"type": "string", "format": "uri"}
      }
    },
    "capabilities": {
      "type": "array", "minItems": 1,
      "items": {"type": "string", "pattern": "^[a-z]+(\\.[a-z_]+)+$"}
    },
    "coverage": {
      "type": "object",
      "required": ["type", "areas"],
      "properties": {
        "type": {"enum": ["metro", "region", "national", "remote"]},
        "areas": {"type": "array", "items": {"type": "string"}},
        "exclusions": {"type": "array", "items": {"type": "string"}}
      }
    },
    "actions": {
      "type": "object", "minProperties": 1,
      "propertyNames": {"pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)*$"},
      "additionalProperties": {
          "type": "object",
          "required": ["url", "method", "auth"],
          "properties": {
            "url": {"type": "string", "format": "uri-template", "pattern": "^https://"},
            "method": {"enum": ["GET", "POST", "PUT", "PATCH", "DELETE"]},
            "auth": {"enum": ["none", "api_key", "oauth2"]},
            "input_schema": {"type": "string", "format": "uri"},
            "output_schema": {"type": "string", "format": "uri"},
            "idempotent": {"type": "boolean"},
            "timeout_ms_recommended": {"type": "integer", "minimum": 100}
          }
      }
    },
    "pricing": {
      "type": "object",
      "required": ["model", "currency"],
      "properties": {
        "model": {"enum": ["fixed", "hourly", "quote_based", "tiered"]},
        "currency": {"type": "string", "pattern": "^[A-Z]{3}$"},
        "price_range": {
          "type": "object",
          "properties": {
            "min": {"type": "number", "minimum": 0},
            "max": {"type": "number", "minimum": 0}
          }
        },
        "notes": {"type": "string", "maxLength": 500}
      }
    },
    "verification": {
      "type": "object",
      "required": ["level", "status", "last_verified_at"],
      "oneOf": [
        {"properties": {"level": {"const": 0}, "status": {"enum": ["unverified", "suspended"]}}},
        {"properties": {"level": {"const": 1}, "status": {"const": "self_asserted"}}},
        {"required": ["checks"], "properties": {"level": {"const": 2}, "status": {"const": "probed"}, "checks": {"minItems": 1}, "last_verified_at": {"type": "string"}}},
        {"required": ["checks"], "properties": {"level": {"enum": [3, 4]}, "status": {"const": "verified"}, "checks": {"minItems": 1}, "last_verified_at": {"type": "string"}}}
      ],
      "properties": {
        "level": {"type": "integer", "minimum": 0, "maximum": 4},
        "status": {"enum": ["unverified", "self_asserted", "probed", "verified", "suspended"]},
        "checks": {
          "type": "array",
          "items": {
            "type": "object",
            "required": ["type", "result", "checked_at", "source", "expires_at"],
            "properties": {
              "type": {"enum": ["liveness_probe", "schema_validation", "synthetic_transaction",
                               "license_check", "insurance_check", "identity_check", "domain_ownership"]},
              "result": {"enum": ["pass", "fail", "pending"]},
              "checked_at": {"type": "string", "format": "date-time"},
              "source": {"type": "string"},
              "expires_at": {"type": "string", "format": "date-time"},
              "evidence_url": {"type": "string", "format": "uri"}
            }
          }
        },
        "last_verified_at": {"type": ["string", "null"], "format": "date-time"},
        "suspension_reason": {"type": "string"},
        "suspended_at": {"type": "string", "format": "date-time"}
      }
    },
    "reputation": {
      "type": "object",
      "properties": {
        "completion_rate_90d": {"type": "number", "minimum": 0, "maximum": 1},
        "dispute_rate_90d": {"type": "number", "minimum": 0, "maximum": 1},
        "review_count": {"type": "integer", "minimum": 0},
        "aggregate_rating": {"type": "number", "minimum": 0, "maximum": 5}
      }
    },
    "schema_org_type": {"type": "string"},
    "extensions": {"type": "object"},
    "attestation": {"type": "string"},
    "record_updated_at": {"type": "string", "format": "date-time"},
    "placement": {"type": "string", "enum": ["sponsored"]}
  },
  "allOf": [
    {
      "if": {"required": ["verification"], "properties": {"verification": {"required": ["level"], "properties": {"level": {"const": 4}}}}},
      "then": {"required": ["reputation"], "properties": {"reputation": {"required": ["completion_rate_90d", "dispute_rate_90d"]}}}
    }
  ]
}
