Image SEO Audit Tool - Alt Text, Weight & Format Checker avatar

Image SEO Audit Tool - Alt Text, Weight & Format Checker

Under maintenance

Pricing

Pay per event

Go to Apify Store
Image SEO Audit Tool - Alt Text, Weight & Format Checker

Image SEO Audit Tool - Alt Text, Weight & Format Checker

Under maintenance

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

Pay per event

Rating

5.0

(2)

Developer

My Smart Digital

My Smart Digital

Maintained by Community

Actor stats

3

Bookmarked

29

Total users

0

Monthly active users

6 days ago

Last modified

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 codeRaised when
ALT_MISSINGThe image has no alt attribute, or an empty one
HEAVY_WARNThe file is over 200 KB and up to 500 KB
HEAVY_CRITICALThe file is over 500 KB
NON_NEXT_GENA JPEG or PNG heavier than 50 KB, where WebP or AVIF would be lighter
UPSCALEDThe image is displayed larger than its own resolution, so it looks blurry
DOWNSCALEDThe 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

FieldTypeDefaultWhat it does
startUrlstringRequired. The page to analyze, or the page the crawl starts from
crawlUrlsbooleanfalseFollow internal links and analyze several pages instead of one
maxPagesinteger10Upper bound on the number of pages analyzed when crawlUrls is on
checkAltbooleantrueReport images with no alt text
checkWeightbooleantrueReport heavy images and outdated formats
checkDimensionsbooleantrueReport images displayed at the wrong size
timeoutinteger (ms)15000Time budget for loading a page, and for each image request
userAgentstringMozilla/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,
"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. A page that could not be loaded is reported with httpStatus: 0 and an empty image list, and is not charged.
  • Image Analyzed: one event per image analyzed on those pages, after deduplication by URL.

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-Length nor a byte range leaves bytes at null, and the weight and format checks are then skipped for that image. On the example run above this was the case for 12 of the 28 images.
  • Inline images (data: URIs) are analyzed like the others, and their imageUrl field then holds the whole base64 string, which can be several thousand characters long.
  • CSS background images have no alt text and no natural size, by construction. They are therefore always reported as ALT_MISSING, and never get an UPSCALED or DOWNSCALED verdict.
  • 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.
  • pagesCrawled counts every page record, including the pages that failed to load.

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.