Perplexity's Sonar Chat Completions API stopped taking support two days ago. "Sonar Chat Completions support ended on September 27, 2026," according to Perplexity's migration guide, and if your integration still calls /v1/sonar directly, some of it is broken right now and the rest is running on a clock. The Perplexity Sonar API isn't gone entirely, it's been folded into something called the Agent API, and the two don't speak the same request format.
The confusing part is that a lot of code still runs, which makes the deadline easy to underestimate.
What changed on September 27, 2026
Perplexity didn't shut every Sonar call off at once. The migration guide splits the cutover into two behaviors, and mixing them up is the fastest way to misjudge your own exposure.
Synchronous and streaming requests keep working. Per the same guide, they're "being reformulated as Agent API requests, rolling out gradually by model." Nobody flipped a switch and broke every sync call on September 27; Perplexity is quietly rewriting them into Agent API calls behind the old endpoint, model by model, on a schedule it hasn't published in full.
Asynchronous Sonar requests got no such courtesy. The same page states plainly that they "are not reformulated and are no longer supported," and the fix is to move them to Agent API background mode. If any part of your pipeline submits an async Sonar job and polls for the result later, that path is dead today, not eventually.
This isn't the only hard vendor deadline engineering teams hit this week. OpenAI's own legacy-model shutdown cut off gpt-3.5-turbo-instruct and three other models on September 28, one day after the Sonar cutover, with the same lesson attached: a published deadline that passed quietly is still a deadline.
What actually breaks, and what doesn't
Treat these as two separate problems, because they need two separate responses.
Async calls need code changes now. There's no grace period, no gradual reformulation, no version of "it still works for now" that applies here. Anything queued through the old async Sonar flow needs to move to Agent API background mode before it runs again.
Sync and streaming calls are the trap. They still work today because Perplexity is reformulating them under the hood, but "still works" and "fixed" aren't the same claim. The reformulation is rolling out by model, not all at once, and nothing in Perplexity's own documentation promises how long the old endpoint keeps accepting the old request shape. Teams that read "still works" as "no action needed" are the ones who'll get paged when their model's turn in the rollout comes up.
The pain is already visible outside Perplexity's own docs. Developers have filed GitHub issues describing calls to retired Sonar endpoints returning 403 agent_api_migration_required, and more than one repo has an open migration issue referencing the cutover. Those reports show teams hitting the cutover in production, not just reading about it.
Sonar-to-Agent-API model mapping
The Agent API replaces individual Sonar models with presets, and the mapping isn't one-to-one. Two different Sonar tiers collapse into the same preset.
| Sonar model | Agent API preset |
|---|---|
| Sonar | fast |
| Sonar Pro | fast |
| Sonar Reasoning Pro | low |
| Sonar Deep Research | high |
Sonar and Sonar Pro both land on fast. If your code branched on model name to pick different token budgets or timeouts for those two, that branch stops making sense once both point at the same preset, and it's worth deleting rather than carrying forward as dead logic.
How to migrate from Sonar to the Agent API
1. Point calls at /v1/agent instead of /v1/sonar
The old endpoint is https://api.perplexity.ai/v1/sonar. The new one is https://api.perplexity.ai/v1/agent. Every client, SDK config, or hardcoded base URL that still references the Sonar path needs updating before anything else here matters.
2. Swap the request shape from chat.completions.create to responses.create
The old call:
client.chat.completions.create(model="sonar", messages=[{"role":"user","content":"..."}])becomes:
client.responses.create(preset="fast", input="...")The request shape changes too. model becomes preset, using the mapping above, and messages becomes a flatter input field. Swapping the method name alone leaves the old parameter names in place, so plan to touch every call site.
3. Update response parsing
The old response shape reads through completion.choices[0].message.content. The new one reads through response.output_text. If your code has any helper function that extracts text from a Sonar response, that function's return path changes, not just the call that produces the response object.
4. Move async Sonar calls to Agent API background mode
Anything using the old asynchronous Sonar flow has no reformulation path. Per Perplexity's guide, these requests "are not reformulated and are no longer supported." Rewrite them against Agent API background mode directly. This is the one step with no grace period attached, prioritize it if you haven't touched it yet.
5. Re-test before you call it done
Perplexity's presets documentation says each preset bundles a model, search config, reasoning steps, system prompt and available tools, with its own output token limit, so a response built with preset="fast" can differ from what the old sonar model returned even when the input is identical. Re-run your existing test cases against the new preset and check for shifts in output length, tone, and tool use before shipping, not just a green build.
FAQ
When did Perplexity retire the Sonar API?
Sonar Chat Completions support ended on September 27, 2026. Perplexity flagged the change months ahead of time: a changelog entry tagged "Deprecation" went out in July 2026, and a community forum thread titled "Sonar is moving to the Agent API" followed on August 13, 2026. Developers watching either channel had weeks of notice before the cutover date.
Do my existing synchronous or streaming Sonar calls still work?
For now. Perplexity's migration guide says sync and streaming requests are "being reformulated as Agent API requests, rolling out gradually by model," which means the old endpoint keeps accepting the old request shape while Perplexity rewrites it behind the scenes. That's not a stable state to build on. Migrate on your own schedule rather than waiting for the rollout to force your hand.
What happens to my async Sonar requests?
They stop working outright. The same guide states that asynchronous Sonar requests "are not reformulated and are no longer supported," and the fix is to move them to Agent API background mode. There's no gradual rollout covering this path.
Which Agent API preset replaces sonar-pro?
fast, the same preset that replaces plain Sonar. Sonar Reasoning Pro maps to low, and Sonar Deep Research maps to high, per the model-to-preset table in Perplexity's migration guide.
Do I need to rewrite my request format, or just change the model name?
Rewrite the request. client.chat.completions.create(model=..., messages=...) becomes client.responses.create(preset=..., input=...), and the response is read through output_text instead of choices[0].message.content. Update the method call and the response parsing together; changing only the model name leaves both of them on the old shape.
Perplexity isn't the only vendor replacing raw model names with presets and bundled defaults this quarter; the rest are tracked in AI model releases and pricing: what changes for engineering teams.
