{"openapi":"3.1.0","info":{"title":"Tracker API","version":"1.0.0","description":"Read monitoring data and run actions on your Tracker projects. Authenticate with a personal API key from Profile → API keys."},"servers":[{"url":"/api/v1"}],"security":[{"apiKey":[]}],"tags":[{"name":"Account","description":"The key and account making the request."},{"name":"Projects","description":"Create, read, update and delete projects."},{"name":"Data","description":"Read monitoring results for a project."},{"name":"Actions","description":"Run checks and change pages or findings. Long work is queued as a job."},{"name":"Jobs","description":"Poll queued actions."},{"name":"Webhooks","description":"Have Tracker POST signed events to your HTTPS endpoint."}],"paths":{"/me":{"get":{"tags":["Account"],"summary":"Current key and plan","description":"Who the key belongs to, its scopes, and your plan’s API allowance.","x-scope":"read","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Me"}}},"example":{"data":{"user":{"id":"64b7f0c2a1e4d5f6a7b8c901","name":"Alex Rivera","email":"alex@acmeretail.com"},"apiKey":{"id":"66a1c3e5f7a9b1c3d5e7f901","name":"Reporting script","prefix":"tk_live_3f9a1c7e2b40","scopes":["read","write"],"expiresAt":"2027-01-04T09:00:00.000Z"},"plan":{"key":"growth","maxApiKeys":3,"requestsPerMinute":300}}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getMe","x-permission":null,"x-errors":[]}},"/projects":{"get":{"tags":["Projects"],"summary":"List projects","description":"Projects you own or are an active member of, newest first.","x-scope":"read","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"example":{"data":[{"id":"6650a4c2e1b3d5f7a9c1e301","name":"Acme Retail","domain":"acmeretail.com","role":"owner","trackingStatus":"active","phases":{"uptime":true,"technical":true,"sitemap":true,"pages":true,"robots":true,"llm":false,"udp":false,"dns":true,"domainExpiry":true,"ports":true},"intervals":{"uptimeMinutes":5,"pagesMinutes":1440,"technicalMinutes":1440,"dnsMinutes":60},"uptime":{"scheme":"https","port":null,"timeoutSeconds":30,"alertRepeatMinutes":60,"lastStatus":"success","lastCheckedAt":"2026-10-06T09:25:12.000Z"},"healthCheck":{"verifyHeader":false,"headerName":"","headerValueIncludes":"","verifyContent":true,"contentIncludes":"Add to cart"},"sitemap":{"url":"https://acmeretail.com/sitemap.xml","status":"ok","lastCheckedAt":"2026-10-06T03:00:41.000Z","pagesFound":128},"robotsUrl":null,"llmUrl":null,"domainExpiry":{"status":"ok","daysLeft":212,"lastCheckedAt":"2026-10-05T03:00:00.000Z"},"technicalLastCheckedAt":"2026-10-06T03:00:45.000Z","cms":"wordpress","createdAt":"2026-05-24T10:12:00.000Z","updatedAt":"2026-10-06T09:25:12.000Z"},{"id":"6650a4c2e1b3d5f7a9c1e302","name":"Northwind Legal","domain":"northwindlegal.com","role":"owner","trackingStatus":"active","phases":{"uptime":true,"technical":true,"sitemap":true,"pages":true,"robots":true,"llm":true,"udp":false,"dns":true,"domainExpiry":false,"ports":false},"intervals":{"uptimeMinutes":5,"pagesMinutes":1440,"technicalMinutes":1440,"dnsMinutes":null},"uptime":{"scheme":"https","port":null,"timeoutSeconds":30,"alertRepeatMinutes":60,"lastStatus":"success","lastCheckedAt":"2026-10-06T09:27:40.000Z"},"healthCheck":{"verifyHeader":false,"headerName":"","headerValueIncludes":"","verifyContent":false,"contentIncludes":""},"sitemap":{"url":null,"status":"ok","lastCheckedAt":null,"pagesFound":42},"robotsUrl":null,"llmUrl":null,"domainExpiry":{"status":"pending","daysLeft":null,"lastCheckedAt":null},"technicalLastCheckedAt":null,"cms":"unknown","createdAt":"2026-07-02T14:40:00.000Z","updatedAt":"2026-10-06T09:27:40.000Z"}],"meta":{"page":1,"limit":25,"total":2}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listProjects","x-permission":null,"x-errors":[]},"post":{"tags":["Projects"],"summary":"Create a project","description":"Plan limits apply (project count, minimum intervals). The first uptime, technical and DNS checks start automatically. If `intervals.pagesMinutes` is omitted while page crawling is on, your plan’s minimum is used.","x-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"},"example":{"name":"Acme Retail","domain":"acmeretail.com","intervals":{"uptimeMinutes":5},"healthCheck":{"verifyContent":true,"contentIncludes":"Add to cart"}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Project"}}},"example":{"data":{"id":"6650a4c2e1b3d5f7a9c1e301","name":"Acme Retail","domain":"acmeretail.com","role":"owner","trackingStatus":"active","phases":{"uptime":true,"technical":true,"sitemap":true,"pages":true,"robots":true,"llm":false,"udp":false,"dns":true,"domainExpiry":true,"ports":true},"intervals":{"uptimeMinutes":5,"pagesMinutes":1440,"technicalMinutes":1440,"dnsMinutes":60},"uptime":{"scheme":"https","port":null,"timeoutSeconds":30,"alertRepeatMinutes":60,"lastStatus":"success","lastCheckedAt":"2026-10-06T09:25:12.000Z"},"healthCheck":{"verifyHeader":false,"headerName":"","headerValueIncludes":"","verifyContent":true,"contentIncludes":"Add to cart"},"sitemap":{"url":"https://acmeretail.com/sitemap.xml","status":"ok","lastCheckedAt":"2026-10-06T03:00:41.000Z","pagesFound":128},"robotsUrl":null,"llmUrl":null,"domainExpiry":{"status":"ok","daysLeft":212,"lastCheckedAt":"2026-10-05T03:00:00.000Z"},"technicalLastCheckedAt":"2026-10-06T03:00:45.000Z","cms":"wordpress","createdAt":"2026-05-24T10:12:00.000Z","updatedAt":"2026-10-06T09:25:12.000Z"}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"You already have a project for that domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createProject","x-permission":null,"x-errors":["invalid-request","plan-required","max-projects","forbidden","conflict"]}},"/projects/{id}":{"get":{"tags":["Projects"],"summary":"Get a project","x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Project"}}},"example":{"data":{"id":"6650a4c2e1b3d5f7a9c1e301","name":"Acme Retail","domain":"acmeretail.com","role":"owner","trackingStatus":"active","phases":{"uptime":true,"technical":true,"sitemap":true,"pages":true,"robots":true,"llm":false,"udp":false,"dns":true,"domainExpiry":true,"ports":true},"intervals":{"uptimeMinutes":5,"pagesMinutes":1440,"technicalMinutes":1440,"dnsMinutes":60},"uptime":{"scheme":"https","port":null,"timeoutSeconds":30,"alertRepeatMinutes":60,"lastStatus":"success","lastCheckedAt":"2026-10-06T09:25:12.000Z"},"healthCheck":{"verifyHeader":false,"headerName":"","headerValueIncludes":"","verifyContent":true,"contentIncludes":"Add to cart"},"sitemap":{"url":"https://acmeretail.com/sitemap.xml","status":"ok","lastCheckedAt":"2026-10-06T03:00:41.000Z","pagesFound":128},"robotsUrl":null,"llmUrl":null,"domainExpiry":{"status":"ok","daysLeft":212,"lastCheckedAt":"2026-10-05T03:00:00.000Z"},"technicalLastCheckedAt":"2026-10-06T03:00:45.000Z","cms":"wordpress","createdAt":"2026-05-24T10:12:00.000Z","updatedAt":"2026-10-06T09:25:12.000Z"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getProject","x-permission":"open","x-errors":["not-found"]},"patch":{"tags":["Projects"],"summary":"Update a project","description":"Send only the fields to change, in the same shape the API returns. Unknown fields are ignored. Requires the change-settings permission.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"},"example":{"trackingStatus":"active","uptime":{"timeoutSeconds":30},"intervals":{"uptimeMinutes":5}}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Project"}}},"example":{"data":{"id":"6650a4c2e1b3d5f7a9c1e301","name":"Acme Retail","domain":"acmeretail.com","role":"owner","trackingStatus":"active","phases":{"uptime":true,"technical":true,"sitemap":true,"pages":true,"robots":true,"llm":false,"udp":false,"dns":true,"domainExpiry":true,"ports":true},"intervals":{"uptimeMinutes":5,"pagesMinutes":1440,"technicalMinutes":1440,"dnsMinutes":60},"uptime":{"scheme":"https","port":null,"timeoutSeconds":30,"alertRepeatMinutes":60,"lastStatus":"success","lastCheckedAt":"2026-10-06T09:25:12.000Z"},"healthCheck":{"verifyHeader":false,"headerName":"","headerValueIncludes":"","verifyContent":true,"contentIncludes":"Add to cart"},"sitemap":{"url":"https://acmeretail.com/sitemap.xml","status":"ok","lastCheckedAt":"2026-10-06T03:00:41.000Z","pagesFound":128},"robotsUrl":null,"llmUrl":null,"domainExpiry":{"status":"ok","daysLeft":212,"lastCheckedAt":"2026-10-05T03:00:00.000Z"},"technicalLastCheckedAt":"2026-10-06T03:00:45.000Z","cms":"wordpress","createdAt":"2026-05-24T10:12:00.000Z","updatedAt":"2026-10-06T09:25:12.000Z"}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"You already have a project for that domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateProject","x-permission":"change-settings","x-errors":["invalid-request","not-found","flag-changeSettings","paused-by-plan","forbidden","conflict"]},"delete":{"tags":["Projects"],"summary":"Delete a project","description":"Owner only. Deletes the project and all its data.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"deleted":{"const":true}}}}},"example":{"data":{"id":"6650a4c2e1b3d5f7a9c1e301","deleted":true}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteProject","x-permission":"delete-or-transfer","x-errors":["not-found","owner-only","forbidden"]}},"/projects/{id}/health":{"get":{"tags":["Data"],"summary":"Website health summary","description":"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.","x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Health"}}},"example":{"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}}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getProjectHealth","x-permission":"view-health","x-errors":["not-found","flag-viewHealth"]}},"/projects/{id}/uptime/checks":{"get":{"tags":["Data"],"summary":"Uptime check history","description":"Newest first. Pass `meta.nextBefore` as `before` to get the next page.","x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"},"description":"Only checks created before this time"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UptimeCheck"}},"meta":{"$ref":"#/components/schemas/CursorMeta"}}},"example":{"data":[{"id":"6653d7f5b4e6a8c0d2f4b601","kind":"health","status":"success","statusCode":200,"errorClass":null,"errorMessage":null,"requestedUrl":"https://acmeretail.com/","finalUrl":"https://acmeretail.com/","redirectChain":[],"crossHostRedirect":false,"downgradedToHttp":false,"timing":{"dnsMs":12,"connectMs":31,"tlsMs":44,"ttfbMs":182,"totalMs":241,"startedAt":null},"healthCheckFailures":[],"tls":{"subjectCn":"acmeretail.com","issuer":"Let's Encrypt","validFrom":"2026-09-10T00:00:00.000Z","validTo":"2026-12-09T23:59:59.000Z","daysRemaining":64},"createdAt":"2026-10-06T09:25:12.000Z"},{"id":"6653d7f5b4e6a8c0d2f4b602","kind":"health","status":"failed","statusCode":503,"errorClass":"http_5xx","errorMessage":"Server returned 503","requestedUrl":"https://acmeretail.com/","finalUrl":null,"redirectChain":[],"crossHostRedirect":false,"downgradedToHttp":false,"timing":{"dnsMs":11,"connectMs":29,"tlsMs":41,"ttfbMs":1904,"totalMs":1910,"startedAt":null},"healthCheckFailures":[],"tls":null,"createdAt":"2026-10-06T09:20:12.000Z"}],"meta":{"limit":2,"nextBefore":"2026-10-06T09:20:12.000Z"}}}}},"400":{"description":"Invalid `before`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listUptimeChecks","x-permission":"view-health","x-errors":["invalid-request","not-found","flag-viewHealth"]}},"/projects/{id}/uptime/daily":{"get":{"tags":["Data"],"summary":"Daily uptime","description":"Scheduled uptime checks summed per UTC day, for charts and reports: uptime %, average response time and TTFB, plus totals for the range. Days without checks are included with null values. The range defaults to the last 7 days and starts no earlier than your plan keeps history (`retentionDays`).","x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"},{"name":"from","in":"query","schema":{"type":"string","format":"date"},"description":"First day, YYYY-MM-DD (UTC)"},{"name":"to","in":"query","schema":{"type":"string","format":"date"},"description":"Last day, YYYY-MM-DD (UTC), inclusive"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/UptimeDaily"}}},"example":{"data":{"from":"2026-10-04","to":"2026-10-06","retentionDays":90,"days":[{"date":"2026-10-04","checks":288,"up":288,"down":0,"uptimePct":100,"avgMs":240,"avgTtfbMs":180},{"date":"2026-10-05","checks":288,"up":285,"down":3,"uptimePct":99,"avgMs":263,"avgTtfbMs":190},{"date":"2026-10-06","checks":0,"up":0,"down":0,"uptimePct":null,"avgMs":null,"avgTtfbMs":null}],"summary":{"checks":576,"up":573,"down":3,"uptimePct":99.5,"avgMs":251,"avgTtfbMs":185}}}}}},"400":{"description":"`from` or `to` is not YYYY-MM-DD","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getUptimeDaily","x-permission":"view-health","x-errors":["invalid-request","not-found","flag-viewHealth"]}},"/projects/{id}/pages":{"get":{"tags":["Data"],"summary":"List pages","description":"Sorted by URL. Requires the view-pages permission.","x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"q","in":"query","schema":{"type":"string","maxLength":200},"description":"Case-insensitive URL substring (plain text)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PageSummary"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"example":{"data":[{"id":"6651b5d3f2c4e6a8b0d2f402","url":"https://acmeretail.com/about","trackingStatus":"active","isActive":true,"source":{"sitemap":true,"manual":false,"links":false},"statusCode":200,"title":"About us | Acme Retail","lastFetchedAt":"2026-10-06T03:04:02.000Z","openFindingCount":0,"createdAt":"2026-05-24T10:20:00.000Z","updatedAt":"2026-10-06T03:04:02.000Z"},{"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"}],"meta":{"page":1,"limit":50,"total":2}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listPages","x-permission":"view-page-reports","x-errors":["not-found","flag-viewPages"]},"post":{"tags":["Actions"],"summary":"Add pages","description":"Adds URLs on the project’s domain. Plan page limit applies; duplicates, off-site and invalid URLs are counted, not added.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["urls"],"properties":{"urls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":200}}},"example":{"urls":["https://acmeretail.com/products/trail-runner-3","https://acmeretail.com/sale","https://othersite.com/not-ours"]}}}},"responses":{"200":{"description":"Processed","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/AddPagesResult"}}},"example":{"data":{"added":2,"duplicates":0,"invalid":0,"offsite":1,"duplicateInBatch":0,"capped":0,"alreadyBroken":0,"submitted":3,"pagesCount":130}}}}},"400":{"description":"Missing urls, or more than 200 (`too-many-urls`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"addPages","x-permission":"edit-pages","x-errors":["invalid-request","too-many-urls","not-found","flag-editPages","forbidden"]}},"/projects/{id}/pages/{pageId}":{"get":{"tags":["Data"],"summary":"Get a page","description":"HTTP result, SEO tags, headings, indexing signals, PageSpeed and open findings for one page.","x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"},{"name":"pageId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Page"}}},"example":{"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}]}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getPage","x-permission":"view-page-reports","x-errors":["not-found","flag-viewPages"]}},"/projects/{id}/findings":{"get":{"tags":["Data"],"summary":"List findings","description":"Most recently seen first. Security findings are hidden if you lack the view-security permission.","x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"},{"name":"status","in":"query","schema":{"enum":["open","accepted","resolved","all"],"default":"open"}},{"name":"severity","in":"query","schema":{"enum":["critical","high","medium","low"]}},{"name":"kind","in":"query","schema":{"type":"string"},"description":"e.g. missing-title, missing-header"},{"name":"pageId","in":"query","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"example":{"data":[{"id":"6652c6e4a3d5f7b9c1e3a502","pageId":null,"kind":"missing-header","severity":"high","status":"open","summary":"Content-Security-Policy header is missing","finalUrl":null,"firstSeenAt":"2026-09-01T09:00:00.000Z","lastSeenAt":"2026-10-06T09:25:12.000Z","acceptedAt":null,"resolvedAt":null}],"meta":{"page":1,"limit":50,"total":1}}}}},"400":{"description":"Invalid filter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listFindings","x-permission":"view-health","x-errors":["invalid-request","not-found","flag-viewHealth"]}},"/projects/{id}/checks/uptime":{"post":{"tags":["Actions"],"summary":"Run an uptime probe now","description":"Runs immediately and returns the result. Requires change-settings. Counts against the owner’s monthly check budget, so one probe per project every 30 seconds — sooner returns 429 `probe-cooldown` with `Retry-After`. Skips return 403 with the reason as `code` (e.g. `check-budget`, `tracking-inactive`, `phase-off`).","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"200":{"description":"Check result","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/UptimeCheck"}}},"example":{"data":{"id":"6653d7f5b4e6a8c0d2f4b601","kind":"health","status":"success","statusCode":200,"errorClass":null,"errorMessage":null,"requestedUrl":"https://acmeretail.com/","finalUrl":"https://acmeretail.com/","redirectChain":[],"crossHostRedirect":false,"downgradedToHttp":false,"timing":{"dnsMs":12,"connectMs":31,"tlsMs":44,"ttfbMs":182,"totalMs":241,"startedAt":null},"healthCheckFailures":[],"tls":{"subjectCn":"acmeretail.com","issuer":"Let's Encrypt","validFrom":"2026-09-10T00:00:00.000Z","validTo":"2026-12-09T23:59:59.000Z","daysRemaining":64},"createdAt":"2026-10-06T09:25:12.000Z"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"runUptimeProbe","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","probe-cooldown","check-budget","tracking-inactive","phase-off","forbidden"]}},"/projects/{id}/checks/full":{"post":{"tags":["Actions"],"summary":"Run a full project check","description":"Uptime now; DNS, all technical checks and page crawls queued. Requires change-settings.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Queued. When deduplicated, only the JobAccepted fields are returned.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/JobAccepted"},{"type":"object","properties":{"dnsJobId":{"type":["string","null"]},"pagesQueued":{"type":"integer"},"pagesTruncated":{"type":"boolean"},"uptime":{"type":["object","null"]}}}]}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"technical-check","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701","dnsJobId":"6654e8a6c5f7b9d1e3a5c702","pagesQueued":128,"pagesTruncated":false,"uptime":{"ok":true,"status":"success"}}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"runFullCheck","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","forbidden"]}},"/projects/{id}/checks/dns":{"post":{"tags":["Actions"],"summary":"Check DNS","description":"Requires change-settings.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"dns-check","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"checkDns","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","forbidden"]}},"/projects/{id}/checks/sitemap":{"post":{"tags":["Actions"],"summary":"Check the sitemap","description":"Requires change-settings.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"technical-check","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"checkSitemap","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","forbidden"]}},"/projects/{id}/checks/robots":{"post":{"tags":["Actions"],"summary":"Check robots.txt","description":"Requires change-settings.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"technical-check","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"checkRobots","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","forbidden"]}},"/projects/{id}/checks/llm":{"post":{"tags":["Actions"],"summary":"Check llms.txt","description":"Requires change-settings.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"technical-check","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"checkLlm","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","forbidden"]}},"/projects/{id}/checks/udp":{"post":{"tags":["Actions"],"summary":"Check the UDP port","description":"Requires change-settings.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"technical-check","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"checkUdp","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","forbidden"]}},"/projects/{id}/checks/domain-expiry":{"post":{"tags":["Actions"],"summary":"Check domain expiry","description":"Requires change-settings and a plan with domain expiry monitoring (403 `plan-gate` otherwise).","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"technical-check","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"checkDomainExpiry","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","plan-gate","forbidden"]}},"/projects/{id}/checks/broken-urls":{"post":{"tags":["Actions"],"summary":"Recheck broken URLs","description":"Requires change-settings.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"broken-urls-recheck","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"recheckBrokenUrls","x-permission":"change-settings","x-errors":["not-found","flag-changeSettings","forbidden"]}},"/projects/{id}/checks/pagespeed":{"post":{"tags":["Actions"],"summary":"Run PageSpeed","description":"Requires view-performance.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"device":{"enum":["mobile","desktop"],"default":"mobile"}}},"example":{"device":"desktop"}}}},"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"project-pagespeed","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"runPagespeed","x-permission":"view-performance","x-errors":["not-found","flag-viewPerformance","forbidden"]}},"/projects/{id}/pages/{pageId}/crawl":{"post":{"tags":["Actions"],"summary":"Crawl a page","description":"Requires edit-pages.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"},{"name":"pageId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"202":{"description":"Job queued (or an identical one is already queued)","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/JobAccepted"}}},"example":{"data":{"jobId":"6654e8a6c5f7b9d1e3a5c701","kind":"page-crawl","status":"queued","deduplicated":false,"statusUrl":"/api/v1/jobs/6654e8a6c5f7b9d1e3a5c701"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"crawlPage","x-permission":"edit-pages","x-errors":["not-found","flag-editPages","forbidden"]}},"/projects/{id}/findings/{findingId}/accept":{"post":{"tags":["Actions"],"summary":"Accept a finding","description":"Marks the finding as accepted baseline. Requires the accept-findings permission.","x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Project id"},{"name":"findingId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"200":{"description":"Accepted","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Finding"}}},"example":{"data":{"id":"6652c6e4a3d5f7b9c1e3a501","pageId":"6651b5d3f2c4e6a8b0d2f401","kind":"thin-page-noindex","severity":"medium","status":"accepted","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":"2026-10-06T09:30:00.000Z","resolvedAt":null}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"acceptFinding","x-permission":"accept-security-baseline","x-errors":["not-found","flag-acceptFindings","forbidden"]}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook endpoints","x-scope":"read","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"example":{"data":[{"id":"6655f9b7d6a8c0e2f4b6d801","url":"https://hooks.acmeretail.com/tracker","description":"Ops channel","events":["uptime.down","uptime.recovered"],"projectIds":["6650a4c2e1b3d5f7a9c1e301"],"enabled":true,"disabledReason":null,"consecutiveFailures":0,"lastDeliveryAt":"2026-10-06T09:20:44.000Z","lastSuccessAt":"2026-10-06T09:20:44.000Z","createdAt":"2026-09-12T08:00:00.000Z","updatedAt":"2026-10-06T09:20:44.000Z"}]}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listWebhooks","x-permission":null,"x-errors":[]},"post":{"tags":["Webhooks"],"summary":"Create a webhook endpoint","description":"HTTPS only. Omit `events` for all event types and `projectIds` for all projects you can open. The response includes the signing `secret` — it is only shown here and on rotation. Up to 10 endpoints per account.","x-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointInput"},"example":{"url":"https://hooks.acmeretail.com/tracker","description":"Ops channel","events":["uptime.down","uptime.recovered"],"projectIds":["6650a4c2e1b3d5f7a9c1e301"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointWithSecret"}}},"example":{"data":{"id":"6655f9b7d6a8c0e2f4b6d801","url":"https://hooks.acmeretail.com/tracker","description":"Ops channel","events":["uptime.down","uptime.recovered"],"projectIds":["6650a4c2e1b3d5f7a9c1e301"],"enabled":true,"disabledReason":null,"consecutiveFailures":0,"lastDeliveryAt":null,"lastSuccessAt":null,"createdAt":"2026-09-12T08:00:00.000Z","updatedAt":"2026-10-06T09:20:44.000Z","secret":"whsec_Q2xhdWRlIGRvY3MgZXhhbXBsZSBzZWNyZXQ"}}}}},"400":{"description":"Invalid URL (`invalid-url`), events or projectIds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"A projectId is not a project you can open","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createWebhook","x-permission":null,"x-errors":["invalid-url","invalid-request","not-found","too-many-endpoints"]}},"/webhooks/{webhookId}":{"get":{"tags":["Webhooks"],"summary":"Get a webhook endpoint","x-scope":"read","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"example":{"data":{"id":"6655f9b7d6a8c0e2f4b6d801","url":"https://hooks.acmeretail.com/tracker","description":"Ops channel","events":["uptime.down","uptime.recovered"],"projectIds":["6650a4c2e1b3d5f7a9c1e301"],"enabled":true,"disabledReason":null,"consecutiveFailures":0,"lastDeliveryAt":"2026-10-06T09:20:44.000Z","lastSuccessAt":"2026-10-06T09:20:44.000Z","createdAt":"2026-09-12T08:00:00.000Z","updatedAt":"2026-10-06T09:20:44.000Z"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getWebhook","x-permission":null,"x-errors":["not-found"]},"patch":{"tags":["Webhooks"],"summary":"Update a webhook endpoint","description":"Send `enabled: true` to turn an endpoint back on after it was disabled for repeated failures.","x-scope":"write","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointUpdate"},"example":{"events":["uptime.down","uptime.recovered","finding.opened"]}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"example":{"data":{"id":"6655f9b7d6a8c0e2f4b6d801","url":"https://hooks.acmeretail.com/tracker","description":"Ops channel","events":["uptime.down","uptime.recovered","finding.opened"],"projectIds":["6650a4c2e1b3d5f7a9c1e301"],"enabled":true,"disabledReason":null,"consecutiveFailures":0,"lastDeliveryAt":"2026-10-06T09:20:44.000Z","lastSuccessAt":"2026-10-06T09:20:44.000Z","createdAt":"2026-09-12T08:00:00.000Z","updatedAt":"2026-10-06T09:20:44.000Z"}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateWebhook","x-permission":null,"x-errors":["invalid-url","invalid-request","not-found"]},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook endpoint","description":"Also deletes its delivery log.","x-scope":"write","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"deleted":{"const":true}}}}},"example":{"data":{"id":"6655f9b7d6a8c0e2f4b6d801","deleted":true}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteWebhook","x-permission":null,"x-errors":["not-found"]}},"/webhooks/{webhookId}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Rotate the signing secret","description":"The old secret stops working immediately.","x-scope":"write","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"200":{"description":"Rotated","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointWithSecret"}}},"example":{"data":{"id":"6655f9b7d6a8c0e2f4b6d801","url":"https://hooks.acmeretail.com/tracker","description":"Ops channel","events":["uptime.down","uptime.recovered"],"projectIds":["6650a4c2e1b3d5f7a9c1e301"],"enabled":true,"disabledReason":null,"consecutiveFailures":0,"lastDeliveryAt":"2026-10-06T09:20:44.000Z","lastSuccessAt":"2026-10-06T09:20:44.000Z","createdAt":"2026-09-12T08:00:00.000Z","updatedAt":"2026-10-06T09:20:44.000Z","secret":"whsec_Q2xhdWRlIGRvY3MgZXhhbXBsZSBzZWNyZXQ"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"rotateWebhookSecret","x-permission":null,"x-errors":["not-found"]}},"/webhooks/{webhookId}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test event","description":"Queues a `webhook.test` event to this endpoint. Check the result in its deliveries. Tests and redeliveries are limited to one per endpoint every 10 seconds (429 `send-cooldown`) and 20 per minute per account (429 `send-rate-limited`).","x-scope":"write","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"202":{"description":"Queued","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WebhookDelivery"}}},"example":{"data":{"id":"6656a0c8e7b9d1f3a5c7e901","endpointId":"6655f9b7d6a8c0e2f4b6d801","eventId":"evt_3c5e7a9b1d3f5a7c9e1b3d5f","event":"webhook.test","projectId":null,"status":"pending","attempts":0,"nextAttemptAt":"2026-10-06T09:30:00.000Z","lastAttemptAt":null,"lastStatusCode":null,"lastError":null,"lastDurationMs":null,"deliveredAt":null,"createdAt":"2026-10-06T09:30:00.000Z"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"sendWebhookTest","x-permission":null,"x-errors":["not-found","send-cooldown","send-rate-limited"]}},"/webhooks/{webhookId}/deliveries":{"get":{"tags":["Webhooks"],"summary":"List recent deliveries","description":"Newest first; kept for 30 days. Shows each attempt’s HTTP status, error and timing.","x-scope":"read","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"status","in":"query","schema":{"enum":["pending","delivering","succeeded","failed"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"meta":{"type":"object"}}},"example":{"data":[{"id":"6656a0c8e7b9d1f3a5c7e901","endpointId":"6655f9b7d6a8c0e2f4b6d801","eventId":"evt_9b1f2c4d6e8a0b2c4d6e8f01","event":"uptime.down","projectId":"6650a4c2e1b3d5f7a9c1e301","status":"succeeded","attempts":1,"nextAttemptAt":null,"lastAttemptAt":"2026-10-06T09:20:44.000Z","lastStatusCode":204,"lastError":null,"lastDurationMs":183,"deliveredAt":"2026-10-06T09:20:44.000Z","createdAt":"2026-10-06T09:20:43.000Z"}],"meta":{"limit":10}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listWebhookDeliveries","x-permission":null,"x-errors":["invalid-request","not-found"]}},"/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver":{"post":{"tags":["Webhooks"],"summary":"Redeliver an event","description":"Sends the same event again with the same event id, so your receiver can dedupe. Shares the test-send limits (429 `send-cooldown` / `send-rate-limited`).","x-scope":"write","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}},{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"202":{"description":"Queued","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WebhookDelivery"}}},"example":{"data":{"id":"6656a0c8e7b9d1f3a5c7e901","endpointId":"6655f9b7d6a8c0e2f4b6d801","eventId":"evt_9b1f2c4d6e8a0b2c4d6e8f01","event":"uptime.down","projectId":"6650a4c2e1b3d5f7a9c1e301","status":"pending","attempts":0,"nextAttemptAt":"2026-10-06T09:30:00.000Z","lastAttemptAt":null,"lastStatusCode":null,"lastError":null,"lastDurationMs":null,"deliveredAt":null,"createdAt":"2026-10-06T09:30:00.000Z"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"redeliverWebhookEvent","x-permission":null,"x-errors":["not-found","send-cooldown","send-rate-limited"]}},"/jobs/{jobId}":{"get":{"tags":["Jobs"],"summary":"Get a job","description":"Poll until `status` is `done` or `failed`. Jobs are kept for 24 hours.","x-scope":"read","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Job"}}},"example":{"data":{"id":"6654e8a6c5f7b9d1e3a5c701","kind":"dns-check","projectId":"6650a4c2e1b3d5f7a9c1e301","pageId":null,"status":"done","result":{"status":"ok","monitors":4,"changed":0},"errorClass":null,"errorMessage":null,"createdAt":"2026-10-06T09:30:00.000Z","startedAt":"2026-10-06T09:30:01.000Z","finishedAt":"2026-10-06T09:30:03.000Z"}}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan has no API access, key over plan limit, missing scope, account locked, or missing project permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded — see RateLimit-* and Retry-After headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getJob","x-permission":null,"x-errors":["not-found"]}}},"webhooks":{"uptime.down":{"post":{"summary":"uptime.down event","parameters":[{"name":"Tracker-Event","in":"header","schema":{"const":"uptime.down"}},{"name":"Tracker-Event-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Delivery-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Signature","in":"header","schema":{"type":"string"},"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your endpoint secret>"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried"}}}},"uptime.still_down":{"post":{"summary":"uptime.still_down event","parameters":[{"name":"Tracker-Event","in":"header","schema":{"const":"uptime.still_down"}},{"name":"Tracker-Event-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Delivery-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Signature","in":"header","schema":{"type":"string"},"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your endpoint secret>"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried"}}}},"uptime.recovered":{"post":{"summary":"uptime.recovered event","parameters":[{"name":"Tracker-Event","in":"header","schema":{"const":"uptime.recovered"}},{"name":"Tracker-Event-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Delivery-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Signature","in":"header","schema":{"type":"string"},"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your endpoint secret>"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried"}}}},"finding.opened":{"post":{"summary":"finding.opened event","parameters":[{"name":"Tracker-Event","in":"header","schema":{"const":"finding.opened"}},{"name":"Tracker-Event-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Delivery-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Signature","in":"header","schema":{"type":"string"},"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your endpoint secret>"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried"}}}},"finding.resolved":{"post":{"summary":"finding.resolved event","parameters":[{"name":"Tracker-Event","in":"header","schema":{"const":"finding.resolved"}},{"name":"Tracker-Event-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Delivery-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Signature","in":"header","schema":{"type":"string"},"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your endpoint secret>"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried"}}}},"webhook.test":{"post":{"summary":"webhook.test event","parameters":[{"name":"Tracker-Event","in":"header","schema":{"const":"webhook.test"}},{"name":"Tracker-Event-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Delivery-Id","in":"header","schema":{"type":"string"}},{"name":"Tracker-Signature","in":"header","schema":{"type":"string"},"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your endpoint secret>"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Authorization: Bearer tk_live_…"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","examples":["invalid-request","not-found","insufficient-scope","plan-limit"]},"message":{"type":"string"}},"additionalProperties":true}}},"PageMeta":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"}}},"CursorMeta":{"type":"object","properties":{"limit":{"type":"integer"},"nextBefore":{"type":["string","null"],"format":"date-time"}}},"Me":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"name":{"type":["string","null"]},"email":{"type":"string"}}},"apiKey":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"enum":["read","write"]}},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"plan":{"type":"object","properties":{"key":{"type":"string"},"maxApiKeys":{"type":"integer"},"requestsPerMinute":{"type":"integer"}}}}},"Intervals":{"type":"object","description":"Minutes. Plan minimums apply. null when that monitor has no schedule yet.","properties":{"uptimeMinutes":{"type":["integer","null"]},"pagesMinutes":{"type":["integer","null"]},"technicalMinutes":{"type":["integer","null"]},"dnsMinutes":{"type":["integer","null"]}}},"Phases":{"type":"object","description":"Which monitors are on.","properties":{"uptime":{"type":"boolean"},"technical":{"type":"boolean"},"sitemap":{"type":"boolean"},"pages":{"type":"boolean"},"robots":{"type":"boolean"},"llm":{"type":"boolean"},"udp":{"type":"boolean"},"dns":{"type":"boolean"},"domainExpiry":{"type":"boolean"},"ports":{"type":"boolean"}}},"Project":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"name":{"type":"string"},"domain":{"type":"string"},"role":{"enum":["owner","member"]},"trackingStatus":{"enum":["active","inactive","paused-by-plan"]},"phases":{"$ref":"#/components/schemas/Phases"},"intervals":{"$ref":"#/components/schemas/Intervals"},"uptime":{"type":"object","properties":{"scheme":{"enum":["https","http"]},"port":{"type":["integer","null"]},"timeoutSeconds":{"type":"integer"},"alertRepeatMinutes":{"type":"integer"},"lastStatus":{"type":["string","null"]},"lastCheckedAt":{"type":["string","null"],"format":"date-time"}}},"healthCheck":{"$ref":"#/components/schemas/HealthCheckSettings"},"sitemap":{"type":"object","properties":{"url":{"type":["string","null"]},"status":{"type":["string","null"]},"lastCheckedAt":{"type":["string","null"],"format":"date-time"},"pagesFound":{"type":"integer"}}},"robotsUrl":{"type":["string","null"]},"llmUrl":{"type":["string","null"]},"domainExpiry":{"type":"object","properties":{"status":{"type":["string","null"]},"daysLeft":{"type":["integer","null"]},"lastCheckedAt":{"type":["string","null"],"format":"date-time"}}},"technicalLastCheckedAt":{"type":["string","null"],"format":"date-time"},"cms":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"HealthCheckSettings":{"type":"object","properties":{"verifyHeader":{"type":"boolean"},"headerName":{"type":"string","maxLength":200},"headerValueIncludes":{"type":"string","maxLength":500},"verifyContent":{"type":"boolean"},"contentIncludes":{"type":"string","maxLength":2000}}},"ProjectCreate":{"type":"object","required":["name","domain"],"properties":{"name":{"type":"string","maxLength":120},"domain":{"type":"string","examples":["example.com"]},"trackingStatus":{"enum":["active","inactive"],"default":"active"},"phases":{"type":"object","properties":{"pages":{"type":"boolean","default":true}}},"intervals":{"type":"object","properties":{"uptimeMinutes":{"type":"integer"},"pagesMinutes":{"type":"integer"},"technicalMinutes":{"type":"integer"}}},"healthCheck":{"$ref":"#/components/schemas/HealthCheckSettings"}}},"ProjectUpdate":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"domain":{"type":"string"},"trackingStatus":{"enum":["active","inactive"]},"phases":{"$ref":"#/components/schemas/Phases"},"intervals":{"$ref":"#/components/schemas/Intervals"},"uptime":{"type":"object","properties":{"scheme":{"enum":["https","http"]},"port":{"type":["integer","null"]},"timeoutSeconds":{"type":"integer","minimum":28,"maximum":300},"alertRepeatMinutes":{"type":"integer"}}},"healthCheck":{"$ref":"#/components/schemas/HealthCheckSettings"},"sitemap":{"type":"object","properties":{"url":{"type":["string","null"]}}},"robotsUrl":{"type":["string","null"]},"llmUrl":{"type":["string","null"]}}},"Health":{"type":"object","description":"Each section carries its own status, lastCheckedAt and phaseOn where relevant.","properties":{"uptime":{"type":"object","properties":{"pct":{"type":["number","null"]},"avgMs":{"type":["number","null"]},"avgTtfbMs":{"type":["number","null"]},"sampleSize":{"type":"integer"},"lastStatus":{"type":["string","null"]},"lastCheckedAt":{"type":["string","null"],"format":"date-time"},"phaseOn":{"type":"boolean"}}},"ssl":{"type":"object"},"domainExpiry":{"type":"object"},"dns":{"type":"object"},"sitemap":{"type":"object"},"files":{"type":"object","properties":{"robots":{"type":"object"},"llm":{"type":"object"}}},"technical":{"type":"object"},"httpVersion":{"type":"object"},"hostVersion":{"type":"object"},"compression":{"type":"object"},"cacheControl":{"type":"object"},"ports":{"type":"object"},"udp":{"type":"object"},"crawl":{"type":"object","properties":{"pageCount":{"type":"integer"},"crawledCount":{"type":"integer"},"pendingCount":{"type":"integer"},"orphanCount":{"type":"integer"},"crawledPct":{"type":["number","null"]},"statsComputedAt":{"type":["string","null"],"format":"date-time"}}},"security":{"type":"object"},"findings":{"type":"object","properties":{"open":{"type":"integer"},"bySeverity":{"type":"object","properties":{"critical":{"type":"integer"},"high":{"type":"integer"},"medium":{"type":"integer"},"low":{"type":"integer"}}},"includesSecurity":{"type":"boolean"}}}}},"UptimeCheck":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"kind":{"type":"string"},"status":{"type":"string","examples":["success","failed"]},"statusCode":{"type":["integer","null"]},"errorClass":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"requestedUrl":{"type":["string","null"]},"finalUrl":{"type":["string","null"]},"redirectChain":{"type":"array","items":{"type":"object"}},"crossHostRedirect":{"type":"boolean"},"downgradedToHttp":{"type":"boolean"},"timing":{"type":"object","description":"Milliseconds, e.g. ttfbMs, totalMs"},"healthCheckFailures":{"type":"array","items":{"type":"object"}},"tls":{"type":["object","null"]},"createdAt":{"type":"string","format":"date-time"}}},"UptimeDaily":{"type":"object","properties":{"from":{"type":"string","format":"date","description":"First day actually covered"},"to":{"type":"string","format":"date","description":"Last day actually covered"},"retentionDays":{"type":"integer","description":"Days of history your plan keeps"},"summary":{"$ref":"#/components/schemas/UptimeDailyStats"},"days":{"type":"array","items":{"allOf":[{"type":"object","properties":{"date":{"type":"string","format":"date"}}},{"$ref":"#/components/schemas/UptimeDailyStats"}]}}}},"UptimeDailyStats":{"type":"object","description":"Rate-limited (429) answers count as up: the site responded.","properties":{"checks":{"type":"integer"},"up":{"type":"integer"},"down":{"type":"integer"},"uptimePct":{"type":["number","null"],"description":"Null when there were no checks"},"avgMs":{"type":["integer","null"],"description":"Average total response time"},"avgTtfbMs":{"type":["integer","null"]}}},"PageSummary":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"url":{"type":"string"},"trackingStatus":{"type":"string"},"isActive":{"type":"boolean"},"source":{"type":"object","properties":{"sitemap":{"type":"boolean"},"manual":{"type":"boolean"},"links":{"type":"boolean"}}},"statusCode":{"type":["integer","null"]},"title":{"type":["string","null"]},"lastFetchedAt":{"type":["string","null"],"format":"date-time"},"openFindingCount":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Page":{"allOf":[{"$ref":"#/components/schemas/PageSummary"},{"type":"object","properties":{"accessDenied":{"type":"boolean"},"http":{"type":"object"},"seo":{"type":"object","properties":{"title":{"type":["string","null"]},"description":{"type":["string","null"]},"canonicalUrl":{"type":["string","null"]},"metaRobots":{"type":["string","null"]},"xRobotsTag":{"type":["string","null"]},"headings":{"type":"array","items":{"type":"object","properties":{"level":{"type":"integer"},"text":{"type":"string"}}}},"og":{"type":"object"}}},"indexing":{"type":"object"},"pagespeed":{"type":["object","null"]},"findings":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}}}}]},"Finding":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"pageId":{"type":["string","null"],"pattern":"^[a-f0-9]{24}$"},"kind":{"type":"string"},"severity":{"enum":["critical","high","medium","low"]},"status":{"enum":["open","accepted","resolved"]},"summary":{"type":"string"},"finalUrl":{"type":["string","null"]},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"acceptedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"}}},"AddPagesResult":{"type":"object","properties":{"added":{"type":"integer"},"duplicates":{"type":"integer"},"invalid":{"type":"integer"},"offsite":{"type":"integer"},"duplicateInBatch":{"type":"integer"},"capped":{"type":"integer"},"alreadyBroken":{"type":"integer"},"submitted":{"type":"integer"},"pagesCount":{"type":"integer"}}},"JobAccepted":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"kind":{"type":"string"},"status":{"enum":["queued","running"]},"deduplicated":{"type":"boolean","description":"True when an identical job was already queued or running"},"statusUrl":{"type":"string"}}},"WebhookEndpointInput":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","examples":["https://example.com/hooks/tracker"]},"description":{"type":"string","maxLength":200},"events":{"type":"array","items":{"enum":["uptime.down","uptime.still_down","uptime.recovered","finding.opened","finding.resolved"]},"minItems":1},"projectIds":{"type":"array","items":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Empty = every project you can open"},"enabled":{"type":"boolean"}}},"WebhookEndpointUpdate":{"type":"object","description":"Every field is optional; send only what changes.","properties":{"url":{"type":"string","format":"uri"},"description":{"type":"string","maxLength":200},"events":{"type":"array","items":{"enum":["uptime.down","uptime.still_down","uptime.recovered","finding.opened","finding.resolved"]},"minItems":1},"projectIds":{"type":"array","items":{"type":"string","pattern":"^[a-f0-9]{24}$"},"description":"Empty = every project you can open"},"enabled":{"type":"boolean","description":"true turns a paused or auto-disabled endpoint back on"}}},"WebhookEndpoint":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"url":{"type":"string"},"description":{"type":"string"},"events":{"type":"array","items":{"enum":["uptime.down","uptime.still_down","uptime.recovered","finding.opened","finding.resolved"]}},"projectIds":{"type":"array","items":{"type":"string","pattern":"^[a-f0-9]{24}$"}},"enabled":{"type":"boolean"},"disabledReason":{"type":["string","null"],"examples":["too-many-failures","disabled-by-user","password-changed"]},"consecutiveFailures":{"type":"integer"},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastSuccessAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"WebhookEndpointWithSecret":{"allOf":[{"$ref":"#/components/schemas/WebhookEndpoint"},{"type":"object","properties":{"secret":{"type":"string","examples":["whsec_…"]}}}]},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"endpointId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"eventId":{"type":"string"},"event":{"type":"string"},"projectId":{"type":["string","null"],"pattern":"^[a-f0-9]{24}$"},"status":{"enum":["pending","delivering","succeeded","failed"]},"attempts":{"type":"integer"},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"lastAttemptAt":{"type":["string","null"],"format":"date-time"},"lastStatusCode":{"type":["integer","null"]},"lastError":{"type":["string","null"]},"lastDurationMs":{"type":["integer","null"]},"deliveredAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"WebhookEvent":{"type":"object","description":"Body Tracker POSTs to your endpoint.","properties":{"id":{"type":"string","examples":["evt_…"]},"type":{"enum":["uptime.down","uptime.still_down","uptime.recovered","finding.opened","finding.resolved","webhook.test"]},"createdAt":{"type":"string","format":"date-time"},"project":{"type":["object","null"],"properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"name":{"type":"string"},"domain":{"type":"string"}}},"data":{"type":"object","description":"uptime.*: status, statusCode, errorClass, errorMessage, checkedAt. finding.*: { finding }."}}},"Job":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"kind":{"type":"string"},"projectId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"pageId":{"type":["string","null"],"pattern":"^[a-f0-9]{24}$"},"status":{"enum":["queued","running","done","failed"]},"result":{"type":["object","null"]},"errorClass":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}}}}