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.