REST API · Live

Competitor Research Tool API Documentation

The competitor research tool API (geomind-competitor-audit) delivers structured competitive intelligence on any keyword: SERP positions for each rival domain, position change deltas, estimated organic traffic, sentiment analysis, citation velocity, and real-time rank-drop alerts — all from synchronous REST endpoints callable from any language. $0.005 per audit call — half of SpyFu's published Kombat API rate. 5,000 free credits (24-hour trial), no credit card required.

$0.005 / audit call Synchronous JSON 5,000 free credits (24-hour trial) No credit card 6 competitive endpoints SOC2-aligned infra
Get an API key (free) Quick start See pricing API docs

Quick start — competitor research in one API call

Sign up, copy your key from the dashboard, and call the competitor displacement endpoint with your target keyword. The response arrives synchronously — no polling, no webhooks required. You get back a ranked list of competing domains with SERP positions and change deltas immediately.

# Competitor SERP positions for a keyword
curl "https://api.pixelapi.dev/v1/geomind/competitor/displacement?keyword=seo+competitor+analysis" \
  -H "Authorization: Bearer YOUR_API_KEY"
# {
#   "keyword": "seo competitor analysis",
#   "scanned_at": "2026-10-13T10:00:00Z",
#   "competitors": [
#     {"domain": "semrush.com", "position": 1, "change": 0, "estimated_traffic": 42500},
#     {"domain": "ahrefs.com",  "position": 2, "change": 1, "estimated_traffic": 38200}
#   ],
#   "total_competitors": 5,
#   "displacement_alerts": 2
# }

# Keyword sentiment
curl "https://api.pixelapi.dev/v1/geomind/sentiment?keyword=seo+competitor+analysis" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Active competitor alerts
curl "https://api.pixelapi.dev/v1/geomind/alerts" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Save an audit snapshot
curl -X POST "https://api.pixelapi.dev/v1/geomind/scan/save" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"example.com","keyword":"seo competitor analysis","score":82,"grade":"A"}'
pip install requests
---
import requests

API_KEY = "YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
BASE    = "https://api.pixelapi.dev/v1/geomind"
KEYWORD = "seo competitor analysis"

# Step 1 — competitor SERP positions
disp = requests.get(f"{BASE}/competitor/displacement",
                    params={"keyword": KEYWORD}, headers=HEADERS).json()
for c in disp["competitors"]:
    print(f"{c['domain']:30s}  pos={c['position']}  delta={c['change']:+d}  traffic≈{c['estimated_traffic']:,}")

# Step 2 — keyword sentiment
sent = requests.get(f"{BASE}/sentiment",
                    params={"keyword": KEYWORD}, headers=HEADERS).json()
print(f"Sentiment: {sent['overall']} (score {sent['score']:.2f})")

# Step 3 — citation velocity
vel = requests.get(f"{BASE}/citation/velocity",
                   params={"keyword": KEYWORD}, headers=HEADERS).json()
print(f"Citation velocity 7d: {vel['velocity_7d']}, acceleration: {vel['acceleration']:.2f}")

# Step 4 — active alerts
alerts = requests.get(f"{BASE}/alerts", headers=HEADERS).json()
for a in alerts["alerts"]:
    print(f"[{a['severity'].upper()}] {a['type']} — {a['message']}")

# Step 5 — save audit snapshot
saved = requests.post(f"{BASE}/scan/save", headers=HEADERS,
    json={"url": "example.com", "keyword": KEYWORD, "score": 82, "grade": "A"}).json()
print(f"Saved scan_id: {saved['scan_id']}")
npm install node-fetch
---
import fetch from "node-fetch";

const API_KEY = process.env.PIXELAPI_KEY;
const BASE    = "https://api.pixelapi.dev/v1/geomind";
const KEYWORD = "seo competitor analysis";
const auth    = { Authorization: `Bearer ${API_KEY}` };

// Competitor SERP positions
const disp = await fetch(
  `${BASE}/competitor/displacement?keyword=${encodeURIComponent(KEYWORD)}`,
  { headers: auth }
).then(r => r.json());

console.table(disp.competitors.map(c => ({
  domain:   c.domain,
  position: c.position,
  delta:    c.change,
  traffic:  c.estimated_traffic,
})));

// Sentiment
const sent = await fetch(
  `${BASE}/sentiment?keyword=${encodeURIComponent(KEYWORD)}`, { headers: auth }
).then(r => r.json());
console.log(`Sentiment: ${sent.overall} (${sent.score.toFixed(2)})`);

// Active alerts
const alerts = await fetch(`${BASE}/alerts`, { headers: auth }).then(r => r.json());
console.log(`${alerts.active_alerts} active alerts`);
// No SDK needed — plain PHP curl
<?php
$apiKey = getenv("PIXELAPI_KEY");
$base   = "https://api.pixelapi.dev/v1/geomind";
$kw     = urlencode("seo competitor analysis");

function geomind_get(string $url, string $apiKey): array {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => ["Authorization: Bearer $apiKey"],
    ]);
    $body = curl_exec($ch);
    curl_close($ch);
    return json_decode($body, true);
}

// Competitor positions
$disp = geomind_get("$base/competitor/displacement?keyword=$kw", $apiKey);
foreach ($disp["competitors"] as $c) {
    printf("%-30s pos=%d  delta=%+d  traffic=%s\n",
        $c["domain"], $c["position"], $c["change"],
        number_format($c["estimated_traffic"]));
}

// Alerts
$alerts = geomind_get("$base/alerts", $apiKey);
foreach ($alerts["alerts"] as $a) {
    echo "[{$a['severity']}] {$a['type']} — {$a['message']}\n";
}

// Save audit
$ch = curl_init("$base/scan/save");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ["Authorization: Bearer $apiKey", "Content-Type: application/json"],
    CURLOPT_POSTFIELDS     => json_encode(["url"=>"example.com","keyword"=>"seo competitor analysis","score"=>82,"grade"=>"A"]),
]);
$saved = json_decode(curl_exec($ch), true);
echo "Saved scan_id: {$saved['scan_id']}\n";
require "uri"
require "net/http"
require "json"

API_KEY = ENV["PIXELAPI_KEY"]
BASE    = "https://api.pixelapi.dev/v1/geomind"
KEYWORD = "seo competitor analysis"

def geomind_get(path, api_key, params = {})
  uri = URI("#{BASE}#{path}")
  uri.query = URI.encode_www_form(params) unless params.empty?
  req = Net::HTTP::Get.new(uri)
  req["Authorization"] = "Bearer #{api_key}"
  resp = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
  JSON.parse(resp.body)
end

# Competitor positions
disp = geomind_get("/competitor/displacement", API_KEY, keyword: KEYWORD)
disp["competitors"].each do |c|
  printf("%-30s pos=%d  delta=%+d  traffic=%d\n",
    c["domain"], c["position"], c["change"], c["estimated_traffic"])
end

# Alerts
alerts = geomind_get("/alerts", API_KEY)
puts "#{alerts['active_alerts']} active alerts"

# Save audit
uri = URI("#{BASE}/scan/save")
req = Net::HTTP::Post.new(uri, "Authorization" => "Bearer #{API_KEY}", "Content-Type" => "application/json")
req.body = JSON.generate(url: "example.com", keyword: KEYWORD, score: 82, grade: "A")
resp = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts "Saved scan_id: #{JSON.parse(resp.body)['scan_id']}"
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
    "os"
    "strings"
)

func geomindGet(path, apiKey, keyword string) map[string]interface{} {
    base := "https://api.pixelapi.dev/v1/geomind"
    u := base + path
    if keyword != "" {
        u += "?keyword=" + url.QueryEscape(keyword)
    }
    req, _ := http.NewRequest("GET", u, nil)
    req.Header.Set("Authorization", "Bearer "+apiKey)
    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    var result map[string]interface{}
    json.Unmarshal(body, &result)
    return result
}

func main() {
    apiKey  := os.Getenv("PIXELAPI_KEY")
    keyword := "seo competitor analysis"

    // Competitor positions
    disp := geomindGet("/competitor/displacement", apiKey, keyword)
    for _, c := range disp["competitors"].([]interface{}) {
        comp := c.(map[string]interface{})
        fmt.Printf("%-30s pos=%.0f  delta=%.0f  traffic=%.0f\n",
            comp["domain"], comp["position"], comp["change"], comp["estimated_traffic"])
    }

    // Alerts
    alerts := geomindGet("/alerts", apiKey, "")
    fmt.Printf("Active alerts: %.0f\n", alerts["active_alerts"])

    // Save audit
    payload := `{"url":"example.com","keyword":"seo competitor analysis","score":82,"grade":"A"}`
    req, _ := http.NewRequest("POST",
        "https://api.pixelapi.dev/v1/geomind/scan/save",
        strings.NewReader(payload))
    req.Header.Set("Authorization", "Bearer "+apiKey)
    req.Header.Set("Content-Type", "application/json")
    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    var saved map[string]interface{}
    json.Unmarshal(body, &saved)
    fmt.Printf("Saved scan_id: %.0f\n", saved["scan_id"])
}

Competitor research tool API documentation — all six endpoints

The geomind-competitor-audit API exposes six synchronous endpoints. No polling, no webhooks — every call returns its full JSON payload immediately.

GET /v1/geomind/competitor/displacement

Param: keyword (required).
Returns: competitors[] with domain, SERP position 1–100, signed change delta vs prior scan, estimated monthly organic traffic. Also: total_competitors, displacement_alerts, scanned_at.

Primary entry point for any competitor research audit.

GET /v1/geomind/sentiment

Param: keyword (required).
Returns: overall (bullish/bearish), score (0–1 float), sources breakdown (news, social, blogs), trend_7d array, top_sentiments with headlines.

Correlate a competitor's SERP rise with a press cycle before it appears in rank data.

GET /v1/geomind/citation/velocity

Param: keyword (required).
Returns: total_citations, velocity_24h, velocity_7d, velocity_30d, trend 7-day array, acceleration (0–1), top_citing_sources with first-seen dates.

Detect keywords gaining editorial momentum before competitors do.

GET /v1/geomind/alerts

No params required.
Returns: total_alerts, active_alerts, alerts[]. Alert types: rank_drop · rank_rise · competitor_new · sentiment_spike · citation_surge. Each includes severity (high/medium/low), keyword, message, and timestamp.

Poll hourly and route to Slack, PagerDuty, or any webhook.

POST /v1/geomind/scan/save & GET /v1/geomind/scan/history

Save an audit snapshot: {"url", "keyword", "score", "grade"} — returns a unique scan_id. Retrieve full history with timestamps, numeric score, and letter grade (A+/A/B+/B/C).

Build audit trails for client reporting and week-over-week trend analysis.

GET /v1/geomind/agent/protocol & POST /v1/geomind/agent/command

Protocol returns agent version, status, and a complete endpoint map — use as the bootstrap step in automated pipelines. Command endpoint executes parameterized actions and returns a structured result with a unique command_id.

Foundation for agent-driven SEO orchestration.

Pricing — competitor research tool API vs SpyFu, SEMrush, Ahrefs

ProviderFree tierPer-call costSynchronousNo subscription required
PixelAPI (geomind-competitor-audit) 5,000 credits (24-hour trial), no card $0.005 ✓ ✓
SpyFu (Kombat API) Limited free account ~$0.01 ($1.00/1,000 rows, ~10 rows per audit call) ✓ ✓
SEMrush API 10 req/day on free account Not published — API units bundled with subscription; see semrush.com/api ✓ ✗ (subscription required)
Ahrefs API None Not published — credits bundled with subscription; see ahrefs.com/api ✓ ✗ (subscription required)

Pricing verified from each rival's public pricing page October 2026. SpyFu Kombat API rate from developer.spyfu.com ($1.00/1,000 rows). SEMrush and Ahrefs do not publish a flat per-call rate — see their pricing pages for current unit package costs. PixelAPI's $0.005/call is set at exactly half SpyFu's per-call equivalent per our standing pricing principle.

What you get back — response shapes

Every geomind-competitor-audit endpoint returns clean, typed JSON. Here are the key response shapes:

Competitor displacement

GET /v1/geomind/competitor/displacement?keyword=...
competitors[]: domain (string), position (int 1–100), change (signed int, position delta vs prior scan), estimated_traffic (monthly organic visits). Top-level: keyword, scanned_at (ISO 8601), total_competitors, displacement_alerts.

Keyword sentiment

GET /v1/geomind/sentiment?keyword=...
overall: "bullish" or "bearish". score: 0.0–1.0. sources.news: articles_24h, avg_impact. sources.social: mentions_24h, engagement_rate. sources.blogs: posts_24h, avg_authority. trend_7d: 7-element float array. top_sentiments: source, headline, sentiment.

Citation velocity

GET /v1/geomind/citation/velocity?keyword=...
total_citations, velocity_24h, velocity_7d, velocity_30d (all ints). trend: 7-day int array. acceleration: float 0–1. top_citing_sources: domain, citations count, first_seen (ISO date).

Alerts

GET /v1/geomind/alerts
total_alerts, active_alerts (ints). alerts[]: id, type (rank_drop / rank_rise / competitor_new / sentiment_spike / citation_surge), keyword, severity (high / medium / low), message (human-readable), timestamp (ISO 8601).

Common workflows

Integrate geomind-competitor-audit into SEO pipelines and reporting stacks:

Keyword position tracking

Pair competitor displacement with the geomind-rank-tracker for a full SERP picture — your own positions and rival positions in one pipeline.

Rival audit reports

Combine displacement + sentiment + citation velocity into a weekly audit report using scan/save and scan/history for trend tracking.

Open-source rank tracking

Self-hosted SEO dashboards can call the geomind API on a schedule and store position deltas in any time-series database.

Agency client reporting

Run competitive audits for multiple client domains in parallel via the agent/command endpoint, then aggregate into branded PDF or Data Studio reports.

Content gap analysis

Feed a competitor keyword list into the displacement endpoint to find keywords where rivals rank 1–3 but you are absent — your highest-impact content gaps.

Alert-driven content sprints

Poll /v1/geomind/alerts on a daily cron. When a competitor_new or rank_drop alert fires, trigger a content refresh or outreach sprint automatically.

Integrations — connect the competitor research API

Python pipelines

Scheduled competitor audits with plain requests or pip install pixelapi — runs inside any cron job, Airflow DAG, or Prefect flow. Built-in retry on 429.

Node.js / Next.js

Serve competitive SERP data server-side: call npm install pixelapi inside a Route Handler to feed a live competitive intelligence dashboard.

Google Sheets / Looker Studio

Call the displacement endpoint from an Apps Script function, write competitor positions to a sheet, and visualize in Looker Studio for stakeholders.

Slack / PagerDuty alerts

Pipe /v1/geomind/alerts into an incoming webhook. Notify the SEO team in Slack or open a PagerDuty incident when a competitor enters the top 5.

BI dashboards (Grafana, Metabase, Retool)

REST with no SDK required — any dashboard that can issue an HTTP GET can pull live competitor positions and chart position-delta trends over time.

CI/CD SEO gates

Add a competitor audit step to your deployment pipeline. If a key keyword's competitive displacement worsens past a threshold, flag the release for SEO review.

Comparison vs alternatives

vs SpyFu API

SpyFu's Kombat API charges $1.00/1,000 rows — approximately $0.01 per typical 10-competitor audit call. PixelAPI charges $0.005 per call — half the cost at the same synchronous REST interface. SpyFu also requires an active account subscription for higher API limits; PixelAPI is credit-based with no subscription lock-in.

vs SEMrush API

SEMrush bundles API units with a subscription starting at $117.33/month. PixelAPI has no subscription requirement — pay per call from $0.005, with a free 5,000-credit trial. For agencies needing sporadic competitive snapshots rather than daily crawls, credit-based billing is far cheaper than a monthly commitment.

vs Ahrefs API

Ahrefs API access requires an active Ahrefs subscription with no standalone or pay-per-call option. PixelAPI's competitor research tool API is accessible with just a free API key — sign up, receive 5,000 trial credits, and make your first call in under 60 seconds, no plan commitment needed.

vs SerpWatch

SerpWatch offers per-check pricing (~$0.004/check on annual Starter plan) but focuses on rank tracking for your own keywords. PixelAPI's geomind-competitor-audit centers on rival domain analysis — displacement positions, change deltas, sentiment, and citation velocity for competitor-first SEO research workflows.

Rate limits & error handling

20 requests/minute on the free trial, 60 on Starter, 120 on Pro, and 300 on Scale — plus 3/10/20/50 concurrent calls respectively (see pixelapi.dev/docs/parallel-processing.html). Exceeding the limit returns HTTP 429 with a Retry-After header. The Python and Node SDKs handle exponential backoff automatically; for raw HTTP clients, start at 2s and double on each retry up to 30s.

# Python — manual exponential backoff for HTTP 429
import requests
from time import sleep

def geomind_call(keyword: str, api_key: str, max_retries: int = 4) -> dict:
    url     = "https://api.pixelapi.dev/v1/geomind/competitor/displacement"
    headers = {"Authorization": f"Bearer {api_key}"}
    delay   = 2
    for attempt in range(max_retries):
        resp = requests.get(url, headers=headers, params={"keyword": keyword})
        if resp.status_code == 429:
            sleep(delay)
            delay = min(delay * 2, 30)
            continue
        resp.raise_for_status()
        return resp.json()
    raise RuntimeError(f"Max retries reached for keyword: {keyword}")

data = geomind_call("seo competitor analysis", "YOUR_API_KEY")

Frequently asked questions

How do I start a competitor research audit via API?

Call GET https://api.pixelapi.dev/v1/geomind/competitor/displacement?keyword=your+keyword with Authorization: Bearer YOUR_API_KEY. The response arrives synchronously — no polling required. You get back a competitors array with each domain's SERP position, signed change delta, and estimated monthly organic traffic. See the Quick Start section above for code in cURL, Python, Node.js, PHP, Ruby, and Go.

What does the competitor research tool API cost?

$0.005 per competitor audit call — half of SpyFu's Kombat API rate ($1.00/1,000 rows = $0.01 per typical 10-competitor audit). New accounts get 5,000 free credits (24-hour trial) with no credit card required — enough for 1,000 competitor audit calls before paying anything.

What endpoints does the geomind-competitor-audit API include?

Six endpoints: GET /v1/geomind/competitor/displacement (SERP positions and deltas), GET /v1/geomind/sentiment (keyword sentiment), GET /v1/geomind/citation/velocity (citation momentum), GET /v1/geomind/alerts (rank-drop and new-competitor alerts), GET /v1/geomind/scan/history and POST /v1/geomind/scan/save (audit persistence), plus GET /v1/geomind/agent/protocol and POST /v1/geomind/agent/command for automated orchestration.

What data does the competitor displacement endpoint return?

The /v1/geomind/competitor/displacement endpoint returns: the queried keyword, scan timestamp, a competitors array (each with domain, SERP position 1–100, signed change delta vs prior scan, and estimated monthly organic traffic), total_competitors count, and displacement_alerts count — all in a single synchronous JSON response.

Can I track keyword sentiment alongside competitor positions?

Yes. GET /v1/geomind/sentiment?keyword=... returns an overall bullish/bearish rating, a 0–1 score, per-source breakdowns for news (articles_24h, avg_impact), social (mentions_24h, engagement_rate), and blogs (posts_24h, avg_authority), plus a 7-day sentiment trend array. Use it alongside displacement data to understand whether a competitor's SERP gain is backed by press momentum or organic growth.

How do I get alerted when a competitor enters the top 5?

GET /v1/geomind/alerts returns all active alerts for your tracked keywords. Alert types: rank_drop, rank_rise, competitor_new (new domain entering top 5), sentiment_spike, and citation_surge. Each alert includes severity (high/medium/low), affected keyword, human-readable message, and timestamp. Poll on a daily or hourly schedule and route to Slack, PagerDuty, or any webhook.

What is citation velocity and why does it matter?

GET /v1/geomind/citation/velocity?keyword=... measures how fast a keyword is being cited across news, blogs, and social sources — with 24h/7d/30d velocity windows, a 7-day trend array, a velocity acceleration score (0–1), and the top citing domains. A rising citation velocity often precedes an incoming SERP shift by several weeks, making it a leading indicator that standard rank-tracking misses.

How do I save and retrieve past competitor audit results?

POST to /v1/geomind/scan/save with JSON body {"url": "example.com", "keyword": "...", "score": 82, "grade": "A"}. The response returns a unique scan_id. Retrieve your full audit history via GET /v1/geomind/scan/history, which returns scan id, URL, keyword, numeric score, letter grade (A+/A/B+/B/C), and ISO timestamp for each record — ideal for client reporting and trend analysis.

What are the rate limits for the competitor research API?

20 requests/minute on the free trial, 60 on Starter, 120 on Pro, and 300 on Scale — plus 3/10/20/50 concurrent jobs respectively. Exceeding the limit returns HTTP 429 with a Retry-After header. The Python and Node SDKs handle automatic exponential backoff (2s → 4s → 8s → 30s cap). Higher limits for batch competitive research — contact support@pixelapi.dev with your expected call volume.

Is there a Python SDK?

Yes — pip install pixelapi. Official SDKs also available for Node.js (npm install pixelapi), PHP (Composer), Ruby (Gem), and Go (go get github.com/pixelapi/pixelapi-go). All SDKs handle authentication, retry-on-429 with backoff, and JSON parsing automatically. A plain requests.get or curl call works equally well with no SDK needed.

How does PixelAPI compare to SEMrush and Ahrefs for competitor research?

SEMrush and Ahrefs bundle API access with subscriptions starting at $117+/month — no standalone pay-per-call option. PixelAPI charges $0.005 per call with no subscription required and a free 5,000-credit trial. Sign up, get your API key, and make your first competitor research call in under 60 seconds with no plan commitment.

Can I use the geomind competitor audit API in an automated pipeline?

Yes. The API is synchronous REST — any cron job, Airflow DAG, GitHub Action, Lambda function, or scheduled Cloud Run job can call it. Use GET /v1/geomind/agent/protocol to discover all endpoint capabilities at startup, then pipe displacement and alert data into your reporting stack, time-series database, or notification system automatically.

Start free — 5,000 credits, no card Read full API docs Compare all plans