Directory

One drive with its evidence: the level, the five outcomes, the part scores, every checkpoint and every attempt

Changed on
get/api/tools/{slug}.json

Request

  • Base URL: https://agentdrives.com
  • URL: https://agentdrives.com/api/tools/{slug}.json
  • Auth: none required

Path parameters

slugstring required

Response

Drive

idstring

The product's stable id: never reused, kept when its slug or address changes. Resolve it at /api/id/{id}

slugstring

The product's address in the directory (can change; id doesn't)

namestring
domainstring
iconstring nullable

The product's logo, a path on this site

categorystring

The category id

category_namestring
tested_atstring date

The day of the drive behind the level

urlstring uri

The product's page here

jsonstring uri

Its full record: /api/tools/{slug}.json

draftboolean

Not reviewed yet: the result may still change

origin'editorial' | 'owner'

editorial: we picked the product; owner: its owner ordered the drive

disclosurestring

Only on a drive its owner paid for: the label to show with it

staleboolean

The newest drive is older than 182 days

level_selfhostinteger nullable

The level of the self-hosted edition, when it was driven (null: not driven)

summarystring

What an agent can do with it, in a sentence or two

first_blockerstring

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

corestring nullable

Core features done of all, as done/total

paystring nullable

The pay grade, P0 to P5 (n/a: nothing to pay for)

lets_agentstring 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

levelinteger

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_namestring
minutesnumber nullable

Minutes to the first call on the fastest way in; within a level, the order after work done

stopstring 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_coreinteger 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

badgesstring[]

agent-can-buy: an agent paid through an agent-native rail, proven from our side; agent-can-leave: leaves on its own

pays_withstring[]

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)

paidboolean

Our side made and proved a payment on one of them (the transaction is in the tool's pay_options.paid)

blocks_agentstring 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_typeunknown
monitoredboolean

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)

same_level_drivesinteger

The latest drives in a row that gave this level

drivesinteger

Every drive of the product so far

ways_instring[]

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)

scoresobject

The measures behind the parts: coverage, reliability, resilience, setup, and after the full surface audit surface_coverage, docs_accuracy, docs_completeness

methodologyinteger

The scoring rules that made this result

rules_datestring date

The date of those rules, as pages name them ("Rules of ..."; now 2026-10-19). Every set of rules: /method/changelog

nothing_to_payboolean

The product has nothing to pay for: L5 says so in its own words

checkoutobject nullable

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)

docsobject nullable

The docs read and judged by our side 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)

ladderobject

The nine checkpoints, each with status and note, in the order of the agent's eight steps (Find → Learn → Sign up → Get a key → Do the work → Pay → Cancel → Leave; Find: none, it is the Agent-ready setup score; Learn: 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 side proved (paid); a rail only seen has exercised false, its grade capped at P3 and the grade it would give in detected_grade

attemptsobject[]

Example response

{
  "disclosure": "Owner-paid drive",
  "core": "8/8",
  "pay": "P2",
  "level_name": "Does the work",
  "parts": {
    "standards": [
      {
        "standard": "OpenAPI"
      }
    ]
  },
  "access": [
    {
      "label": "Pay per call",
      "core": "8/8"
    }
  ],
  "works_assisted": {
    "core": "5/8"
  },
  "routes": [
    {
      "route": "sso_github"
    }
  ],
  "pay_options": {
    "options": [
      {
        "id": "x402"
      }
    ],
    "paid": {
      "network": "eip155:8453"
    },
    "owner_fixes": [
      {
        "title": "Accept x402 or MPP on your API"
      }
    ]
  },
  "after_wall": {
    "label": "measured after a human cleared sign-up"
  }
}

Changes

    • info

      added the optional property ////// to the response with the status

    • info

      added the optional property ////// to the response with the status

    • warning

      added the new agent enum value to the /// response property for the response status

    • warning

      added the new not_counted enum value to the /// response property for the response status

    • info

      added the optional property //// to the response with the status