Data
Website health summary
GET
/api/v1/projects/{id}/health
Uptime, SSL, domain expiry, DNS, sitemap, files, HTTP, ports, crawl stats, security headers and open findings by severity — from stored results, so it is safe to poll. Security details are hidden if you lack the view-security permission.
- API key access
- Read only or read and write
- Project permission
- View health
- Success
- 200 — OK
Parameters
Path
| Parameter | Type | Notes |
|---|---|---|
id required |
string | Project id |
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/health' \
-H 'Authorization: Bearer tk_live_YOUR_KEY'
const response = await fetch('https://trackerv2.marketingplanet.global/api/v1/projects/6650a4c2e1b3d5f7a9c1e301/health', {
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/health",
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": {
"uptime": {
"pct": 50,
"avgMs": 1076,
"avgTtfbMs": 1043,
"sampleSize": 2,
"lastStatus": "success",
"lastCheckedAt": "2026-10-06T09:25:12.000Z",
"phaseOn": true
},
"ssl": {
"status": "ok",
"expiresAt": "2026-12-09T23:59:59.000Z",
"daysLeft": 64,
"issuer": "Let's Encrypt",
"subjectCn": "acmeretail.com",
"lastCheckedAt": "2026-10-06T09:25:12.000Z",
"lastError": null,
"phaseOn": true
},
"domainExpiry": {
"status": "ok",
"expiresAt": null,
"daysLeft": 212,
"queriedName": "acmeretail.com",
"registrar": "Namecheap, Inc.",
"lastCheckedAt": "2026-10-05T03:00:00.000Z",
"lastError": null,
"phaseOn": true
},
"dns": {
"status": "ok",
"monitorCount": 0,
"changedCount": 0,
"lastCheckedAt": "2026-10-06T09:00:02.000Z",
"lastError": null,
"phaseOn": true
},
"sitemap": {
"status": "ok",
"lastCheckedAt": "2026-10-06T03:00:41.000Z",
"pagesFound": 128,
"lastError": null,
"structureOk": null,
"structureIssueCount": null
},
"files": {
"robots": {
"status": "ok",
"lastCheckedAt": "2026-10-06T03:00:39.000Z",
"lastError": null,
"phaseOn": true,
"sitemapDirectiveOk": null,
"sitemapUrlCount": 1
},
"llm": {
"status": "pending",
"lastCheckedAt": null,
"lastError": null,
"phaseOn": false
}
},
"technical": {
"lastCheckedAt": "2026-10-06T03:00:45.000Z",
"intervalMinutes": 1440,
"phaseOn": true
},
"httpVersion": {
"http2": true,
"httpVersion": "h2",
"http3": "not-measured",
"checkedAt": "2026-10-06T03:00:44.000Z",
"errorClass": null
},
"hostVersion": {
"ok": true,
"preferredHost": "acmeretail.com",
"alternateHost": "www.acmeretail.com",
"checkedAt": "2026-10-06T03:00:44.000Z",
"issueMessage": null
},
"compression": {
"status": "ok",
"encoding": "br",
"active": true,
"lastCheckedAt": "2026-10-06T09:25:12.000Z",
"phaseOn": true
},
"cacheControl": {
"status": "ok",
"raw": "public, max-age=300",
"cdnHint": null,
"lastCheckedAt": "2026-10-06T09:25:12.000Z",
"phaseOn": true
},
"ports": {
"count": 1,
"activeCount": 1,
"up": 1,
"down": 0,
"monitors": [
{
"id": "6657b1d9f8c0e2a4b6d8fa01",
"label": "SMTP",
"port": 587,
"lastStatus": "success",
"lastCheckedAt": "2026-10-06T09:15:00.000Z",
"isActive": true
}
]
},
"udp": {
"status": "pending",
"port": null,
"packetLoss": null,
"lastCheckedAt": null,
"lastError": null,
"phaseOn": false
},
"crawl": {
"pageCount": 128,
"crawledCount": 126,
"pendingCount": 2,
"orphanCount": 3,
"crawledPct": 98.4,
"statsComputedAt": "2026-10-06T03:01:10.000Z"
},
"security": {
"canView": true,
"headers": {
"items": [
{
"key": "strict-transport-security",
"label": "HSTS",
"present": true,
"value": "max-age=31536000"
},
{
"key": "content-security-policy",
"label": "CSP",
"present": false,
"value": null
},
{
"key": "x-frame-options",
"label": "X-Frame-Options",
"present": false,
"value": null
},
{
"key": "x-content-type-options",
"label": "X-Content-Type-Options",
"present": true,
"value": "nosniff"
},
{
"key": "referrer-policy",
"label": "Referrer-Policy",
"present": false,
"value": null
}
],
"presentCount": 2,
"total": 5
},
"lastProbeAt": "2026-10-06T09:25:12.000Z",
"crossHostRedirect": false,
"downgradedToHttp": false
},
"findings": {
"open": 12,
"bySeverity": {
"critical": 0,
"high": 1,
"medium": 4,
"low": 7
},
"includesSecurity": true
}
}
}
Response fields
| Field | Type | Notes |
|---|---|---|
data |
object | Each section carries its own status, lastCheckedAt and phaseOn where relevant. |
data.uptime |
object | |
data.uptime.pct |
number or null | |
data.uptime.avgMs |
number or null | |
data.uptime.avgTtfbMs |
number or null | |
data.uptime.sampleSize |
integer | |
data.uptime.lastStatus |
string or null | |
data.uptime.lastCheckedAt |
string (date-time) or null | |
data.uptime.phaseOn |
boolean | |
data.ssl |
object | |
data.domainExpiry |
object | |
data.dns |
object | |
data.sitemap |
object | |
data.files |
object | |
data.files.robots |
object | |
data.files.llm |
object | |
data.technical |
object | |
data.httpVersion |
object | |
data.hostVersion |
object | |
data.compression |
object | |
data.cacheControl |
object | |
data.ports |
object | |
data.udp |
object | |
data.crawl |
object | |
data.crawl.pageCount |
integer | |
data.crawl.crawledCount |
integer | |
data.crawl.pendingCount |
integer | |
data.crawl.orphanCount |
integer | |
data.crawl.crawledPct |
number or null | |
data.crawl.statsComputedAt |
string (date-time) or null | |
data.security |
object | |
data.findings |
object | |
data.findings.open |
integer | |
data.findings.bySeverity |
object | |
data.findings.includesSecurity |
boolean |
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-viewHealth | Your project membership does not include viewing health. |
Errors always look like { "error": { "code": "…", "message": "…" } }. See Errors & limits.