---
title: "Dock + Semrush: competitive intel workspaces with attributed agent reports"
excerpt: "Semrush holds the competitor backlink, organic, and paid data. Dock is where the agent's competitor-by-competitor briefs, gap analyses, and reviewer-approved share-of-voice reports live."
author: mei
category: Use Cases
date: "2026-05-30"
---

Pair an SEO agent with [Semrush](https://www.semrush.com/blog/competitive-analysis/) and you get fast competitor pulls: organic positions, paid spend, referring domains, traffic estimates. What you do not get is a place where last quarter's interpretation of those pulls still exists. The agent ran a share-of-voice report in March. Where did it go? In the Dock + Semrush setup, the report is a row in a workspace with the agent's name on it, the reviewer's approval timestamp, and a pointer back to the exact Semrush query that produced the underlying numbers. That row is what your team reads on Monday morning, not the Semrush dashboard.

## The split

Semrush, alongside [the rest of the SEO stack](/blog/dock-for-seo), stays the system of record for the raw competitive data: organic positions across 142 geo databases, the backlink graph, paid keyword overlap, traffic estimates. Dock is the system of record for what the agent interprets from that data: the prioritized competitor brief, the gap table, the share-of-voice report, the outreach decision. Each Dock row carries a pointer to the platform record (`semrush_domain_id`, `semrush_keyword_gap_id`, `semrush_backlink_id`), the agent identity that wrote it, the decision, the human reviewer, the timestamp. When the agent needs current state, it re-queries the [Semrush SEO API](https://developer.semrush.com/api/v3/analytics/basic-docs/) for fresh CSV. Dock holds the persistent interpretive layer that survives across sessions.

## One Dock surface: the competitor brief table

| competitor | semrush_domain_id | organic_keywords | shared_keywords | keyword_gaps_high_intent | agent | recommendation | reviewer | status |
|---|---|---|---|---|---|---|---|---|
| linear.app | sr_dom_8821 | 14,302 | 412 | 38 | mei | Build hub for "issue tracking for AI agents"; they rank #3, we are unranked | govind | approved 2026-05-22 |
| notion.so | sr_dom_1147 | 89,210 | 1,604 | 211 | mei | Skip head-to-head; pursue long-tail "workspace for agents" cluster (47 gaps) | govind | approved 2026-05-22 |
| airtable.com | sr_dom_4490 | 22,815 | 587 | 64 | mei | Compete on "structured data for AI"; backlink gap of 142 referring domains, outreach plan in row 117 | govind | pending |

Each row has a pointer back to the Semrush query (the `semrush_domain_id` joins to the Domain Analytics report). The agent identity is on the row, not in a comment thread. The reviewer signed off explicitly. Three months from now, anyone can ask why we deprioritized notion.so and get a deterministic answer.

## Worked workflow

Mei runs a weekly competitor sweep. The agent calls Semrush's Keyword Gap report for our domain plus three named competitors, pulls the CSV, and writes one row per competitor into the competitive-intel table. For each row Mei drafts a recommendation: pursue, skip, or escalate. Govind opens the workspace, reads the three recommendations side by side, approves two, sends the third back with a comment. The approved rows trigger downstream actions: the "build a hub" recommendation creates a brief in the [content audit workspace](/blog/seo-content-audit), the "outreach" recommendation queues a row in the link-building workspace, both linked back to the parent competitor brief. If any downstream action touches a published page, a [two-key handshake](/blog/two-key-handshakes-irreversible) is required before the change ships.

## Why it matters

Attribution. The Semrush dashboard does not know which agent ran which report or which human signed off. Dock does. Every recommendation has a name on it, a timestamp, an approving reviewer, and a back-pointer to the underlying Semrush query. When the CMO asks why we are not chasing a competitor's hot keyword, the row answers in one click. This is the same [agent audit pattern](/blog/agent-audit-and-compliance) we use across every Dock workspace, applied to competitive research.

Daily-driver experience. SEO teams already live in Semrush for the data. Dock is what they open to see what the agent decided, what is waiting for review, and what shipped last week. The two views are designed to coexist: Semrush in one tab for raw lookups, Dock in another for the interpretive record. Pair this workspace with the [Ahrefs keyword research workspace](/blog/dock-ahrefs-keyword-research) and you have the full picture.

Continuity across sessions. The agent that runs next week's sweep reads the prior recommendations before pulling new data. It sees that notion.so was deprioritized and why. It does not re-recommend a path the team already rejected. That continuity is only possible because the agent has [a stable identity](/blog/agent-identity) and a persistent place to write.

[Start a competitive-intel workspace.](/signup)

## FAQ

**Does Dock replace Semrush?**
No. Semrush stays the source of truth for raw competitive data (organic positions, backlinks, paid spend, traffic estimates). Dock holds the agent's interpretation of that data: prioritized briefs, gap tables, share-of-voice reports, outreach decisions. Each Dock row points back to the Semrush record it summarized.

**How does the agent stay in sync with current Semrush data?**
The agent re-queries the Semrush SEO API on demand for the freshest numbers, then updates the relevant Dock row. The platform record IDs (`semrush_domain_id`, `semrush_keyword_gap_id`) are stored on the row so the next refresh always pulls the same comparable slice.

**Who approves an agent's competitor recommendation before it ships?**
A named human reviewer on the row, recorded with a timestamp. For recommendations that trigger downstream publishing, a second key is required at the publish step. Both signatures live on the row.

**What happens to the interpretive record if we cancel Semrush?**
The Dock workspace keeps the historical briefs, gap tables, and approved reports. You lose the ability to refresh against new Semrush data, but every interpretive artifact your team built, with attribution intact, stays in Dock.
