Guide

Errors & limits

Every response has the same shape, every error carries a stable machine-readable code, and limits are reported in headers — so your integration can react without parsing messages.

Response format

Successful responses wrap the result in data. Lists add meta with paging details.

Success
{
  "data": [
    {
      "id": "6650a4c2e1b3d5f7a9c1e301",
      "name": "Acme Retail"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 25,
    "total": 2
  }
}

Errors return a non-2xx status and an error object. Branch on code; message is for people and may change. Some errors add fields, such as maxProjects or retryAfter.

Error
{
  "error": {
    "code": "max-projects",
    "message": "Plan allows at most 3 project(s)",
    "maxProjects": 3
  }
}

Errors any request can return

These come from the key, the plan or the account, before an endpoint runs.

Statuserror.codeMeaning
401api-key-missingNo Authorization: Bearer <key> header was sent.
401api-key-invalidThe key is not a valid Tracker API key, or its owner is no longer a customer account.
401api-key-revokedThe key was revoked — by you, or automatically when the account password changed.
401api-key-expiredThe key passed its expiry date. Create a new one.
403plan-requiredYour plan does not include API access.
403api-key-over-plan-limitYou have more active keys than your plan allows; only the newest ones work.
403insufficient-scopeA read-only key called an endpoint that changes data.
402 / 403payment-required / forbiddenThe account is locked (billing hold returns 402) or closed; error.accountStatus says which.
429rate-limitedToo many requests for your plan, or too many invalid-key attempts from your IP. Wait for Retry-After seconds.

All error codes

Each endpoint page lists the codes it can return. A few codes depend on your role in the project: flag-… means your membership is missing that permission (see project permissions).

Statuserror.codeMeaning
400invalid-requestA parameter or body field is missing or invalid; error.message says which.
404not-foundThe resource does not exist or you cannot open it. Tracker does not reveal which.
409conflictYou already have a project for that domain.
400too-many-urlsMore than 200 URLs in one request. Split them into batches.
400invalid-urlThe webhook URL is not HTTPS, contains credentials, or points at a private address.
403plan-requiredStart a trial or choose a plan before adding projects.
403max-projectsYour plan’s project limit is reached; error.maxProjects gives the limit.
403plan-gateThis check is not included in your plan.
403paused-by-planThe project is over your plan’s project limit and paused. It resumes automatically when your plan has room again; trackingStatus cannot be changed until then.
403forbiddenThe account is restricted: reads still work, but changes that add or modify projects, pages or monitors are blocked (error.accountStatus is restricted).
403owner-onlyOnly the project owner can do this.
403flag-viewHealthYour project membership does not include viewing health.
403flag-viewPagesYour project membership does not include viewing pages.
403flag-editPagesYour project membership does not include editing pages.
403flag-changeSettingsYour project membership does not include changing settings.
403flag-viewPerformanceYour project membership does not include viewing performance.
403flag-acceptFindingsYour project membership does not include accepting findings.
429probe-cooldownThis project was probed in the last 30 seconds. Retry after Retry-After seconds.
403check-budgetThe owner’s monthly check budget is used up.
403tracking-inactiveTracking is turned off for this project.
403phase-offUptime monitoring is turned off for this project.
403too-many-endpointsYou already have the maximum of 10 webhook endpoints.
429send-cooldownA test or redelivery was sent to this endpoint in the last 10 seconds.
429send-rate-limitedMore than 20 test sends and redeliveries in the last minute on your account.

Rate limits

Your plan sets how many requests your account can make per rolling minute, shared across all your keys (see plans). Every response tells you where you stand:

HeaderMeaning
RateLimit-LimitRequests allowed in the current window
RateLimit-RemainingRequests left in the window
RateLimit-ResetSeconds until the window resets
Retry-AfterOn a 429: seconds to wait before trying again

Some actions have their own short limits, because they cost more than a read:

  • Uptime probes: one per project every 30 seconds (probe-cooldown).
  • Webhook test sends and redeliveries: one per endpoint every 10 seconds, 20 per minute per account.
  • Requests with an invalid key are limited per IP address.

Pagination

Lists of projects, pages and findings take page (from 1) and limit (up to 100). meta.total is the number of matching items, so the last page is ceil(total / limit).

Uptime history is newest first and uses a cursor instead, because new checks arrive all the time: pass meta.nextBefore as before to get the next page, and stop when it is null. See uptime check history.

When to retry

ResponseWhat to do
429Wait Retry-After seconds, then retry.
5xx or a network errorRetry with backoff (for example 1s, 2s, 4s). Queued actions are safe to retry — an identical queued job is returned instead of a new one.
Other 4xxDo not retry unchanged; fix the request, key or permissions using error.code.