PageSpeed
Lab and field performance for one URL from PageSpeed Insights.
1 endpoint. Each one is a REST endpoint under https://woodander.com/api/v1 and an MCP tool with the same name and arguments. See the overview for authentication, rate limits and errors.
pagespeed_check
/api/v1/pagespeed
Run Google PageSpeed on one page of your own sites and get everything needed to fix the code: score, lab and field (Chrome UX Report) metrics and, for each failing audit, the resources to change (render-blocking scripts and styles, unused JS and CSS with URLs and bytes, oversized images, fonts, LCP element, layout-shift elements, long tasks, third parties, cache lifetimes, redirects, server response time). Needs the site-audit plan feature; 30 fresh runs an hour and 100 a day (answers are cached 10 minutes and do not count).
pagespeed_check
Scope read:seo
Plan Pro and above
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
url |
query | string |
Yes | Full page address on one of your sites (see list_sites), e.g. https://example.com/pricing. |
strategy |
query | string |
No | Device: mobile (default) or desktop. One of: mobile, desktop. |
Example request
curl "https://woodander.com/api/v1/pagespeed?url=https%3A%2F%2Fexample.com%2F" \
-H "Authorization: Bearer wdr_..."{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "pagespeed_check",
"arguments": {
"url": "https://example.com/"
}
}
}Example response Example
{
"data": {
"url": "https://example.com/",
"fetched_at": "2026-10-19T09:00:00.000Z",
"final_url": "https://example.com/",
"strategy": "mobile",
"score": 62,
"lab": [
{
"id": "largest-contentful-paint",
"label": "Largest Contentful Paint",
"value": "4.1 s",
"score": 0.4,
"numeric_value": 4100
}
],
"field": null,
"truncated": false,
"audits": [
{
"id": "render-blocking-resources",
"title": "Eliminate render-blocking resources",
"description": "Resources are blocking the first paint of your page.",
"score": 0.3,
"display_value": "Potential savings of 1,200 ms",
"savings_ms": 1200,
"savings_bytes": 0,
"items_total": 1,
"items": [
{
"url": "https://example.com/assets/app.css",
"totalBytes": 48000,
"wastedMs": 1200
}
]
}
]
},
"meta": {
"site": "example.com",
"strategy": "mobile",
"cached": false
}
}Errors
| HTTP | Code | Meaning |
|---|---|---|
| 401 | unauthenticated | Missing, invalid, expired or revoked token. |
| 403 | insufficient_scope | The token does not have the read:seo scope. |
| 403 | plan_required | The plan does not include API access. |
| 422 | invalid_request | A parameter is not valid (range, type, cursor). |
| 429 | rate_limited | Too many requests. See the Retry-After header. |