HTTP 416 Range Not Satisfiable
The client asked for a slice of the file that does not exist — usually past the end, or a garbled Range header. The server answers 416 instead of 206.
What you see
HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */10485760
Content-Length: 0
RFC 9110 encourages Content-Range: bytes */total on 416 so clients can adjust. Some servers omit it — then compare your local size to a fresh HEAD’s Content-Length.
Common causes
- Partial larger than remote file — you resumed a different/shorter build, or a previous 200 appended duplicate data. Local length ≥ remote size → 416 on
bytes=local-. - Off-by-one / inclusive end — HTTP byte ranges are inclusive. For a 1000-byte file, valid last range is
bytes=999-999, notbytes=1000-. - Malformed Range — typos, multiple incompatible units, or
bytes=with blanks. Servers may 416 or ignore. - Empty resource — size 0; any non-empty range is unsatisfiable.
- Suffix too long —
bytes=-Nwhen N exceeds size is usually clamped, but buggy servers 416.
Repair steps
# Learn the real size
curl -sI https://example.com/file.bin | grep -i content-length
# If local partial is bigger or checksum fails — start clean
rm file.bin
curl -O https://example.com/file.bin
# If local is smaller and server supports ranges — resume explicitly
LOCAL=$(wc -c < file.bin)
curl -H "Range: bytes=${LOCAL}-" -o file.bin.part https://example.com/file.bin
# then append after verifying 206
Interactive walkthrough of “restart vs resume”: learn.oddlathe.com/resume.
416 vs other statuses
| Status | When |
|---|---|
| 206 | Range OK — body is the slice |
| 200 | Range ignored — full body (resume broken) |
| 416 | Range invalid for current size |
| 404 | Object gone — do not keep appending to an old partial |
Related
Content-Range header · Resume with curl or wget · HTTP 206 Partial Content · Download won't resume / starts over · 401 vs 403 · ENOSPC · Anvil HTTP status · Wirebook /resume
Questions
What does 416 Range Not Satisfiable mean?
The Range header did not overlap the resource’s current byte size. Adjust the range or re-download from scratch.
Why do I get 416 after a failed resume?
Often the local file grew past the remote size (wrong file merged) or the remote was replaced with a smaller object. Check Content-Range */SIZE on the 416.
Should clients retry 416?
Not with the same Range. Read */SIZE, truncate or discard the partial, then GET without Range or with a corrected range.
Is 416 an error in the browser UI?
It usually surfaces as a failed download. DevTools Network shows status 416 on the ranged request.
Can middleware invent a 416?
Yes — WAFs or API gateways that parse Range strictly. Compare curling the origin vs the public hostname.
How does this relate to video seeking?
A player seeking past EOF or with a stale duration can trigger 416; refresh metadata and duration from the server.
Published · updated .