RankSharkDocs
Reports

Update a saved report

RankShark TrackScopetrack:reports

POST
/v1/track/reports/{id}

The settings are replaced by what is sent; a pending retry of a failed send is dropped.

Scope: track:reports.

Authorization

headerAuthorizationBearer <rstk_… API key or OAuth access token>

A Track API key (rstk_…, Settings → API & MCP) or an OAuth access token issued for this API

Path Parameters

id*string

Report id (rp_…). A malformed id is 404 not_found.

Match^rp_[A-Za-z0-9]{10,40}$

Request Body

application/json
  1. body
name?string
Lengthlength <= 120
clientId?|

A business (tc_…): the report covers its campaigns

Match^tc_[A-Za-z0-9]{10,40}$
trackerIds?array<>

Campaign ids (default: the business's, or all)

period?
compare?string

previous (default): against the last scan before the period

Value in"previous""none"
sections?

Sections on (true, the default) or off: summary, changes, keywords ("Keywords at a glance"), heatmaps, competitors, trend, ai

schedule?
subjectTemplate?string

White-label plans: the email subject; {{business}}, {{period}}, {{agency}}, {{campaign}} (default "{{business}} · {{period}}")

Lengthlength <= 200
message?string

White-label plans: the intro of the email and the PDF

Lengthlength <= 2000
closing?string

White-label plans: the closing text at the end of the PDF

Lengthlength <= 2000
preparedBy?string

White-label plans: "Prepared by" on the PDF cover (default: the member who saved the report)

Lengthlength <= 100

Response Body

OK

application/json
  1. response
id*string

rp_…

name*string
clientId?string|null
trackerIds?array<string>
period?
compare?string
Value in"previous""none"
sections?

Sections on (true, the default) or off: summary, changes, keywords ("Keywords at a glance"), heatmaps, competitors, trend, ai

schedule*
nextSendAt?|
Formatdate-time
lastSentAt?|
Formatdate-time
lastSendError?|

Why the last scheduled send failed (null: it did not)

sendAttempts?integer

Failed attempts for the current period

sendRetrying?boolean

A failed send will be retried

subjectTemplate?string|null
message?string|null
closing?string|null
preparedBy?string|null
createdAt?|
Formatdate-time
updatedAt?|
Formatdate-time
Example Request
curl -X POST 'https://panel.rankshark.io/v1/track/reports/rp_7Tb2Xc9Mv4LdWs' \  -H 'Content-Type: application/json' \  -d '{  "name": "Harbor Dental · monthly",  "clientId": "tc_5Rw8Jn3Ys2QeLk",  "trackerIds": [],  "period": {    "preset": "month"  },  "compare": "previous",  "sections": {    "summary": true,    "changes": true,    "keywords": true,    "heatmaps": true,    "competitors": true,    "trend": true,    "ai": true  },  "schedule": {    "freq": "monthly",    "dow": 1,    "dom": 1,    "hour": 8,    "tz": "America/Chicago",    "emails": [      "[email protected]"    ]  }}'
Example Response
{  "id": "rp_7Tb2Xc9Mv4LdWs",  "name": "Harbor Dental · monthly",  "clientId": "tc_5Rw8Jn3Ys2QeLk",  "trackerIds": [],  "period": {    "preset": "month"  },  "compare": "previous",  "sections": {    "summary": true,    "changes": true,    "keywords": true,    "heatmaps": true,    "competitors": true,    "trend": true,    "ai": true  },  "schedule": {    "freq": "monthly",    "dow": 1,    "dom": 1,    "hour": 8,    "tz": "America/Chicago",    "emails": [      "[email protected]"    ]  },  "nextSendAt": "2026-12-01T14:00:00.000Z",  "lastSentAt": "2026-11-01T13:00:07.000Z",  "lastSendError": null,  "sendAttempts": 0,  "sendRetrying": false,  "subjectTemplate": null,  "message": null,  "closing": null,  "preparedBy": null,  "createdAt": "2026-09-20T09:15:00.000Z",  "updatedAt": "2026-10-02T11:40:00.000Z"}