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:
- Click Export in the scan header.
- Choose CSV or JSON.
- 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:
| Column | Description |
|---|---|
page_url | Full URL scanned. |
path | URL path (no origin). |
strategy | mobile or desktop. |
score_performance | 0-100. |
score_seo | 0-100. |
score_accessibility | 0-100. |
score_best_practices | 0-100. |
lcp_ms, cls, inp_ms, fcp_ms, ttfb_ms, tbt_ms, speed_index_ms, tti_ms | Lab CWV and supporting metrics. |
crux_lcp_ms, crux_cls, crux_inp_ms, has_crux_data | Real-user CrUX values, where available. |
top_opportunities | Semicolon-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.
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.