Pre-flight checklist
- This is about the Perplexity API, not the Perplexity app, Comet, or web UI.
- I have removed API keys, secrets, and private data.
- I have included enough information for someone else to reproduce the issue.
Bug type
- Error response or failed request
- Incorrect or unexpected model output
- Missing, invalid, or stale citations/search results
- Streaming issue
- Structured output or JSON schema issue
- SDK issue
- Billing, credits, or rate limit issue
- Dashboard, API key, or auth issue
- Other API bug
Affected API area
- Agent API
- Search API
- Sonar API
- Embeddings API
- SDKs
- Dashboard, API keys, or auth
- Billing or credits
- Not sure
Summary
sonar-reasoning-pro returning an empty content body on 5 out of 6 sequential API calls on June 10, 2026. Each failed call returned HTTP 200 with finish_reason=stop and 7–15 citations, but message.content was a literal empty string. No reasoning trace was present. One call (out of 6) succeeded normally with finish_reason=length. We were billed for all 6 calls including the 5 that produced no usable output. This appears to be a recurrence of the same root cause documented in thread #5074 (May 1, 2026), where the search pipeline feeds an empty search_results block to the language model.
Expected behavior
Each call returns a populated text response in message.content, with a reasoning trace and grounded citations, as documented for sonar-reasoning-pro.
Actual behavior
HTTP 200 returned. finish_reason=stop. Citations array populated (7–15 URLs per call). message.content is an empty string “”. No trace present. Raw message object: {“role”: “assistant”, “content”: “”}. The one call that succeeded returned finish_reason=length with normal content.
Minimal reproduction
import requests
headers = {
"Authorization": "Bearer <REDACTED>",
"Content-Type": "application/json",
}
payload = {
"model": "sonar-reasoning-pro",
"messages": [
{"role": "system", "content": "You are a research analyst. Write a 600-word dossier on the topic below."},
{"role": "user", "content": "Research the current state of US Treasury yields and what they signal about monetary policy in mid-2026. Include specific data points with sources and dates."}
],
"max_tokens": 6000,
"search_recency_filter": "month",
"web_search_options": {
"search_context_size": "high",
"search_domain_filter": ["-youtube.com", "-reddit.com", "-twitter.com", "-x.com"]
}
}
resp = requests.post("https://api.perplexity.ai/chat/completions", headers=headers, json=payload, timeout=150)
data = resp.json()
print("status:", resp.status_code)
print("finish_reason:", data["choices"][0]["finish_reason"])
print("citations:", len(data.get("citations", [])))
print("content:", repr(data["choices"][0]["message"]["content"]))
# Expected output:
# status: 200
# finish_reason: stop
# citations: 15
# content: '## WHAT ACTUALLY HAPPENED\nAs of June 2026...'
# Actual output on 5/6 calls:
# status: 200
# finish_reason: stop
# citations: 15
# content: ''
Response or error
{
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": ""
}
}
],
"citations": ["https://...", "https://..."],
"usage": { ... }
}
Request details
- Endpoint: https://api.perplexity.ai/chat/completions
- Model or preset: sonar-reasoning-pro
- SDK/language/version: Python 3.14, requests 2.x (direct HTTP, no SDK)
- Request ID: Not captured — will log on next run
- Approximate time and timezone: June 10, 2026, 16:05–16:50 UTC
- Consistent or intermittent: Consistent within this run — 5/6 calls failed identically. The 6 calls were made sequentially with 15-second gaps between them.
Additional context
This is a recurrence of the issue documented in thread #5074 (May 1, 2026): sonar-pro and sonar-reasoning-pro returning empty search_results across all queries (2026-05-01)
In that thread, the root cause was identified as the search pipeline feeding an empty <search_results> block to the language model — the model correctly responds with nothing when given nothing to work from. Our symptom is identical: citations are returned (confirming the web search ran), but content is empty.
Note that the one call that succeeded (article #4, an H-1B visa ruling story) returned finish_reason=length — meaning it generated content and hit the token ceiling. The 5 that failed all returned finish_reason=stop with empty content. The failed topics were US Treasury yields, nuclear energy, Iran/military readiness, energy prices, and bond market geopolitics — all requiring fresh web data.
We ran this pipeline the prior day without issues. No code changes were made between runs.
We are requesting credits for the 5 billed calls that produced no usable output due to this infrastructure failure.