Data
Get a page
GET
/api/v1/projects/{id}/pages/{pageId}
HTTP result, SEO tags, headings, indexing signals, PageSpeed and open findings for one page.
- API key access
- Read only or read and write
- Project permission
- View pages
- Success
- 200 — OK
Parameters
Path
| Parameter | Type | Notes |
|---|---|---|
id required |
string | Project id |
pageId required |
string |
Example request
Replace tk_live_YOUR_KEY with your API key and the ids with your own.
curl 'https://trackerv2.marketingplanet.global/api/v1/projects/6650a4c2e1b3d5f7a9c1e301/pages/6651b5d3f2c4e6a8b0d2f401' \
-H 'Authorization: Bearer tk_live_YOUR_KEY'
const response = await fetch('https://trackerv2.marketingplanet.global/api/v1/projects/6650a4c2e1b3d5f7a9c1e301/pages/6651b5d3f2c4e6a8b0d2f401', {
headers: {
Authorization: 'Bearer tk_live_YOUR_KEY',
},
});
const result = await response.json();
if (!response.ok) throw new Error(`${result.error.code}: ${result.error.message}`);
console.log(result.data);
import requests
response = requests.get(
"https://trackerv2.marketingplanet.global/api/v1/projects/6650a4c2e1b3d5f7a9c1e301/pages/6651b5d3f2c4e6a8b0d2f401",
headers={"Authorization": "Bearer tk_live_YOUR_KEY"},
)
result = response.json()
if not response.ok:
raise RuntimeError(f"{result['error']['code']}: {result['error']['message']}")
print(result["data"])
Example response
{
"data": {
"id": "6651b5d3f2c4e6a8b0d2f401",
"url": "https://acmeretail.com/products/trail-runner",
"trackingStatus": "active",
"isActive": true,
"source": {
"sitemap": true,
"manual": false,
"links": false
},
"statusCode": 200,
"title": "Trail Runner 2 — Lightweight Running Shoe | Acme Retail",
"lastFetchedAt": "2026-10-06T03:04:18.000Z",
"openFindingCount": 1,
"createdAt": "2026-05-24T10:20:00.000Z",
"updatedAt": "2026-10-06T03:04:18.000Z",
"accessDenied": false,
"http": {
"statusCode": 200,
"requestedUrl": "https://acmeretail.com/products/trail-runner",
"finalUrl": "https://acmeretail.com/products/trail-runner",
"redirectChain": [],
"crossHostRedirect": false,
"downgradedToHttp": false,
"errorClass": null
},
"seo": {
"title": "Trail Runner 2 — Lightweight Running Shoe | Acme Retail",
"description": "Breathable trail shoe with a grippy outsole. Free returns.",
"canonicalUrl": "https://acmeretail.com/products/trail-runner",
"metaRobots": "index, follow",
"xRobotsTag": null,
"headings": [
{
"level": 1,
"text": "Trail Runner 2"
},
{
"level": 2,
"text": "Features"
},
{
"level": 2,
"text": "Reviews"
}
],
"og": {
"title": "Trail Runner 2",
"description": null,
"image": "https://acmeretail.com/media/trail-runner.jpg"
}
},
"indexing": {
"robotsDisallowed": null,
"metaNoindex": false,
"xRobotsNoindex": false,
"canonicalRelative": false,
"canonicalNotSelf": false,
"soft404Suspect": false,
"hasQuery": false,
"moneyScore": null,
"thinScore": null,
"thinSuggestNoindex": false,
"archiveSuspect": false,
"urlPattern": null,
"urlPatternLabels": [],
"urlPatternSuggestNoindex": false,
"signalsAt": null
},
"pagespeed": {
"lastFetchedAt": "2026-10-05T03:10:00.000Z",
"lastError": null,
"current": {
"capturedAt": "2026-10-05T03:10:00.000Z",
"strategy": "mobile",
"scores": {
"performance": 0.82,
"accessibility": 0.96,
"bestPractices": 1,
"seo": 0.92
},
"metrics": {
"fcp": null,
"lcp": {
"id": "largest-contentful-paint",
"title": "Largest Contentful Paint",
"displayValue": "2.4 s",
"numericValue": 2410,
"score": 0.79
},
"cls": {
"id": "cumulative-layout-shift",
"title": "Cumulative Layout Shift",
"displayValue": "0.02",
"numericValue": 0.02,
"score": 1
},
"tbt": null,
"si": null,
"tti": null,
"inp": null
}
}
},
"findings": [
{
"id": "6652c6e4a3d5f7b9c1e3a501",
"pageId": "6651b5d3f2c4e6a8b0d2f401",
"kind": "thin-page-noindex",
"severity": "medium",
"status": "open",
"summary": "Thin page (84 words) — consider noindex or expanding the content",
"finalUrl": null,
"firstSeenAt": "2026-09-28T03:04:00.000Z",
"lastSeenAt": "2026-10-06T03:04:18.000Z",
"acceptedAt": null,
"resolvedAt": null
}
]
}
}
Response fields
| Field | Type | Notes |
|---|---|---|
data |
object | |
data.id |
string | |
data.url |
string | |
data.trackingStatus |
string | |
data.isActive |
boolean | |
data.source |
object | |
data.source.sitemap |
boolean | |
data.source.manual |
boolean | |
data.source.links |
boolean | |
data.statusCode |
integer or null | |
data.title |
string or null | |
data.lastFetchedAt |
string (date-time) or null | |
data.openFindingCount |
integer | |
data.createdAt |
string (date-time) | |
data.updatedAt |
string (date-time) | |
data.accessDenied |
boolean | |
data.http |
object | |
data.seo |
object | |
data.seo.title |
string or null | |
data.seo.description |
string or null | |
data.seo.canonicalUrl |
string or null | |
data.seo.metaRobots |
string or null | |
data.seo.xRobotsTag |
string or null | |
data.seo.headings |
array of object | |
data.seo.og |
object | |
data.indexing |
object | |
data.pagespeed |
object or null | |
data.findings |
array of Finding | |
data.findings[].id |
string | |
data.findings[].pageId |
string or null | |
data.findings[].kind |
string | |
data.findings[].severity |
"critical" | "high" | "medium" | "low" | |
data.findings[].status |
"open" | "accepted" | "resolved" | |
data.findings[].summary |
string | |
data.findings[].finalUrl |
string or null | |
data.findings[].firstSeenAt |
string (date-time) | |
data.findings[].lastSeenAt |
string (date-time) | |
data.findings[].acceptedAt |
string (date-time) or null | |
data.findings[].resolvedAt |
string (date-time) or null |
Errors
Besides the errors any request can return (bad or missing key, plan, scope, rate limit), this endpoint can return:
| Status | error.code | Meaning |
|---|---|---|
| 404 | not-found | The resource does not exist or you cannot open it. Tracker does not reveal which. |
| 403 | flag-viewPages | Your project membership does not include viewing pages. |
Errors always look like { "error": { "code": "…", "message": "…" } }. See Errors & limits.