Skip to main content

Bulk Export

Need the raw data? Every scan has an Export button that gives you the full result set as CSV or JSON.

How to export​

On any completed scan:

  1. Click Export in the scan header.
  2. Choose CSV or JSON.
  3. The file downloads instantly.

You can also hit the endpoint directly:

GET /api/sites/[siteId]/export?format=csv&scanId=<scanId>
GET /api/sites/[siteId]/export?format=json&scanId=<scanId>

Omit scanId to export the latest completed scan for the site.

CSV format​

One row per page × strategy. Columns:

ColumnDescription
page_urlFull URL scanned.
pathURL path (no origin).
strategymobile or desktop.
score_performance0-100.
score_seo0-100.
score_accessibility0-100.
score_best_practices0-100.
lcp_ms, cls, inp_ms, fcp_ms, ttfb_ms, tbt_ms, speed_index_ms, tti_msLab CWV and supporting metrics.
crux_lcp_ms, crux_cls, crux_inp_ms, has_crux_dataReal-user CrUX values, where available.
top_opportunitiesSemicolon-delimited list of top 5 opportunity titles with estimated savings.

Import straight into Google Sheets, Excel, or pipe into a pandas DataFrame.

JSON format​

JSON export is the full structured payload — every field the CSV has, plus nested objects the CSV flattens or drops:

{
"scan": {
"id": "scan_...",
"siteId": "wf_...",
"startedAt": "2026-04-18T09:00:12Z",
"completedAt": "2026-04-18T09:04:47Z",
"strategy": "both"
},
"results": [
{
"pageUrl": "https://example.com/",
"path": "/",
"strategy": "mobile",
"scores": { "performance": 82, "seo": 100, "accessibility": 94, "bestPractices": 100 },
"cwv": { "lcp": 2100, "cls": 0.04, "inp": 180, "fcp": 1300, "ttfb": 420, "tbt": 150, "speedIndex": 2800, "tti": 3400 },
"crux": { "lcp": 2400, "cls": 0.06, "inp": 220, "hasData": true },
"topOpportunities": [ { "title": "...", "savingsMs": 1200, "description": "..." } ],
"thirdPartyScripts": [ { "domain": "...", "transferSize": 45000, "blockingTime": 120 } ],
"a11yAudits": [ { "id": "...", "title": "...", "score": 0, "displayValue": "..." } ]
}
]
}

JSON is the right format when you need topOpportunities, thirdPartyScripts, or failing a11yAudits in structured form — the CSV flattens these.

Sheet trick for clients

Export CSV, filter by strategy = "mobile", sort by score_performance ascending. You now have a ready-to-paste "worst mobile pages" table for any client report.

What's next​

  • Want a sharable version instead of a file? See Shareable Reports.
  • Want to trigger exports programmatically from CI? Export uses your API key — pass it as Authorization: Bearer.