Original research
1 in 5 retailer image hosts served us no image at all
We requested images from every host that appeared in a day of live US affiliate product feeds. One host in five served nothing at all, and the failures were mostly refusals rather than missing files.
Some links here are affiliate links — if you buy, the retailer may pay us a commission at no extra cost to you. We have earned $0 from them so far. Here’s how it works.
We requested images from every host that appeared in a day of live US affiliate product feeds. Of 61 distinct image hosts, 12 (19.7%) returned no usable image on any sampled URL, and those 12 hosts supplied 981 of the 3,642 distinct image URLs in the sample — 26.9% of them. 23 of the 29 individual failures were HTTP 403 Forbidden: the host answered and refused. Sample and method below; measured 2 September 2026.

The finding
| Measure | Value |
|---|---|
| Distinct image hosts in the sample | 61 |
| Hosts returning no usable image on any sampled URL | 12 (19.7%) |
| Hosts returning some but not all | 3 |
| Distinct image URLs collected | 3,642 |
| URLs sitting behind a fully failing host | 981 (26.9%) |
| Individual requests made | 160 |
| Requests returning a usable image | 131 (81.9%) |
| Failures that were HTTP 403 Forbidden | 23 of 29 |
All figures measured on 2 September 2026 during a single run.
The sentence worth lifting: on live US affiliate product feeds on 2 September 2026, about one image host in five served no image at all, and more than a quarter of the image URLs in the sample sat behind one of those hosts.
Method
- Query the CJ product API for US advertisers across 32 keyword pulls spanning kitchen, apparel, electronics, books, toys, beauty, sport, pet, tools, jewellery, furniture, baby, outdoor, grocery, automotive and office categories.
- Collect every distinct
imageLinkreturned: 3,642 URLs across 61 hosts. - Group by host and sample up to 4 URLs per host, chosen with a fixed random seed so the run is repeatable.
- Request each sampled URL once with an ordinary desktop Chrome user-agent and image Accept headers, 12-second timeout, no referrer.
- Count a response as a usable image only when it returns HTTP 200, an
image/content type, and more than 200 bytes of body. A host counts as failing when no sampled URL passes that test.
160 requests, not 3,642: we sampled deliberately rather than crawling every URL, because hammering a retailer’s image CDN to make a point about retailers’ image CDNs would be a poor way to behave.
Which hosts failed, and how
| Image host | URLs in sample | Outcome on every sampled URL |
|---|---|---|
| images.replacements.com | 953 | HTTP 403 Forbidden |
| covers.vitalsource.com | 7 | HTTP 403 Forbidden |
| sc-images.jcpenney.com | 6 | HTTP 403 Forbidden |
| www.maxaroma.com | 6 | HTTP 403 Forbidden |
| covers1.booksamillion.com | 2 | HTTP 403 Forbidden |
| covers3.booksamillion.com | 1 | HTTP 403 Forbidden |
| covers4.booksamillion.com | 1 | HTTP 403 Forbidden |
| image.sportsmansguide.com | 1 | HTTP 403 Forbidden |
| img.tjmaxx.com | 1 | HTTP 403 Forbidden |
| static.platform.michaels.com | 1 | HTTP 403 Forbidden |
| g.christianbook.com | 1 | Answered 200 with a non-image body |
| images.fun.com | 1 | Connection failed |
Hosts are named because the finding is not interpretable without them: one host carries 953 of the 981 affected URLs, and a percentage alone would hide that.
The concentration is the story. One host, images.replacements.com, accounts for 953 of the 981 URLs behind a failing host — and it is the dominant image supplier for replacement china, glassware and discontinued dinnerware in these feeds. For a publisher working in that vertical, the practical position is that the deepest catalogue available comes with no usable photographs.

Three different failures wearing one name
Refusal (23 of 29 failures)
HTTP 403. The host is up, the path is right, and it declines. This is a policy decision somewhere in a CDN configuration, and it is invisible to any check that does not actually fetch the bytes.
Absence (2 of 29)
HTTP 404. The feed references an image that is no longer there. This is the failure everyone expects and it turns out to be the rarest.
Malformed URLs in the feed itself (2 of 29)
Two sampled URLs could not be requested at all, because they were not valid URLs. Checking that host’s full pool, 28 of its 82 image URLs contained unescaped spaces, in the pattern .../full/Harvey Performance Co DBA Harvey Tool_...png. A supplier name with spaces in it had been concatenated into a path without encoding. That is not rot, it is a feed defect, and it fails before any network request is made.
Keep reading
What this data cannot show
It cannot distinguish a block from a rate limit, a geography rule or a referrer policy. A 403 tells you the host refused this request from this address at this moment. It does not tell you it refuses everybody.
It is one network location and one moment. A host that answered at 06:00 might refuse at 18:00, and a host that refused us might serve a request from a different address without complaint.
Small pools produce coarse verdicts. Eight of the twelve failing hosts contributed fewer than 10 URLs, so a single unlucky sample would move them. The 19.7% host figure is therefore softer than the 26.9% URL figure, which is dominated by one large, consistently refusing host.
It says nothing about whether images are correct. We measured whether bytes arrive, not whether the photograph shows the product it claims to.
Last verified 2 September 2026 against 32 live CJ product-feed pulls and 160 individual image requests made during this run, with outcomes recorded per host
Why it matters to anyone publishing product content
Because every automated quality gate a publisher runs will pass a page whose images are dead. Markup validates. Structured data parses. Internal links resolve. The alt text is present and descriptive. And the reader sees a column of grey boxes.
- Check the host, not the page. One request per host tells you more than a hundred requests per page, because the failure is a host property.
- Refusals are not retryable. A 403 will still be a 403 on the third attempt; treating it as transient wastes the retry budget that 404s and timeouts actually need.
- A deep catalogue with unusable images is a trap, and it is the specific trap that a keyword-depth comparison will walk you straight into.
- Validate URLs before requesting them. A tenth of the sample from one host was unfetchable for a reason no network check would ever diagnose.
We ran this because the images on our own pages come from these feeds, and we wanted a number rather than an impression. The number changed what we published the same day: the kitchen guides written in this run all avoid the host in the first row of that table, despite it holding the deepest catalogue we found.
Some links here are affiliate links. LinkToLooks has earned $0 from them to date — no network has approved us yet — so nothing on this page is picked to hit a payout.
Frequently asked
How much retailer image rot is there in affiliate feeds?
In our sample, 12 of 61 image hosts (19.7%) returned no usable image on any sampled URL, and those hosts accounted for 981 of 3,642 distinct image URLs, or 26.9%. Measured 2 September 2026 on live US product feeds.
What causes it?
Mostly refusal rather than absence. 23 of the 29 failed requests returned HTTP 403 Forbidden, meaning the host answered and declined to serve the image. Only 2 were 404 Not Found.
Is this the same as a broken product link?
No. These are the image URLs the feed supplies, not the destination links. A product link can work perfectly while its image refuses to load, which is why the failure is easy to miss.
Does the study prove those hosts block everyone?
No, and we say so explicitly. It measures what happened from one network location, at one moment, with one browser user-agent. A 403 can be a block, a rate limit, a geography rule or a referrer policy, and this method cannot tell them apart.
What should a publisher do about it?
Check image hosts before building pages on them, not after. A host that refuses your server will refuse your readers' browsers in the same way, and no amount of markup validation catches it.
Sources and scope
- Product data: CJ product API, US advertisers, 32 keyword pulls made on 2 September 2026.
- Image requests: 160 single GET requests made on the same date from one network location with a desktop Chrome user-agent.
- Reproducibility: hosts were sampled with a fixed random seed, so the same URL set is selected on a re-run against the same pull.
- No claim is made about the intent behind any refusal.
Keep reading
How this guide was made. We research and draft these guides with AI, then a person checks every price, link and factual claim against the source before it publishes. We work this way because it lets us re-verify prices across hundreds of guides in a day, which is what keeps the numbers here current; it does not decide what we recommend. Anything we could not verify is labelled as unverified rather than filled in.