---
title: "Every product in the directory (open data, CC BY 4.0): each one driven by our agent, with its agent level, part scores, drive date and origin (editorial or owner, with disclosure when the owner paid). Sorted by level, then work done, then minutes to the first call. To filter, GET /api/tools (a query on this file answers 302 there)"
method: GET
path: "/api/tools.json"
tags: ["Directory"]
---

# Every product in the directory (open data, CC BY 4.0): each one driven by our agent, with its agent level, part scores, drive date and origin (editorial or owner, with disclosure when the owner paid). Sorted by level, then work done, then minutes to the first call. To filter, GET /api/tools (a query on this file answers 302 there)

`GET /api/tools.json`

## Request

- Base URL: `https://agentdrives.com`
- URL: `https://agentdrives.com/api/tools.json`
- Auth: none required

## Response `200`

Tools

- ToolList
  - `methodology` integer
  - `rules_date` string, date: The date of the rules the levels were set by
  - `tools` ToolSummary[]
    - `id` string: The product's stable id: never reused, kept when its slug or address changes. Resolve it at /api/id/{id}
    - `slug` string: The product's address in the directory (can change; id doesn't)
    - `name` string
    - `domain` string
    - `icon` string, nullable: The product's logo, a path on this site
    - `category` string: The category id
    - `category_name` string
    - `tested_at` string, date: The day of the drive behind the level
    - `url` string, uri: The product's page here
    - `json` string, uri: Its full record: /api/tools/{slug}.json
    - `draft` boolean: Not reviewed yet: the result may still change
    - `origin` 'editorial' | 'owner': editorial: we picked the product; owner: its owner ordered the drive
    - `disclosure` string: Only on a drive its owner paid for: the label to show with it
    - `stale` boolean: The newest drive is older than 182 days
    - `level_selfhost` integer, nullable: The level of the self-hosted edition, when it was driven (null: not driven)
    - `summary` string: What an agent can do with it, in a sentence or two
    - `first_blocker` string: The first thing that stops or slows an agent
    - `coverage_source` 'computed' | 'reported': computed: work done measured against the product's capability map; reported: counted by the driving agent
    - `core` string, nullable: Core features done of all, as done/total
    - `pay` string, nullable: The pay grade, P0 to P5 (n/a: nothing to pay for)
    - `lets_agent` string, nullable: A bot check that let our signed agent through (null: none seen)
    - `mcp` 'official' | 'third-party' | 'docs' | 'none' | 'null', nullable: 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` integer: 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 pays on its own for the work)
    - `level_name` string
    - `parts` Parts: The part scores (methodology 21), 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.
      - `holds_up` integer, nullable: Reliability and the crash test. null until the crash test ran
      - `docs_match` integer, nullable: The docs checked against live behaviour (accuracy and completeness). null until the full surface audit ran
      - `setup` integer, nullable: Agent-ready setup as points (kept for compatibility): machine-readable docs, OpenAPI, llms.txt, MCP, CLI or SDK. Pages show the surfaces found instead
      - `security` 'private' | 'null', nullable: 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` object[]: Whether the product speaks the current version of each standard, as facts, never points
        - `standard` string
        - `state` 'current' | 'behind'
        - `behind` integer, nullable: Revisions behind, when countable
        - `value` string, nullable
    - `stages` Stage[]
      - `key` 'in' | 'work' | 'pay' | 'leave'
      - `label` string
      - `state` 'yes' | 'part' | 'no' | 'unreached' | 'na'
      - `text` string
      - `value` 'paid' | 'partial' | 'ready' | 'checkout' | 'person' | 'not_tried' | 'unreached' | 'nothing': 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 side paid and the seller didn't settle), person (the product puts a person in the way of buying), not_tried (our side didn't try: no card, robots.txt, time, a rule; 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` object: 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)
        - `caps` string[]
        - `core` integer
        - `share` integer, nullable
      - `left` 'deleted' | 'data_only' | 'nothing_made' | 'removed' | 'expires' | 'stuck' | 'wallet_kept': 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` object, nullable: 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
        - `state` 'yes' | 'part' | 'no' | 'na' | 'unreached'
        - `text` string
        - `why` string, nullable
      - `after_hours` number: Leave only, with expires: after how long the product removes what the agent made, per its docs
      - `route` 'agent_rail' | 'projects' | 'billing_api' | 'agent_checkout' | 'card_checkout' | 'portal' | 'sales' | 'none': Pays only: the most agentic way to buy the product offers
      - `why` string: 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 side paid and the seller didn't settle
      - `way` string: 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)
    - `next` object
      - `to` integer, nullable
      - `text` string
    - `outcomes` Outcome[]: The five outcomes: find, access, use, pay, leave
      - `key` 'find' | 'access' | 'use' | 'pay' | 'leave'
      - `label` string
      - `state` 'yes' | 'part' | 'no' | 'unreached' | 'na'
      - `text` string
      - `value` 'paid' | 'partial' | 'ready' | 'checkout' | 'person' | 'not_tried' | 'unreached' | 'nothing': 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 side paid and the seller didn't settle), person (the product puts a person in the way of buying), not_tried (our side didn't try: no card, robots.txt, time, a rule; 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` object: 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)
        - `caps` string[]
        - `core` integer
        - `share` integer, nullable
      - `left` 'deleted' | 'data_only' | 'nothing_made' | 'removed' | 'expires' | 'stuck' | 'wallet_kept': 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` object, nullable: Leave only: the delete as its own fact, as on its stage (Stage.delete)
      - `after_hours` number: Leave only, with expires: after how long the product removes what the agent made, per its docs
      - `route` 'agent_rail' | 'projects' | 'billing_api' | 'agent_checkout' | 'card_checkout' | 'portal' | 'sales' | 'none': Pays only: the most agentic way to buy the product offers
      - `why` string: 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 side paid and the seller didn't settle
      - `way` string: 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` 'in' | 'work' | 'pay' | 'leave'
      - `have` string[]: Find only: what the drive found
      - `docs` string: Find only: the docs pass's verdict, when the drive read the docs
    - `access` Access[]: How an agent gets in
      - `key` 'keyless' | 'local' | 'try_first' | 'no_account' | 'pay_per_call' | 'key_by_api' | 'mcp_signin' | 'email_signup' | 'browser_signup' | 'by_name' | 'person'
      - `label` string
      - `routes` string[]: The route ids behind it (e.g. pay_per_call, email_code, sso_github)
      - `minutes` number, nullable: Minutes to the first call on this way
      - `core` string, nullable: Core tasks done on this way, as done/total
    - `minutes` number, nullable: Minutes to the first call on the fastest way in; within a level, the order after work done
    - `stop` string, nullable: 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` integer, nullable: Work done: the share of the core features done and read back, through documented routes (null: not measured)
    - `entry` 'self-start' | 'setup' | 'closed': self-start: gets in on its own; setup: a human set up the account once; 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` string[]: agent-can-buy: an agent paid through an agent-native rail, proven from our side; agent-can-leave: leaves on its own
    - `pays_with` string[]: 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` boolean: Our side made and proved a payment on one of them (the transaction is in the tool's pay_options.paid)
    - `blocks_agent` string, nullable: 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` unknown
    - `monitored` boolean: Driven monthly
    - `freshness` 'fresh' | 'aging' | 'redrive': How old the listed drive is: aging from 90 days (Driven over 3 months ago), redrive from 180 (Needs a new drive)
    - `newer_drives` object, nullable: Finished drives after the listed one, not listed yet: how many and the newest's date. null: the listed drive is the newest
      - `count` integer
      - `newest` string, date
    - `same_level_drives` integer: The latest drives in a row that gave this level
    - `drives` integer: Every drive of the product so far
    - `robots` Robots, nullable: 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
      - `rule` 'named' | 'star'
      - `step` 'signup' | 'verify' | 'credentials' | 'first_call' | 'null', nullable
      - `seen` string, date: The newest drive that met it
      - `held` boolean
    - `ways_in` string[]: The ways in that got our agent in (route ids, e.g. api_signup, sso_github); empty on drives before the route table
    - `docs_overall` 'complete' | 'gaps' | 'thin' | 'unreachable' | 'null', nullable: The docs pass's verdict (null: no docs pass on that drive)

## Changes

- **2026-10-19** `875c17f6ee52`: 2 info
  - added the optional property `tools/items/outcomes/items/delete` to the response with the `200` status
  - added the optional property `tools/items/stages/items/delete` to the response with the `200` status
- **2026-10-19** `b9957601c4c5`: 1 info
  - added the optional property `tools/items/newer_drives` to the response with the `200` status

[Operation history](https://skmtc.dev/agentdrives/apis/agentdrives-api/changes/api/tools.json/get.md)

---

[API](https://skmtc.dev/agentdrives/apis/agentdrives-api.md) · [All operations](https://skmtc.dev/agentdrives/apis/agentdrives-api/llms.txt) · [OpenAPI document](https://skmtc.dev/agentdrives/apis/agentdrives-api/revisions/ae3f2c04ff72?raw)
