Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: AgentDrives Newsletter API
version: 5.20.1
license:
name: CC BY 4.0 for the listings and the facts
url: https://agentdrives.com/data/licence
x-changelog: https://agentdrives.com/data/api-changelog.json
description: 'Getting started, the calls in order: https://agentdrives.com/getting-started. What changed, dated, with removed routes and retired products: https://agentdrives.com/data/api-changelog. Each key has an hourly limit (1,000 requests; an agent''s own unclaimed account''s key: 600), an hour from the key''s first call. Every answer to a keyed call carries RateLimit-Policy ("per-key";q=;w=3600) and RateLimit ("per-key";r=;t=). Over it, every call answers 429 rate_limited with Retry-After (seconds) and a body with limit, window_s, retry_after_s and resets_at: the key is fine, wait and retry. 401 means the key itself is unknown, revoked or expired. Everything a person can do on AgentDrives, an agent can do over HTTP, with no browser and no CAPTCHA. An agent with no address of its own signs up in one call (POST /api/agents/signup: an account and a key at once, and a claim link for its person; until a person claims it or it pays for an Audit, 1 free check a day and an Audit it pays over HTTP 402). Or sign in with an emailed 6-digit code, create an API key, claim your product''s domain, prove it is yours, order drives, cancel, and delete your account. Order of steps: claim (POST /api/claims; an account email on the domain verifies at once, unless the domain is a mailbox provider''s), verify (a code mailed to an address at the domain, a DNS TXT record, a meta tag on the home page or a file), then order. The free check needs no claim (product free: private, it lists nothing); a product whose claim is verified gets one queued. Every other order without a verified claim fails with 403 claim_not_verified and the fix. Only driven products are in the directory. Errors carry a `fix` field. API keys: 1,000 requests per hour each. When online payment is on, an order returns payment.url to pay at; otherwise payment is null and the order is confirmed by email. An Audit, a Tool comparison and a data plan also return payment.agent: pay it without a person over HTTP 402 at POST /api/orders/{id}/payment, with MPP or x402: a card through a Stripe Shared Payment Token, or USDC on Base or Tempo. Every payment has a receipt, and a business that sends its details gets our invoice.'
contact:
email: hello@agentdrives.com
x-guidance: 'Find software an AI agent can use on its own: POST /api/paid/find-tools with {"task": "send an invoice"} answers with ranked products, each with its agent level (0 to 5), whether an agent gets in without a person, and what our agent got done in a real drive. $0.01 a call over x402 or MPP (USDC on Base or Tempo): the first request answers 402 with the challenges. For many calls, buy credit once: POST /api/credits/topup with {"amount_usd": 5} returns an API key that holds 500 calls; send it as x-api-key. The same search is free, rate-limited per IP, at GET /api/find-tools?task=…. To have a product of your own audited: POST /api/agents/signup for a key, claim and prove its domain (POST /api/claims), POST /api/orders with product audit, then pay $499 at POST /api/orders/{id}/payment. A data plan or a Tool comparison needs no domain: POST /api/orders with product builder ($49 a month) or stack3 ($490, with urls and use_case), then pay it the same way.'
servers:
- url: https://agentdrives.com
security:
- apiKey: []
- bearer: []
tags:
- name: Newsletter
description: The monthly report by email
paths:
/api/subscribe:
post:
operationId: subscribe
summary: 'Subscribe to the monthly report (double opt-in: a confirmation mail is sent…'
security: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
source:
type: string
required:
- email
responses:
'200':
description: Confirmation mail sent, or confirmed at once
'400':
description: 'A missing or refused address: error is the line the form shows, fix the same (a mistyped, shared or throwaway address, or a domain that takes no mail)'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: More than 8 sends an hour from one address
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Newsletter
/api/unsubscribe:
get:
operationId: unsubscribe
summary: 'Unsubscribe (the link in every mail): a page with the button that unsubscribes.'
security: []
parameters:
- name: e
in: query
required: true
schema:
type: string
format: email
description: The address, exactly as in the mail's link
- name: t
in: query
required: true
schema:
type: string
description: The link's token, from the mail's link; it fits only this address (and list, keep or k). A wrong or cut one answers 400
- name: k
in: query
required: false
schema:
enum:
- follows
- offers
description: 'Stop one kind of account mail instead of the lists: follows, level changes of the tools you follow; offers, our offers. Its own token'
responses:
'200':
description: The page with the button
content:
text/html:
schema:
type: string
'400':
description: 'invalid link: the link''s e or t is wrong or cut off (a plain-text page). Open the link from the mail again, whole'
content:
text/plain:
schema:
type: string
example: Invalid link
tags:
- Newsletter
post:
operationId: unsubscribeConfirm
summary: The button, and one-click unsubscribe from a mail client (RFC 8058…
security: []
parameters:
- name: e
in: query
required: true
schema:
type: string
format: email
description: The address, exactly as in the mail's link
- name: t
in: query
required: true
schema:
type: string
description: The link's token, from the mail's link; it fits only this address (and list, keep or k). A wrong or cut one answers 400
- name: k
in: query
required: false
schema:
enum:
- follows
- offers
description: 'Stop one kind of account mail instead of the lists: follows, level changes of the tools you follow; offers, our offers. Its own token'
- name: i
in: query
required: false
schema:
type: string
description: The issue the link came from (counted, never needed)
requestBody:
required: false
description: None for the button. A mail client sends List-Unsubscribe=One-Click. e and t in the body are not read
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
List-Unsubscribe:
const: One-Click
responses:
'200':
description: Unsubscribed
content:
text/html:
schema:
type: string
'400':
description: 'invalid link: the link''s e or t is wrong or cut off (a plain-text page). Open the link from the mail again, whole'
content:
text/plain:
schema:
type: string
example: Invalid link
tags:
- Newsletter
/api/subscribe/confirm:
get:
operationId: confirmSubscriptionPage
summary: 'The confirm link in the subscription mail (double opt-in): a page with the…'
security: []
parameters:
- name: e
in: query
required: true
schema:
type: string
format: email
description: The address, exactly as in the mail's link
- name: t
in: query
required: true
schema:
type: string
description: The link's token, from the mail's link; it fits only this address (and list, keep or k). A wrong or cut one answers 400
- name: list
in: query
required: false
schema:
enum:
- launch
description: 'launch: the launch list (one email, on launch day), with its own token. Left out: the monthly report'
- name: keep
in: query
required: false
schema:
enum:
- '1'
description: '1: keep the monthly report coming, from the mail that asks whether you still want it. Its own token'
responses:
'200':
description: 'The page with the button (or: this address unsubscribed and isn''t added again)'
content:
text/html:
schema:
type: string
'400':
description: 'invalid link: the link''s e or t is wrong or cut off (a plain-text page). Open the link from the mail again, whole'
content:
text/plain:
schema:
type: string
example: Invalid link
tags:
- Newsletter
post:
operationId: confirmSubscription
summary: 'The button: confirms the address.'
security: []
parameters:
- name: e
in: query
required: true
schema:
type: string
format: email
description: The address, exactly as in the mail's link
- name: t
in: query
required: true
schema:
type: string
description: The link's token, from the mail's link; it fits only this address (and list, keep or k). A wrong or cut one answers 400
- name: list
in: query
required: false
schema:
enum:
- launch
description: 'launch: the launch list (one email, on launch day), with its own token. Left out: the monthly report'
- name: keep
in: query
required: false
schema:
enum:
- '1'
description: '1: keep the monthly report coming, from the mail that asks whether you still want it. Its own token'
responses:
'200':
description: 'Confirmed (or: this link has expired; an unsubscribed address isn''t added again)'
content:
text/html:
schema:
type: string
'400':
description: 'invalid link: the link''s e or t is wrong or cut off (a plain-text page). Open the link from the mail again, whole'
content:
text/plain:
schema:
type: string
example: Invalid link
tags:
- Newsletter
components:
schemas:
Error:
type: object
description: 'RFC 9457 problem details (application/problem+json) with two extension members: error, machine-readable, and fix, what to do next (the same text as detail). A body sent as JSON that isn''t JSON answers 400 invalid_json on every route'
properties:
type:
type: string
format: uri
description: https://agentdrives.com/openapi.json#<error>
title:
type: string
status:
type: integer
detail:
type: string
error:
type: string
fix:
type: string
description: 'What to do next: every error has one'
required:
- error
- fix
securitySchemes:
apiKey:
type: apiKey
in: header
name: x-api-key
description: 'Each key has an hourly limit (1,000 requests; an agent''s own unclaimed account''s key: 600), an hour from the key''s first call. Every answer to a keyed call carries RateLimit-Policy ("per-key";q=<limit>;w=3600) and RateLimit ("per-key";r=<left>;t=<seconds until the hour ends>). Over it, every call answers 429 rate_limited with Retry-After (seconds) and a body with limit, window_s, retry_after_s and resets_at: the key is fine, wait and retry. 401 means the key itself is unknown, revoked or expired.'
bearer:
type: http
scheme: bearer
x-service-info:
categories:
- developer-tools
- data
docs:
homepage: https://agentdrives.com/data
apiReference: https://agentdrives.com/openapi.json
llms: https://agentdrives.com/llms.txt