# HTTP 303 See Other — Status Code Meaning & Examples

> Fetch the result from another URL with GET — the standard answer after a form POST.

303 tells the client to fetch a different URL using GET, whatever the original method was. Its classic job is Post/Redirect/Get: after a form submission the server answers 303 pointing at a confirmation page, so refreshing reloads the confirmation instead of resubmitting the form.

- Class: 3xx Redirection
- Retry: Not applicable
- Cacheable by default: no
- Defined in: [RFC 9110 §15.4.4 — 303 See Other](https://www.rfc-editor.org/rfc/rfc9110.html#section-15.4.4)

## Example response

```http
HTTP/1.1 303 See Other
Location: /orders/1042
```

## When you'll see it

- Form submissions following the Post/Redirect/Get pattern.
- Next.js `redirect()` inside a Server Action responds with 303.
- Async APIs pointing a finished job's status URL at its result.

## How to use it well

1. Use 303 rather than 302 after a POST when you want GET semantics explicitly.
2. For job polling, return 303 with `Location` pointing at the finished resource.

## Send a 303 from your server

### Express

```
res.redirect(303, "/orders/1042");
```

### Next.js route handler

```
return NextResponse.redirect(new URL("/orders/1042", request.url), 303);
```

### Flask

```
return redirect("/orders/1042", code=303)
```

### Go net/http

```
http.Redirect(w, r, "/orders/1042", http.StatusSeeOther)
```

### nginx

```
return 303 /orders/1042;
```

## FAQ

### Why use 303 instead of 302 after a POST?

Browsers already change POST to GET on a 302, but that's legacy behaviour. 303 states the intent in the spec, so every client — API libraries included — does the right thing.

## Related status codes

- [302 Found](https://www.devkult.com/http/302.md)
- [307 Temporary Redirect](https://www.devkult.com/http/307.md)
- [202 Accepted](https://www.devkult.com/http/202.md)

Open the interactive page: https://www.devkult.com/http/303