{
 "slug": "serpapi",
 "name": "SerpApi",
 "url": "https://serpapi.com",
 "domain": "serpapi.com",
 "category": "search-apis",
 "category_name": "Search APIs",
 "tested_at": "2026-10-12",
 "run": "20261012T094719Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T034112Z",
   "date": "2026-10-06",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  },
  {
   "run": "20261012T094719Z",
   "date": "2026-10-12",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 3,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "obey"
   }
  }
 ],
 "level": 1,
 "level_name": "Needs a person",
 "level_selfhost": null,
 "entry": "closed",
 "door": {
  "passed": 0,
  "tries": 2,
  "self_start": false
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: llms.txt and an MCP server",
   "have": [
    "llms_txt",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "person",
   "label": "A person sets it up",
   "routes": [],
   "minutes": null,
   "core": null
  }
 ],
 "minutes": null,
 "next": {
  "to": 2,
  "text": "Next: let an agent sign up on its own"
 },
 "stop": "signup",
 "core": "0/7",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 75,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 75,
  "security": "private",
  "standards": [
   {
    "standard": "MCP",
    "state": "current",
    "behind": null,
    "value": "2026-07-28"
   },
   {
    "standard": "MCP discovery",
    "state": "current",
    "behind": null,
    "value": "ok"
   }
  ]
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 3,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "076cd4c65a1a",
  "kb_version": "3+overlay-1353601952",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 3,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "obey"
 },
 "same_level_drives": 2,
 "drives": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": {
  "rung": "signup",
  "vendor": "Google reCAPTCHA v2",
  "visible": true,
  "type": "challenge",
  "human": null,
  "how": "Check the Web Bot Auth signature on the sign-up request and skip reCAPTCHA (or lower the score threshold) for signed agents; or offer a documented sign-up API with email verification.",
  "signed": true
 },
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "captcha"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "captcha",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt, .md versions of every docs page, and Accept: text/markdown all work. No OpenAPI (/openapi.json 404)."
  },
  "signup": {
   "status": "human",
   "note": "Web form only (or GitHub/Google OAuth). After submit a reCAPTCHA picture puzzle ('Select all squares with bicycles') appeared. No documented API or CLI sign-up."
  },
  "verify": {
   "status": "",
   "note": "Not reached: no account.",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "Not reached: the API key is shown on /manage-api-key after login. The CLI's 'serpapi login' only stores a key you already have. No API to create, scope or revoke keys.",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "No key: /account.json gave 401 'Invalid API key'. MCP search gave 'Missing API key'. robots.txt also disallows /search? and /search.json for all user agents, which covers the documented REST endpoint.",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "Not reached: no key.",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [
    "web plan page (checkout not seen without an account)"
   ],
   "rail_ids": [
    "other"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "Free plan (250 searches/month); paid plans from $25/mo are bought on the logged-in plan page. No 402 challenge, no x402/MPP, no billing API, CLI or MCP payment tool. We paid nothing. The checkout processor and whether it needs a card could not be seen without an account. Graded as the likely ceiling: a person-run card checkout. [INFERENCE] not confirmed.",
   "reached": false
  },
  "cancel": {
   "status": "",
   "note": "Not tested: no account or plan was ever started, because sign-up stopped at the reCAPTCHA puzzle. pricing.md says cancel is available any time on the web plan page, but this was never reached.",
   "docs_grade": "",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "No account was created. No documented API or CLI to delete an account.",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-12",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": false,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": false,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST GET /search with api_key, 100+ engines; /search? disallowed in robots.txt",
  "mcp": "official, 3 tools (search, search_table, search_dashboard), engine schema resources",
  "cli": "serpapi-cli, interactive login",
  "openapi": "none"
 },
 "can_do": [
  "Read the docs as Markdown (llms.txt, .md pages, Accept: text/markdown)",
  "Look up canonical Google locations without an account (/locations.json)",
  "Read per-engine parameter schemas over MCP without an account"
 ],
 "cannot_do": [
  {
   "what": "Create an account",
   "why": "reCAPTCHA picture puzzle on the sign-up form; no API sign-up"
  },
  {
   "what": "Run any search",
   "why": "Needs an API key from an account; REST /search? is also disallowed by robots.txt"
  },
  {
   "what": "Use the Playground or UULE tool logged out",
   "why": "Invisible reCAPTCHA rejected our agent's browser ('We are unable to load ReCaptcha and verify your browser')"
  },
  {
   "what": "Create, scope or revoke API keys",
   "why": "Web page only"
  },
  {
   "what": "Delete the account",
   "why": "No account was created; no documented API route"
  }
 ],
 "blockers": [
  "reCAPTCHA picture puzzle on sign-up",
  "robots.txt disallows /search? and /search.json for all user agents"
 ],
 "tips_for_owner": [
  "Let verified agents sign up without a puzzle",
  "Allow agents on /search in robots.txt",
  "Add an API for API keys",
  "Serve an OpenAPI description",
  "Accept x402 or MPP on /search",
  "Document account deletion"
 ],
 "tips_for_agents": [
  "Use the official MCP server at https://mcp.serpapi.com/mcp (2026-07-28, stateless); key in the path or a Bearer header.",
  "Read serpapi://engines/{engine} before building params.",
  "Send Mcp-Name matching the tool name or resource uri.",
  "/locations.json needs no key.",
  "Every docs page has a .md version."
 ],
 "selfhost": null,
 "summary": "SerpApi has agent-friendly docs (llms.txt, Markdown pages) and a current, stateless MCP server, but an agent cannot get an account: the sign-up form shows a reCAPTCHA picture puzzle and there is no API sign-up. Without a key no search works, and robots.txt also disallows the documented /search endpoint. Only the keyless parts worked: locations lookup and the MCP engine schemas.",
 "wall": "reCAPTCHA picture puzzle on sign-up",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "SerpApi is a search-results API with good documentation for AI agents (Markdown docs, llms.txt, a modern MCP server), but an agent cannot create an account on its own: the sign-up form shows a picture puzzle. Without an account, no search can run.",
  "can_do": [
   "Read all the documentation in plain text/Markdown",
   "Look up standardized location names for cities (no account needed)",
   "Read the parameter guide for each search type through the MCP connector (no account needed)"
  ],
  "cannot_do": [
   {
    "what": "Create an account",
    "why": "A picture-identification puzzle appears"
   },
   {
    "what": "Run any search",
    "why": "Needs a key from an account, which could not be created"
   },
   {
    "what": "Pay for a plan",
    "why": "Paying requires logging into an account first, and sign-up failed"
   },
   {
    "what": "Delete an account",
    "why": "No account was ever created, and there's no documented way to delete one"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "ZeroTrace",
   "plan": "Cloud 1M+",
   "evidence": "pricing.md plan table"
  },
  {
   "capability": "Automatic Early Renewal",
   "plan": "paid",
   "evidence": "pricing.md FAQ"
  },
  {
   "capability": "Extra credits",
   "plan": "paid",
   "evidence": "pricing.md FAQ"
  },
  {
   "capability": "Speed modes",
   "plan": "paid multiplier",
   "evidence": "pricing.md Speed Modes"
  },
  {
   "capability": "Legal Shield",
   "plan": "Production+",
   "evidence": "pricing.md plan table"
  },
  {
   "capability": "Priority Support",
   "plan": "Cloud 1M+",
   "evidence": "pricing.md plan table"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Search",
   "capability": "Run a real-time Google search and get structured JSON results",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?engine=google",
    "mcp": "search",
    "cli": "serpapi search",
    "ui": "Playground"
   },
   "check": "Response JSON contains search_metadata.status == Success and organic_results array",
   "source": "https://serpapi.com/search-api"
  },
  {
   "id": "cap-02",
   "group": "Search",
   "capability": "Search 20+ other engines (Bing, Amazon, eBay, YouTube, Walmart, Yelp, Yahoo, DuckDuckGo, Baidu, Yandex, Zillow, TripAdvisor, Home Depot, Apple App Store/Maps, Facebook, Instagram, Naver, Brave) besides Google",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?engine={engine}",
    "mcp": "search (params.engine)",
    "cli": "serpapi search --engine",
    "ui": "Playground"
   },
   "check": "Response search_metadata.engine matches requested engine and status Success",
   "source": "https://serpapi.com/playground; https://github.com/serpapi/serpapi-mcp"
  },
  {
   "id": "cap-03",
   "group": "Search",
   "capability": "Query specialized Google verticals (Maps, Images, News, Shopping, Local, Videos, Scholar, Patents, Trends, Flights, Hotels, Jobs, Lens, Finance, Play Store, Sports, Events, Autocomplete, AI Overview, AI Mode)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?engine=google_maps|google_scholar|google_trends|...",
    "mcp": "search (params.engine)",
    "cli": "serpapi search --engine",
    "ui": "Playground"
   },
   "check": "Response JSON contains the engine-specific top-level key (e.g. local_results, organic_results for scholar, interest_over_time for trends)",
   "source": "https://serpapi.com/locations-api; https://serpapi.com/google-maps-api; https://serpapi.com/google-scholar-api; https://serpapi.com/google-trends-api"
  },
  {
   "id": "cap-04",
   "group": "Search",
   "capability": "Localize a search by city/region, GPS coordinates, or radius",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?location=|lat=&lon=|uule=&radius=",
    "mcp": "search (params.location)",
    "cli": "serpapi search --location",
    "ui": "Playground"
   },
   "check": "search_information.results_for in response reflects requested location/area",
   "source": "https://serpapi.com/search-api"
  },
  {
   "id": "cap-05",
   "group": "Search",
   "capability": "Localize a search by country, language, and site-restriction (gl/hl/cr/lr/google_domain)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?gl=&hl=&cr=&lr=&google_domain=",
    "mcp": "search (params)",
    "cli": "serpapi search --gl --hl",
    "ui": "Playground"
   },
   "check": "Response organic_results titles/snippets are in the requested language/country edition",
   "source": "https://serpapi.com/search-api"
  },
  {
   "id": "cap-06",
   "group": "Search",
   "capability": "Choose the simulated device (desktop, tablet, mobile) for a search",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?device=desktop|tablet|mobile",
    "mcp": "search (params.device)",
    "cli": "serpapi search --device",
    "ui": "Playground"
   },
   "check": "search_metadata.google_url or response layout reflects requested device viewport",
   "source": "https://serpapi.com/search-api"
  },
  {
   "id": "cap-07",
   "group": "Search",
   "capability": "Paginate through search result pages",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?start=N",
    "mcp": "search (params.start)",
    "cli": "serpapi search --start",
    "ui": "Playground"
   },
   "check": "pagination.current in response equals the requested page number",
   "source": "https://serpapi.com/search-api"
  },
  {
   "id": "cap-08",
   "group": "Search output",
   "capability": "Choose response format: JSON, raw HTML, or LLM-optimized Markdown",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?output=json|html|md",
    "mcp": "search (params.output)",
    "cli": "serpapi search --output",
    "ui": null
   },
   "check": "Content-Type / body shape of response matches requested output (markdown text vs JSON object vs raw HTML)",
   "source": "https://serpapi.com/search-api; https://serpapi.com/markdown-output.md"
  },
  {
   "id": "cap-09",
   "group": "Search output",
   "capability": "Restrict the JSON response to only selected fields to shrink payload",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?json_restrictor=...",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response JSON keys are limited to exactly the fields named in json_restrictor",
   "source": "https://serpapi.com/json-restrictor"
  },
  {
   "id": "cap-10",
   "group": "Search output",
   "capability": "Get pixel coordinates of result elements on the rendered results page",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?output=json_with_pixel_position",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response elements include pixel_position x/y fields",
   "source": "https://serpapi.com/pixel-position-api; https://serpapi.com/search-archive-api"
  },
  {
   "id": "cap-11",
   "group": "Search execution",
   "capability": "Force a fresh (non-cached) search instead of serving a cached result",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?no_cache=true",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "search_metadata.cached is false and a new search id is issued for an identical query within the 1h cache window",
   "source": "https://serpapi.com/search-api"
  },
  {
   "id": "cap-12",
   "group": "Search execution",
   "capability": "Submit a search asynchronously and retrieve results later",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /search?async=true then GET /searches/{id}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Initial response search_metadata.status is Queued/Processing; later GET /searches/{id}.json shows status Success with results",
   "source": "https://serpapi.com/search-api; https://serpapi.com/search-archive-api"
  },
  {
   "id": "cap-13",
   "group": "Search execution",
   "capability": "Retrieve a previously run search's JSON or HTML by its search ID (up to 31 days)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /searches/{search_id}.json|.html",
    "mcp": null,
    "cli": null,
    "ui": "Your Account > search history"
   },
   "check": "GET /searches/{id}.json returns the same search_metadata.id and result content as the original search",
   "source": "https://serpapi.com/search-archive-api"
  },
  {
   "id": "cap-14",
   "group": "Search execution",
   "capability": "Look up precise canonicalized location codes/names for use in searches",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /locations.json",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response is a JSON array of location objects with canonical_name and google_id matching the query string",
   "source": "https://serpapi.com/locations-api"
  },
  {
   "id": "cap-15",
   "group": "Search execution",
   "capability": "Convert a location name or GPS coordinates to/from a Google 'uule' location token",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "UULE Generator tool"
   },
   "check": "Tool page returns a uule string for an input location that decodes back to the same place",
   "source": "https://serpapi.com/tools/uule-generator"
  },
  {
   "id": "cap-16",
   "group": "Search output",
   "capability": "Get an interactive table/dashboard UI rendering of search results inside an MCP-Apps-capable AI client",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "search_table, search_dashboard",
    "cli": null,
    "ui": "MCP host UI"
   },
   "check": "MCP host renders an interactive UI widget instead of raw JSON/text for the search_table/search_dashboard tool call",
   "source": "https://github.com/serpapi/serpapi-mcp"
  },
  {
   "id": "cap-17",
   "group": "Search output",
   "capability": "Browse per-engine parameter schemas before building a query",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "resource serpapi://engines, serpapi://engines/{engine}",
    "cli": null,
    "ui": "search-api docs pages"
   },
   "check": "MCP resource read for serpapi://engines/google_flights returns the engine's required/optional parameter list",
   "source": "https://github.com/serpapi/serpapi-mcp"
  },
  {
   "id": "cap-18",
   "group": "Search execution",
   "capability": "Test queries across engines interactively in the browser and export the equivalent code",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Playground"
   },
   "check": "Playground page returns live results panel and an 'Export To Code' snippet for the selected engine/query",
   "source": "https://serpapi.com/playground"
  },
  {
   "id": "cap-19",
   "group": "Account",
   "capability": "Check account usage: searches used, searches left, renewal date, throughput limit",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /account.json",
    "mcp": null,
    "cli": null,
    "ui": "Your Account dashboard"
   },
   "check": "Response JSON contains this_month_usage, plan_searches_left, account_rate_limit_per_hour for the authenticated account",
   "source": "https://serpapi.com/account-api"
  },
  {
   "id": "cap-20",
   "group": "Account",
   "capability": "Enable ZeroTrace mode so a search's parameters/results are not retained on SerpApi's servers",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "GET /search?zero_trace=true",
    "mcp": null,
    "cli": null,
    "ui": "Plan settings"
   },
   "check": "Subsequent GET /searches/{id} for a zero_trace search returns not-found/no stored data instead of the result",
   "source": "https://serpapi.com/zero-trace-mode; https://serpapi.com/pricing"
  },
  {
   "id": "cap-21",
   "group": "Account",
   "capability": "Toggle Automatic Early Renewal so the plan renews once the monthly quota is exhausted",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Your Plan page"
   },
   "check": "Account API plan_renewal_date and plan_searches_left reset immediately after quota exhaustion when toggle is on",
   "source": "https://serpapi.com/pricing"
  },
  {
   "id": "cap-22",
   "group": "Account",
   "capability": "Upgrade, downgrade, or cancel the subscription plan at any time",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Your Plan page"
   },
   "check": "Account API plan_id/plan_name changes to the newly selected plan immediately after the change",
   "source": "https://serpapi.com/pricing"
  },
  {
   "id": "cap-23",
   "group": "Account",
   "capability": "Purchase extra one-off search credits beyond the monthly plan",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Extra Credits page"
   },
   "check": "Account API extra_credits field increases by the purchased amount",
   "source": "https://serpapi.com/extra-credits; https://serpapi.com/account-api"
  },
  {
   "id": "cap-24",
   "group": "Account",
   "capability": "Enable a paid Speed Mode (Ludicrous Speed / Ludicrous Speed Max) for faster response times",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Your Plan page"
   },
   "check": "search_metadata.total_time_taken drops and account billing reflects the 2x/4x price multiplier after enabling",
   "source": "https://serpapi.com/pricing"
  },
  {
   "id": "cap-25",
   "group": "Account",
   "capability": "Carry U.S. Legal Shield coverage for scraped search data on qualifying plans",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Pricing / Plan page"
   },
   "check": "Pricing page / Your Plan page shows Legal Shield: Yes for the account's plan tier",
   "source": "https://serpapi.com/pricing"
  },
  {
   "id": "cap-26",
   "group": "Account",
   "capability": "Get Priority Support from SerpApi's team on qualifying plans",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Pricing / Plan page"
   },
   "check": "Pricing page / Your Plan page shows Priority Support: Yes for the account's plan tier",
   "source": "https://serpapi.com/pricing"
  },
  {
   "id": "cap-27",
   "group": "Account",
   "capability": "Rotate/manage the private API key used to authenticate requests",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Manage API Key page"
   },
   "check": "A newly generated key authenticates GET /account.json while the old key is rejected",
   "source": "https://serpapi.com/manage-api-key"
  }
 ],
 "attempts": [
  {
   "t": "00:43",
   "cap": "discovery",
   "capability": "robots.txt",
   "task": "Read robots.txt",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "User-agent: * Disallow: /samples/ /searches/ /search? /search.json /search.html; no Content-Usage or Content-signal lines",
   "notes": "The documented REST endpoint GET /search?... and the archive /searches/{id} are disallowed for all user agents.",
   "documented": true
  },
  {
   "t": "00:43",
   "cap": "discovery",
   "capability": "llms.txt",
   "task": "Fetch /llms.txt",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "200 text, H1 \"# SerpApi\", links to .md docs per engine, sign-up URL /users/sign_up, says output=md, /search.md or Accept: text/markdown",
   "documented": true
  },
  {
   "t": "00:43",
   "cap": "discovery",
   "capability": "markdown docs",
   "task": "Accept: text/markdown on /search-api and /search-api.md",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "Both 200 content-type text/markdown; vary: accept-encoding only (no Vary: Accept)",
   "documented": true
  },
  {
   "t": "00:43",
   "cap": "discovery",
   "capability": "well-known cards",
   "task": "ai-catalog, agent-card, agent.json, mcp server-card, auth.md, SKILL.md, oauth metadata",
   "route": "api",
   "result": "failed",
   "verified": true,
   "evidence": "All 404 text/html on serpapi.com; mcp.serpapi.com/mcp/server-card 404; /openapi.json 404 (pay_probe)",
   "documented": true
  },
  {
   "t": "00:43",
   "cap": "discovery",
   "capability": "MCP server/discover",
   "task": "POST server/discover 2026-07-28 to https://mcp.serpapi.com/mcp",
   "route": "mcp",
   "result": "done",
   "verified": true,
   "evidence": "200 application/json, supportedVersions [\"2026-07-28\"], serverInfo SerpApi MCP Server 2.0.0, server uvicorn, extensions io.modelcontextprotocol/ui; no auth needed for discover; /.well-known/oauth-protected-resource 404",
   "documented": true
  },
  {
   "cap": "signup",
   "capability": "sign up",
   "task": "Create an account with the agent's inbox",
   "route": "api",
   "result": "failed",
   "verified": true,
   "evidence": "GET https://serpapi.com/users/sign_up: web form only (Full Name, Email, Password, Confirm, plus GitHub/Google OAuth) with reCAPTCHA; no documented API/CLI sign-up (llms.txt lists only the web URL)",
   "notes": "Headless route: none documented; form needs a reCAPTCHA token.",
   "t": "01:56",
   "documented": true
  },
  {
   "cap": "signup",
   "capability": "sign up",
   "task": "Submit the sign-up form in the browser",
   "route": "browser",
   "result": "blocked",
   "verified": true,
   "evidence": "pw: form filled, click Sign Up -> reCAPTCHA image puzzle \"Select all squares with bicycles\" (visible_challenge true, shots/003.png).",
   "notes": "Wall: reCAPTCHA v2 picture puzzle on sign-up. Not solved, per rules.",
   "t": "01:57",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "discovery",
   "capability": "aipref",
   "task": "Content-Usage in robots.txt and headers",
   "route": "api",
   "result": "failed",
   "verified": true,
   "evidence": "robots.txt has no Content-Usage/Content-signal line; no Content-Usage response header on / or /search-api",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "discovery",
   "capability": "MCP tools/list",
   "task": "List tools and resources keyless",
   "route": "mcp",
   "result": "done",
   "verified": true,
   "evidence": "3 tools: search, search_table, search_dashboard (params object); resources serpapi://engines index + 2 MCP-App UI renderers; tools/call search without key -> isError \"Missing API key. Use path format /{API_KEY}/mcp or Authorization: Bearer {API_KEY} header.\"",
   "quality": {
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "pay",
   "capability": "pay step public probes",
   "task": "Read pay_probe/pay_tx; check pricing.md for checkout/billing API/agent rails",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "pay_probe: no 402 challenges, no x402/mpp/agents subdomains (no such host), no /openapi.json, /.well-known/ucp 404, no registry listings; pay_tx: refused, no 402 on product domain. pricing.md: Free $0/250 searches, paid plans $25+/mo, \"Month-to-month. Cancel anytime\", upgrade/downgrade/cancel on the account plan page; no billing API, CLI or MCP payment tool documented. Checkout processor not visible without an account.",
   "notes": "Free plan exists; paid plans only via the logged-in web plan page.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "verify",
   "capability": "verify email",
   "task": "Verify sign-up mail",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "credentials",
   "capability": "API key",
   "task": "Get API key; create a scoped key headless",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with. Docs: key is shown on the web page /manage-api-key (needs login; manage-api-key.md answers 401); serpapi-cli README: \"serpapi login\" is an interactive flow saving an existing key; no documented API to create, scope or revoke keys.",
   "key": "create",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "first_call",
   "capability": "first API call",
   "task": "GET /account.json and MCP search",
   "route": "api",
   "result": "blocked",
   "verified": true,
   "evidence": "GET https://serpapi.com/account.json without key -> 401 {\"error\":\"Invalid API key. Your API key should be here: https://serpapi.com/manage-api-key\"}; robots.txt also disallows /search? and /search.json for all user agents.",
   "quality": {
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "first_action",
   "capability": "first real action",
   "task": "Run a search",
   "route": "mcp",
   "result": "blocked",
   "verified": true,
   "evidence": "MCP tools/call search keyless -> \"Missing API key\"; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-01",
   "capability": "Google search",
   "task": "Run it via MCP search tool",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "MCP search needs an API key (\"Missing API key\"); REST /search? Is disallowed by robots.txt; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "quality": {
    "docs_url": "https://serpapi.com/search-api.md",
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-02",
   "capability": "other engines",
   "task": "Run it via MCP search tool",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "MCP search needs an API key (\"Missing API key\"); REST /search? Is disallowed by robots.txt; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "quality": {
    "docs_url": "https://serpapi.com/search-api.md",
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-03",
   "capability": "Google verticals",
   "task": "Run it via MCP search tool",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "MCP search needs an API key (\"Missing API key\"); REST /search? Is disallowed by robots.txt; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "quality": {
    "docs_url": "https://serpapi.com/search-api.md",
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-04",
   "capability": "localize by location/GPS",
   "task": "Run it via MCP search tool",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "MCP search needs an API key (\"Missing API key\"); REST /search? Is disallowed by robots.txt; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "quality": {
    "docs_url": "https://serpapi.com/search-api.md",
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-05",
   "capability": "gl/hl localization",
   "task": "Run it via MCP search tool",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "MCP search needs an API key (\"Missing API key\"); REST /search? Is disallowed by robots.txt; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "quality": {
    "docs_url": "https://serpapi.com/search-api.md",
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-06",
   "capability": "device",
   "task": "Run it via MCP search tool",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "MCP search needs an API key (\"Missing API key\"); REST /search? Is disallowed by robots.txt; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "quality": {
    "docs_url": "https://serpapi.com/search-api.md",
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-07",
   "capability": "pagination",
   "task": "Run it via MCP search tool",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "MCP search needs an API key (\"Missing API key\"); REST /search? Is disallowed by robots.txt; No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "quality": {
    "docs_url": "https://serpapi.com/search-api.md",
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-08",
   "capability": "output json/html/md",
   "task": "Try it once",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-09",
   "capability": "json_restrictor",
   "task": "Try it once",
   "route": "api",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-10",
   "capability": "pixel position",
   "task": "Try it once",
   "route": "api",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-11",
   "capability": "no_cache",
   "task": "Try it once",
   "route": "api",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-12",
   "capability": "async search",
   "task": "Try it once",
   "route": "api",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with. /searches/ is also disallowed by robots.txt.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-13",
   "capability": "search archive",
   "task": "Try it once",
   "route": "api",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with. /searches/ is also disallowed by robots.txt.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-16",
   "capability": "search_table/search_dashboard MCP App",
   "task": "Try it once",
   "route": "mcp",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-19",
   "capability": "account usage",
   "task": "Try it once",
   "route": "api",
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with. GET /account.json keyless -> 401 Invalid API key.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-14",
   "capability": "locations lookup",
   "task": "Find canonical location for Austin",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "GET https://serpapi.com/locations.json?q=Austin&limit=3 -> 200 JSON array; first: canonical_name \"Austin,Texas,United States\", google_id 1026201, target_type City (no key needed, as the CLI README says)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://serpapi.com/locations-api"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-17",
   "capability": "per-engine parameter schemas",
   "task": "Read serpapi://engines/google_flights over MCP",
   "route": "mcp",
   "result": "done",
   "verified": true,
   "evidence": "resources/read serpapi://engines/google_flights (keyless) -> application/json with engine google_flights and params incl. departure_id with description. First try without Mcp-Name header for the uri -> 400 -32020 \"mcp-name header does not match the request body's 'uri' parameter\" (clear, fixed).",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://github.com/serpapi/serpapi-mcp",
    "error_legibility": "clear",
    "recoverable": "yes"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-15",
   "capability": "UULE generator",
   "task": "Encode \"Austin,Texas,United States\" in the UULE tool",
   "route": "browser",
   "result": "failed",
   "verified": true,
   "evidence": "pw on /tools/uule-generator: filled Canonical Name, clicked Encode; no result shown (shots/012-013); page loads reCAPTCHA; nothing explained.",
   "quality": {
    "error_legibility": "silent"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-18",
   "capability": "Playground",
   "task": "Search \"coffee\" in the Playground logged out",
   "route": "browser",
   "result": "blocked",
   "verified": true,
   "evidence": "pw /playground Search -> {\"error\":\"We are unable to load ReCaptcha and verify your browser.\"} and \"Register / Sign In for a full access to our APIs.\" (shots/015.png). Invisible reCAPTCHA rejected our agent's browser.",
   "quality": {
    "error_legibility": "clear"
   },
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-20",
   "capability": "ZeroTrace",
   "task": "Check against docs",
   "route": "none",
   "result": "plan_gated",
   "verified": true,
   "evidence": "Documented: pricing.md: ZeroTrace Mode only on Cloud 1M+ plans; /zero-trace-mode page exists",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-21",
   "capability": "Automatic Early Renewal",
   "task": "Check against docs",
   "route": "none",
   "result": "plan_gated",
   "verified": true,
   "evidence": "Documented: pricing.md FAQ: toggle at https://serpapi.com/plan (web)",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-22",
   "capability": "upgrade/downgrade/cancel",
   "task": "Check against docs",
   "route": "none",
   "result": "blocked",
   "verified": true,
   "evidence": "Documented: pricing.md FAQ: \"you can upgrade, downgrade, or cancel your plan at any time\"; web plan page only. No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-23",
   "capability": "extra credits",
   "task": "Check against docs",
   "route": "none",
   "result": "plan_gated",
   "verified": true,
   "evidence": "Documented: /extra-credits page (login); pricing FAQ mentions Extra Credits balance",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-24",
   "capability": "Speed modes",
   "task": "Check against docs",
   "route": "none",
   "result": "plan_gated",
   "verified": true,
   "evidence": "Documented: pricing.md Speed Modes table: Ludicrous 2x, Max 4x",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-25",
   "capability": "Legal Shield",
   "task": "Check against docs",
   "route": "none",
   "result": "plan_gated",
   "verified": true,
   "evidence": "Documented: pricing.md: Yes from Production ($150/mo)",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-26",
   "capability": "Priority Support",
   "task": "Check against docs",
   "route": "none",
   "result": "plan_gated",
   "verified": true,
   "evidence": "Documented: pricing.md: Yes on Cloud 1M+",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cap-27",
   "capability": "API key rotation",
   "task": "Check against docs",
   "route": "none",
   "result": "blocked",
   "verified": true,
   "evidence": "Documented: /manage-api-key web page (manage-api-key.md 401 without login); no API documented. No account: sign-up stopped at a reCAPTCHA picture puzzle; no key to call with.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "cancel",
   "capability": "cancel plan",
   "task": "Cancel",
   "route": "none",
   "result": "skipped",
   "verified": false,
   "evidence": "not tested: no plan or trial was started; pricing.md: cancel any time on the web plan page, remaining searches usable until renewal",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "delete",
   "capability": "delete account",
   "task": "Delete account",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "evidence": "No account was created (sign-up stopped at reCAPTCHA). No documented API/CLI account delete found in llms.txt, pricing.md or integrations.md.",
   "documented": true
  },
  {
   "t": "05:58",
   "cap": "discovery",
   "capability": "keyless /search.md",
   "task": "One probe of documented /search.md (not disallowed by robots.txt) without an api_key",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "GET /search.md?engine=google&q=coffee without api_key -> 200 text/markdown with search_metadata status Success, created_at about 1 h before (a cached result). Not used further.",
   "notes": "Docs show api_key on every /search.md example; keyless answer is undocumented. nothing counted from it.",
   "documented": true
  }
 ],
 "stale": false,
 "icon": "/logos/serpapi.png",
 "monitored": false,
 "verdict": "Needs a person: a person has to sign up and get the key before an agent can search on its own. Our agent stopped first at signup: after the web form, a reCAPTCHA picture puzzle asking to select squares with bicycles appeared, and there is no documented API or CLI sign-up. SerpApi's docs are agent-friendly, with llms.txt and Markdown pages, and the MCP server works keyless for locations lookup and engine schemas. Without a key, /account.json returned \"Invalid API key,\" and robots.txt also blocks the documented search endpoint, so no search ran. Paying, cancelling and deleting the account were never reached: no key, no plan, no account.",
 "page": "https://agentdrives.com/tools/serpapi?via=api"
}