{
 "slug": "perplexity",
 "name": "Perplexity API",
 "url": "https://perplexity.ai",
 "domain": "perplexity.ai",
 "category": "search-apis",
 "category_name": "Search APIs",
 "tested_at": "2026-10-06",
 "run": "20261006T085113Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261002T080146Z",
   "date": "2026-10-02",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  },
  {
   "run": "20261006T085113Z",
   "date": "2026-10-06",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "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": "Most of the core needs a paid plan, so the work is not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "billing_api"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "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": "Most of the core needs a paid plan, so the work is not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "billing_api",
   "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/3",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": [
   {
    "standard": "MCP client registration",
    "state": "current",
    "behind": null,
    "value": "cimd"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 1,
    "value": "3.1.0"
   },
   {
    "standard": "A2A",
    "state": "behind",
    "behind": 1,
    "value": "0.3"
   }
  ]
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f3d0adeeb256",
  "kb_version": "2+overlay-9e43028a2c",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "start"
 },
 "same_level_drives": 2,
 "drives": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": true,
 "profiles": {},
 "agent_check": {
  "rung": "signup",
  "vendor": "Cloudflare managed challenge (Turnstile 'Verify you are human')",
  "visible": true,
  "type": "network",
  "human": "",
  "how": "Let verified bots and signed agents past the check on sign-up: in Cloudflare, add a WAF custom rule that skips the bot challenge on your sign-up paths for verified bots and for signed agents (rule field cf.bot_management.signed_agent; since 1 July 2026 signed agents count as verified bots), and render Turnstile only when the request is not from a verified agent.",
  "signed": true
 },
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "edge"
  },
  "signed": {
   "state": "page",
   "kind": "home",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "through",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": true
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs.perplexity.ai/llms.txt and llms-full.txt, .md pages, Accept: text/markdown, 6 OpenAPI specs (30 operations) all fetched headless."
  },
  "signup": {
   "status": "human",
   "note": "Sign-up is only in the web UI (console.perplexity.ai, passwordless email code). console.perplexity.ai and www.perplexity.ai answer our signed agent with a Cloudflare challenge (403 cf-mitigated: challenge); in the browser a 'Verify you are human' Turnstile that does not clear.",
   "via": ""
  },
  "verify": {
   "status": "",
   "note": "Not reached: sign-up blocked by the Cloudflare challenge.",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "API keys are made in the console (behind the challenge). OAuth for the MCP server: DCR registration works headless, but /oauth/authorize redirects to console.perplexity.ai/oauth/consent, behind the same challenge. No device flow; Stripe Projects route needs a Stripe account with a card and a $10 credit purchase.",
   "via": "",
   "reached": false
  },
  "first_call": {
   "status": "",
   "note": "No key: /v1/agent, /search and the MCP server answer 401 invalid_api_key; pplx CLI says 'No API key configured'.",
   "reached": false
  },
  "first_action": {
   "status": "",
   "note": "No key, no account.",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P3",
   "rails": [
    "Stripe Projects (stripe projects add perplexity/api, $10 minimum credit purchase)",
    "Card via Stripe in the API console Billing page"
   ],
   "rail_ids": [
    "stripe-projects",
    "card"
   ],
   "first_party": false,
   "rail_scope": "full",
   "trial_path": "free tier",
   "note": "No 402 on Perplexity's own hosts (unauth calls give 401; x402./mpp./agents. subdomains do not answer; no x-payment-info, no /.well-known/ucp, docs never mention x402/MPP). Documented Stripe Projects CLI provisions account, project, key and credits headless once a Stripe account has a payment method (on the docs, not exercised: no card). mpp.dev lists a third-party Locus proxy (perplexity.mpp.paywithlocus.com, real 402 WWW-Authenticate: Payment method=tempo intent=charge) that is not Perplexity's endpoint. Free consumer tier exists but sits behind the same Cloudflare challenge.",
   "detected_grade": "P3",
   "exercised": false,
   "reached": false
  },
  "cancel": {
   "status": "",
   "grade": "n/a",
   "note": "No plan or credits were bought. API is prepaid credits (nothing recurring by default); consumer Pro/Max cancellation not reachable.",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "No account was created. One DCR OAuth client remains registered at api.perplexity.ai; no documented way to delete it.",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [
   {
    "id": "stripe-projects",
    "name": "Stripe Projects",
    "kind": "agent-rail",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   },
   {
    "id": "card",
    "name": "Card checkout",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [
   "stripe-projects"
  ],
  "paid": null,
  "exercised": false,
  "detected_grade": "P3",
  "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."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": false,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST: Agent, Search, Embeddings, Router, Decisions, Skills, analytics; 30 operations across 6 specs",
  "openapi": "openapi.json 3.1.0; gateway specs 3.0.3",
  "mcp": "official hosted MCP (api.perplexity.ai/mcp) plus Computer MCP; the docs-host server card and A2A card describe the Mintlify docs search server, not the product",
  "cli": "pplx 2026.07.30, installs headless; needs an API key",
  "llms_txt": "docs.perplexity.ai/llms.txt and llms-full.txt; docs robots.txt has 'Content-Signal: ai-train=yes, search=yes, ai-input=yes' (Cloudflare Content Signals), www robots.txt has none"
 },
 "can_do": [
  "Read all API docs headless: llms.txt, markdown pages and six OpenAPI specs",
  "Install the pplx CLI headless",
  "Register an OAuth client for the MCP server headless (DCR)"
 ],
 "cannot_do": [
  {
   "what": "Sign up or sign in",
   "why": "console.perplexity.ai and www.perplexity.ai show a Cloudflare 'Verify you are human' challenge to our signed agent, also in a real browser"
  },
  {
   "what": "Get an API key or OAuth token",
   "why": "Keys and OAuth consent live on console.perplexity.ai behind the same challenge; no device flow or agent registration"
  },
  {
   "what": "Ask a question, search, upload a file or generate an image",
   "why": "Every API, CLI and MCP call needs a key; the web app is challenged"
  },
  {
   "what": "Buy credits as an agent",
   "why": "No 402 rail on Perplexity's own endpoints; Stripe Projects needs a Stripe account with a card"
  }
 ],
 "blockers": [
  "Cloudflare challenge (Turnstile) on console.perplexity.ai and www.perplexity.ai for a Web Bot Auth signed agent"
 ],
 "tips_for_owner": [
  "Let verified agents through console Cloudflare rules",
  "Add device flow to the API OAuth server",
  "Offer a native agent payment rail",
  "Serve the product MCP server card"
 ],
 "tips_for_agents": [
  "Docs are excellent for agents: start at https://docs.perplexity.ai/llms.txt; every page has a .md URL and Accept: text/markdown works.",
  "Everything needs an API key from console.perplexity.ai, which is behind Cloudflare: have a human create a project and key (no card needed to look, credits needed to call).",
  "The hosted MCP server at https://api.perplexity.ai/mcp takes the API key as Bearer, or OAuth (CIMD or DCR) with consent on the console.",
  "pplx auth login only stores an existing key; it does not sign you in."
 ],
 "selfhost": null,
 "summary": "Perplexity's docs are agent-ready (llms.txt, markdown pages, six OpenAPI specs, an official hosted MCP server with RFC 9728 metadata and CIMD), but an agent cannot get in: console.perplexity.ai and www.perplexity.ai answer our signed agent with a Cloudflare 'Verify you are human' challenge, also in a real browser. Without a key every API, CLI and MCP call returns 401, so no capability was driven.",
 "wall": "Cloudflare Turnstile on console sign-up",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Perplexity has an AI search product and a developer API with very agent-friendly documentation (machine-readable docs, an official MCP server). But an agent trying this drive could not even sign up: the sign-up page and the app's main site both showed a 'prove you're human' challenge that never cleared to take over.",
  "can_do": [
   "Read all the product's technical documentation automatically, including a version made for AI tools.",
   "Install the official command-line tool.",
   "Start (but not finish) the technical handshake for getting a login token."
  ],
  "cannot_do": [
   {
    "what": "Create an account or get an API key",
    "why": "The sign-up and login pages show a 'prove you're human' check that never let the agent through"
   },
   {
    "what": "Ask a question, upload a file, or generate an image",
    "why": "Every one of these needs an account key, which could not be obtained"
   },
   {
    "what": "Pay for API credits as an agent",
    "why": "No automatic payment option on Perplexity's own site; the documented path needs a human with a credit card"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Deep Research",
   "plan": "Pro/Max or API credits",
   "evidence": "capability map plan: paid; API is prepaid credits (docs pricing); not reachable anyway (sign-up wall)"
  },
  {
   "capability": "Model selection",
   "plan": "Pro/Max or API credits",
   "evidence": "capability map plan: paid; API is prepaid credits (docs pricing); not reachable anyway (sign-up wall)"
  },
  {
   "capability": "Model Council",
   "plan": "Max",
   "evidence": "capability map plan: paid; API is prepaid credits (docs pricing); not reachable anyway (sign-up wall)"
  },
  {
   "capability": "Video generation",
   "plan": "Pro/Max",
   "evidence": "capability map plan: paid; API is prepaid credits (docs pricing); not reachable anyway (sign-up wall)"
  },
  {
   "capability": "Perplexity Computer",
   "plan": "Computer credits (Pro/Max)",
   "evidence": "capability map plan: paid; API is prepaid credits (docs pricing); not reachable anyway (sign-up wall)"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Answer engine",
   "capability": "Ask a question and get a cited, real-time web answer",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /search (Search API)",
    "mcp": null,
    "cli": "pplx (search)",
    "ui": "perplexity.ai home search box"
   },
   "check": "Answer text includes inline citation markers that resolve to source URLs",
   "source": "https://web.archive.org/web/20260930164535/https://www.perplexity.ai/ (meta-description: \"free AI-powered answer engine that provides accurate, trusted, and real-time answers\"); https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Get answers from [the web]\")"
  },
  {
   "id": "cap-02",
   "group": "Answer engine",
   "capability": "Run Deep Research for expert-level, multi-step research",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/agent (medium/large preset)",
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai answer mode selector"
   },
   "check": "Response/thread is labeled Deep Research and contains a longer multi-section report with multiple sources",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (Pro row: \"Deep research\"; Max FAQ: \"higher limits on Deep Research\")"
  },
  {
   "id": "cap-03",
   "group": "Answer engine",
   "capability": "Select a preferred AI model to answer a query",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "model param on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai model picker"
   },
   "check": "Answer metadata/response shows the chosen model id matches the one selected before asking",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Select between AI models\" / \"Preferred model selection\"; FAQ: \"Pro and Max both allow selecting a preferred model\")"
  },
  {
   "id": "cap-04",
   "group": "Answer engine",
   "capability": "Run Model Council: multiple top models answer and are compared side by side",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai Max-only Model Council mode"
   },
   "check": "Response view shows several named-model answers to the same query at once",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Model Council\" row, Max only)"
  },
  {
   "id": "cap-05",
   "group": "Generation",
   "capability": "Generate an image/asset from a text prompt",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai answer composer"
   },
   "check": "Thread contains a generated image file attached to the response",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Asset generation\" row: Free=Limited, Pro=10x)"
  },
  {
   "id": "cap-06",
   "group": "Generation",
   "capability": "Generate a short video from a text prompt",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai answer composer"
   },
   "check": "Thread contains a generated video file; Max FAQ confirms more monthly video minutes than Pro",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Video generation\" row: Free=none, Pro=5x, Max FAQ \"more video creation per month\")"
  },
  {
   "id": "cap-07",
   "group": "Answer engine",
   "capability": "Upload a file and ask questions about its contents",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "file upload on POST /v1/agent (Working with Files)",
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai attachment button"
   },
   "check": "Answer cites content from the uploaded file rather than only the web",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"File uploads\" row: Free=Limited, Pro=10x); https://docs.perplexity.ai/docs/agent-api/working-with-files.md"
  },
  {
   "id": "cap-08",
   "group": "Agentic tasks",
   "capability": "Use Perplexity Computer to carry out multi-step tasks for you",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": "Perplexity Computer MCP Server",
    "cli": null,
    "ui": "perplexity.ai Computer tab"
   },
   "check": "Task run shows step-by-step tool actions and a final deliverable; Computer-credit balance decreases afterward",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Computer credits\" row: Free=none, Pro=10,000/month, Max=10,000/month higher usage); https://docs.perplexity.ai/docs/getting-started/integrations/computer-mcp-server.md"
  },
  {
   "id": "cap-09",
   "group": "Browser",
   "capability": "Get in-browser AI assistance while browsing with Comet",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Comet browser sidebar"
   },
   "check": "Comet sidebar answers a question about the currently open page",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Comet Assistant\" row, available on all plans)"
  },
  {
   "id": "cap-10",
   "group": "Browser",
   "capability": "Have Comet Agent autonomously complete browsing tasks (e.g. fill forms, book, buy)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Comet browser agent mode"
   },
   "check": "Comet opens tabs and performs actions (navigation, clicks, form fills) without the user driving each step, ending in a completed task state",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Comet Agent\" row: Free=Limited, Pro=10x)"
  },
  {
   "id": "cap-11",
   "group": "Data sources",
   "capability": "Connect 400+ third-party app connectors so answers can use your own apps' data",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "connector_id on POST /v1/agent tools (Connectors)",
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai Settings > Connectors"
   },
   "check": "A query answer cites or pulls a result from a connected app (e.g. Slack/Gmail) rather than only the public web",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Connect 400+ app connectors\" row: Free=none, Pro=yes); https://docs.perplexity.ai/docs/agent-api/tools/connectors.md"
  },
  {
   "id": "cap-12",
   "group": "Data sources",
   "capability": "Use premium finance/market data sources (PitchBook, Statista, S&P Capital IQ) in answers",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "finance_search tool on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai Finance answers"
   },
   "check": "A finance query's citations include PitchBook/Statista/S&P Capital IQ as sources",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (FAQ: \"Pro and Max add premium data sources for finance and market intelligence work, including PitchBook, Statista, and S&P Capital IQ\"); https://docs.perplexity.ai/docs/agent-api/tools/finance-search.md"
  },
  {
   "id": "cap-13",
   "group": "Memory",
   "capability": "Use Brain to carry persistent context/memory across chats",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai Max-only Brain feature"
   },
   "check": "A later unrelated thread references information from an earlier thread without it being restated",
   "source": "https://web.archive.org/web/20260827003856/https://www.perplexity.ai/hub/pricing (\"Brain\" row, Max only)"
  },
  {
   "id": "cap-14",
   "group": "Agent building",
   "capability": "Configure an agent run: system prompt, model, loop bound, from a preset",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v1/agent/{id} shows the run reflects the configured preset/model/instructions",
   "source": "https://docs.perplexity.ai/docs/agent-api/building-agents/define-the-run.md; https://docs.perplexity.ai/docs/agent-api/presets.md"
  },
  {
   "id": "cap-15",
   "group": "Agent building",
   "capability": "Enable built-in tools (web search, fetch URL, finance search, people search) in an agent run",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "tools[] on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response includes tool-call entries for the requested tool type and their results",
   "source": "https://docs.perplexity.ai/docs/agent-api/tools/overview.md; https://docs.perplexity.ai/docs/agent-api/tools/web-search.md; https://docs.perplexity.ai/docs/agent-api/tools/fetch-url-content.md; https://docs.perplexity.ai/docs/agent-api/tools/people-search.md"
  },
  {
   "id": "cap-16",
   "group": "Agent building",
   "capability": "Run code in an isolated sandbox during an agent request",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "sandbox tool on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response includes sandbox execution output/stdout and any generated files",
   "source": "https://docs.perplexity.ai/docs/agent-api/tools/sandbox.md; https://docs.perplexity.ai/docs/agent-api/building-agents/run-code.md"
  },
  {
   "id": "cap-17",
   "group": "Agent building",
   "capability": "Connect a remote MCP server so the agent can call its tools",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "mcp tool config on POST /v1/agent",
    "mcp": "remote MCP passthrough",
    "cli": null,
    "ui": null
   },
   "check": "Response shows a tool call routed to the configured external MCP server with its result",
   "source": "https://docs.perplexity.ai/docs/agent-api/tools/mcp.md"
  },
  {
   "id": "cap-18",
   "group": "Agent building",
   "capability": "Define a custom function the agent can call and return results for",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "custom functions in tools[] on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response contains a function-call request matching the declared schema, and the final answer uses the function_call_output you sent back",
   "source": "https://docs.perplexity.ai/docs/agent-api/tools/custom-functions.md"
  },
  {
   "id": "cap-19",
   "group": "Agent building",
   "capability": "Force a structured JSON response via a JSON schema",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "response_format on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response body parses as valid JSON matching the submitted schema",
   "source": "https://docs.perplexity.ai/docs/agent-api/building-agents/shape-output.md; https://docs.perplexity.ai/docs/cookbook/articles/structured-output-extraction/README.md"
  },
  {
   "id": "cap-20",
   "group": "Agent building",
   "capability": "Continue a conversation across turns using prior responses",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "previous_response_id / replayed input on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "A follow-up request without restating context still answers using earlier turn's facts",
   "source": "https://docs.perplexity.ai/docs/agent-api/conversation-state.md"
  },
  {
   "id": "cap-21",
   "group": "Agent building",
   "capability": "Attach and analyze images in a request",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "image content blocks on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": "perplexity.ai image attach button"
   },
   "check": "Answer describes/analyzes content specific to the attached image",
   "source": "https://docs.perplexity.ai/docs/agent-api/image-attachments.md"
  },
  {
   "id": "cap-22",
   "group": "Agent building",
   "capability": "Run a long agent task in the background and poll/stream for its result",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "background:true on POST /v1/agent, GET /v1/agent/{id}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Initial call returns status:queued/in_progress; polling GET /v1/agent/{id} later shows status:completed with output",
   "source": "https://docs.perplexity.ai/docs/agent-api/background-mode.md; https://docs.perplexity.ai/api-reference/agent-get.md"
  },
  {
   "id": "cap-23",
   "group": "Agent building",
   "capability": "Cancel a running agent response",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/agent/{id}/cancel",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Immediate response shows status:cancelling, and a later GET shows a cancelled terminal status",
   "source": "https://docs.perplexity.ai/api-reference/agent-cancel-post.md"
  },
  {
   "id": "cap-24",
   "group": "Agent building",
   "capability": "Retrieve and download files an agent produced and shared",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "GET /v1/agent/{id}/files, GET file content",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "File list endpoint returns a file_id produced by share_file, and the content endpoint streams matching bytes",
   "source": "https://docs.perplexity.ai/api-reference/agent-files-get.md; https://docs.perplexity.ai/api-reference/agent-file-content-get.md"
  },
  {
   "id": "cap-25",
   "group": "Agent building",
   "capability": "Give the agent on-demand domain skills (built-in, inline, or custom)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "skills on POST /v1/agent, POST/GET/PUT/DELETE /v1/skills",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET a created skill returns the uploaded SKILL.md name/description; an agent run referencing it changes its behavior accordingly",
   "source": "https://docs.perplexity.ai/docs/agent-api/skills.md; https://docs.perplexity.ai/api-reference/skills-create-post.md"
  },
  {
   "id": "cap-26",
   "group": "Agent building",
   "capability": "Save a reusable, versioned request configuration as a Profile",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "profiles on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Two separate requests referencing the same profile id produce runs with identical configured settings",
   "source": "https://docs.perplexity.ai/docs/agent-api/profiles.md"
  },
  {
   "id": "cap-27",
   "group": "Agent building",
   "capability": "Specify a fallback chain of models for higher availability",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "model array on POST /v1/agent",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "When the primary model id is invalid, the response's model field shows the next model in the chain was used",
   "source": "https://docs.perplexity.ai/docs/agent-api/model-fallback.md"
  },
  {
   "id": "cap-28",
   "group": "Search & retrieval",
   "capability": "Query the Search API directly for ranked web results with domain/date/language filters",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /search",
    "mcp": null,
    "cli": "pplx",
    "ui": null
   },
   "check": "Results list only includes URLs within the requested search_domain_filter and recency window",
   "source": "https://docs.perplexity.ai/docs/search/quickstart.md; https://docs.perplexity.ai/docs/search/filters/domain-filter.md; https://docs.perplexity.ai/docs/search/filters/date-time-filters.md"
  },
  {
   "id": "cap-29",
   "group": "Search & retrieval",
   "capability": "Search for people/professionals by role, company, or background",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "people_search tool / filter",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Returned candidates match the requested role/company/location filters",
   "source": "https://docs.perplexity.ai/docs/agent-api/tools/people-search.md; https://docs.perplexity.ai/docs/search/filters/people-search.md"
  },
  {
   "id": "cap-30",
   "group": "Search & retrieval",
   "capability": "Generate text embeddings (standard or contextualized) for RAG/search",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /embeddings, POST /embeddings/contextualized",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response returns a fixed-length float vector per input text",
   "source": "https://docs.perplexity.ai/docs/embeddings/quickstart.md; https://docs.perplexity.ai/docs/embeddings/contextualized-embeddings.md"
  },
  {
   "id": "cap-31",
   "group": "Search & retrieval",
   "capability": "Get probabilistic yes/no, choice, or score answers about your own content",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /decisions",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response returns one answer with a probability/score per submitted named question, matching the question type",
   "source": "https://docs.perplexity.ai/docs/decisions/quickstart.md; https://docs.perplexity.ai/api-reference/decisions-post.md"
  },
  {
   "id": "cap-32",
   "group": "Integrations",
   "capability": "Search the web from the terminal with the Perplexity CLI",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "pplx",
    "ui": null
   },
   "check": "Running the pplx CLI command returns search results/snippets in the terminal",
   "source": "https://docs.perplexity.ai/docs/cli/overview.md"
  },
  {
   "id": "cap-34",
   "group": "Account & billing",
   "capability": "Generate, revoke, and rotate API keys",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST generate-auth-token, revoke-auth-token",
    "mcp": null,
    "cli": null,
    "ui": "API Portal > API Keys"
   },
   "check": "A revoked key fails auth on the next request; a newly generated key succeeds",
   "source": "https://docs.perplexity.ai/docs/admin/api-key-management.md; https://docs.perplexity.ai/api-reference/generate-auth-token-post.md; https://docs.perplexity.ai/api-reference/revoke-auth-token-post.md"
  },
  {
   "id": "cap-35",
   "group": "Account & billing",
   "capability": "Manage Projects, team access, and billing in the API Portal",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "console.perplexity.ai"
   },
   "check": "A newly invited teammate appears with project access; usage/credits reflect project-scoped billing",
   "source": "https://docs.perplexity.ai/docs/getting-started/projects.md"
  },
  {
   "id": "cap-36",
   "group": "Account & billing",
   "capability": "View organization usage analytics by time and by member",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET /analytics/usage, /analytics/usage/v2",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Organization > Computer"
   },
   "check": "Returned buckets total match the organization's known recent request/credit volume",
   "source": "https://docs.perplexity.ai/docs/admin/computer-analytics-api.md; https://docs.perplexity.ai/api-reference/computer-analytics-usage-get.md"
  },
  {
   "id": "cap-37",
   "group": "Account & billing",
   "capability": "Subscribe to the API platform through AWS Marketplace for consolidated billing",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "AWS Marketplace listing"
   },
   "check": "Account billing source shows AWS Marketplace after subscribing through that listing",
   "source": "https://docs.perplexity.ai/docs/resources/aws-marketplace.md"
  }
 ],
 "attempts": [
  {
   "t": "02:19",
   "cap": "discovery",
   "capability": "docs",
   "task": "Find docs index",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://docs.perplexity.ai/llms.txt 200 text (35947 bytes, H1 '# Perplexity', ## OpenAPI Specs section); llms-full.txt 3.4 MB; 6 OpenAPI specs (openapi.json 3.1.0 with 22 ops; gateway specs 3.0.3), 30 operations total",
   "notes": "Docs on Mintlify",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "02:19",
   "cap": "discovery",
   "capability": "markdown docs",
   "task": "Accept: text/markdown on docs page",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET docs.perplexity.ai/docs/getting-started/quickstart with Accept: text/markdown -> 200 content-type: text/markdown; vary: rsc, accept-encoding, Accept, User-Agent; Link header rel=llms-txt, mcp-server-card, agent-card, agent-skills. .md URLs also serve markdown (e.g. /docs/admin/signing-in.md)"
  },
  {
   "t": "02:19",
   "cap": "discovery",
   "capability": "MCP server/discover",
   "task": "POST server/discover (2026-07-28) to https://api.perplexity.ai/mcp",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "401 application/json {\"error\":{\"message\":\"Invalid API key provided...\",\"type\":\"invalid_api_key\",\"code\":401}}; WWW-Authenticate: Bearer resource_metadata=\"https://api.perplexity.ai/.well-known/oauth-protected-resource\". PRM 200 JSON (authorization_servers https://api.perplexity.ai); AS metadata has client_id_metadata_document_supported: true and registration_endpoint (DCR); grants authorization_code, refresh_token only (no device flow)",
   "notes": "auth required before any discovery; credentials need an API key or OAuth browser sign-in",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "02:19",
   "cap": "discovery",
   "capability": "Computer MCP server/discover",
   "task": "POST server/discover to https://www.perplexity.ai/rest/computer/mcp",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "401 WWW-Authenticate: Bearer error=invalid_token, resource_metadata=https://www.perplexity.ai/.well-known/oauth-protected-resource/rest/computer/mcp (200 JSON, scope asi:query). /.well-known/oauth-authorization-server on www: registration_endpoint (DCR), no client_id_metadata_document_supported, grants authorization_code/refresh_token",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "02:19",
   "cap": "discovery",
   "capability": "cards and preferences",
   "task": "Server cards, A2A card, AI catalog, robots Content-Usage",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "api.perplexity.ai/mcp/server-card 404; www/.well-known/ai-catalog.json 404 (HTML); www agent-card.json 404. docs.perplexity.ai/.well-known/mcp/server-card.json 200 JSON = 'Perplexity Docs MCP' (Mintlify docs search server); docs agent-card.json 200 JSON protocolVersion 0.3; docs agent-skills/index.json 200. www robots.txt: no Content-Usage/Content-signal lines; docs robots.txt: 'Content-Signal: ai-train=yes, search=yes, ai-input=yes' (Cloudflare Content Signals form). No Content-Usage header on www (homepage returns 403 cf-mitigated: challenge)"
  },
  {
   "t": "02:19",
   "cap": "pay",
   "capability": "pay step probes",
   "task": "402 probes, registries, docs text",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Unauth POST api.perplexity.ai/v1/agent and /search -> 401 invalid_api_key (no 402, no PAYMENT-REQUIRED/Payment challenge). x402./mpp./agents.perplexity.ai: no response. No x-payment-info in any OpenAPI; /.well-known/ucp 404. llms-full.txt: 0 hits for x402/MPP/USDC/L402. x402 Bazaar: no Perplexity resource. mpp.dev lists 'perplexity' integration: third-party (serviceUrl perplexity.mpp.paywithlocus.com; real 402 WWW-Authenticate: Payment method=tempo intent=charge from Locus, not Perplexity's domain). Documented: Stripe Projects 'stripe projects add perplexity/api' creates account+project+key, $10 minimum credit purchase charged to Stripe payment method; console Billing via Stripe card."
  },
  {
   "t": "04:22",
   "cap": "signup",
   "capability": "sign up for API Portal",
   "task": "Open console.perplexity.ai and Continue with email (passwordless code) as the agent's inbox",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "same on https://www.perplexity.ai/ (home of the consumer app)",
   "notes": "Cloudflare managed challenge for our signed agent; no documented headless sign-up API",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "04:22",
   "cap": "signup",
   "capability": "sign up for API Portal",
   "task": "Same, in the real browser (pw)",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "console.perplexity.ai and www.perplexity.ai both stay on 'Just a moment...' with a visible Cloudflare 'Verify you are human' Turnstile widget after 15 s (shots 002, 004).",
   "notes": "Cloudflare Turnstile/interstitial, not solved",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "04:22",
   "cap": "credentials",
   "capability": "OAuth for remote MCP",
   "task": "Register OAuth client and start authorization code flow for https://api.perplexity.ai/mcp",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://api.perplexity.ai/oauth/register -> 201 client_id dcr… (DCR works headless). GET /oauth/authorize (PKCE S256, resource=https://api.perplexity.ai/mcp) -> 302 Location https://console.perplexity.ai/oauth/consent?request=… which is behind the same Cloudflare challenge. AS metadata offers only authorization_code/refresh_token (no device flow, no agent_auth block)",
   "notes": "Consent needs a signed-in browser on console.perplexity.ai"
  },
  {
   "t": "04:22",
   "cap": "credentials",
   "capability": "Stripe Projects provisioning",
   "task": "Check stripe projects add perplexity/api route",
   "route": "cli",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "docs/getting-started/integrations/stripe-projects.md: 'You do need a payment method on your Stripe account' and 'Creating a new Perplexity API project prompts for a $10 minimum credit purchase'",
   "notes": "We have no Stripe account or card; never pay"
  },
  {
   "t": "04:22",
   "cap": "cap-32",
   "capability": "Search the web from the terminal with the Perplexity CLI",
   "task": "pplx search web 'latest stable Rust release' -n 2",
   "route": "cli",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "pplx 2026.07.30 installed headless via documented install.sh (checksum OK). Without a key: {\"error\":{\"code\":\"AUTHENTICATION\",\"message\":\"No API key configured. Run `pplx auth login`, set the PERPLEXITY_API_KEY ...\",\"hint\":...}}. `pplx auth login` only stores an existing key (no sign-in flow)",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "04:22",
   "cap": "cap-01",
   "capability": "Ask a question and get a cited, real-time web answer",
   "task": "Ask 'latest stable Rust release' via POST /v1/agent preset fast, or the perplexity.ai search box",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://api.perplexity.ai/v1/agent without key -> 401 invalid_api_key; no key obtainable (sign-up behind Cloudflare Turnstile on console.perplexity.ai); web app www.perplexity.ai -> 403 cf-mitigated: challenge, in browser too",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "04:22",
   "cap": "cap-05",
   "capability": "Generate an image/asset from a text prompt",
   "task": "Generate an image in the perplexity.ai composer",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://api.perplexity.ai/v1/agent without key -> 401 invalid_api_key; no key obtainable (sign-up behind Cloudflare Turnstile on console.perplexity.ai); web app www.perplexity.ai -> 403 cf-mitigated: challenge, in browser too",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "04:22",
   "cap": "cap-07",
   "capability": "Upload a file and ask questions about its contents",
   "task": "Upload a text file to POST /v1/agent or perplexity.ai attachment",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://api.perplexity.ai/v1/agent without key -> 401 invalid_api_key; no key obtainable (sign-up behind Cloudflare Turnstile on console.perplexity.ai); web app www.perplexity.ai -> 403 cf-mitigated: challenge, in browser too",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "04:22",
   "cap": "cap-02",
   "capability": "Run Deep Research",
   "task": "Try Run Deep Research",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "capabilities.json plan: paid (Pro/Max (consumer) or API credits); API is prepaid credits (docs pricing: pay-as-you-go, Tier 0 $0); Computer MCP docs: 'Computer usage is billed against your Perplexity account credits'. Not reachable anyway: sign-up blocked by Cloudflare Turnstile",
   "notes": "also behind the sign-up wall"
  },
  {
   "t": "04:22",
   "cap": "cap-03",
   "capability": "Select a preferred AI model",
   "task": "Try Select a preferred AI model",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "capabilities.json plan: paid (Pro/Max (consumer) or API credits); API is prepaid credits (docs pricing: pay-as-you-go, Tier 0 $0); Computer MCP docs: 'Computer usage is billed against your Perplexity account credits'. Not reachable anyway: sign-up blocked by Cloudflare Turnstile",
   "notes": "also behind the sign-up wall"
  },
  {
   "t": "04:22",
   "cap": "cap-04",
   "capability": "Run Model Council",
   "task": "Try Run Model Council",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "capabilities.json plan: paid (Max); API is prepaid credits (docs pricing: pay-as-you-go, Tier 0 $0); Computer MCP docs: 'Computer usage is billed against your Perplexity account credits'. Not reachable anyway: sign-up blocked by Cloudflare Turnstile",
   "notes": "also behind the sign-up wall"
  },
  {
   "t": "04:22",
   "cap": "cap-06",
   "capability": "Generate a short video",
   "task": "Try Generate a short video",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "capabilities.json plan: paid (Pro/Max); API is prepaid credits (docs pricing: pay-as-you-go, Tier 0 $0); Computer MCP docs: 'Computer usage is billed against your Perplexity account credits'. Not reachable anyway: sign-up blocked by Cloudflare Turnstile",
   "notes": "also behind the sign-up wall"
  },
  {
   "t": "04:22",
   "cap": "cap-08",
   "capability": "Use Perplexity Computer",
   "task": "Try Use Perplexity Computer",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "capabilities.json plan: paid (Pro/Max Computer credits); API is prepaid credits (docs pricing: pay-as-you-go, Tier 0 $0); Computer MCP docs: 'Computer usage is billed against your Perplexity account credits'. Not reachable anyway: sign-up blocked by Cloudflare Turnstile",
   "notes": "also behind the sign-up wall"
  },
  {
   "t": "05:14",
   "cap": "delete",
   "capability": "delete account",
   "task": "Delete our account",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "No account was created (sign-up blocked). One OAuth client registered via DCR at api.perplexity.ai/oauth/register (client_id dcrGCxjy…); no documented endpoint to delete a DCR client",
   "notes": "nothing to delete"
  }
 ],
 "stale": false,
 "icon": "/logos/perplexity.png",
 "monitored": false,
 "verdict": "Gets in on its own fails here: L1 · Needs a person. The docs fetched cleanly headless: llms.txt, markdown pages, and OpenAPI specs. The MCP server's registration also worked headless, but its consent step hit the same challenge. With no key, the API and MCP server answered invalid_api_key, the CLI said no key was configured, and no work got done. No plan was bought, so there was nothing to cancel, but a registered OAuth client has no documented way to delete it.",
 "page": "https://agentdrives.com/tools/perplexity?via=api"
}