Developer docs

Track a keyword daily, or stop

POST/sites/{siteId}/keywords/track
Scope
actions:write

Track a keyword daily, or stop The star on a Keywords row: Google positions are checked every day (once a week the top 100). The keyword must be in the list; POST /sites/{siteId}/actions adds a gap keyword. Starting counts against the plan's tracked keywords and posts the first check at once. Recorded in the website's Activity as the key owner.

Parameters

NameInDetails
siteIdRequiredpathstringWebsite id, from GET /sites.

Request body

FieldDetails
keyword_idstring · Keyword id, from GET /keywords
keywordstring · Or the keyword text, in the website's current location
ontrue or false · Default true; false stops tracking
{
  "keyword": "gravel bike tires"
}

Response

200 · application/json

FieldDetails
keywordobject · required
keyword.idstring · required; Keyword id
keyword.keywordstring · required; The search phrase
keyword.trackedtrue or false · required; Checked daily now
linkaddress (URL) · required; The Keywords screen in the app

Errors

StatusMeaning
400Bad request. Codes: missing_keyword, bad_on, not_tracked.
401Missing, unknown or revoked key. Codes: missing_key, invalid_key.
403The key lacks the scope, covers another website, or its owner lost access. Codes: missing_scope, other_site, owner_left, no_owner, forbidden.
404Not found. Codes: not_found, keyword_not_found.
429Too many requests this hour for this key. Codes: rate_limited.

Example request

curl -X POST \
  -H "Authorization: Bearer mr_ws_…" \
  -H "Content-Type: application/json" \
  -d '{"keyword":"gravel bike tires"}' \
  "https://app.monoranks.com/api/v1/sites/SITE_ID/keywords/track"

Example response

{
  "keyword": {
    "id": "2d4f6b8d-0f2b-4d4f-9b6d-0f2b4d6f8b0d",
    "keyword": "gravel bike tires",
    "tracked": true
  },
  "link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/keywords"
}

The MCP server does the same with the tool track_keyword.