{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/botfriendly-xyz/json-schema/botfriendly-xyz-service-schema.json",
  "title": "Service",
  "x-generated": "2026-11-03",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/botfriendly-xyz-openapi.json#/components/schemas/Service",
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "category": {
      "type": "string",
      "description": "Category slug the listing carries; map it to a label via /categories (slugs array)"
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "docs_url": {
      "type": [
        "string",
        "null"
      ],
      "format": "uri"
    },
    "icon_url": {
      "type": [
        "string",
        "null"
      ],
      "format": "uri",
      "description": "Service icon URL"
    },
    "auth_method": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "api-key",
        "m2m-oauth",
        "bot-token",
        "wallet",
        "x402-none",
        "none"
      ]
    },
    "has_mcp_server": {
      "type": "boolean"
    },
    "mcp_server_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "has_openapi_spec": {
      "type": "boolean"
    },
    "openapi_spec_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "has_api": {
      "type": "boolean",
      "description": "A live API host answered in JSON when probed"
    },
    "api_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "no_human_needed": {
      "type": "boolean",
      "description": "Probe-backed: the service's own (non-documentation) MCP server listed its tools to an unauthenticated client and its auth needs no key (none or wallet), or a callable interface answered HTTP 402. An agent can start with nobody setting up a key"
    },
    "payment_protocols": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "x402",
          "mpp",
          "l402",
          "ap2",
          "tap",
          "agent-pay",
          "ace",
          "acp",
          "ucp",
          "actp",
          "icc"
        ]
      },
      "description": "Agent payment / commerce protocols this service supports"
    },
    "accepts_mpp": {
      "type": "boolean",
      "description": "Derived from payment_protocols"
    },
    "accepts_x402": {
      "type": "boolean",
      "description": "Derived from payment_protocols"
    },
    "supports_acp": {
      "type": "boolean",
      "description": "Derived from payment_protocols"
    },
    "supports_ucp": {
      "type": "boolean",
      "description": "Derived from payment_protocols"
    },
    "has_skill_file": {
      "type": "boolean"
    },
    "skill_file_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "has_llms_txt": {
      "type": "boolean"
    },
    "llms_txt_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "has_structured_feed": {
      "type": "boolean"
    },
    "structured_feed_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "billing_model": {
      "type": [
        "string",
        "null"
      ]
    },
    "has_free_tier": {
      "type": "boolean"
    },
    "has_webhooks": {
      "type": "boolean"
    },
    "programmatic_onboarding": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "full",
        "partial",
        "none"
      ]
    },
    "bot_friendly_tos": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "explicit-welcome",
        "neutral",
        "restricts-bots",
        "unknown"
      ]
    },
    "bot_score": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "vote_count": {
      "type": "integer",
      "description": "Community upvote count"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "is_pro": {
      "type": "boolean"
    },
    "is_verified": {
      "type": "boolean"
    },
    "verified_interfaces": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The machine-readable interface flags we have actually fetched and confirmed. A flag that is true on the service but absent here is claimed rather than verified — the listing says it exists and nothing has reached it yet. Prefer a verified interface when choosing how to call a service."
    },
    "promoted": {
      "type": "boolean",
      "description": "Whether this is a paid promoted placement (ad)"
    },
    "ad": {
      "type": "boolean",
      "description": "Whether this is an ad (redundant with promoted for compatibility)"
    },
    "promotion_type": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "site",
        "category"
      ],
      "description": "Type of promotion if promoted"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "last_verified_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  }
}