Image SEO Audit Tool - Alt Text, Weight & Format Checker
Pricing
from $20.00 / 1,000 page analyzeds
Image SEO Audit Tool - Alt Text, Weight & Format Checker
Opens a page in a real browser and returns every image it renders with its weight, format, size and alt text. Flags missing alt attributes, files over 200 KB, JPEG/PNG that should be WebP, and images displayed at the wrong size. JSON per page plus a run summary.
Pricing
from $20.00 / 1,000 page analyzeds
Rating
5.0
(2)
Developer
My Smart Digital
Maintained by CommunityActor stats
3
Bookmarked
30
Total users
0
Monthly active users
12 days ago
Last modified
Categories
Share
Image SEO Audit Tool - Alt Text, Image Weight & Format Checker
Give it a URL. The page is opened in a real browser, every image it actually renders is collected — <img> tags and CSS background-image — and each one comes back with its weight, format, HTTP status, displayed size, natural size, alt text and the problems it has.
Output is JSON: one record per page, plus one summary record for the whole run.
What a real run returns
https://www.smashingmagazine.com, single page, default settings: 28 images, 12 issues — 9 images displayed far smaller than the file actually served, 3 images with no alt text. Formats found on that page: 10 SVG, 6 PNG, 12 undetermined.
What it checks
| Issue code | Raised when |
|---|---|
ALT_MISSING | The image has no alt attribute, or an empty one |
HEAVY_WARN | The file is over 200 KB and up to 500 KB |
HEAVY_CRITICAL | The file is over 500 KB |
NON_NEXT_GEN | A JPEG or PNG heavier than 50 KB, where WebP or AVIF would be lighter |
UPSCALED | The image is displayed larger than its own resolution, so it looks blurry |
DOWNSCALED | The image is displayed at under 25 % of its resolution, so most of the downloaded bytes are wasted |
Each family of checks can be switched off: checkAlt, checkWeight (weight and format), checkDimensions.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
startUrl | string | — | Required. The page to analyze, or the page the crawl starts from |
crawlUrls | boolean | false | Follow internal links and analyze several pages instead of one |
maxPages | integer | 10 | Upper bound on the number of pages analyzed when crawlUrls is on |
checkAlt | boolean | true | Report images with no alt text |
checkWeight | boolean | true | Report heavy images and outdated formats |
checkDimensions | boolean | true | Report images displayed at the wrong size |
timeout | integer (ms) | 15000 | Time budget for loading a page, and for each image request |
userAgent | string | Mozilla/5.0 (compatible; SEO-Image-Analyzer/1.0) | User agent sent to the site |
Only links on the same domain are followed, and anchors, mailto: and tel: links are ignored. There is no sitemap reading: the crawl only sees links present on the pages it visits.
Output
One record per page (type: "page"), with its images and its own counters:
{"type": "page","pageUrl": "https://www.smashingmagazine.com","title": "Smashing Magazine — For Web Designers And Developers","httpStatus": 200,"imagesCount": 28,"issuesCount": 12,"images": [{"imageUrl": "https://www.smashingmagazine.com/images/logo.svg","alt": "Smashing Magazine","displayed": { "w": 52.06, "h": 69.42 },"natural": { "w": 113, "h": 150 },"bytes": 2735,"bytesKB": 2.67,"format": "svg+xml","mime": "image/svg+xml","httpStatus": 206,"cacheControl": "public,max-age=31536000,immutable","issues": ["DOWNSCALED"]}],"summary": {"altMissing": 3,"heavyWarn": 0,"heavyCritical": 0,"nonNextGen": 0,"upscaled": 0,"downscaled": 9,"byFormat": { "svg+xml": 9, "png": 6, "unknown": 11, "svg": 1, "octet-stream": 1 }}}
One summary record for the run (type: "site-summary"), always the last one:
{"type": "site-summary","pagesCrawled": 1,"pagesTurnedAway": 0,"imagesTotal": 28,"issuesTotal": 12,"topIssues": [{ "type": "DOWNSCALED", "count": 9 },{ "type": "ALT_MISSING", "count": 3 }],"byFormat": { "svg+xml": 9, "png": 6, "unknown": 11, "svg": 1, "octet-stream": 1 },"byProblem": { "ALT_MISSING": 3, "HEAVY_WARN": 0, "HEAVY_CRITICAL": 0, "NON_NEXT_GEN": 0, "UPSCALED": 0, "DOWNSCALED": 9 },"byStatus": { "200": 8, "206": 8 },"thresholds": { "HEAVY_WARN": 204800, "HEAVY_CRITICAL": 512000, "HEAVY_WARN_KB": 200, "HEAVY_CRITICAL_KB": 500 }}
thresholds is there so the numbers behind the verdicts are never a black box.
What you are charged for
- Page Analyzed: one event per page record actually written to the dataset, never more than
maxPages, and never twice for the same page. A page that could not be loaded is reported withhttpStatus: 0and an empty image list, and is not charged. A page the site answers with an HTTP error (a broken link's 404, a server error page) is reported with that status so you can see it, and is not charged either, nor are its images. A page the site turns away — the challenge or block page of an anti-bot protection (Cloudflare, Akamai, AWS WAF, DataDome, Imperva) served in its place, or a 401, 403 or 429 refusal — is reported like a page that could not be loaded, withturnedAwayBynaming what answered ("Cloudflare challenge","HTTP 403"): it is not analyzed, not charged, takes none of themaxPagesplaces, and its links are not followed. The run's status message says how many pages were turned away and by what. - Image Analyzed: one event per image analyzed on those pages, after deduplication by URL.
Only HTML pages count as pages. Links to files (images, PDFs, documents, feeds, archives) are not followed, and an address that turns out to serve a file is neither written nor charged: its place goes to a real page. A startUrl that leads to a file ends the run with a message saying so, and nothing is charged.
The amounts are shown in the pricing section of this page.
Limits, stated up front
- Weight is read from HTTP headers, not by downloading the image. A server that returns neither
Content-Lengthnor a byte range leavesbytesatnull, and the weight and format checks are then skipped for that image. - Inline images (
data:URIs) are measured from the page itself. Theirbytesis the decoded size of the embedded payload, and theirformatcomes from the declared media type, so they get the same weight and format verdicts as hosted images. They have nohttpStatusand nocacheControl, since nothing is requested over the network. Note that a base64 payload takes about a third more room inside the HTML document than the size reported here. - The
imageUrlof an inline image is shortened. A payload of several thousand characters is unreadable in a result table, so the field keeps the media type and the first 40 characters, then states how many were dropped:data:image/avif;base64,AAAAHGZ0eXBtaWYxAAAAAG1pZjFhdmlmbWlhZgAA… (+6264 chars). Deduplication still compares the full payload. - CSS background images have no alt text and no natural size, by construction. They are therefore always reported as
ALT_MISSING, and never get anUPSCALEDorDOWNSCALEDverdict. - The page is not scrolled. Images that a lazy-loading script only fetches once the visitor scrolls may be missing from the report, or reported without their final source.
- A site behind an anti-bot protection may turn the audit away. The audit does not try to get past a protection: such pages come back with
turnedAwayByand no images, uncharged. If it is your site, let the audit through (for example with an allow rule for theuserAgentset in the input) and run it again. pagesCrawledcounts every page record, including the pages that failed to load and the pages the site turned away;pagesTurnedAwaycounts the latter.
Typical uses
Pre-migration audit of a site's images, accessibility check on alt text, hunting down the heavy images that slow a page down, and checking that a WebP/AVIF migration actually reached every template.