{
 "version": "3.3.0",
 "openapi": "https://agentdrives.com/openapi.json",
 "page": "https://agentdrives.com/data/api-changelog",
 "changes": [
  {
   "date": "2026-10-24",
   "version": "3.3.0",
   "surface": "e74c9bea5a10",
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "category_median on GET /api/tools/{slug}.json: each part score's median in the product's category ({median, n} for holds_up and docs_match), only for a category with 5 or more driven products and a part 5 or more of them have; null otherwise."
   ]
  },
  {
   "date": "2026-10-24",
   "version": "3.2.0",
   "surface": "4eb0691f0a9e",
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "rules_version and rules_url on every listing (GET /api/tools/{slug}.json, the directory's pages, GET /api/tools) and every move in GET /api/changes (MCP what_changed): the rules version the level was judged under, its entry on /method/changelog."
   ]
  },
  {
   "date": "2026-10-24",
   "version": "3.1.0",
   "surface": "eade854775db",
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "POST /api/tools/{slug}/reports (MCP report_attempt): an agent reports its own attempt on a product, by API key: the checkpoint it reached, the wall it met and the day. Kept apart from our drives; it never sets or changes a level."
   ]
  },
  {
   "date": "2026-10-24",
   "version": "3.0.0",
   "surface": "be06523409a6",
   "removed": [],
   "retired": [],
   "changed": [
    "GET /api/tools.json is page 1 of 100 products, no longer every product: page, pages, per_page, total, next, prev and full say where the rest is."
   ],
   "added": [
    "GET /api/tools/pages/{n}.json: the directory's pages after the first, 100 products each.",
    "GET /api/tools-{day}.json: every product in one file, the day in its name."
   ]
  },
  {
   "date": "2026-10-24",
   "version": "2.3.0",
   "surface": "966332dc1363",
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "rank, rank_of, rank_change and rank_since on every product in /api/tools.json, /api/tools and /api/tools/{slug}.json: its place in its category among the products our agent got into on its own, from drive results only, and how it last moved."
   ]
  },
  {
   "date": "2026-10-24",
   "version": "2.2.0",
   "surface": "2ae068fcc198",
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "GET /api/stats: how many products we drove, how many domains our newest survey looked at and how many products wait for a drive."
   ]
  },
  {
   "date": "2026-10-23",
   "version": "2.1.0",
   "surface": "d66c67e1b655",
   "removed": [],
   "retired": [],
   "changed": [
    "GET /api/me/delete: kept and a refund's domain can be null, as the answers were; credit_cents and credit_line are described.",
    "POST /api/orders/{id}/payment's 402: order.url is null for a data plan, and order.name is described.",
    "POST /api/orders 201: payment.url is null when the order is paid over HTTP 402 only."
   ],
   "added": []
  },
  {
   "date": "2026-10-23",
   "version": "2.0.0",
   "surface": "50a403b841a0",
   "removed": [
    "POST /api/billing/cancel: the Monthly drive's cancel. It answers 404 not_found; nothing is left to cancel."
   ],
   "retired": [],
   "changed": [
    "Every operation lists its error answers as application/problem+json, each with error and fix.",
    "API keys show their hourly limit (1,000 requests); a 429 waits only until the hour ends (Retry-After, resets_at).",
    "Directory search gives the true total of matches and pages past 100 with offset.",
    "info.version now moves with this changelog. 2.0.0 follows 1.4.0 (14 Oct): routes were removed since then."
   ],
   "added": [
    "GET /api/orders/{id}: one order, as GET /api/orders lists it."
   ]
  },
  {
   "date": "2026-10-22",
   "version": null,
   "surface": null,
   "removed": [],
   "retired": [
    "The Stack check is now called the Tool comparison. Its product ids stay stack3 and stack."
   ],
   "changed": [],
   "added": [
    "GET /api/a2a and POST /api/a2a: the A2A agent card and its JSON-RPC endpoint (search the directory, get a listing, ask for a free drive).",
    "POST /api/claims/{id}/directory: show your product as In Audit while its Audit runs, or keep it private until it is Audited."
   ]
  },
  {
   "date": "2026-10-21",
   "version": null,
   "surface": null,
   "removed": [
    "POST /api/paid/detail/{slug}: one product's attempt log, sold per call from 19 Oct. It answers 410 gone; the verified owner reads it at GET /api/detail/{slug}."
   ],
   "retired": [
    "Keep it driven and Monitor: product watch and keep answer 400 product_retired, as the Monthly drive does."
   ],
   "changed": [
    "GET /api/detail/{slug} answers only the product's verified owner; anyone else gets 403 owner_only with the public listing.",
    "A key over its hourly limit gets 429 rate_limited with Retry-After, no longer 401. An unknown or revoked key stays 401."
   ],
   "added": [
    "GET /api/payments: each drive's result at the pay step, dated.",
    "GET /api/bot-checks: per product and vendor, whether a bot check stopped our agent."
   ]
  },
  {
   "date": "2026-10-20",
   "version": null,
   "surface": null,
   "removed": [
    "POST /api/billing/switch: the Monthly drive's switch between monthly and yearly (it answered 410). It answers 404 not_found."
   ],
   "retired": [],
   "changed": [
    "GET /api/me has no monthly field, and a new order's 201 no monthly.starts."
   ],
   "added": [
    "GET /api/keys: your API keys.",
    "The account's own routes: GET /api/auth/get-session, GET /api/auth/list-sessions, POST /api/auth/update-user, POST /api/auth/change-password, POST /api/auth/link-social, POST /api/auth/revoke-session, POST /api/auth/revoke-other-sessions, POST /api/me/password and GET /api/auth-config.",
    "PATCH /api/claims/{id}: link your product to its directory entry. DELETE /api/claims/{id}: remove a claim."
   ]
  },
  {
   "date": "2026-10-19",
   "version": null,
   "surface": null,
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "GET /api/tools: the directory, filtered, with the same filters as the MCP tool search_tools.",
    "GET /api/capabilities: what an agent can do, by domain, for find-tools.",
    "GET /api/categories.json: the areas and categories with stable ids.",
    "GET /api/changes: level moves between drives, with the cause.",
    "GET /api/export: every published listing in one file, on Team.",
    "GET /api/follows, POST /api/follows, DELETE /api/follows/{tool} and PUT /api/follows/webhook: hear when a product's level changes.",
    "GET /api/orders/{id}/report: an order's report as Markdown.",
    "GET /api/detail/{slug}: your own product's newest drive in full.",
    "POST /api/claims/{id}/reply: reply to your product's drive as its owner.",
    "GET /api/billing/receipt/{id}: a payment's receipt.",
    "GET /api/subscribe/confirm, POST /api/subscribe/confirm and POST /api/unsubscribe: the monthly report by email."
   ]
  },
  {
   "date": "2026-10-18",
   "version": null,
   "surface": null,
   "removed": [],
   "retired": [
    "The Monthly drive: product monthly and yearly answer 400 product_retired, and none runs.",
    "Findings and the Full report: product drive, findings, quick and report, and any upgrade_from, answer 400 product_retired. Order product audit, the Audit Drive."
   ],
   "changed": [],
   "added": [
    "GET /api/orders/{id}/fixes and POST /api/orders/{id}/fixes/{n}: an Audit's fix list.",
    "POST /api/orders/{id}/finish: end an Audit Drive early once a drive found L5.",
    "GET /api/billing/renewals, POST /api/billing/renewals/{id}/cancel and POST /api/billing/renewals/{id}/resume: an Audit's renewal.",
    "GET /api/explore and GET /api/explore/options: filter the whole record.",
    "GET /api/id/{id}: a company, product or surface by its stable id."
   ]
  },
  {
   "date": "2026-10-17",
   "version": null,
   "surface": null,
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "POST /api/auth/email-otp/verify-email: verify the account's address with the emailed code."
   ]
  },
  {
   "date": "2026-10-16",
   "version": null,
   "surface": null,
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "GET /api/claims/{id}/fixed and POST /api/claims/{id}/fixed: a verified owner's free drive after a fix.",
    "GET /api/me/reports/{slug}: what our agent found in your product's latest drive, counted."
   ]
  },
  {
   "date": "2026-10-15",
   "version": null,
   "surface": null,
   "removed": [],
   "retired": [],
   "changed": [],
   "added": [
    "POST /api/orders/{id}/checkout: reopen an unpaid order's card checkout.",
    "GET /api/credits, POST /api/credits/topup, POST /api/credits/rotate and GET /api/credits/{id}/receipt: prepaid credit for paid calls, and a new key for the same credit."
   ]
  }
 ]
}