Batch PageSpeed & Core Web Vitals — Mobile+Desktop+CrUX
Pricing
from $3.00 / 1,000 pagespeed reports
Batch PageSpeed & Core Web Vitals — Mobile+Desktop+CrUX
Batch Google PageSpeed Insights via the official PSI API: mobile + desktop Lighthouse scores, LCP/CLS/TBT/FCP lab metrics and CrUX field data (LCP/CLS/INP p75). Markdown + CSV report. URL list, sitemap or dataset input. Bring your own free Google API key. Failed URLs free. 256 MB.
Pricing
from $3.00 / 1,000 pagespeed reports
Rating
0.0
(0)
Developer
新世紀書僮
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Batch PageSpeed & Core Web Vitals — PSI API (Mobile + Desktop + CrUX)
Run Google PageSpeed Insights for a list of URLs, a sitemap, or another Actor's dataset — mobile and desktop in one run — and get:
- Lighthouse scores (performance; optionally accessibility, best practices, SEO)
- Lab Core Web Vitals: LCP, CLS, TBT, plus FCP, Speed Index, TTI, server response time (TTFB)
- CrUX field data (real-user 28-day p75: LCP, CLS, INP, FCP, TTFB + good / needs-improvement / poor) whenever Google returns it, for the URL and for the origin
- Top Lighthouse opportunities by estimated savings
- A Markdown report (
REPORT.md) and a CSV (REPORT.csv) in the run's key-value store, plus one dataset row per URL × strategy
It calls the official PageSpeed Insights v5 HTTP API only. No local Chrome, no Lighthouse binary, so the default memory is 256 MB.
Bring your own Google API key (important)
Google's PSI API needs an API key for any real volume. Without a key, Google's shared keyless quota usually answers HTTP 429 – Quota exceeded … Queries per day. When that happens the Actor:
- marks the URL × strategy row as
status: failed,errorClass: quota_exceeded, with a clear hint, - does not charge for it,
- stops making further calls for the rest of the run (
stopOnDailyQuota, on by default), so you are not billed for a run that can't succeed.
Getting a key is free and takes a couple of minutes:
- Open Google Cloud Console → APIs & Services → Library → enable PageSpeed Insights API.
- APIs & Services → Credentials → Create credentials → API key. Optionally restrict the key to the PageSpeed Insights API.
- Paste it into the
googlePagespeedApiKeyinput field. It is stored as an encrypted secret input, sent to Google in a request header (never in the URL), and never written to logs or output.
This Actor has no wallet, top-up or identity-verification step. The only things you supply are URLs and, optionally, your own Google key.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
urls | array | — | { "url": "…" } objects, plain strings, or requestsFromUrl remote lists |
sitemapUrl | string | — | sitemap.xml / sitemap index (.gz ok) / text list; capped by maxUrls |
datasetId | string | — | Dataset from Sitemap URL Discovery or URL Status Checker (reads url; skips rows with httpStatus >= 400) |
keyValueStoreId / keyValueRecordKey | string | DOC_TO_MARKDOWN_INPUT | Load URLs from a KV record |
googlePagespeedApiKey | secret string | — | Recommended. Your Google API key |
strategies | array | ["mobile","desktop"] | Each strategy = one PSI call and one report per URL |
categories | array | ["performance"] | Add accessibility, best-practices, seo at the same price |
locale | string | — | e.g. en, de, ja |
maxUrls | integer | 100 | 0 = no limit |
maxConcurrency | integer | 2 | 1–5; PSI calls take 10–30 s each |
maxRetries | integer | 3 | Retries per-minute 429, 5xx and timeouts with backoff |
requestTimeoutSecs | integer | 120 | Per PSI call |
stopOnDailyQuota | boolean | true | Skip remaining calls (free) once Google reports the daily quota is exhausted |
topOpportunities | integer | 5 | Opportunities kept per row |
includeFailedInCsv | boolean | true | Include failed rows in REPORT.csv |
Example:
{"urls": [{ "url": "https://example.com/" }],"strategies": ["mobile", "desktop"],"googlePagespeedApiKey": "YOUR_KEY"}
Output
Dataset (one row per URL × strategy), main fields:
url, strategy, status, finalUrl, performanceScore, accessibilityScore, bestPracticesScore, seoScore, labLcpMs, labCls, labTbtMs, labFcpMs, labSpeedIndexMs, labTtiMs, labTtfbMs, cruxAvailable, cruxIsOriginFallback, cruxOverallCategory, cruxLcpP75, cruxLcpCategory, cruxClsP75, cruxClsCategory, cruxInpP75, cruxInpCategory, cruxFcpP75, cruxTtfbP75, cruxOrigin…, topOpportunities, lighthouseVersion, fetchTime, httpStatus, attempts, durationMs, errorClass, errorMessage
Key-value store: REPORT.md (lab table, CrUX table, opportunities, failed rows), REPORT.csv, SUMMARY / OUTPUT (counts, error classes, whether a key was used, what was charged).
errorClass values: quota_exceeded, skipped_quota, api_key_invalid, api_forbidden, lighthouse_error, bad_request, psi_server_error, timeout, network.
CrUX notes: CLS p75 is converted to the usual unitless value (Google's API returns it ×100). Low-traffic pages often have no URL-level field data. In that case PSI may fall back to origin data (cruxIsOriginFallback: true), or there may be none at all.
Pricing (pay per event)
| Event | Price | When |
|---|---|---|
| Actor start | $0.001 | once per run (Apify synthetic event) |
pagespeed-report | $0.003 | per successful URL × strategy report |
One URL with mobile + desktop is 2 reports, $0.006. Failed calls are free, including 429 quota, invalid key, timeouts and Lighthouse page-load errors. Your Google API usage is billed by Google under your own key's terms; PSI is normally free within Google's quota.
Chaining
- Sitemap URL Discovery → pass its dataset id as
datasetIdto audit a whole site section. - URL Status Checker → pass its dataset id; broken URLs (
httpStatus >= 400) are skipped automatically.
Limits & notes
- Lab metrics vary from run to run (network, Google's test location). Compare trends, not single runs.
- PSI can't test pages behind login, on localhost, or ones that block Google's Lighthouse user agent. Those come back as
lighthouse_error, free. - Results are computed by Google's servers and returned as-is. INP exists only as field data (CrUX); lab responsiveness shows up as TBT.
License
AGPL-3.0. See LICENSE.