Error pages and status codes

When RTEdge.net cannot serve a request normally, it answers with a small HTML page that names the problem. This reference lists those pages, what triggers each of them and what to do, as of 2026-10-04. The pages are served as text/html;charset=utf-8 and carry no edge-worker header, which tells them apart from a response of your own worker.

Missing code, files and workers

StatusPageShown whenWhat to do
404Not Found: "Code does not exist."No deployment exists for the route the URL maps to. It was never deployed, it was deleted, or the URL's directory is not itself a route: the route name/docs/sub is separate from name/docs, even when name/docs has a worker. The page links to "Sign in to deploy" for a signed-out visitor and to "Deploy your code here" for a signed-in one. Just after a first deploy, some visitors can still see it for a short time.Deploy the route, or check the directory of the URL. See Request routing and Freshness after a deploy.
404Not Found: "File does not exist."The route exists, but nothing answers the request: a file name that no export matches (names are case-sensitive), or a method other than GET on the page when there is no worker to take it. A page that is empty after processing, on a route without a worker, gives the same page.Check the file name and its case, use GET, or add a worker.
404Not Found: "Worker does not exist."A worker URL (/:…) or a fallback request reached a route that has no edge worker. If you did deploy a worker, an error that stops it from loading can end in this page too.Deploy an edge worker (<script type=worker edge>), and check that it loads without errors.

Sign-in and access

StatusPageShown whenWhat to do
401"You are not authenticated." with a "Sign in" link to ::si. The title is 🌐 ::.A visitor who is not signed in opens a page restricted with edge:user.Sign in.
403"You are not authorized." with a "Sign in as a different user" link to ::sa.A signed-in visitor is not allowed to view a page restricted with edge:user (title 🌐 ::), or is not allowed to open a protected source (title ❓ ::).Sign in with another account, or ask the owner for access. See Restricting access.
303No page: a redirect to ::sit? on the same path.A signed-out visitor opens the source (?) of a deployment whose source is private. They sign in and return to the source.Sign in.

Worker URLs (/:) are not behind the edge:user check, so a worker that must authenticate them has to check request.rt.user itself. Adding sign-in shows how.

Worker errors

StatusPageShown whenWhat to do
501Not Implemented: "Worker response is undefined."The handler returned nothing instead of a Response.Return a Response from every path of the handler.
500Exception: "Worker encountered an exception."The handler threw, or its promise rejected. The page shows the ray ID and the location, the time, and the first lines of the stack.Read the stack. Throw Error objects: a thrown string shows undefined where the stack would be.
500Exception: "Edge encountered an error."A fault in the platform rather than in your worker.Retry. If it persists, write to support@elefunc.com.

See The edge worker runtime and The fetch() handler for what a worker may return.

Other responses

StatusPageShown whenWhat to do
429Too Many RequestsA visitor sends more requests than the platform allows. In the playground, a deploy that is sent too quickly reports "Rate limit hit. Try again later!"Wait and try again.
404No page: an empty body.A path that contains ::i, ::e, ::c, ::u, ::t or ::v that no suffix claims.Keep :: out of paths. See Reserved paths.
501"Invalid affix"A path that contains ::s followed by letters that name no sign-in action.Keep :: out of paths.

Requests for the names in Names to avoid are refused before they reach the router, so they show none of these pages. A path without a trailing slash is not an error: it is redirected to its slash form (see Canonical redirects).

In the playground

The playground output has no router, so it shows none of the pages above. A worker's failures look different there:

SituationWhat happens
The handler's promise rejects with an Error (the default, with io:fail closed)HTTP 500 as text/plain, with a filtered stack.
Any other failure: a synchronous throw, a syntax error, an error while the worker loads, or a rejection with a value that is not an ErrorA network error. fetch() rejects with a TypeError, and a navigation shows the browser's error page.
io:fail=openThe original request goes to the network.
The handler returns nothingA non-GET request to / gets the page, and any other request goes to the network. RTEdge.net answers with the 501 page instead.

The playground console shows worker failures with a ☁️ mark for closed and a ⛅ mark for open. See <script type=worker>.

Notes

Answering missing files yourself

On RTEdge.net, a request for a file name that no export matches reaches your worker with its original URL, so the worker can answer with its own page and status. This covers names with a dot, such as /missing.js. A path with no dot and no trailing slash is redirected to its slash form first and then belongs to another route, which answers "Code does not exist." In the playground, every path except / reaches the worker.

html
<h1>Home</h1>
<script type=worker edge>
  export default { fetch: r => new Response(`Nothing at ${new URL(r.url).pathname}`, { status: 404 }) }
</script>

Throw Error objects

Throw Error objects, in the playground and on RTEdge.net. Both print a stack for them, and neither does for a thrown string or number.

Checking a deployment with HEAD

The root document answers GET only. A HEAD request goes to your worker, or gets "File does not exist.", while a GET of the same URL returns the page. Uptime monitors and link checkers should use GET. Exported files answer any method.

Errors while deploying

Problems that occur while you deploy appear as toasts in the playground, not as pages. See When a deploy fails.

See also