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

  1. 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-.
  2. Off-by-one / inclusive end — HTTP byte ranges are inclusive. For a 1000-byte file, valid last range is bytes=999-999, not bytes=1000-.
  3. Malformed Range — typos, multiple incompatible units, or bytes= with blanks. Servers may 416 or ignore.
  4. Empty resource — size 0; any non-empty range is unsatisfiable.
  5. Suffix too long — bytes=-N when 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

StatusWhen
206Range OK — body is the slice
200Range ignored — full body (resume broken)
416Range invalid for current size
404Object 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 .

Try it

Related guides

Newest guides