Projects

Update a project

PATCH /api/v1/projects/{id}

Send only the fields to change, in the same shape the API returns. Unknown fields are ignored. Requires the change-settings permission.

API key access
Read and write
Project permission
Change settings
Success
200 — Updated

Parameters

Path

ParameterTypeNotes
id required string Project id

Request body

JSON, with Content-Type: application/json.

FieldTypeNotes
name string max 120 chars
domain string
trackingStatus "active" | "inactive"
phases object Which monitors are on.
phases.uptime boolean
phases.technical boolean
phases.sitemap boolean
phases.pages boolean
phases.robots boolean
phases.llm boolean
phases.udp boolean
phases.dns boolean
phases.domainExpiry boolean
phases.ports boolean
intervals object Minutes. Plan minimums apply. null when that monitor has no schedule yet.
intervals.uptimeMinutes integer or null
intervals.pagesMinutes integer or null
intervals.technicalMinutes integer or null
intervals.dnsMinutes integer or null
uptime object
uptime.scheme "https" | "http"
uptime.port integer or null
uptime.timeoutSeconds integer min 28 · max 300
uptime.alertRepeatMinutes integer
healthCheck object
healthCheck.verifyHeader boolean
healthCheck.headerName string max 200 chars
healthCheck.headerValueIncludes string max 500 chars
healthCheck.verifyContent boolean
healthCheck.contentIncludes string max 2000 chars
sitemap object
sitemap.url string or null
robotsUrl string or null
llmUrl string or null

Example request

Replace tk_live_YOUR_KEY with your API key and the ids with your own.

curl -X PATCH 'https://trackerv2.marketingplanet.global/api/v1/projects/6650a4c2e1b3d5f7a9c1e301' \
  -H 'Authorization: Bearer tk_live_YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "trackingStatus": "active",
  "uptime": {
    "timeoutSeconds": 30
  },
  "intervals": {
    "uptimeMinutes": 5
  }
}'

Example response

200 OK
{
  "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"
  }
}

Response fields

FieldTypeNotes
data object
data.id string
data.name string
data.domain string
data.role "owner" | "member"
data.trackingStatus "active" | "inactive" | "paused-by-plan"
data.phases object Which monitors are on.
data.phases.uptime boolean
data.phases.technical boolean
data.phases.sitemap boolean
data.phases.pages boolean
data.phases.robots boolean
data.phases.llm boolean
data.phases.udp boolean
data.phases.dns boolean
data.phases.domainExpiry boolean
data.phases.ports boolean
data.intervals object Minutes. Plan minimums apply. null when that monitor has no schedule yet.
data.intervals.uptimeMinutes integer or null
data.intervals.pagesMinutes integer or null
data.intervals.technicalMinutes integer or null
data.intervals.dnsMinutes integer or null
data.uptime object
data.uptime.scheme "https" | "http"
data.uptime.port integer or null
data.uptime.timeoutSeconds integer
data.uptime.alertRepeatMinutes integer
data.uptime.lastStatus string or null
data.uptime.lastCheckedAt string (date-time) or null
data.healthCheck object
data.healthCheck.verifyHeader boolean
data.healthCheck.headerName string max 200 chars
data.healthCheck.headerValueIncludes string max 500 chars
data.healthCheck.verifyContent boolean
data.healthCheck.contentIncludes string max 2000 chars
data.sitemap object
data.sitemap.url string or null
data.sitemap.status string or null
data.sitemap.lastCheckedAt string (date-time) or null
data.sitemap.pagesFound integer
data.robotsUrl string or null
data.llmUrl string or null
data.domainExpiry object
data.domainExpiry.status string or null
data.domainExpiry.daysLeft integer or null
data.domainExpiry.lastCheckedAt string (date-time) or null
data.technicalLastCheckedAt string (date-time) or null
data.cms string or null
data.createdAt string (date-time)
data.updatedAt string (date-time)

Errors

Besides the errors any request can return (bad or missing key, plan, scope, rate limit), this endpoint can return:

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.
403flag-changeSettingsYour project membership does not include changing settings.
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).
409conflictYou already have a project for that domain.

Errors always look like { "error": { "code": "…", "message": "…" } }. See Errors & limits.