416 - Range Not Satisfiable
HTTP 416 Range Not Satisfiable means requested byte ranges cannot be served for the selected representation.
Last reviewed: March 10, 2026|Source-backed guidance under our editorial policy
Start Here
Use the closest compare guide, playbook, or adjacent error page to narrow the decision faster before you start changing production systems.
This page is part of the Error Reference library. Learn more about the project or report a correction.
What Does Range Not Satisfiable Mean?
Partial content retrieval failed because requested byte ranges do not map to the current representation, so resumable reads break until offsets are corrected.
Common Causes
- -Resume download requests bytes range beyond current object length after object was replaced with smaller file.
- -Cached Content-Length metadata is stale at CDN edge, so client computes invalid byte window against origin.
- -Video player generates suffix range larger than small asset size, and origin returns range not satisfiable.
How to Fix Range Not Satisfiable
- 1Fetch current object length (for example via
HEAD) and rebuildRangeheader within valid bounds. - 2Reset stale resume offsets when resource size/version changed since previous download attempt.
- 3Use single-range requests first to isolate range-calculation defects before multi-range optimization.
Step-by-Step Diagnosis for Range Not Satisfiable
- 1Capture the exact
Rangeheader sent and the response metadata returned with 416. - 2Verify current representation length and compare it against requested byte intervals.
- 3Check for stale resume metadata after upstream resource replacement or truncation.
- 4Retest with a known-valid range (
bytes=0-1023) and then expand range logic incrementally.
Range Math and Representation Length Validation
- -Validate computed offsets against current size (example: client asks
bytes=10485760-for a 6 MB file). - -Inspect inclusive end-range calculations to avoid off-by-one errors (example: requesting
0-1024for a 1024-byte object).
Resume State and Version Drift Trace
- -Correlate resume checkpoints with object version changes (example: file replaced, old checkpoint now points past end).
- -Check caching and CDN behavior for stale metadata (example: cached
Content-Lengthno longer matches origin object).
Implementation Examples
curl -i -X GET https://api.example.com/v1/resource -H "Range: bytes=9999999-10000000"
# Response:
# HTTP/1.1 416 Range Not Satisfiable
# {"error":"Range Not Satisfiable","code":"416"}const response = await fetch('https://api.example.com/v1/resource', {
method: 'GET',
headers: { 'Accept': 'application/json', 'Range': 'bytes=9999999-10000000' }
});
if (response.status === 416) {
console.error('Handle 416 Range Not Satisfiable');
}import requests
response = requests.get(
'https://api.example.com/v1/resource',
headers={'Accept': 'application/json', 'Range': 'bytes=9999999-10000000'}
)
if response.status_code == 416:
print('Handle 416 Range Not Satisfiable')Seen in Production
Download resume offset persisted after file replacement
Frequency: common
Example: Client resumes at old offset, but new file is shorter, so Range starts beyond end and returns 416.
Fix: Invalidate resume checkpoint when ETag or content length changes and restart download from byte 0.
Off-by-one bug in custom range generator
Frequency: rare
Example: Service asks for bytes=0-1048576 on a 1 MB file, exceeding valid inclusive end index.
Fix: Centralize range arithmetic helper and test boundary math with fixed-size fixtures.
Debugging Tools
- -curl -v with explicit Range headers
- -HEAD response inspection for Content-Length and ETag
- -Download-resume client logs
- -CDN/origin metadata comparison dashboards
How to Verify the Fix
- -Repeat resumable reads and confirm valid ranges return expected partial content paths.
- -Run boundary tests for first byte, last byte, and end-of-file resume offsets.
- -Confirm clients recover gracefully by resetting offsets when server signals invalid range.
How to Prevent Recurrence
- -Store and validate resource length/version metadata before issuing resumed range requests.
- -Add integration tests for resume logic across file replacement and truncation scenarios.
- -Standardize range-header builders to avoid manual offset arithmetic in clients.
Pro Tip
- -pin ETag alongside resume offset and restart from byte 0 whenever ETag changes to avoid cross-version range corruption.
Official References
Provider Context
This guidance is specific to HTTP services. Always validate implementation details against official provider documentation before deploying to production.