error code, a reason, and the quoteId of the request when it got one:
Two error bodies differ from the shape above:
not_readycarries a list,reasons, instead ofreason;low_liquidityaddsliquidity: {venue, hubMint, hubAmount}, the deepest pool the router found.
quoteId is absent when the body or query could not be parsed and on an unknown path. A failed build gets a new quoteId, not the quote’s.
Quote declines
Build declines
A build decline’s
reason is a short label; the detail is in the router’s log, under the same quoteId.
/ready
GET /ready is 200 {"ready": true, "reasons": []} when the router can quote and build, and 503 with every reason it cannot otherwise. Use it for your load balancer’s health check; GET /health only says the process is up.
What keeps a router red: no account stream yet, the index not built, your
swap deploy’s config unreadable or missing, the token directory not being written, a stalled stream. A paused config is not a readiness reason: the router stays ready and every build answers 503 swap is paused on chain.
On a fresh install the router knows only the tokens traded since it started. A long-tail token never seen gives
422 cold_unresolved on its first quote, until its first trade arrives or the background pool search finds it.