Troubleshoot 503 UNDER_PRESSURE — when the platform sheds load
UNDER_PRESSURE is the platform’s load-shed response: the server answers
a fast, retryable 503 with a Retry-After header the moment its event loop
is saturated, instead of letting requests queue behind a stuck loop until
they hang past the edge timeout. It names a transient shed, not a
systemic outage — the server is healthy enough to answer immediately.
This page covers the script-shaped 503 envelope that carries
error.code = UNDER_PRESSURE. When a request lands on the /health or
/ready probes, the shed is bypassed; this page covers every other route.
What the UNDER_PRESSURE code means
Orbit’s API samples two pressure signals on every request: event-loop delay (mean, viaperf_hooks.monitorEventLoopDelay) and event-loop utilization
(delta ELU). When the loop is wedged — delay is high and ELU is near-saturated,
corroborated across consecutive sample windows — the gate answers 503
immediately instead of letting the request queue behind the loop until it
times out silently. The code UNDER_PRESSURE names this transient shed
explicitly and distinguishes it from the general SERVICE_UNAVAILABLE code
saved for systemic dependency failures (a pgbouncer blip, a slow migration, a
provider outage).
The shed gives up the response in a few milliseconds with a Retry-After
header, so it buys relief instead of amplifying the pressure. The gate also
leaves the /health, /ready, CORS preflight (OPTIONS), and a per-route
exempt list untouched, so a fleet-wide pressure blip cannot disable the
platform’s own probes or break browser preflight requests — the two
self-inflicted outage classes the shed exists to avoid.
Distinguish UNDER_PRESSURE from SERVICE_UNAVAILABLE
Both are503. Use this table to decide the retry posture and whether it is
a shed or a systemic fault.
On a typical healthy integration,
UNDER_PRESSURE almost never appears. When
it does, it is usually paired with the platform’s load-shedding itself — a
deploy burst, a regional pod burst, or a slow upstream dependency tripping
the loop on that one route. The request id is still stamped into the
meta.request_id so support can trace the shed.
The
UNDER_PRESSURE code was introduced 2026-09-24 on the load-shed gate.
Before then the same behaviour emitted the generic SERVICE_UNAVAILABLE
code — integrators could not tell a transient shed from a systemic fault.
Treat any observed UNDER_PRESSURE response as the transient-shed signal
this page describes. The general 503 envelope contract is
Error response format.Retry posture
UNDER_PRESSURE is retryable as-is. The right posture is:
- Read
Retry-Afterfrom the header. When it is present (it always is on this gate), sleep that many seconds before the retry. When it is absent, fall back to exponential backoff (2 ** attemptseconds, capped). - Retry only the request that was shed. Do not loop over the full batch — that amplifies the load the shed exists to relieve.
- Idempotency keys benefit every retry.
UNDER_PRESSUREitself is safe to replay, but when you retry a mutating write (aPOST /messages, aPOST /billing/top-up), send the same idempotency key you used the first time. The idempotency window replays the original response on a duplicate instead of running the write again. See Idempotency and safe retries.
Retry-After when present and exponential backoff otherwise.
Escalation — when to contact support
The shed is transient. Contact support only when one of these holds:- The same endpoint returns
UNDER_PRESSUREconsistently for more than a few minutes, or returns it on every retry inside one deploy window. - You see
UNDER_PRESSUREon a route that should have been idle, or you can reproduce the shed from a single request.
meta.request_id from one of the responses and a
UTC timestamp. Support can localize the shed in the platform’s
api.load_shed log and confirm the event_loop_delay_ms /
event_loop_utilization the gate recorded when it answered.
The
Retry-After value is bounded (the gate only hints at a short wait).
If your integration retries with jittered exponential backoff for hours,
that is a systemic issue — contact support and include the request id.