Perplexity Agent API · wide-research preset

How this was built

One API call. 500 companies. Every cell cited. Reproducible in ~15 lines of curl.

The idea

The wide-research preset is built for exactly this: run the same lookup across a large set of entities. So I gave it the S&P 500 and two questions per company: did the CEO or CFO mention "AI agents" or "agentic AI" on the most recent earnings call, and what was that quarter's YoY revenue growth?

Every hit needs a direct-quote excerpt with the transcript URL. Every YoY number needs the current and prior-year quarter dollar values and the Perplexity Finance page it came from. No summarization allowed.

The API call

One request to /v1/responses. Preset set to wide-research, tools list declares what the agent is allowed to reach for, background mode so the client can poll or walk away. That is the whole client-side surface.

curl https://api.perplexity.ai/v1/responses \
  -H "Authorization: Bearer $PPLX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "preset": "wide-research",
    "input": "...S&P 500 x AI-agents prompt...",
    "tools": [
      {"type": "finance_search"},
      {"type": "web_search"},
      {"type": "fetch_url"},
      {"type": "sandbox"}
    ],
    "background": true
  }'

That returns a response_id. Poll GET /v1/responses/{id} until status: "completed". When the run streams a share_file item, download it with GET /v1/responses/{id}/files/{file_id}/content.

The prompt (abridged)

The system message asks for the S&P 500 ticker list, then for each ticker: one row of JSON with the GICS sector, whether the latest call transcript matched the keyword list, an exact quote if it did with speaker role and the transcript URL, and the last-quarter revenue plus prior-year same-quarter revenue with the financials URL.

Two constraints do the heavy lifting. First: every value must come with a real URL, no synthesizing. Second: write to disk after every batch and share the partial file every 100 rows completed, so the client always has usable data even if the sandbox is evicted mid-run.

The interesting part: the agent picked its own tools

Nothing in the prompt said use finance_search for X or use fetch_url for Y. The four tools were just listed as available.

The agent tried finance_search once as a probe. Then it noticed that Perplexity Finance already serves a public JSON-backed financials page per ticker, and switched to bulk-fetch_url for the remaining ~490 companies. Cheaper, faster, same underlying data. For the transcript branch it stayed on web_search, since it needed to find a specific quote inside a specific page for each company.

Different tool per sub-task, chosen at runtime. That is not something I set up; it is what the preset does with a real list of tools.

Row schema

Every row written to the results file looks like this:

{
  "ticker": "GOOGL",
  "company": "Alphabet Inc. (Class A)",
  "gics_sector": "Communication Services",
  "call_date": "2026-04-29",
  "keyword_hit": true,
  "quote": "...introduced our 8 generation TPUs...
            able to take on the most demanding agentic workloads.",
  "speaker_role": "Executive",
  "transcript_url": "https://www.fool.com/earnings/call-transcripts/...",
  "latest_q_end": "2026-03-31",
  "revenue_usd": 109896000000,
  "prior_yr_q_revenue_usd": 90234000000,
  "yoy_pct": 21.8,
  "financials_url": "https://www.perplexity.ai/finance/GOOGL/financials?..."
}

What the data says

The dashboard has the live results. Two takeaways from the current sample:

Cost and time

The full 500-company run finished in about an hour of wall-clock time on the API side, delivering partial results every ~100 rows so nothing was ever waiting-only. Prompt plus scripts are under 200 lines total.


Docs for the preset: docs.perplexity.ai/docs/agent-api/wide-research.