sveltejs/kit · error

Invalid response from route ${event.url.pathname}: handler s

Error message

Invalid response from route ${event.url.pathname}: handler should return a Response object

What it means

Runtime contract check in the endpoint renderer: after awaiting the route's handler, the returned value was not a Response instance. SvelteKit endpoint handlers must return a Response (e.g. via Response.json() or new Response(...)); returning plain objects, undefined, or other values fails this instanceof check. The message names the route path whose handler misbehaved.

Source

Thrown at packages/kit/src/runtime/server/endpoint.js:54

	if (state.prerendering && !state.prerendering.inside_reroute && !prerender) {
		if (state.depth > 0) {
			// if request came from a prerendered page, bail
			throw new Error(`${event.route.id} is not prerenderable`);
		} else {
			// if request came direct from the crawler, signal that
			// this route cannot be prerendered, but don't bail
			return new Response(undefined, { status: 204 });
		}
	}

	try {
		const response = await with_request_store({ event, state }, () =>
			handler(/** @type {import('@sveltejs/kit').RequestEvent<Record<string, any>>} */ (event))
		);

		if (!(response instanceof Response)) {
			throw new Error(
				`Invalid response from route ${event.url.pathname}: handler should return a Response object`
			);
		}

		if (state.prerendering && (!state.prerendering.inside_reroute || prerender)) {
			// The returned Response might have immutable Headers
			// so we should clone them before trying to mutate them.
			// We also need to clone the response body since it may be read twice during prerendering
			const cloned = new Response(response.clone().body, {
				status: response.status,
				statusText: response.statusText,
				headers: new Headers(response.headers)
			});
			cloned.headers.set('x-sveltekit-prerender', String(prerender));

			if (state.prerendering.inside_reroute && prerender) {
				// Without this, the route wouldn't be recorded as prerendered,
				// because there's nothing after reroute that would do that.

View on GitHub (pinned to 03f1687fe6)

Solutions

  1. Return a Response from the handler, e.g. `return Response.json({ ok: true })`
  2. Wrap accidental plain-object returns with Response.json(...)
  3. Check all code paths including early returns so none fall through to undefined
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/kit/src/runtime/server/endpoint.js:54 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of sveltejs/kit@03f1687fe6 (2026-09-02). Data as JSON: /api/errors/e8cae982ca1a1736. Report an issue: GitHub.