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 456Create 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 --confirmDefault 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"]' --confirmAdding 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"]' --confirmPassing 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"]' --confirmNote: 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 --confirmCaution: 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 --confirmReading 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/*"]' --jsonDates 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' --confirmConditions 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