{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/agentdrives-com/json-schema/agentdrives-com-tool-schema.json",
  "title": "Tool",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/agentdrives-com-openapi.json#/components/schemas/Tool",
  "allOf": [
    {
      "$ref": "#/$defs/ToolSummary"
    },
    {
      "type": "object",
      "properties": {
        "ids": {
          "$ref": "#/$defs/ToolIds"
        },
        "copilot_connector": {
          "type": [
            "object",
            "null"
          ],
          "description": "The product in GitHub's list of Copilot connectors (GitHub-verified MCP servers), read on checked: the connector's name there, its MCP server URL, the list's URL and the day we read it. null when the list didn't name the product that day",
          "properties": {
            "name": {
              "type": "string"
            },
            "server": {
              "type": "string",
              "format": "uri"
            },
            "source": {
              "type": "string",
              "format": "uri"
            },
            "checked": {
              "type": "string",
              "format": "date"
            }
          }
        },
        "stripe_directory": {
          "type": [
            "object",
            "null"
          ],
          "description": "The product's profile in Stripe's agent directory (what an agent finds with stripe directory search), as we searched it on checked: the profile's name and handle, the routes the directory names, its URL and the day we searched it. null when the directory had no profile of the product's that day",
          "properties": {
            "name": {
              "type": "string"
            },
            "profile": {
              "type": "string",
              "description": "The Stripe profile handle, without the @"
            },
            "routes": {
              "type": "array",
              "items": {
                "enum": [
                  "projects",
                  "mpp",
                  "mcp",
                  "app",
                  "link"
                ]
              },
              "description": "projects: provisioned and billed through Stripe Projects; mpp: pay per call with the Machine Payments Protocol; mcp: an MCP server; app: a Stripe App; link: pays with Link"
            },
            "source": {
              "type": "string",
              "format": "uri"
            },
            "checked": {
              "type": "string",
              "format": "date"
            }
          }
        },
        "in_stripe_directory": {
          "type": [
            "string",
            "null"
          ],
          "description": "The product's profile handle in Stripe Directory, the same as stripe_directory.profile. null when the directory has no profile of the product's"
        },
        "stripe_projects": {
          "type": [
            "object",
            "null"
          ],
          "description": "The product as a provider in the Stripe Projects catalog (an agent creates its account and gets credentials with `stripe projects add`), read on checked. free_tier: one of its available services is priced free; free_tier and services are null when the catalog's services weren't read. null when the catalog doesn't list it",
          "properties": {
            "provider": {
              "type": "string"
            },
            "free_tier": {
              "type": [
                "boolean",
                "null"
              ]
            },
            "services": {
              "type": [
                "integer",
                "null"
              ]
            },
            "source": {
              "type": "string",
              "format": "uri"
            },
            "checked": {
              "type": "string",
              "format": "date"
            }
          }
        },
        "pay_rails": {
          "type": "array",
          "description": "Each agent-native payment rail (x402, mpp, l402, acp, ucp, ap2, mcp-payment) the drive saw on the product (drive true: its pay probe or a payment challenge) or a registry lists as the product's own endpoint (listed: mpp.dev, read on checked). A listed rail is not a tested one",
          "items": {
            "type": "object",
            "properties": {
              "rail": {
                "type": "string"
              },
              "drive": {
                "type": "boolean"
              },
              "listed": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "registry": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "source": {
                    "type": "string",
                    "format": "uri"
                  },
                  "checked": {
                    "type": "string",
                    "format": "date"
                  }
                }
              }
            }
          }
        },
        "wall_vendor": {
          "type": [
            "object",
            "null"
          ],
          "description": "The company whose bot check or sign-in our agent stopped at: the bot check that stopped it at the door, else, when it stopped at sign-up, the sign-in provider the drive's pages show. null when neither (the product's own form, a phone field)",
          "properties": {
            "vendor": {
              "type": "string"
            },
            "id": {
              "type": "string"
            },
            "kind": {
              "enum": [
                "bot check",
                "sign-in"
              ]
            },
            "at": {
              "type": [
                "string",
                "null"
              ],
              "description": "The checkpoint"
            }
          }
        },
        "fix_counts": {
          "type": [
            "object",
            "null"
          ],
          "description": "How many fixes the drive found, by size and in all. Counts only: the fixes themselves are in the Audit's report",
          "properties": {
            "small": {
              "type": "integer"
            },
            "medium": {
              "type": "integer"
            },
            "large": {
              "type": "integer"
            },
            "total": {
              "type": "integer"
            }
          }
        },
        "evidence_sha256": {
          "type": [
            "string",
            "null"
          ],
          "description": "The sha256 of the drive's record, which lists every evidence file of the drive with its own sha256: one hash for the drive's evidence. null for a drive from before records"
        },
        "first_seen": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "The day we first drove the product: its first entry in history"
        },
        "correction": {
          "type": [
            "object",
            "null"
          ],
          "description": "The listing's correction status: disputed while a correction someone asked for waits for our answer (we reply by reply_by, 5 business days after it came in), else none. Every decision: GET /api/corrections",
          "properties": {
            "status": {
              "enum": [
                "disputed",
                "none"
              ]
            },
            "open": {
              "type": "integer"
            },
            "since": {
              "type": [
                "string",
                "null"
              ],
              "format": "date"
            },
            "reply_by": {
              "type": [
                "string",
                "null"
              ],
              "format": "date"
            }
          }
        },
        "license": {
          "type": [
            "object",
            "null"
          ],
          "description": "The licence of this record",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string",
              "format": "uri"
            }
          }
        },
        "scores": {
          "type": "object",
          "description": "The measures behind the parts: coverage, reliability, resilience, setup (kept for compatibility, not a score), and when the Audit measured them surface_coverage, docs_accuracy, docs_completeness"
        },
        "unreachable_since": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "The day the product's site has been unreachable since: two drives on separate days couldn't reach it and none has since. The level is from the drive before them. null: the site answers"
        },
        "not_driven_since": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "The day of the last drive, when the product's owner asked us to stop driving it: we drive it no more and the listing keeps that drive. null: we still drive it"
        },
        "rules_date": {
          "type": "string",
          "format": "date",
          "description": "The date of those rules, as pages name them (\"Rules of ...\"; now 2026-10-30). Every set of rules: /method/changelog"
        },
        "category_median": {
          "type": [
            "object",
            "null"
          ],
          "description": "Each part score's median in this product's category (holds_up, docs_match: {median, n}), only for a category with 5 or more driven products and a part 5 or more of them have; null otherwise",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "median": {
                "type": "integer"
              },
              "n": {
                "type": "integer"
              }
            }
          }
        },
        "peers": {
          "type": [
            "object",
            "null"
          ],
          "description": "Each graded criterion of the standard (by its id) next to its peers, the products measured on it: with 20 or more in its category, its percentile there; with 10 to 19, its quartile there (1 the lowest quarter, 4 the top); with 5 to 9, the comparison there without a rank; with fewer, the same among every measured product (basis all, from 10); below and above: how many of them scored lower and higher, the rest the same. Pass scores 2, partly 1, fail 0; the percentile is the share below it plus half the ties. null when it has none",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "basis": {
                "type": "string",
                "enum": [
                  "category",
                  "all"
                ]
              },
              "n": {
                "type": "integer"
              },
              "below": {
                "type": "integer"
              },
              "above": {
                "type": "integer"
              },
              "percentile": {
                "type": "integer"
              },
              "quartile": {
                "type": "integer"
              }
            }
          }
        },
        "rules_version": {
          "type": [
            "string",
            "null"
          ],
          "description": "The rules version this level was judged under: its entry's anchor on /method/changelog (rules-<date>, with a number after it when a day had two sets)"
        },
        "rules_url": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri",
          "description": "That rules version's entry: https://agentdrives.com/method/changelog#<rules_version>"
        },
        "engine": {
          "type": [
            "object",
            "null"
          ],
          "description": "What made this drive on our end, so a level that moves with it can be told from one the product moved",
          "properties": {
            "model": {
              "type": [
                "string",
                "null"
              ]
            },
            "driver": {
              "type": [
                "integer",
                "null"
              ],
              "description": "The driver's version"
            },
            "signed": {
              "type": "boolean",
              "description": "Every request signed (Web Bot Auth)"
            },
            "inbox": {
              "type": [
                "array",
                "null"
              ],
              "items": {
                "type": "string"
              },
              "description": "The domains of the test inboxes it used (an older pool's as \"older test domain\")"
            },
            "robots": {
              "enum": [
                "start",
                "obey",
                "skip",
                "consent"
              ],
              "description": "robots.txt on this drive: start (only the address driven), obey or skip (every page; account steps obey a rule for all user agents, or skip it), consent (the owner ordered the drive)"
            },
            "version": {
              "type": [
                "string",
                "null"
              ],
              "description": "The version of our drive engine that made this drive: the date (UTC, YYYY.MM.DD) of its last change. Two drives with the same version ran the same engine. null for a drive from before 25 Oct 2026"
            },
            "commit": {
              "type": [
                "string",
                "null"
              ],
              "description": "That change's commit in the AgentDrives repository"
            },
            "prompts": {
              "type": "object",
              "description": "The same for the drive's prompts",
              "properties": {
                "version": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "commit": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            },
            "rules": {
              "type": "object",
              "description": "The same for the engine's rules",
              "properties": {
                "version": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "commit": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          }
        },
        "history": {
          "type": "array",
          "description": "The level per day, oldest first",
          "items": {
            "type": "object",
            "properties": {
              "run": {
                "type": "string"
              },
              "date": {
                "type": "string",
                "format": "date"
              },
              "level": {
                "$ref": "#/$defs/Level"
              },
              "why": {
                "enum": [
                  "product",
                  "rules",
                  "noise",
                  "agent"
                ],
                "description": "Why it moved from the entry before: product (a new drive gave another level), rules (a new set of rules moved it: rules_date), noise (the sign-up let our agent in on some drives and not others), agent (our agent changed between the two drives: another version of it)"
              },
              "rules_date": {
                "type": "string",
                "format": "date"
              },
              "engine": {
                "type": "object",
                "description": "What made that drive on our end, as engine"
              },
              "paid": {
                "type": "boolean",
                "description": "Whether someone paid for the drive behind this entry (an owner's order); a move by our rules is never paid. Payment never moves a level"
              },
              "agent_paid": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "What our agent paid in that drive, checked by us (the transaction is in pay_options.paid); null when it paid nothing. Not an order: paid says that",
                "properties": {
                  "amount": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "currency": {
                    "type": "string"
                  },
                  "rail": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "date": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date"
                  }
                }
              }
            }
          }
        },
        "terms": {
          "type": [
            "object",
            "null"
          ],
          "description": "The product's terms say automated sign-up isn't allowed: the clause word for word, where and when we read it, and the fix. A quoted finding only since the rules of 24 Oct 2026 (our agent signs up as anyone can and every way in counts; from 20 to 24 Oct no way that made an account counted). null for every other product",
          "properties": {
            "finding": {
              "type": "string"
            },
            "quote": {
              "type": "string"
            },
            "url": {
              "type": "string",
              "format": "uri"
            },
            "document": {
              "type": [
                "string",
                "null"
              ]
            },
            "section": {
              "type": [
                "string",
                "null"
              ]
            },
            "terms_date": {
              "type": [
                "string",
                "null"
              ],
              "format": "date",
              "description": "The date the page itself shows"
            },
            "checked": {
              "type": [
                "string",
                "null"
              ],
              "format": "date",
              "description": "The day we read it"
            },
            "fix": {
              "type": [
                "string",
                "null"
              ]
            },
            "work": {
              "type": [
                "string",
                "null"
              ],
              "enum": [
                "not_counted",
                "part",
                null
              ],
              "description": "not_counted: none of this drive's work counts; part: only the work done without an account counts"
            }
          }
        },
        "email_gate": {
          "type": [
            "object",
            "null"
          ],
          "description": "Its sign-up refused our agent's own email address (invalid, disposable, not a work email, only Gmail or Outlook): the product's wall since the rules of 25 Oct 2026 (before, such a drive counted as ours and wasn't published), with its message word for word and the fix. null for every other product",
          "properties": {
            "finding": {
              "type": "string"
            },
            "said": {
              "type": [
                "string",
                "null"
              ],
              "description": "The product's message, word for word; null when the drive didn't quote it"
            },
            "step": {
              "enum": [
                "signup",
                "verify"
              ]
            },
            "date": {
              "type": "string",
              "format": "date",
              "description": "The drive's day"
            },
            "fix": {
              "type": "string"
            }
          }
        },
        "works_assisted": {
          "type": [
            "object",
            "null"
          ],
          "description": "What the agent did once a person set up the account or cleared a step at the door, from the newest drive that measured it. Data only, not counted: no page shows it and it is never part of the level. null: not measured",
          "properties": {
            "core": {
              "type": [
                "string",
                "null"
              ],
              "description": "Core tasks done of all, as done/total"
            },
            "coverage_core": {
              "type": "integer"
            },
            "via": {
              "type": [
                "string",
                "null"
              ]
            },
            "run": {
              "type": "string"
            },
            "date": {
              "type": "string",
              "format": "date"
            }
          }
        },
        "nothing_to_pay": {
          "type": "boolean",
          "description": "The product has nothing to pay for: L5 says so in its own words"
        },
        "routes": {
          "type": "array",
          "description": "Every way in the product offers, tried agent-native first (since the rules of 12 Oct 2026; empty on older drives). A way not tried has its reason, ours, never the product's wall",
          "items": {
            "type": "object",
            "properties": {
              "route": {
                "type": "string"
              },
              "offered": {
                "enum": [
                  "documented",
                  "seen",
                  "listed",
                  "no",
                  "unknown"
                ]
              },
              "tried": {
                "type": "boolean"
              },
              "not_tried": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "no_kit",
                  "over_cap",
                  "policy",
                  "time",
                  "same_as",
                  "assisted_only",
                  "idp_blocked",
                  "sign_in_code",
                  "robots",
                  "terms",
                  "beyond",
                  null
                ],
                "description": "terms: a drive from 20 to 24 Oct 2026 kept to the product's terms (see terms); beyond: the self-hosted edition needs more memory or privileges than our sandbox gives (the hosted edition is the drive); every other reason is ours"
              },
              "result": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "in",
                  "partial",
                  "walled",
                  "refused",
                  "broken",
                  "not_reached",
                  "not_counted",
                  null
                ],
                "description": "not_counted: in only with our own Google or GitHub account, which drives no longer use, or (why: terms) with an account its terms allow only a person to make"
              },
              "why": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "terms",
                  null
                ],
                "description": "Why a way that got in is not counted: terms (a drive from 20 to 24 Oct 2026, under the terms rule of those days)"
              },
              "wall": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "type": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "owner": {
                    "enum": [
                      "product",
                      "idp",
                      "platform",
                      "ours",
                      null
                    ]
                  }
                }
              },
              "person": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "none",
                  "once",
                  "each",
                  null
                ]
              },
              "brings": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "fresh": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "minutes": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "browser": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Whether this way in took a step in a browser (sign-up, the key, the first call), from the drive's own steps on it; null when none was recorded"
              }
            }
          }
        },
        "checkout": {
          "type": [
            "object",
            "null"
          ],
          "description": "The walk to the last click: how far the checkout went (reached: last_click, card_form, plan_page, no) and what it showed (processor, captcha, three_ds, card_form, phone_field, wallets, rail_offer, price, currency, period, plan, last_button)"
        },
        "docs": {
          "type": [
            "object",
            "null"
          ],
          "description": "The docs read and judged by us before the drive: pages read and listed, sampled, and the verdict (overall: complete, gaps, thin, unreachable; getting_started, auth, errors, examples, freshness, newest, core_pages)"
        },
        "claims": {
          "type": [
            "object",
            "null"
          ],
          "description": "The claims ledger: each way the docs give to do the core work, tried once. claimed, tried, held, broken (documented but didn't work), not_tried, undocumented_works (worked but the docs don't describe it)",
          "properties": {
            "claimed": {
              "type": "integer"
            },
            "tried": {
              "type": "integer"
            },
            "held": {
              "type": "integer"
            },
            "broken": {
              "type": "integer"
            },
            "unclear": {
              "type": "integer",
              "description": "Ran, but the result wasn't read back"
            },
            "not_tried": {
              "type": "integer"
            },
            "undocumented_works": {
              "type": "integer"
            }
          }
        },
        "ladder": {
          "type": "object",
          "description": "The nine checkpoints, each with status and note, in the order of the agent's eight steps (Discover → Docs → Sign up → Get a key → Do the work → Pay → Cancel → Leave; Discover: none: what an agent finds on the domain; Docs: docs; Sign up: signup, verify; Get a key: credentials, first_call; Do the work: first_action; Pay: pay; Cancel: cancel; Leave: delete). pay: grade P0-P5 by how agentic paying is; from P3 up only with a payment our agent made and we checked (paid); a rail only seen has exercised false, its grade capped at P3 and the grade it would give in detected_grade"
        },
        "attempts": {
          "type": "array",
          "items": {
            "type": "object"
          }
        },
        "pay_options": {
          "type": [
            "object",
            "null"
          ],
          "description": "The pay checkpoint: the ways to pay it offers an agent (our pay probe before the drive, without paying; or an older drive's record), the payment our agent made and we checked, and what the owner could add so an agent pays on its own",
          "properties": {
            "checked": {
              "type": "string",
              "format": "date"
            },
            "source": {
              "enum": [
                "probe",
                "drive"
              ]
            },
            "options": {
              "type": "array",
              "description": "Agent ways first",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "kind": {
                    "enum": [
                      "agent-rail",
                      "agent-checkout",
                      "mcp-tool",
                      "billing",
                      "checkout"
                    ]
                  },
                  "first_party": {
                    "type": "boolean",
                    "description": "Answered on the vendor's own domain (or Stripe's own catalog)"
                  },
                  "lead": {
                    "type": "boolean",
                    "description": "Only a listing or a word in the docs, no answer from the vendor's own side"
                  },
                  "networks": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "testnet": {
                    "type": "boolean"
                  }
                }
              }
            },
            "agentic": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "paid": {
              "type": [
                "object",
                "null"
              ],
              "description": "The payment our agent made and we checked: a wallet transaction confirmed on chain (the trial card, a person's help, is never the agent paying)",
              "properties": {
                "rail": {
                  "type": "string"
                },
                "network": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "testnet": {
                  "type": "boolean"
                },
                "tx": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "amount": {
                  "type": [
                    "number",
                    "string",
                    "null"
                  ]
                },
                "currency": {
                  "type": "string"
                },
                "at": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            },
            "exercised": {
              "type": [
                "boolean",
                "null"
              ]
            },
            "detected_grade": {
              "type": [
                "string",
                "null"
              ]
            },
            "trial": {
              "type": "object",
              "properties": {
                "no_card": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "card_required": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "free_plan": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                }
              }
            },
            "owner_fixes": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "how": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "who_gets_in": {
          "type": [
            "object",
            "null"
          ],
          "description": "Who gets in, next to the level and never part of it. server: our agent from our server (in, edge: stopped before the sign-up page, captcha: a CAPTCHA on the form, form: turned away at the form, robots: a robots.txt rule that names AI agents, closed). signed: the sign-up page opened by a signed agent Cloudflare knows, JavaScript off (page, check, block, robots, unknown), with the date. browser: an agent in a person's browser, from the kind of check (in, through, captcha, unknown), not measured. our_key: verified once Cloudflare knows our agent's key. robots: closed when robots.txt asks crawlers to stay off the sign-up page. tip: the edge stopped agents on a server and signed agents reached the page",
          "properties": {
            "server": {
              "type": "object",
              "properties": {
                "state": {
                  "enum": [
                    "in",
                    "edge",
                    "captcha",
                    "form",
                    "robots",
                    "closed"
                  ]
                }
              }
            },
            "signed": {
              "type": "object",
              "properties": {
                "state": {
                  "enum": [
                    "page",
                    "check",
                    "block",
                    "robots",
                    "unknown"
                  ]
                },
                "kind": {
                  "enum": [
                    "signup",
                    "home"
                  ]
                },
                "at": {
                  "type": "string",
                  "format": "date"
                }
              }
            },
            "browser": {
              "type": "object",
              "properties": {
                "state": {
                  "enum": [
                    "in",
                    "through",
                    "captcha",
                    "unknown"
                  ]
                },
                "measured": {
                  "type": "boolean"
                }
              }
            },
            "our_key": {
              "enum": [
                "verified",
                "pending"
              ]
            },
            "robots": {
              "enum": [
                "closed",
                null
              ],
              "description": "robots.txt asks crawlers to stay off the sign-up page"
            },
            "tip": {
              "type": "boolean"
            }
          }
        },
        "after_wall": {
          "type": [
            "object",
            "null"
          ],
          "description": "After the wall: what the agent did on its own once a person cleared one step at the door (a bot check, a phone code, a refused sign-up), set up the account, or gave a card for a free trial that asks for one. Data only, not counted: never part of the level, which counts only what the agent did alone. null: no person helped",
          "properties": {
            "step": {
              "type": "string",
              "description": "The first checkpoint a person did"
            },
            "steps": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "via": {
              "type": "string",
              "description": "human handoff (in the agent's browser), human, own browser, human setup, owner access, human, trial card (a card a person gave for a free trial)"
            },
            "kind": {
              "type": [
                "string",
                "null"
              ],
              "enum": [
                "challenge",
                "browser-check",
                "phone",
                "card",
                "signup-refused",
                "other",
                null
              ]
            },
            "label": {
              "type": "string"
            },
            "agent_steps": {
              "type": "array",
              "description": "Checkpoints after it the agent passed on its own",
              "items": {
                "type": "object",
                "properties": {
                  "rung": {
                    "type": "string"
                  },
                  "status": {
                    "enum": [
                      "headless",
                      "browser"
                    ]
                  }
                }
              }
            },
            "done": {
              "type": "array",
              "description": "Capabilities the agent did and read back on its own once in",
              "items": {
                "type": "object",
                "properties": {
                  "cap": {
                    "type": "string"
                  },
                  "capability": {
                    "type": "string"
                  },
                  "weight": {
                    "type": "string"
                  },
                  "route": {
                    "enum": [
                      "headless",
                      "browser"
                    ]
                  }
                }
              }
            },
            "coverage_core": {
              "type": [
                "integer",
                "null"
              ]
            },
            "parts": {
              "type": "array",
              "description": "The part scores measured after the wall: they carry the label",
              "items": {
                "enum": [
                  "holds_up",
                  "docs_match"
                ]
              }
            }
          }
        }
      }
    }
  ],
  "$defs": {
    "Access": {
      "type": "object",
      "description": "How an agent gets in (rules of 13 Oct 2026): one entry per way that got it in on its own, agent-native first; key person: none did",
      "properties": {
        "key": {
          "enum": [
            "keyless",
            "local",
            "try_first",
            "no_account",
            "pay_per_call",
            "key_by_api",
            "mcp_signin",
            "email_signup",
            "browser_signup",
            "by_name",
            "person"
          ]
        },
        "label": {
          "type": "string"
        },
        "routes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The route ids behind it (e.g. pay_per_call, email_code, sso_github)"
        },
        "minutes": {
          "type": [
            "number",
            "null"
          ],
          "description": "Minutes to the first call on this way"
        },
        "core": {
          "type": [
            "string",
            "null"
          ],
          "description": "Core tasks done on this way, as done/total"
        },
        "by_route": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "With more than one route behind it: each route's own core tasks, as done/total"
        }
      }
    },
    "Level": {
      "type": "integer",
      "minimum": 0,
      "maximum": 5,
      "description": "Agent level, the only rank: 0 Read-only (Agents can read about it, but there is nothing to use); 1 Needs a person (Agents can't get in on their own); 2 Gets in (An agent gets in on its own but does less than half the core work); 3 Does the work (An agent gets in on its own and does half the core work or more); 4 Runs on its own (An agent does the core work and can stop paying on its own); 5 Autonomous (All of that, and it can pay on its own for the work)"
    },
    "Outcome": {
      "type": "object",
      "description": "One of the five outcomes (from the rules of 13 Oct 2026): what an agent needs from a product, whatever the route. find (shown as Learn): whether our agent read the product's docs on its own and can act on them (a getting-started page, the sign-in steps, examples; have: llms.txt, OpenAPI, its own MCP server); shown first, it decides no level. access, use, pay, leave: the four stages, with the stage's own key in `stage`. A level's outcomes are met by construction: L2 needs access, L3 access and use at least part, L4 access, use and leave, L5 all four (pay na: nothing to pay counts). The other fields are the Stage's",
      "properties": {
        "key": {
          "enum": [
            "find",
            "access",
            "use",
            "pay",
            "leave"
          ]
        },
        "label": {
          "type": "string"
        },
        "state": {
          "enum": [
            "yes",
            "part",
            "no",
            "unreached",
            "na"
          ]
        },
        "text": {
          "type": "string"
        },
        "value": {
          "enum": [
            "paid",
            "partial",
            "ready",
            "checkout",
            "person",
            "not_tried",
            "unreached",
            "nothing"
          ],
          "description": "Pay only: paid (a payment we made and checked that pays for the work: credits or a plan for its account, or per call for at least 80% of the core; over x402 or MPP, or one purchase at the checkout on the owner's order with their code; it counts for 90 days), partial (it pays per call, for less of the core than that), ready (ready to pay, payment not yet proven: a valid HTTP 402 offer on a core task that our wallet could meet, or the checkout filled up to the pay button with no person in the way; never L5), checkout (the agent reached the checkout, the last step before the money, without that proof, and paid nothing; with why unsettled, our agent paid and the seller didn't settle), person (the product puts a person in the way of buying), not_tried (not tested in this drive; never the product's failure), unreached (an earlier wall), nothing (no plan to buy). The words are in text, and may change; the values stay"
        },
        "per_call": {
          "type": "object",
          "description": "Pay only, with a per-call payment: what the per-call route covers of the core (caps: the capability ids, core: the core's size, share: percent)",
          "properties": {
            "caps": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "core": {
              "type": "integer"
            },
            "share": {
              "type": [
                "integer",
                "null"
              ]
            }
          }
        },
        "left": {
          "enum": [
            "deleted",
            "data_only",
            "nothing_made",
            "removed",
            "expires",
            "stuck",
            "wallet_kept"
          ],
          "description": "Leave only: what the agent left behind. deleted: its account; data_only: the data and keys went, the login stayed; nothing_made, removed, expires (with after_hours): used without an account; stuck: it can't remove its account or what it made"
        },
        "delete": {
          "type": [
            "object",
            "null"
          ],
          "description": "Leave only: the delete as its own fact, as on its stage (Stage.delete)"
        },
        "after_hours": {
          "type": "number",
          "description": "Leave only, with expires: after how long the product removes what the agent made, per its docs"
        },
        "route": {
          "type": "string",
          "enum": [
            "agent_rail",
            "projects",
            "billing_api",
            "agent_checkout",
            "card_checkout",
            "portal",
            "sales",
            "none"
          ],
          "description": "Pays only: the most agentic way to buy the product offers"
        },
        "why": {
          "type": "string",
          "description": "Pays only: for person, what the product puts in the way (sales, quote, approval, captcha, phone, invoice, id_check, other); for not_tried, our reason (no_card, robots, time, rule, budget, yearly_only, cap, wallet, account); for ready, unsettled when our agent paid and the seller didn't settle"
        },
        "way": {
          "type": "string",
          "description": "Access only: the way in the agent got in by, when the drive kept its route table (e.g. email_code, api_signup, sso_github)"
        },
        "stage": {
          "type": "string",
          "enum": [
            "in",
            "work",
            "pay",
            "leave"
          ]
        },
        "have": {
          "type": "array",
          "items": {
            "enum": [
              "llms_txt",
              "openapi",
              "mcp"
            ]
          },
          "description": "Learn only (key find): what the drive found"
        },
        "docs": {
          "type": "string",
          "description": "Learn only: the docs pass's verdict, when the drive read the docs"
        }
      }
    },
    "Parts": {
      "type": "object",
      "description": "The part scores, 0-100, null when not measured; they never change the level and there is no total. Bands: 90+ good, 50-89 fair, under 50 poor. Pages show only the measured ones, and Agent-ready setup as what was found (llms.txt, OpenAPI, MCP, CLI: the surfaces), not as a number.",
      "properties": {
        "holds_up": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Reliability and the crash test. null until the crash test ran"
        },
        "docs_match": {
          "type": [
            "integer",
            "null"
          ],
          "description": "The docs checked against live behaviour (accuracy and completeness). null unless the Audit measured it"
        },
        "setup": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Kept for compatibility, not a score: what an agent finds (machine-readable docs, OpenAPI, llms.txt, MCP, CLI or SDK) is outcome find's have, and pages show it as found or not"
        },
        "security": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "private",
            null
          ],
          "description": "Security is reported privately to the owner, the same for every product: no score or count. private when a security review ran on the drive, null before one did"
        },
        "standards": {
          "type": "array",
          "description": "Whether the product speaks the current version of each standard, as facts, never points",
          "items": {
            "type": "object",
            "properties": {
              "standard": {
                "type": "string"
              },
              "state": {
                "enum": [
                  "current",
                  "behind"
                ]
              },
              "behind": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Revisions behind, when countable"
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          }
        }
      }
    },
    "Robots": {
      "type": [
        "object",
        "null"
      ],
      "description": "robots.txt on the way in (null: no drive met a rule there). rule named: a rule that names our agent or AI agents that act for a user, the product's own wall; star: a rule for all user agents, a rule for crawlers and never the product's wall. held: the drives after the one shown stopped at a rule for all user agents while our agent follows it on account steps, so the level is that earlier drive's",
      "properties": {
        "rule": {
          "enum": [
            "named",
            "star"
          ]
        },
        "step": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "signup",
            "verify",
            "credentials",
            "first_call",
            null
          ]
        },
        "seen": {
          "type": "string",
          "format": "date",
          "description": "The newest drive that met it"
        },
        "held": {
          "type": "boolean"
        }
      }
    },
    "Stage": {
      "type": "object",
      "description": "One of the four stages that decide the level (in: Access, work: Use, pay: Pay, leave: Leave), by the level's own rules; the same four as outcomes 2-5 with their older keys. They sum up the agent's steps: Access is Sign up and Get a key (or a way in without an account), Use is Do the work, Pay is Pay, Leave is Cancel and Leave",
      "properties": {
        "key": {
          "enum": [
            "in",
            "work",
            "pay",
            "leave"
          ]
        },
        "label": {
          "type": "string"
        },
        "state": {
          "enum": [
            "yes",
            "part",
            "no",
            "unreached",
            "na"
          ]
        },
        "text": {
          "type": "string"
        },
        "value": {
          "enum": [
            "paid",
            "partial",
            "ready",
            "checkout",
            "person",
            "not_tried",
            "unreached",
            "nothing"
          ],
          "description": "Pay only: paid (a payment we made and checked that pays for the work: credits or a plan for its account, or per call for at least 80% of the core; over x402 or MPP, or one purchase at the checkout on the owner's order with their code; it counts for 90 days), partial (it pays per call, for less of the core than that), ready (ready to pay, payment not yet proven: a valid HTTP 402 offer on a core task that our wallet could meet, or the checkout filled up to the pay button with no person in the way; never L5), checkout (the agent reached the checkout, the last step before the money, without that proof, and paid nothing; with why unsettled, our agent paid and the seller didn't settle), person (the product puts a person in the way of buying), not_tried (not tested in this drive; never the product's failure), unreached (an earlier wall), nothing (no plan to buy). The words are in text, and may change; the values stay"
        },
        "per_call": {
          "type": "object",
          "description": "Pay only, with a per-call payment: what the per-call route covers of the core (caps: the capability ids, core: the core's size, share: percent)",
          "properties": {
            "caps": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "core": {
              "type": "integer"
            },
            "share": {
              "type": [
                "integer",
                "null"
              ]
            }
          }
        },
        "left": {
          "enum": [
            "deleted",
            "data_only",
            "nothing_made",
            "removed",
            "expires",
            "stuck",
            "wallet_kept"
          ],
          "description": "Leave only: what the agent left behind. deleted: its account; data_only: the data and keys went, the login stayed; nothing_made, removed, expires (with after_hours): used without an account; stuck: it can't remove its account or what it made"
        },
        "delete": {
          "type": [
            "object",
            "null"
          ],
          "description": "Leave only: the delete as its own fact beside Leave (Leave says whether it stops paying on its own). state yes: what it made goes (its account deleted, or removed, or gone by itself); part: its data deleted, the login stays; no: it stays; na: nothing made; unreached. text in words, why: the drive's note at delete",
          "properties": {
            "state": {
              "enum": [
                "yes",
                "part",
                "no",
                "na",
                "unreached"
              ]
            },
            "text": {
              "type": "string"
            },
            "why": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        },
        "after_hours": {
          "type": "number",
          "description": "Leave only, with expires: after how long the product removes what the agent made, per its docs"
        },
        "route": {
          "type": "string",
          "enum": [
            "agent_rail",
            "projects",
            "billing_api",
            "agent_checkout",
            "card_checkout",
            "portal",
            "sales",
            "none"
          ],
          "description": "Pays only: the most agentic way to buy the product offers"
        },
        "why": {
          "type": "string",
          "description": "Pays only: for person, what the product puts in the way (sales, quote, approval, captcha, phone, invoice, id_check, other); for not_tried, our reason (no_card, robots, time, rule, budget, yearly_only, cap, wallet, account); for ready, unsettled when our agent paid and the seller didn't settle"
        },
        "way": {
          "type": "string",
          "description": "Access only: the way in the agent got in by, when the drive kept its route table (e.g. email_code, api_signup, sso_github)"
        }
      }
    },
    "ToolIds": {
      "type": "object",
      "description": "What the product joins on: its company's and surfaces' stable ids, its slugs and domain, and outside ids",
      "properties": {
        "org": {
          "type": [
            "string",
            "null"
          ],
          "description": "The company's stable id (org_…), by its registrable domain"
        },
        "surfaces": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "A stable id (srf_…) per way to use it: web, api, mcp, cli, sdk"
        },
        "slugs": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Every slug it has had"
        },
        "domain": {
          "type": [
            "string",
            "null"
          ]
        },
        "wikidata": {
          "type": "string",
          "description": "Its Wikidata item (QID), where its official website matches"
        },
        "mcp_registry": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Its servers' names in the official MCP registry"
        }
      }
    },
    "ToolSummary": {
      "type": "object",
      "description": "One product in /api/tools.json (the same fields open each /api/tools/{slug}.json)",
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^prd_[0-9a-hjkmnp-tv-z]{26}$",
          "description": "The product's stable id: never reused, kept when its slug or address changes. Resolve it at /api/id/{id}"
        },
        "slug": {
          "type": "string",
          "description": "The product's address in the directory (can change; id doesn't)"
        },
        "name": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "icon": {
          "type": [
            "string",
            "null"
          ],
          "description": "The product's logo, a path on this site"
        },
        "category": {
          "type": "string",
          "description": "The category id"
        },
        "category_name": {
          "type": "string"
        },
        "tested_at": {
          "type": "string",
          "format": "date",
          "description": "The day of the drive behind the level"
        },
        "rules_version": {
          "type": [
            "string",
            "null"
          ],
          "description": "The rules version the level was judged under: its entry's anchor on /method/changelog"
        },
        "rules_url": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri",
          "description": "That rules version's entry on /method/changelog"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The product's page here"
        },
        "json": {
          "type": "string",
          "format": "uri",
          "description": "Its full record: /api/tools/{slug}.json"
        },
        "draft": {
          "type": "boolean",
          "description": "Not reviewed yet: the result may still change"
        },
        "origin": {
          "enum": [
            "editorial",
            "owner"
          ],
          "description": "editorial: we picked the product; owner: its owner ordered the drive"
        },
        "disclosure": {
          "type": "string",
          "description": "Only on a drive its owner paid for: the label to show with it"
        },
        "stale": {
          "type": "boolean",
          "description": "Always false: a listing never goes stale for its age. Kept for older clients"
        },
        "level_selfhost": {
          "type": [
            "integer",
            "null"
          ],
          "description": "The level of the self-hosted edition, when it was driven (null: not driven)"
        },
        "summary": {
          "type": "string",
          "description": "What an agent can do with it, in a sentence or two"
        },
        "first_blocker": {
          "type": "string",
          "description": "The first thing that stops or slows an agent"
        },
        "coverage_source": {
          "enum": [
            "computed",
            "reported"
          ],
          "description": "computed: work done measured against the product's capability map; reported: counted by the driving agent"
        },
        "core": {
          "type": [
            "string",
            "null"
          ],
          "description": "Core features done of all, as done/total"
        },
        "pay": {
          "type": [
            "string",
            "null"
          ],
          "description": "How an agent can pay for it, as a grade from P0 (no self-serve purchase) up to P5 (an agent-native payment method sells the product); n/a: nothing to pay for"
        },
        "lets_agent": {
          "type": [
            "string",
            "null"
          ],
          "description": "A bot check that let our signed agent through (null: none seen)"
        },
        "mcp": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "official",
            "third-party",
            "docs",
            "none",
            null
          ],
          "description": "Whether it has an MCP server: its own, someone else's, only one that searches its docs (docs), or none; null when not checked"
        },
        "level": {
          "$ref": "#/$defs/Level"
        },
        "level_name": {
          "type": "string"
        },
        "parts": {
          "$ref": "#/$defs/Parts"
        },
        "stages": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Stage"
          }
        },
        "next": {
          "type": "object",
          "properties": {
            "to": {
              "type": [
                "integer",
                "null"
              ]
            },
            "text": {
              "type": "string"
            }
          }
        },
        "outcomes": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Outcome"
          },
          "description": "The five outcomes: find, access, use, pay, leave"
        },
        "access": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Access"
          },
          "description": "How an agent gets in"
        },
        "minutes": {
          "type": [
            "number",
            "null"
          ],
          "description": "Minutes to the first call on the fastest way in; within a level, the order after work done"
        },
        "stop": {
          "type": [
            "string",
            "null"
          ],
          "description": "The first checkpoint the agent did not get past (null: through every one). Only a stop at the door (signup, verify, credentials, first_call) ends a drive; past it each checkpoint is tested on its own"
        },
        "coverage_core": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Work done: the share of the core features done and read back, through documented routes (null: not measured)"
        },
        "entry": {
          "enum": [
            "self-start",
            "setup",
            "closed"
          ],
          "description": "self-start: gets in on its own; setup: a person had to make the account; closed: can't get in on its own. self-start and the other two add up to every product: the other two are the products that stop an agent at the door"
        },
        "badges": {
          "type": "array",
          "items": {
            "enum": [
              "agent-can-buy",
              "agent-can-leave"
            ]
          },
          "description": "agent-can-buy: an agent paid through an agent-native rail, checked by us; agent-can-leave: leaves on its own"
        },
        "pays_with": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The agent-native ways to pay it offers, from our pay probe or the drive (x402, mpp, l402, stripe-projects, acp, ucp, ap2, mcp-payment)"
        },
        "paid": {
          "type": "boolean",
          "description": "Our side made and proved a payment on one of them (the transaction is in the tool's pay_options.paid)"
        },
        "blocks_agent": {
          "type": [
            "string",
            "null"
          ],
          "description": "The bot check that stopped our signed agent on at least one way in, from sign-up to the first call (null: none did). With entry self-start it got in another way; otherwise the check stood in its way at the door"
        },
        "wall_type": {
          "enum": [
            "network",
            "challenge",
            null
          ],
          "description": "What kind of bot check it was. network: It judged where our agent connected from and its browser, not a person. Our agent, working on its own from a data center, didn't get through; the owner can open the check to agents. How agents in a person's own browser fare isn't measured yet. challenge: It asks every visitor to prove they are human. Our agent doesn't solve these, and its signature didn't change that: a person does this step, or the owner opens it for agents."
        },
        "freshness": {
          "enum": [
            "fresh",
            "aging",
            "redrive"
          ],
          "description": "How old the listed drive is: fresh, aging from 90 days, redrive from 180. The level and the page stay as they are"
        },
        "newer_drives": {
          "type": [
            "object",
            "null"
          ],
          "description": "Finished drives after the listed one, not listed yet: how many and the newest's date. null: the listed drive is the newest",
          "properties": {
            "count": {
              "type": "integer"
            },
            "newest": {
              "type": "string",
              "format": "date"
            }
          }
        },
        "same_level_drives": {
          "type": "integer",
          "description": "The latest drives in a row that gave this level"
        },
        "drives": {
          "type": "integer",
          "description": "Every drive of the product so far"
        },
        "confirmation": {
          "type": [
            "object",
            "null"
          ],
          "description": "How far its drives back the level: every drive (drives), those that gave this level (agree), and state. A first L0 to L2 waits for a drive on another day that gives the same level, or a person's review of the drive: awaiting until then, confirmed or signed_off after; L3 and up not_needed. rechecking (any level): a newer drive gave a lower level, so the level stays until a second drive agrees. text: the listing's words (\"1 drive, awaiting confirmation\", \"2 of 3 drives agree\", \"Being re-checked since 24 Oct 2026\")",
          "properties": {
            "state": {
              "enum": [
                "awaiting",
                "confirmed",
                "signed_off",
                "not_needed",
                "rechecking"
              ]
            },
            "drives": {
              "type": "integer"
            },
            "agree": {
              "type": "integer"
            },
            "review": {
              "type": [
                "object",
                "null"
              ],
              "description": "The person's review, when state is signed_off",
              "properties": {
                "by": {
                  "type": "string"
                },
                "date": {
                  "type": "string",
                  "format": "date"
                }
              }
            },
            "text": {
              "type": "string"
            }
          }
        },
        "robots": {
          "$ref": "#/$defs/Robots"
        },
        "rank": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 1,
          "description": "Its place in its category among the products our agent got into on its own (with the directory on: the directory's), by level, then the share of the core work done on its own path. From drive results only: nothing paid moves it. Ties share a place. null: not ranked"
        },
        "rank_of": {
          "type": "integer",
          "description": "How many products of its category are ranked"
        },
        "rank_change": {
          "type": [
            "integer",
            "null"
          ],
          "description": "How many places it moved the last time its place changed: positive up, negative down, 0 none. null: new to the ranking, or not ranked"
        },
        "rank_since": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "The day of that move, or the day it entered the ranking"
        },
        "ways_in": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The ways in that got our agent in (route ids, e.g. api_signup, sso_github); empty on drives before the route table"
        },
        "issues_found": {
          "type": "integer",
          "minimum": 0,
          "description": "How many issues the drive found: its agent blockers plus the issues in its agent surfaces, as the product page counts them. A count only: what they are and how to fix them go to the product's owner"
        },
        "agent_surfaces": {
          "type": "object",
          "description": "Each way an agent works the product, as the product page's tiles show it, whether or not our agent got in: tested in the drive, documented by the product but not tested, none found, or unknown",
          "required": [
            "api",
            "mcp",
            "cli",
            "sdk",
            "docs",
            "payment"
          ],
          "properties": {
            "api": {
              "type": "object",
              "required": [
                "state",
                "documented",
                "tested",
                "source"
              ],
              "properties": {
                "state": {
                  "enum": [
                    "tested",
                    "documented",
                    "none_found",
                    "unknown"
                  ]
                },
                "reachable": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Whether it answered one probe of what its docs list (the API's base URL, the MCP server's initialize, the package in its registry): false is documented, not reachable; null when it wasn't probed"
                },
                "documented": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many items it documents (operations, tools, commands, methods, docs pages), where the drive mapped them; else null"
                },
                "tested": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many of them the drive tried (docs: pages read); null where it didn't map them"
                },
                "source": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The page or address that documents it. Every documented state has one: without it the state is unknown"
                }
              }
            },
            "mcp": {
              "type": "object",
              "required": [
                "state",
                "documented",
                "tested",
                "source"
              ],
              "properties": {
                "state": {
                  "enum": [
                    "tested",
                    "documented",
                    "none_found",
                    "unknown"
                  ]
                },
                "reachable": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Whether it answered one probe of what its docs list (the API's base URL, the MCP server's initialize, the package in its registry): false is documented, not reachable; null when it wasn't probed"
                },
                "documented": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many items it documents (operations, tools, commands, methods, docs pages), where the drive mapped them; else null"
                },
                "tested": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many of them the drive tried (docs: pages read); null where it didn't map them"
                },
                "source": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The page or address that documents it. Every documented state has one: without it the state is unknown"
                }
              }
            },
            "cli": {
              "type": "object",
              "required": [
                "state",
                "documented",
                "tested",
                "source"
              ],
              "properties": {
                "state": {
                  "enum": [
                    "tested",
                    "documented",
                    "none_found",
                    "unknown"
                  ]
                },
                "reachable": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "Whether it answered one probe of what its docs list (the API's base URL, the MCP server's initialize, the package in its registry): false is documented, not reachable; null when it wasn't probed"
                },
                "documented": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many items it documents (operations, tools, commands, methods, docs pages), where the drive mapped them; else null"
                },
                "tested": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many of them the drive tried (docs: pages read); null where it didn't map them"
                },
                "source": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The page or address that documents it. Every documented state has one: without it the state is unknown"
                }
              }
            },
            "sdk": {
              "type": "object",
              "required": [
                "state",
                "documented",
                "tested",
                "source"
              ],
              "properties": {
                "state": {
                  "enum": [
                    "tested",
                    "documented",
                    "none_found",
                    "unknown"
                  ]
                },
                "documented": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many items it documents (operations, tools, commands, methods, docs pages), where the drive mapped them; else null"
                },
                "tested": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many of them the drive tried (docs: pages read); null where it didn't map them"
                },
                "source": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The page or address that documents it. Every documented state has one: without it the state is unknown"
                }
              }
            },
            "docs": {
              "type": "object",
              "required": [
                "state",
                "documented",
                "tested",
                "source"
              ],
              "properties": {
                "state": {
                  "enum": [
                    "tested",
                    "documented",
                    "none_found",
                    "unknown"
                  ]
                },
                "documented": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many items it documents (operations, tools, commands, methods, docs pages), where the drive mapped them; else null"
                },
                "tested": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many of them the drive tried (docs: pages read); null where it didn't map them"
                },
                "source": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The page or address that documents it. Every documented state has one: without it the state is unknown"
                }
              }
            },
            "payment": {
              "type": "object",
              "required": [
                "state",
                "documented",
                "tested",
                "source"
              ],
              "properties": {
                "state": {
                  "enum": [
                    "tested",
                    "documented",
                    "none_found",
                    "unknown"
                  ]
                },
                "documented": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many items it documents (operations, tools, commands, methods, docs pages), where the drive mapped them; else null"
                },
                "tested": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many of them the drive tried (docs: pages read); null where it didn't map them"
                },
                "source": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Always null: payment's state comes from our own pay check, not a page"
                }
              }
            }
          }
        },
        "docs_overall": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "complete",
            "gaps",
            "thin",
            "unreachable",
            null
          ],
          "description": "The docs pass's verdict (null: no docs pass on that drive)"
        }
      }
    }
  }
}