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
| Parameter | Type | Notes |
|---|---|---|
id required |
string | Project id |
Request body
JSON, with Content-Type: application/json.
| Field | Type | Notes |
|---|---|---|
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
}
}'
const response = await fetch('https://trackerv2.marketingplanet.global/api/v1/projects/6650a4c2e1b3d5f7a9c1e301', {
method: 'PATCH',
headers: {
Authorization: 'Bearer tk_live_YOUR_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"trackingStatus": "active",
"uptime": {
"timeoutSeconds": 30
},
"intervals": {
"uptimeMinutes": 5
}
}),
});
const result = await response.json();
if (!response.ok) throw new Error(`${result.error.code}: ${result.error.message}`);
console.log(result.data);
import requests
response = requests.patch(
"https://trackerv2.marketingplanet.global/api/v1/projects/6650a4c2e1b3d5f7a9c1e301",
headers={"Authorization": "Bearer tk_live_YOUR_KEY"},
json={
"trackingStatus": "active",
"uptime": {
"timeoutSeconds": 30,
},
"intervals": {
"uptimeMinutes": 5,
},
},
)
result = response.json()
if not response.ok:
raise RuntimeError(f"{result['error']['code']}: {result['error']['message']}")
print(result["data"])
Example response
{
"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
| Field | Type | Notes |
|---|---|---|
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:
| Status | error.code | Meaning |
|---|---|---|
| 400 | invalid-request | A parameter or body field is missing or invalid; error.message says which. |
| 404 | not-found | The resource does not exist or you cannot open it. Tracker does not reveal which. |
| 403 | flag-changeSettings | Your project membership does not include changing settings. |
| 403 | paused-by-plan | The 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. |
| 403 | forbidden | The account is restricted: reads still work, but changes that add or modify projects, pages or monitors are blocked (error.accountStatus is restricted). |
| 409 | conflict | You already have a project for that domain. |
Errors always look like { "error": { "code": "…", "message": "…" } }. See Errors & limits.