Update a saved report
RankShark TrackScopetrack:reports
The settings are replaced by what is sent; a pending retry of a failed send is dropped.
Scope: track:reports.
AuthorizationBearer <rstk_… API key or OAuth access token>A Track API key (rstk_…, Settings → API & MCP) or an OAuth access token issued for this API
id*stringReport id (rp_…). A malformed id is 404 not_found.
^rp_[A-Za-z0-9]{10,40}$application/json- body
name?stringlength <= 120clientId?|A business (tc_…): the report covers its campaigns
^tc_[A-Za-z0-9]{10,40}$trackerIds?array<>Campaign ids (default: the business's, or all)
period?compare?stringprevious (default): against the last scan before the period
"previous""none"sections?Sections on (true, the default) or off: summary, changes, keywords ("Keywords at a glance"), heatmaps, competitors, trend, ai
schedule?subjectTemplate?stringWhite-label plans: the email subject; {{business}}, {{period}}, {{agency}}, {{campaign}} (default "{{business}} · {{period}}")
length <= 200message?stringWhite-label plans: the intro of the email and the PDF
length <= 2000closing?stringWhite-label plans: the closing text at the end of the PDF
length <= 2000preparedBy?stringWhite-label plans: "Prepared by" on the PDF cover (default: the member who saved the report)
length <= 100OK
application/json- response
id*stringrp_…
name*stringclientId?string|nulltrackerIds?array<string>period?compare?string"previous""none"sections?Sections on (true, the default) or off: summary, changes, keywords ("Keywords at a glance"), heatmaps, competitors, trend, ai
schedule*nextSendAt?|date-timelastSentAt?|date-timelastSendError?|Why the last scheduled send failed (null: it did not)
sendAttempts?integerFailed attempts for the current period
sendRetrying?booleanA failed send will be retried
subjectTemplate?string|nullmessage?string|nullclosing?string|nullpreparedBy?string|nullcreatedAt?|date-timeupdatedAt?|date-timecurl -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]" ] }}'{ "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"}