semrush cli

Position Tracking

Track daily keyword rankings, monitor competitors, configure alert triggers, and manage targets.

Position Tracking monitors daily search engine ranking positions, visibility trends, and cannibalization across desktop, mobile, and localized search markets.

Target identifier format

Position Tracking campaigns use a composite identifier formatted as two numeric values separated by an underscore (for example, 456_789). This string represents a specific target (domain, location, device, and engine combination) within an SEO project. Always keep it as a string.

Creating a tracking target

Inspect account allowances and available location IDs:

semrush position-locations --query 'United States'
semrush position-limits --project-id 456
semrush position-targets --project-id 456

Create a new target and begin keyword tracking:

semrush position-create \
  --project-id 456 --domain example.com \
  --keywords '["typescript framework","deno runtime"]' \
  --location-id 2840 --dry-run

semrush position-create \
  --project-id 456 --domain example.com \
  --keywords '["typescript framework","deno runtime"]' \
  --location-id 2840 --confirm

Default settings: Google, desktop, English language, national volume level, and UTC timezone.

Managing tracked keywords and competitors

Add keywords, update tags, or remove phrases from tracking:

semrush position-keywords-add --campaign-id 456_789 \
  --keywords '["node runtime"]' --tags '["backend"]' --confirm

semrush position-keyword-tags --campaign-id 456_789 \
  --keywords '["node runtime"]' --add-tags '["priority"]' --remove-tags '["backend"]' --confirm

semrush position-keywords-delete --campaign-id 456_789 \
  --keywords '["deno runtime"]' --confirm

Adding keywords consumes your account tracking keyword allowance.

Configuring competitor benchmarks

Replace the target's competitor benchmark list:

semrush position-competitors-set --campaign-id 456_789 \
  --competitors '["competitor1.com","competitor2.com"]' --confirm

Passing an empty array '[]' clears all tracked competitors.

Updating target settings

Use position-configure to update business names, brand terms, volume level, or domain scope while preserving omitted fields:

semrush position-configure --campaign-id 456_789 \
  --business-name 'Acme Corp' --confirm

semrush position-configure --campaign-id 456_789 \
  --brands '["Acme","Acme Tools"]' --confirm

Note: If brand terms are already established, the provider requires a non-empty brand array.

Replacing targets and clearing history

To change core target parameters such as search engine, device, location, or language, use position-replace:

semrush position-replace --campaign-id 456_789 \
  --engine google --device phone --location-id 2840 \
  --language-code en --volume-type national --confirm

Caution: Running position-replace permanently destroys previous ranking history for that target while preserving existing keywords, tags, and competitor settings.

To permanently delete a target entirely:

semrush position-delete --campaign-id 456_789 --confirm

Reading ranking reports

Query ranking tables, landing pages, and visibility trends across date ranges:

semrush position-info --campaign-id 456_789
semrush position-overview --campaign-id 456_789 \
  --date-begin 20261001 --date-end 20261015 \
  --competitors '["*.example.com/*"]' --json

semrush position-overview-trend --campaign-id 456_789 \
  --date-begin 20261001 --date-end 20261015 \
  --competitors '["*.example.com/*"]' --json

semrush position-distribution --campaign-id 456_789 \
  --date-begin 20261001 --date-end 20261015 \
  --competitors '["*.example.com/*"]' --json

semrush position-pages --campaign-id 456_789 \
  --date-begin 20261001 --date-end 20261015 \
  --competitors '["*.example.com/*"]' --json

semrush position-cannibalization-trend --campaign-id 456_789 \
  --date-begin 20261001 --date-end 20261015 \
  --competitors '["*.example.com/*"]' --json

Dates use YYYYMMDD format. Competitor patterns require wildcard syntax (for example, *.example.com/*), matching the patterns returned by position-info.

Automated alert rules and notifications

Set up automated alerts for ranking movements:

semrush position-trigger-create --campaign-id 456_789 \
  --domain example.com --condition enters_top --threshold 10 --confirm

semrush position-trigger-update --campaign-id 456_789 \
  --trigger-id 'trigger-id-placeholder' --domain example.com \
  --condition leaves_top --threshold 20 --confirm

semrush position-trigger-delete --campaign-id 456_789 \
  --trigger-id 'trigger-id-placeholder' --confirm

Conditions include changes_more_than, enters_top, leaves_top, gains_more_than, and loses_more_than.

Inspect triggered alerts:

semrush position-alerts --campaign-id 456_789 --page 1 --limit 50
semrush position-alert-counts --campaign-id 456_789
semrush position-alert-read --campaign-id 456_789 --alert-id 'alert-id-placeholder' --confirm
semrush position-alert-mark-all-read --campaign-id 456_789 --confirm

On this page