One API call. 500 companies. Every cell cited. Reproducible in ~15 lines of curl.
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.
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 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.
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.
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?..."
}
The dashboard has the live results. Two takeaways from the current sample:
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.