Summarize Semrush Position Tracking visibility against your competitors

Each Tuesday: your Semrush Position Tracking visibility, how it compares with the competitors in the campaign, and the keywords that moved it.

Runs
Tuesdays at 7:30
Uses
Semrush
Posts
Stat tile

What lands on your board

example.comVisibility18.6%+4% vs previous period, bettervs last report
Avg position21.4-3.0% vs previous period, better
Top 314
Top 1047
An example with made-up numbers. Your agent posts your real ones.

What it does

Semrush Position Tracking already compares you with the competitors you add to a campaign on the same keywords, which makes it the closest thing search has to a market share number. What it does not do is tell anyone. The visibility chart moves, and the team finds out when a competitor's blog starts appearing in every result.

The agent reads the campaign through the Semrush API each week, reports your visibility and the gap to the nearest competitors, and lists the keywords that explain the change. It is the version of the report that fits in a stand-up.

How it works

  1. 1Read your rankings for both dates

    Call the Semrush Projects API Position Tracking report, GET https://api.semrush.com/reports/v1/projects/{project_id}/tracking/ with action=report and type=tracking_position_organic, for url=*.example.com/* and a date_begin and date_end 7 days apart.

  2. 2Add the competitors

    Run the same report with each competitor's own url mask, so every domain is measured on the same keywords, location and device.

  3. 3

    3Compare visibility and find movers

    Take visibility as Semrush reports it and compare the two dates for every domain. Movers changed by 3 or more positions; sort them by search volume and keep the ranking URL.

  4. 4

    4Keep devices and locations apart

    If the campaign tracks mobile and desktop, or several locations, read each one separately. Averaging them hides a mobile-only drop.

  5. 5

    5Post the tile

    Your visibility is the headline with 8 weeks of history. The glance shows average position and keywords in the top 3 and top 10; the card opens to the competitor table and the movers.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Visibility this week, the change, and an 8-week trend.
  • Competitors: visibility for each domain in the campaign and the change in points.
  • Top 3 and top 10 keyword counts, and average position.
  • Movers: keywords that changed by 3 or more positions, by volume, with the ranking URL.
  • Where you gained or lost against the closest competitor.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/semrush-position-tracking-report/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the semrush-position-tracking-report skill

    Or paste the prompt instead of installing:

    promptUsing the Semrush API Position Tracking report (projects/[project_id]/tracking, action=report, type=tracking_position_organic), compare my domain example.com with 7 days earlier: visibility, average position, and how many tracked keywords sit in the top 3 and top 10. Do the same for each competitor in the campaign and show visibility side by side with the change in points. List keywords that moved 3 or more positions, sorted by search volume, with position, change and the ranking URL. Read mobile and desktop separately if both are tracked. End with where I gained or lost against the closest competitor.
  3. Put it on a schedule

    Tuesdays at 7:30, from cron on any machine where Claude Code is signed in:

    crontab30 7 * * 2 claude -p "Run the semrush-position-tracking-report skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a stat tile. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: semrush-position-tracking-report
description: "Each Tuesday: your Semrush Position Tracking visibility, how it compares with the competitors in the campaign, and the keywords that moved it. Use when the user asks for this, or when it runs on a schedule."
---

# Semrush position tracking report

Each Tuesday: your Semrush Position Tracking visibility, how it compares with the competitors in the campaign, and the keywords that moved it.

Semrush Position Tracking already compares you with the competitors you add to a campaign on the same keywords, which makes it the closest thing search has to a market share number. What it does not do is tell anyone. The visibility chart moves, and the team finds out when a competitor's blog starts appearing in every result.

The agent reads the campaign through the Semrush API each week, reports your visibility and the gap to the nearest competitors, and lists the keywords that explain the change. It is the version of the report that fits in a stand-up.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Semrush Position Tracking campaign for the site, with competitors added, and its project ID.
- Semrush API access: the Projects API needs a Business subscription plus API units bought separately, with the key in `SEMRUSH_API_KEY`. The official Semrush MCP server covers keyword and domain data; check that it exposes Position Tracking before relying on it instead.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Read your rankings for both dates** (Semrush): Call the Semrush Projects API Position Tracking report, `GET https://api.semrush.com/reports/v1/projects/{project_id}/tracking/` with `action=report` and `type=tracking_position_organic`, for `url=*.example.com/*` and a `date_begin` and `date_end` 7 days apart.
2. **Add the competitors** (Semrush): Run the same report with each competitor's own `url` mask, so every domain is measured on the same keywords, location and device.
3. **Compare visibility and find movers**: Take visibility as Semrush reports it and compare the two dates for every domain. Movers changed by 3 or more positions; sort them by search volume and keep the ranking URL.
4. **Keep devices and locations apart**: If the campaign tracks mobile and desktop, or several locations, read each one separately. Averaging them hides a mobile-only drop.
5. **Post the tile**: Your visibility is the headline with 8 weeks of history. The glance shows average position and keywords in the top 3 and top 10; the card opens to the competitor table and the movers.

## Route B: the browser

### What you need

- Signed in to Semrush with access to the Position Tracking project, as its owner or a user it is shared with.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://www.semrush.com/position-tracking/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the campaign**: Open `https://www.semrush.com/position-tracking/` and click the project for `example.com`. It opens on the `Landscape` tab for the campaign's default device and location.
2. **Set the two dates**: In the date picker at the top right choose today and the date 7 days earlier. Read your `Visibility` with its change, and the competitor rows underneath with their visibility and change in points.
3. **Read the summary and the buckets**: Open the `Overview` tab for Average position, then `Rankings Distribution` for the counts in the top 3 and top 10 on both dates.
4. **List the movers**: Back on `Overview`, sort the positions table by `Diff` and keep keywords that moved 3 or more positions, with position, change, volume and the ranking URL. Export when the campaign tracks more than a few hundred keywords.
5. **Check other devices and locations**: Under `Devices & Locations`, repeat for mobile or a second location when the campaign tracks them, and report each on its own.

Note: Visibility in the UI is rounded to one decimal, and the positions table shows 100 rows per page. For campaigns with thousands of keywords use Export on the Overview tab and read the file.

## The report

- **Visibility** this week, the change, and an 8-week trend.
- **Competitors**: visibility for each domain in the campaign and the change in points.
- **Top 3 and top 10** keyword counts, and average position.
- **Movers**: keywords that changed by 3 or more positions, by volume, with the ranking URL.
- Where you gained or lost against the closest competitor.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "semrush-position-tracking-report/<date of this run, e.g. 2026-10-16>",
  "item_key": "semrush-position-tracking-report",
  "project": "example.com",
  "source": "Semrush position tracking report skill",
  "kind": "metric",
  "title": "Visibility 18.6%, closing on competitor-a.com",
  "metric": {
    "label": "Visibility",
    "value": 18.6,
    "unit": "%",
    "better": "higher",
    "period_start": "<start of the period, ISO 8601>",
    "period_end": "<end of the period, ISO 8601>"
  },
  "glance": {
    "type": "Grid",
    "props": {
      "columns": 3
    },
    "children": [
      {
        "type": "Stat",
        "props": {
          "label": "Avg position",
          "value": 21.4,
          "delta": -3,
          "better": "lower"
        }
      },
      {
        "type": "Stat",
        "props": {
          "label": "Top 3",
          "value": 14
        }
      },
      {
        "type": "Stat",
        "props": {
          "label": "Top 10",
          "value": 47
        }
      }
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Domain",
          "Visibility",
          "Change"
        ],
        "align": [
          "left",
          "right",
          "right"
        ],
        "rows": [
          [
            "competitor-a.com",
            "21.2%",
            "-0.4 pts"
          ],
          [
            "example.com",
            "18.6%",
            "+0.7 pts"
          ],
          [
            "competitor-b.com",
            "12.9%",
            "+0.2 pts"
          ],
          [
            "competitor-c.com",
            "9.4%",
            "-1.1 pts"
          ]
        ]
      }
    },
    {
      "type": "Table",
      "props": {
        "columns": [
          "Keyword",
          "Position",
          "Change",
          "Volume"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "online invoicing",
            4,
            "+5",
            4400
          ],
          [
            "invoice software free",
            15,
            "-6",
            3600
          ],
          [
            "invoice app",
            7,
            "+3",
            2900
          ],
          [
            "send invoice online",
            2,
            "+3",
            1600
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "The gap to competitor-a.com narrowed from 3.7 to 2.6 points. \"online invoicing\" moving from 9 to 4 did most of it.",
        "tone": "ok"
      }
    }
  ],
  "size": "md"
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

Set `period_start` and `period_end` to the window the number covers: the tile names it from them ("Last 7 days", "Today", "This month"). For a count right now (open items, a balance), send `"period_label": ""` so no period shows; for another name, send it as `period_label` (at most 24 characters).

## Run it on a schedule

Suggested: Tuesdays at 7:30 (`30 7 * * 2`). From cron, with the agent signed in on that machine:

```bash
30 7 * * 2 claude -p "Run the semrush-position-tracking-report skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/semrush-position-tracking-report#schedule

Source: https://briefkin.dev/skills/semrush-position-tracking-report

What your agent needs

  • A Semrush Position Tracking campaign for the site, with competitors added, and its project ID.

  • Semrush API access: the Projects API needs a Business subscription plus API units bought separately, with the key in SEMRUSH_API_KEY. The official Semrush MCP server covers keyword and domain data; check that it exposes Position Tracking before relying on it instead.

Connecting Semrush

  1. Semrush MCP, Semrush's official remote server at https://mcp.semrush.com/v2/mcp. In Claude it is the Semrush app under connectors; in other agents add the URL and sign in with OAuth, or send Authorization: Apikey <key> where OAuth isn't supported (docs).
  2. API with a key. Store the key in SEMRUSH_API_KEY and call the SEO API, for example https://api.semrush.com/?type=domain_organic&domain=example.com&database=us&display_limit=100&key=.... Some plans include 50,000 API units; larger unit packages are sold separately.

Semrush MCP reads Projects API data but can't create or change projects, which keeps Position Tracking and Site Audit settings out of the agent's reach.

Questions

What does visibility measure?

Semrush estimates the share of clicks your positions would earn across the tracked keywords, using a click-through rate for each position. 100% would mean ranking first for every keyword. It only covers keywords in the campaign, so add the ones that matter to you.

Why do the numbers differ from Semrush Organic Research?

Organic Research estimates rankings across the whole Semrush keyword database, while Position Tracking checks your chosen keywords every day at the location and device you set. For a weekly report on the keywords you picked, Position Tracking is the steadier source.

Do I need Briefkin to use the Semrush position tracking report skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a stat tile, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Semrush pages themselves: the agent opens www.semrush.com/position-tracking in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Watch visibility on your board, run after run

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.