Page Size Profiler
Pricing
$2.99/month + usage
Page Size Profiler
Page size profiler that measures web page weight broken down by HTML, CSS, JavaScript, and images, so SEO teams can pinpoint what makes pages slow and decide what to cut.
Page Size Profiler: Measure Web Page Weight by Resource Type
Page Size Profiler fetches any public web page and tells you exactly how much it weighs. You get the HTML size, plus a breakdown of every CSS file, JavaScript bundle, image, and font the page loads. Useful when you already suspect a page is too heavy and want numbers before deciding what to cut.
SEO performance and page load time are directly tied to page weight. This actor gives you the raw data to make that case without guessing.
Use cases
- SEO auditing: find pages dragging down your Core Web Vitals scores by identifying which ones load the most CSS, JS, or image weight
- Performance budgeting: measure page size before and after optimizations to confirm the change actually helped
- Content audits: run a list of landing pages through the profiler and sort by total weight to find the worst offenders fast
- Agency reporting: pull page size data for client reports without manually checking each URL in a browser
- QA before launch: verify that a newly built page doesn't ship with uncompressed images or an oversized JS bundle
What data does this actor extract?
Each result contains the HTML size, total page weight, per-type size totals, resource counts, server response time, and the final URL after redirects.
{"url": "https://apify.com","finalUrl": "https://apify.com/","statusCode": 200,"pageTitle": "Apify: Full-Stack Web Scraping and Data Extraction Platform","htmlSizeBytes": 142318,"htmlSizeKb": 138.98,"cssSizeBytes": 89423,"jsSizeBytes": 1247891,"imageSizeBytes": 384210,"fontSizeBytes": 62144,"otherSizeBytes": 0,"totalSizeBytes": 1925986,"totalSizeKb": 1880.85,"resourceCount": 34,"cssCount": 3,"jsCount": 18,"imageCount": 12,"fontCount": 1,"otherCount": 0,"loadTimeMs": 412,"scrapedAt": "2026-03-08T10:00:00.000000+00:00","error": null}
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
url | string | Single URL to profile. | |
urls | array | List of URLs to profile, one per line. | |
fetchResources | boolean | true | Fetch all linked CSS, JS, image, and font files to measure their sizes. Disable for HTML-only measurements. |
maxUrls | integer | 100 | Maximum number of URLs to process per run. |
timeoutSecs | integer | 300 | Overall actor run timeout in seconds. |
requestTimeoutSecs | integer | 30 | Timeout per individual HTTP request in seconds. |
proxyConfiguration | object | Datacenter (Anywhere) | Proxy type and location for requests. Supports Datacenter, Residential, Special, and custom proxies. Optional. |
Example input
{"urls": ["https://apify.com","https://docs.apify.com"],"fetchResources": true,"maxUrls": 100,"requestTimeoutSecs": 30,"proxyConfiguration": { "useApifyProxy": true }}
Output
The actor stores one result per URL in the default dataset. Each entry contains:
| Field | Type | Description |
|---|---|---|
url | string | The input URL. |
finalUrl | string | The URL after following redirects. |
statusCode | integer | HTTP status code from the server. |
pageTitle | string | Text from the page's <title> element. |
htmlSizeBytes | integer | Raw HTML response size in bytes. |
htmlSizeKb | number | Raw HTML response size in kilobytes. |
cssSizeBytes | integer | Combined size of all linked CSS files in bytes. |
jsSizeBytes | integer | Combined size of all linked JavaScript files in bytes. |
imageSizeBytes | integer | Combined size of all linked images in bytes. |
fontSizeBytes | integer | Combined size of all linked font files in bytes. |
otherSizeBytes | integer | Combined size of all other linked resources in bytes. |
totalSizeBytes | integer | HTML plus all linked resources in bytes. |
totalSizeKb | number | HTML plus all linked resources in kilobytes. |
resourceCount | integer | Total number of linked resources found. |
cssCount | integer | Number of CSS stylesheets linked. |
jsCount | integer | Number of JavaScript files linked. |
imageCount | integer | Number of images linked. |
fontCount | integer | Number of font files linked. |
otherCount | integer | Number of other resource types linked. |
loadTimeMs | integer | Time to fetch the main HTML page in milliseconds. |
scrapedAt | string | ISO 8601 timestamp of when the page was profiled. |
error | string | Error message if the page failed. Null on success. |
How it works
- Accepts a single URL or a list of URLs via input.
- Fetches each page with a realistic browser User-Agent, following redirects.
- Measures the HTML response body size in bytes.
- Parses the HTML to find all linked CSS, JavaScript, image, and font resources.
- If
fetchResourcesis enabled, fetches each resource (HEAD first, then GET if needed) and records its size. - Sums everything up and pushes one result row per URL to the dataset.
Integrations
Connect Page Size Profiler with other tools using Apify integrations. Export results directly to Google Sheets, trigger Slack alerts when a page exceeds a size threshold, or pipe data into Zapier and Make automations. You can also use webhooks to kick off a downstream action the moment results are ready.
FAQ
Does this actor handle pages that redirect?
Yes. The actor follows all HTTP redirects and records the final URL in the finalUrl field alongside the original input URL.
What if I only want the HTML size and not the full resource breakdown?
Set fetchResources to false. The actor will still fetch and parse the page but skip the individual resource requests. Runs are much faster this way.
Can it profile pages that require a login? No. The actor works with publicly accessible pages only. It does not support cookies, sessions, or authentication headers.
How many URLs can it process per run?
Up to 1000, controlled by the maxUrls input. The default is 100. For very large lists, consider splitting into multiple runs.
Why are some resource sizes zero even with fetchResources enabled? Some resources return 0 if the server rejects HEAD and GET requests for that file, or if the resource URL is behind authentication. The HTML size is always accurate.
Does it work on JavaScript-rendered pages? The actor uses plain HTTP requests, not a browser. It measures the raw HTML the server returns, which may not include dynamically injected resources. For full SPA profiling, a browser-based approach is needed.



