Perplexity API Incident Postmortem: Reconstructing an Outage You Have No Logs For
The provider is recovered, someone wants a written explanation, and every log from the failing side of the wire belongs to a company that is not yours. Here is how to build a Perplexity postmortem out of the evidence you actually have — and what to record now so the next one is not guesswork.
📡 Monitor your APIs — know when they go down before your users do
Better Stack checks uptime every 30 seconds with instant Slack, email & SMS alerts. Free tier available.
Affiliate link — we may earn a commission at no extra cost to you
Almost everything written about incident reviews assumes you own the thing that broke. You read your own logs, you find the deploy or the query or the config change, and the fix is a pull request. A Perplexity API outage inverts that completely: the interesting half of the system is behind someone else's network boundary, it emits no telemetry you can read, and the only public artifact it will ever produce is a status page entry written for customers rather than for investigators.
That does not make the postmortem impossible. It makes it a different document, with a different subject. The vendor's failure is an input to your incident; the incident itself is what your system did when that input arrived. Detection time, blast radius, retry amplification, whether the fallback anyone documented had ever been executed — all of that is yours, all of it is measurable, and all of it is fixable without a single conversation with the provider.
Writing this during or right after the incident? Do the perishable work first: export the raw request records for the window plus two hours on each side, screenshot status.perplexity.ai as it reads right now, and save any provider request ids you have. Status page entries get edited and condensed after the fact, and log retention will age out the window before the review meeting gets scheduled. Check live Perplexity status first if you are not yet sure the incident is over.
The Evidence Asymmetry You Are Writing Around
Start by being explicit about what can and cannot be known, because postmortems for third-party outages go wrong when they quietly promise a level of certainty the evidence does not support. Here is the honest split.
| Question | Who can answer it | What that means for the document |
|---|---|---|
| When did Perplexity start failing for us? | You, precisely | This is the onset timestamp in your timeline. Never use the status page time for this. |
| How long until a human knew? | You, precisely | Detection time is the single most improvable number in the whole review. |
| What did users experience? | You, precisely | Impact section. Requires mapping provider calls to product features in advance. |
| Which requests failed, on which model? | You, only if you recorded it | If the ledger lacks a model id, the scope of the incident is unknowable after the fact. |
| Was it a partial or global degradation? | Partially inferable | Your traffic is a sample of one customer. Say “consistent with”, not “was”. |
| What was the root cause inside Perplexity? | The provider, eventually or never | Quote it if published, mark it unknown if not, and do not block the document on it. |
The last row is where most third-party postmortems stall. A review gets scheduled, the vendor has not published anything, and the document sits in draft waiting for a root cause that in many cases never arrives. Ship the postmortem without it. Four of the six rows above are fully yours, they contain every action item you can actually execute, and none of them depend on the vendor saying anything at all.
status.perplexity.ai Is Not a Timeline
Status pages are written by people, after an internal signal crosses a threshold and someone confirms it is real and decides it is customer-visible. Every one of those steps costs time, and each one is a place where a degradation that was very real for you fails to become a public entry.
| Property of the status page | Consequence for your timeline |
|---|---|
| It is published after human confirmation | The posted start time is later than the real onset. Using it makes your detection time look better than it was and hides the gap you meant to measure. |
| It is scoped to a whole service | A degradation on one model, one endpoint or one region can be total for your workload and still never cross the bar for a public entry. |
| It is graded coarsely | “Degraded performance” covers everything from a 5% error rate to a total outage on a subset of traffic. It cannot size your impact and should never be quoted as if it could. |
| Resolution is declared, not observed | “Resolved” means the provider believes it is fixed. Your recovery timestamp is the first sustained window of healthy responses in your own data, which is often later. |
| Historical entries get edited | The wording you cite in a draft may not be the wording that is live a week later. Screenshot or archive it at the time, with a URL and a capture timestamp. |
None of this is an accusation of bad faith — a status page is a communication tool for a whole customer base and it is doing its job. It is simply the wrong instrument for the measurement you are making. Use it for exactly one thing: corroboration, in a line of the timeline that reads “provider acknowledged at HH:MM, forty minutes after our onset”. That gap is itself a finding, and it is the number that tells you how much independent detection you need to own.
The Timeline You Cannot Reconstruct Later
Onset time, recovery time and the gap before the vendor acknowledged anything all have to be measured while the incident is happening. Continuous external monitoring of your Perplexity endpoint means the postmortem starts from recorded data instead of from memory.
Try Better Stack Free →The Perplexity Trap: The Outage Has No Status Codes In It
Perplexity's API is a retrieval system with a model attached, and that changes the shape of its failures. The distinctive Perplexity incident is not a wave of 500s. It is a window during which every request returns 200, in normal time, with a well-formed body — and the retrieval layer behind it was degraded, so the answers are thinner, the citation lists are shorter or empty, and the content is staler than the question required.
A timeline built from status codes and latency percentiles is structurally blind to this. It will show a flat, healthy green line across the exact window your users were complaining about, and the postmortem will conclude that the reports were anecdotal. The only way to have evidence is to have been recording answer-shaped signals all along: citations returned per response, share of responses with zero citations, response length distribution, and the age of the newest source cited. None of those can be backfilled after the fact.
So the honest finding in a lot of Perplexity postmortems is a measurement gap rather than a cause. Write it that way. “We cannot determine whether retrieval was degraded during this window because we do not record citation counts” is a real, actionable conclusion that produces a specific piece of work. “No provider incident found” is a conclusion that produces nothing and guarantees the same investigation happens again next quarter.
Record the Ledger Now, Not During the Incident
Every postmortem you will ever write for Perplexity is limited by what a single function emitted months earlier. This is the whole game: the investigation is decided in advance, by the fields you chose to log around the call, and no amount of diligence during the review can add a field that was never written.
// One record per Perplexity attempt. Emitted whether it succeeded or not —
// the failures are the postmortem, and a log that only records successes
// is a log that is blank for the exact window you need it.
async function callPerplexity(endpoint, body, ctx) {
const startedAt = Date.now();
let res, err = null;
try {
res = await fetch('https://api.perplexity.ai' + endpoint, {
method: 'POST',
headers: { Authorization: 'Bearer ' + process.env.PERPLEXITY_API_KEY },
body: JSON.stringify(body),
signal: AbortSignal.timeout(ctx.deadlineMs),
});
} catch (e) {
err = e;
}
emit('provider_request', {
ts: startedAt,
// Derive from the base URL, never from the client class name — a
// compatibility-shim client will otherwise log the wrong vendor.
provider: 'perplexity',
// Model id, not just provider. A per-model degradation is invisible
// without this, and it is the most common shape of incident.
model: body.model,
endpoint,
status: res ? res.status : 0,
error_class: err ? err.name : null,
latency_ms: Date.now() - startedAt,
// The provider's OWN request id. This is the single highest-value
// field here: it is the only identifier vendor support can act on,
// and it cannot be reconstructed from anything else you have.
provider_request_id: res ? res.headers.get('x-request-id') : null,
attempt: ctx.attempt,
breaker_state: ctx.breakerState,
// Which product feature this call was serving, so impact can be
// stated in user terms rather than in request counts.
feature: ctx.feature,
});
if (err) throw err;
return res;
}Three fields carry most of the weight and are the three most often missing. provider_request_id is the only thing that makes a support conversation productive; without it you are describing an outage in prose to someone who indexes by id. attempt is what separates “the provider saw 8,000 failures” from “the provider saw 2,000 failures and we turned them into 8,000”, which is a finding about your own retry policy. And feature is what lets the impact section say which part of the product stopped working instead of quoting a request count that means nothing to anyone outside the team.
Retention is part of the design. The request to write a postmortem routinely arrives days or weeks after the incident, especially when it comes from outside engineering. If these records live in a store with a seven-day window, the investigation is over before it starts. Ninety days of the aggregate signal — per-minute counts by status, model and feature — costs very little and is enough to reconstruct any timeline, even when the raw request bodies are long gone.
The Six Facts, In Order
A third-party postmortem is a short document with a fixed spine. Establish these six in this order and the findings write themselves; skip straight to the vendor's root cause and you will produce three pages that change nothing.
- Onset. The first minute your own Perplexity error rate or latency distribution left its normal band. From your ledger, to the minute, with the metric named.
- Detection. When a human first knew. Record the mechanism honestly — an alert, a colleague in Slack, or a customer. Detection minus onset is the number this document exists to reduce.
- Signature. What the failure actually looked like: status codes, error classes, latency shape, which models and endpoints, and crucially whether responses were failing or merely wrong. Several provider degradations return 200 throughout.
- Response. What your system did automatically — retried, tripped a breaker, failed over, queued, or piled up — and what humans did after that. This is where retry amplification and untested fallbacks surface.
- Impact. In product terms and, where a dedicated or provisioned resource was involved, in currency. “Document ingestion was unavailable for 52 minutes, affecting 1,900 uploads” travels; “4.2% of API calls failed” does not.
- Provider account. Last, not first. What
status.perplexity.aisaid and when, quoted with a capture timestamp, plus any published root cause. If nothing was published, write “no provider statement as of <date>” and ship the document.
Note what is deliberately absent: a five-whys chain into the provider's infrastructure. You cannot conduct one, and the imitation of one — speculating about their capacity planning — is the part of these documents that ages worst. The five whys still apply, just pointed at your own side: why did this take nineteen minutes to detect is a question you can answer all the way down.
Symptoms That Get Attributed to the Wrong System
The reason detection times on provider incidents are so bad is that a dependency degradation rarely announces itself as a dependency degradation. It arrives dressed as one of your own bugs, and teams spend the first half of the incident debugging the wrong layer. Five of the six rows below involve responses that a naive monitor reads as healthy.
| What the team sees | Where they look first | What the ledger later shows |
|---|---|---|
| Web workers saturated, unrelated endpoints timing out | Traffic spike, autoscaling, a slow database query | Perplexity calls holding connections open; no bulkhead, so one dependency consumed the whole pool |
| A queue backing up with no error rate change | Consumer deploy, a poison message | Per-job Perplexity latency up several multiples, still returning 200 |
| Support tickets about “bad answers”, dashboards green | A prompt change, a model config regression | Provider-side quality degradation with a 200 on every request |
| Costs spike on a flat traffic day | A pricing change, a runaway loop | Retries on slow-but-successful calls, billed in full every attempt |
| Truncated or empty outputs reaching users | A parsing bug, a serialization change | Streams cut mid-response; the HTTP status was 200 because headers arrived fine |
| A clean wall of 5xx from Perplexity | The provider — correctly, immediately | The only loud row here, and the rarest. Most provider incidents are quieter than this. |
Write this table's relevant row into the postmortem as its own finding. “Twenty-three minutes were spent investigating our own queue consumer because the dependency was returning 200s” is precise, blameless, and produces an obvious piece of work: alert on the latency distribution of provider calls, not only on their failures.
Action Items You Can Actually Own
The test for every line in the action items section: does it have an owner on your team and a definition of done? “Escalate reliability concerns with Perplexity” fails both. These pass.
- Cut detection time. Alert on provider error rate and latency percentiles per model, with a minimum-volume floor so low-traffic endpoints do not page on two failures. Done when a synthetic degradation pages within the target.
- Contain the blast radius. A bounded concurrency limit for Perplexity calls, so a slow dependency cannot exhaust shared workers and take down features that never touch it. Done when a fault-injection test slows Perplexity to the deadline and unrelated endpoints stay healthy — see the circuit breaker guide.
- Cap retry amplification. A retry budget expressed as a ratio of successful traffic rather than a per-call attempt count, so a total outage cannot multiply your own load. Done when the ledger's
attemptfield shows a bounded ratio during a simulated outage — see the retry budget guide. - Exercise the fallback. Route a small share of real production traffic to the documented alternative on a schedule. Done when the last successful execution is dated and recent. An untested fallback is a paragraph, not a control.
- Close the evidence gaps this postmortem exposed. Every “we could not determine” in the document becomes a logging ticket. This is the item that makes the next postmortem cheap, and it is the one most reliably dropped.
- Record the vendor-facing follow-up separately. Support ticket ids and provider request ids are worth tracking, but keep them out of the action item list — they have no completion criteria you control, and mixing them in is how a review gets marked incomplete for months.
Incident Access Should Not Be the Bottleneck
Half of a slow postmortem is nobody being able to reach the provider console, the log archive or the status-page admin at 3am. Shared, audited credential access removes an entire category of delay from the timeline.
Try 1Password Free →Where Traffic Should Have Gone
Almost every Perplexity postmortem ends at the same finding: an alternative existed on paper and was never exercised. Each of these runs on separate infrastructure and separate credentials, so a Perplexity incident does not follow you there.
Groq
Separate infrastructure, separate credential, separate status page. A Perplexity incident does not propagate here.
Check Groq status →Mistral
Separate infrastructure, separate credential, separate status page. A Perplexity incident does not propagate here.
Check Mistral status →OpenAI
Separate infrastructure, separate credential, separate status page. A Perplexity incident does not propagate here.
Check OpenAI status →Deciding which destination is worth the same answer is its own problem — see the fallback ranking guidefor how to rank them, and the failover guidefor the cutover mechanics.
Frequently Asked Questions
How do I write a postmortem for a Perplexity API outage?
Build the timeline from your own request records rather than from the provider's status page, because the status page is published after human confirmation and is coarser than your incident. Establish six facts in order: when your error or latency signal actually changed, when a human noticed, what the failure looked like on the wire including status codes and model ids, what your client did in response, what user-visible impact resulted, and only then what the provider later said. Findings should be scoped to decisions you control — detection time, blast radius, retry behaviour, fallback readiness — because the vendor's root cause is not an action item you can own.
Why does the Perplexity status page not match my incident window?
Status pages are updated by people after an internal threshold is crossed and confirmed, so they lag the onset of a degradation, usually by a meaningful margin, and they are almost always scoped to a whole service rather than to the specific model, region or endpoint you were calling. A partial degradation affecting a subset of traffic can be entirely real for you and still never appear on status.perplexity.ai. Treat the status page as corroboration for a timeline you built yourself, never as its source.
What evidence do I need to keep to investigate a Perplexity outage later?
Per request: a timestamp, the provider and the exact model identifier, the endpoint, the HTTP status, the latency split into time-to-first-byte and total, the provider's own request id, which attempt number it was, and the state of your circuit breaker or fallback at the time. Provider request ids are the highest-value field and the one teams most often drop — they are the only identifier a vendor support conversation can act on. Retention of at least ninety days matters because the request to investigate an incident routinely arrives after the raw logs have aged out.
Should a third-party API postmortem be blameless?
Yes, and the discipline is harder than it looks, because an external cause makes it tempting to write a document whose entire content is that the vendor failed. That version is comfortable and useless. The productive framing is that the outage was an input and your system's response to it is the subject: how long detection took, how far the failure spread beyond the feature that needed the provider, whether retries amplified the load, and whether the documented fallback had ever been exercised. Every one of those is yours to fix.
What action items actually come out of a Perplexity outage postmortem?
Only the ones on your side of the wire. Realistic outputs are: reduce detection time by alerting on latency and error-rate shape rather than on hard failures alone, contain blast radius so a degraded provider cannot exhaust shared connection or worker capacity, cap retry amplification with a budget, and execute the fallback path on a schedule so it is known to work before it is needed. “Ask the vendor to be more reliable” and “wait for the official root cause” are not action items — they have no owner on your team and no completion criteria.
Related Perplexity Guides
Start the Next Postmortem With Data, Not Memory
API Status Check records Perplexity and every other provider in your stack continuously, so onset time, recovery time and the gap before the vendor acknowledged anything are already written down when someone asks for the timeline.
Start Your Free Trial →Alert Pro
14-day free trialStop checking — get alerted instantly
Next time Perplexity goes down, you'll know in under 60 seconds — not when your users start complaining.
- Email alerts for Perplexity + 9 more APIs
- $0 charged today — card required to start
- Cancel anytime — $9/mo after trial
🌐 Can't Access Perplexity?
If Perplexity is working for others but not for you, it might be an ISP or regional issue. A VPN can help bypass network-level blocks and routing problems.
Troubleshoot with a VPN
Connect from a different region to test if the issue is local to your network. Also protects your connection on public Wi-Fi.
Try NordVPN — 30-Day Money-Back GuaranteeSecure Your Perplexity Account
Service outages are a common time for phishing attacks. Use a password manager to keep unique, strong passwords for every account.
Try NordPass — Free Password Manager🛠 Tools We Use & Recommend
Tested across our own infrastructure monitoring 200+ APIs daily
SEO & Site Performance Monitoring
Used by 10M+ marketers
Track your site health, uptime, search rankings, and competitor movements from one dashboard.
“We use SEMrush to track how our API status pages rank and catch site health issues early.”