All Guides

Competitor Monitoring

Add competitors to your workspace, run tracking, and compare mention rates and AI visibility scores across ChatGPT, Claude, Gemini, and Perplexity.

~10 min

Overview

Competitor monitoring tracks how often rival brands are mentioned by AI platforms when answering questions in your category — alongside your own brand. Each tracking run produces a side-by-side comparison of mention rates and visibility scores.

What the data tells you

Mention rate

% of prompts where the brand is named at all

Visibility score

Weighted score (0–100) accounting for prominence and position

Platform breakdown

Which AI platform favours which competitor

Share of voice

Your brand's % share of total category mentions

Competitor limits depend on your plan: 5 on Starter, 10 on Pro, unlimited on Enterprise. Competitors are tracked on every run alongside your brand automatically.


Add Competitors

Competitors are identified by brand name and optional domain. Linksii scrapes their logo automatically when a domain is provided. Limits depend on your plan (5 Starter, 10 Pro, unlimited Enterprise).

1

List current competitors

curl "https://www.linksii.com/api/v1/competitors?workspace_id=ws_01HXYZ" \
  -H "Authorization: Bearer lnk_your_api_key_here"
2

Add competitors

# Add multiple competitors (workspace_id and name are required, domain is optional)
curl -X POST https://www.linksii.com/api/v1/competitors \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"workspace_id": "ws_01HXYZ", "name": "Asana", "domain": "asana.com"}'

curl -X POST https://www.linksii.com/api/v1/competitors \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"workspace_id": "ws_01HXYZ", "name": "Monday.com", "domain": "monday.com"}'

curl -X POST https://www.linksii.com/api/v1/competitors \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"workspace_id": "ws_01HXYZ", "name": "Notion", "domain": "notion.so"}'

Competitor response

{
  "data": {
    "id": "comp_01HABC",
    "workspace_id": "ws_01HXYZ",
    "domain": "asana.com",
    "name": "Asana",
    "logo_url": "https://www.linksii.com/logos/asana.png",
    "is_active": true,
    "created_at": "2025-06-01T10:00:00Z"
  }
}

Competitors are tracked automatically on every future tracking run — no changes needed to your tracking calls. Deactivate a competitor with { "is_active": false } to stop tracking them without deleting.


How Tracking Runs Work

Tracking runs are triggered from the Linksii application UI (Tracking page) or automatically via the daily cron job. Once competitors are added, they are included in every tracking run automatically — no extra configuration needed. After a run completes, use GET /api/v1/tracking with include_competitors=true to fetch results for both your brand and competitors.


Compare Results

After a run completes, fetch tracking results filtered to a specific run to get both your brand and competitor data. Results include per-platform breakdowns.

curl "https://www.linksii.com/api/v1/tracking?workspace_id=ws_01HXYZ&include_competitors=true&limit=20" \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  | jq '[.data[] | {brand: .brand_name, platform: .platform, score: .score, mention_count: .mention_count}]'

Comparison output example

Brand Comparison (avg across platforms):
  My SaaS               Score: 72/100  Mentions: 8
  Asana                 Score: 81/100  Mentions: 14
  Monday.com            Score: 76/100  Mentions: 11
  Notion                Score: 69/100  Mentions: 7

Full results response shape

{
  "data": [
    {
      "run_id": "run_01HPQR",
      "workspace_id": "ws_01HXYZ",
      "brand_name": "My SaaS",
      "competitor_id": null,
      "platform": "chatgpt",
      "score": 74,
      "mention_count": 9,
      "mention_rate": 0.75,
      "status": "complete",
      "ran_at": "2025-06-01T10:07:00Z"
    },
    {
      "run_id": "run_01HPQR",
      "workspace_id": "ws_01HXYZ",
      "brand_name": "Asana",
      "competitor_id": "comp_01HABC",
      "platform": "chatgpt",
      "score": 83,
      "mention_count": 15,
      "mention_rate": 0.92,
      "status": "complete",
      "ran_at": "2025-06-01T10:07:00Z"
    }
  ],
  "meta": { "total": 8, "limit": 20, "offset": 0 }
}

Track Over Time

Fetch results after each daily run and store them in your own database to build trend charts. The snippet below stores results to a local JSON file as a simple example.

#!/bin/bash
# weekly-fetch.sh — run this from cron after Linksii's daily scan completes
# Fetches the latest tracking results and appends to a local JSONL file

DATE=$(date -u +%Y-%m-%d)
RESULT=$(curl -s "https://www.linksii.com/api/v1/tracking?workspace_id=ws_01HXYZ&include_competitors=true&limit=20" \
  -H "Authorization: Bearer $LINKSII_API_KEY")

echo "$RESULT" >> tracking-history.jsonl
echo "[$DATE] Fetched results: $(echo $RESULT | jq '.meta.total') entries"

For production time-series storage, use a database with a time-indexed table. Include run_id, brand_name, platform, and ran_at as indexed columns.


Error Handling

CodeCause & Fix
400Invalid domain format. Use bare domains (asana.com) not full URLs (https://asana.com/product).
409Competitor domain already exists in this workspace. List competitors first to avoid duplicates.
422Competitor limit reached for your plan (5 Starter, 10 Pro, unlimited Enterprise). Upgrade your plan or remove an existing competitor.
404Competitor not found when updating. Verify the competitor ID belongs to the target workspace.

Checking for duplicates before adding

# List competitors and check if domain exists before adding
DOMAIN="asana.com"
EXISTS=$(curl -s "https://www.linksii.com/api/v1/competitors?workspace_id=ws_01HXYZ" \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  | jq --arg d "$DOMAIN" '[.data[] | select(.domain == $d)] | length')

if [ "$EXISTS" -gt 0 ]; then
  echo "$DOMAIN already tracked"
else
  echo "Adding $DOMAIN..."
fi

Next Steps