Resultados de velocidad
GET
/sites/{siteId}/performance- Permiso
sites:read- Herramienta MCP
speed_results
Speed per tested page, lab and real visitors One representative page per template. lab is PageSpeed Insights (mobile median of the latest speed test). field is real Chrome visitors over 28 days (75th percentile, phone): the page's own record, else the whole site's; null when Google has no data. findingsUse says which number each speed finding uses.
Las descripciones vienen del documento OpenAPI y están en inglés.
Parámetros
| Nombre | Dónde | Detalles |
|---|---|---|
siteIdObligatorio | ruta | stringWebsite id, from GET /sites. |
Respuesta
200 · application/json
| Campo | Detalles |
|---|---|
site | object · required; Chrome UX Report for the whole site; null when never asked |
site.phone | object · required |
site.phone.available | true or false |
site.phone.reason | |
site.phone.lcpMs | number |
site.phone.inpMs | number |
site.phone.cls | number |
site.phone.periodEnd | string |
site.phone.collectedAt | string |
site.desktop | object · required |
site.desktop.available | true or false |
site.desktop.reason | string |
site.desktop.lcpMs | |
site.desktop.inpMs | |
site.desktop.cls | |
site.desktop.periodEnd | |
site.desktop.collectedAt | string |
pages | list of object · required |
pages[].url | address (URL) · required; Tested page |
pages[].template | string · required; Page template it stands for |
pages[].testedAt | string or null · required |
pages[].lighthouseVersion | string or null · required |
pages[].lab | object · required |
pages[].lab.lcpMs | number or null · required; Largest Contentful Paint, ms (median of the runs) |
pages[].lab.cls | number or null · required; Cumulative Layout Shift |
pages[].lab.runs | integer · required; Runs in the median |
pages[].lab.desktopLcpMs | number or null · required; Desktop LCP of the same template, ms |
pages[].field | object or null · required; Real visitors; null when Google has no data |
pages[].field.scope | page | site · required; The page's own record or the whole site's |
pages[].field.lcpMs | number or null · required |
pages[].field.inpMs | number or null · required; Interaction to Next Paint, ms |
pages[].field.cls | number or null · required |
pages[].field.periodEnd | date (YYYY-MM-DD) or null · required |
pages[].findingsUse | object · required; Which number each speed finding uses |
pages[].findingsUse.lcp | field_page | field_site | lab | · required |
pages[].findingsUse.cls | field_page | field_site | lab | · required |
pages[].findingsUse.inp | field_page | · required |
budget | object · required |
budget.perDay | integer · required; PageSpeed runs per day |
budget.usedToday | integer · required; Used in the last 24 hours |
budget.left | integer · required; Left now |
budget.nextFreeAt | string or null · required; When a run frees up; null when some are left |
note | string · required; How to read the numbers |
link | address (URL) · required; Speed screen in the app |
Errores
| Estado | Significado |
|---|---|
401 | Missing, unknown or revoked key. Codes: missing_key, invalid_key. |
403 | The key lacks the scope, covers another website, or its owner lost access. Codes: missing_scope, other_site, owner_left, no_owner, forbidden. |
404 | Not found. Codes: not_found. |
429 | Too many requests this hour for this key. Codes: rate_limited. |
Petición de ejemplo
curl \
-H "Authorization: Bearer mr_ws_…" \
"https://app.monoranks.com/api/v1/sites/SITE_ID/performance"const res = await fetch("https://app.monoranks.com/api/v1/sites/SITE_ID/performance", {
headers: { Authorization: "Bearer mr_ws_…" },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import requests
res = requests.get(
"https://app.monoranks.com/api/v1/sites/SITE_ID/performance",
headers={"Authorization": "Bearer mr_ws_…"},
)
res.raise_for_status()
data = res.json()<?php
$ch = curl_init("https://app.monoranks.com/api/v1/sites/SITE_ID/performance");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["Authorization: Bearer mr_ws_…"],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import axios from "axios";
const { data } = await axios.get("https://app.monoranks.com/api/v1/sites/SITE_ID/performance", { headers: { Authorization: "Bearer mr_ws_…" } });Respuesta de ejemplo
{
"site": {
"phone": {
"available": true,
"reason": null,
"lcpMs": 2300,
"inpMs": 180,
"cls": 0.04,
"periodEnd": "2026-10-03",
"collectedAt": "2026-10-05T03:00:12.000Z"
},
"desktop": {
"available": false,
"reason": "not_enough_data",
"lcpMs": null,
"inpMs": null,
"cls": null,
"periodEnd": null,
"collectedAt": "2026-10-05T03:00:13.000Z"
}
},
"pages": [
{
"url": "https://acmebikes.com/bikes/gravel/",
"template": "product-category",
"testedAt": "2026-10-05T03:10:44.000Z",
"lighthouseVersion": "12.8.2",
"lab": {
"lcpMs": 3120,
"cls": 0.02,
"runs": 3,
"desktopLcpMs": 1240
},
"field": {
"scope": "site",
"lcpMs": 2300,
"inpMs": 180,
"cls": 0.04,
"periodEnd": "2026-10-03"
},
"findingsUse": {
"lcp": "field_site",
"cls": "lab",
"inp": null
}
}
],
"budget": {
"perDay": 20,
"usedToday": 6,
"left": 14,
"nextFreeAt": null
},
"note": "Speed of one representative page per template.",
"link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/performance"
}{
"error": {
"code": "missing_key",
"message": "Send the key as Authorization: Bearer mr_site_…"
}
}{
"error": {
"code": "missing_scope",
"message": "This key does not have the scope this call needs."
}
}{
"error": {
"code": "not_found",
"message": "Website not found."
}
}{
"error": {
"code": "rate_limited",
"message": "More than 1200 requests this hour for this key."
}
}El servidor MCP hace lo mismo con la herramienta speed_results.