Complete Guide
How to build automated competitive intelligence workflows that keep your team informed without the manual grind. From first API call to production-ready integrations.
Competitive intelligence (CI) is the systematic collection, analysis, and application of information about your competitors, their products, pricing, positioning, and strategic direction. It is the difference between reacting to market shifts after they happen and anticipating them before they impact your business.
For B2B SaaS companies, competitive intelligence directly impacts three critical areas:
Win rates
Teams with current competitive intel win 30% more competitive deals. When your AE knows the competitor just dropped a feature your prospect asked about, they can reframe the conversation in real time.
Product strategy
Understanding where competitors invest (and where they do not) reveals market gaps. The best product decisions come from seeing the full competitive landscape, not just your own roadmap.
Pricing power
If a competitor raises prices by 20% and you do not know about it for three months, you have left money on the table. Real-time pricing intelligence lets you adjust positioning and capture value.
The challenge is not whether competitive intelligence matters — every product leader, marketing director, and sales enablement manager knows it does. The challenge is doing it consistently, at scale, without burning hours of analyst time every week.
That is where a competitive intelligence API comes in. By programmatically accessing competitor data, you can build automated workflows that keep your entire organisation informed without anyone manually checking competitor websites.
Most companies start competitive intelligence the same way: someone bookmarks competitor websites and checks them periodically. Maybe there is a shared spreadsheet. Perhaps a product marketing manager spends Friday afternoons visiting each competitor's pricing page, blog, and feature list.
This approach fails for five predictable reasons:
Time sink: 5-10 hours per week
A typical B2B SaaS company monitors 5-15 competitors across pricing pages, feature pages, blogs, and about sections. At 3-5 minutes per page and 4-8 pages per competitor, a manual audit takes 2-5 hours. And that is just the checking — analysis and distribution take another 3-5 hours.
Missed changes happen constantly
Competitors do not announce when they update pricing or quietly remove a feature from their website. A weekly check means you might miss a change that happened on Monday until Friday — and by then, your sales team may have already lost a deal using outdated information.
Battle cards go stale within weeks
Sales battle cards are only valuable when they are current. Most companies update battle cards quarterly at best. In a fast-moving market, a three-month-old battle card can actively hurt your sales team by giving them outdated objection handling or incorrect pricing comparisons.
Knowledge stays siloed
When one person owns competitive intelligence, the insights live in their head, their notes, or a document nobody reads. Product teams miss it. Sales teams do not see it. Executives get a filtered summary once a quarter.
It does not scale
Adding a new competitor means adding hours of manual work. Entering a new market segment? Double the monitoring load. Manual CI is inherently limited by human bandwidth, and it is always the first thing that gets deprioritised when teams get busy.
The real cost of manual CI
A product marketing manager earning $120K/year spending 6 hours/week on competitor monitoring costs your company roughly $18,700/year in salary alone — not counting the opportunity cost of what they could be doing instead, or the deals lost because of stale competitive intel.
A competitive intelligence API does not just digitize manual work — it fundamentally changes what is possible. Instead of a person checking websites, software monitors competitors around the clock and exposes structured data through standard HTTP endpoints.
This shift enables four capabilities that manual processes cannot match:
REAL-TIME DETECTION
Changes detected in hours, not weeks
Automated monitoring runs on a schedule — daily for most plans, down to every 6 hours for high-priority competitors. When a change is detected, it is immediately available via the API and can trigger webhooks to notify your team.
STRUCTURED DATA
Machine-readable competitive insights
Raw webpage changes are transformed into structured JSON with categories, severity ratings, and AI-generated analysis. This data can flow directly into dashboards, CRMs, spreadsheets, and AI agents.
INTEGRATION
CI data flows to every tool your team uses
With an API, competitive intelligence is no longer trapped in a single dashboard. It can be pushed to Slack, pulled into Salesforce, synced to Notion, or consumed by AI agents that generate reports on demand.
SCALABILITY
Monitor 5 or 50 competitors with the same effort
Adding a new competitor is a single API call. The system handles discovery, page monitoring, change detection, and analysis automatically. Your CI coverage scales with your market, not your headcount.
The result is competitive intelligence that is always current, always accessible, and always actionable — without anyone spending their Friday afternoons clicking through competitor websites.
A modern competitive intelligence stack has four layers. RivalCheck handles the first two and provides the data layer for the rest.
Detection — RivalCheck monitors competitor pages
RivalCheck's crawler visits competitor pages on a schedule, takes screenshots, and uses AI vision to detect meaningful changes. Raw page data is compared, changes are categorised (pricing, features, messaging, content), and severity is assessed.
Notification — Webhooks, email digests, in-app alerts
When changes are detected, RivalCheck can push notifications through multiple channels: webhook events to your endpoint, daily or weekly email digests, and in-app notifications. Webhooks are the bridge to custom automations.
Integration — REST API + MCP for data access
The RivalCheck API provides RESTful endpoints for competitors, changes, battle cards, and the competitive landscape. The MCP server lets AI agents like Claude access the same data conversationally.
Intelligence — AI analysis, battle cards, reporting
AI processes raw changes into strategic insights: what changed, why it matters, and what your team should do about it. Battle cards are generated and kept current. This layer can be extended with your own AI workflows using the structured data from Layer 3.
# The data flow
Competitor Website
│
▼
RivalCheck Crawler (scheduled snapshots)
│
▼
Change Detection Engine (AI vision + text diff)
│
├──▶ Webhook Event ──▶ Slack / Your App / Zapier
│
├──▶ Email Digest ──▶ Team Inboxes
│
├──▶ REST API ──▶ Dashboards / CRM / Scripts
│
└──▶ MCP Server ──▶ Claude / AI Agents
The beauty of this architecture is that you choose your level of integration. Start with email digests (zero code required), add a Slack webhook when you want real-time alerts, then build custom integrations as your CI programme matures.
Let us walk through building a practical integration from scratch. By the end, you will have a Python script that pulls competitor changes from the RivalCheck API, filters for pricing updates, and generates a formatted weekly report.
Navigate to Settings in your RivalCheck dashboard and click Generate API Key. Your key will start with rc_live_ for production or rc_test_ for sandbox. Store it securely — it provides full read access to your organisation's competitive data.
# Store your API key as an environment variable export RIVALCHECK_API_KEY="rc_live_abc123def456..."
First, let us verify your API key works and see which competitors you are monitoring:
curl -s -H "Authorization: Bearer $RIVALCHECK_API_KEY" \ https://app.rivalcheck.com/api/v1/competitors | python3 -m json.tool
Response:
{
"competitors": [
{
"id": 42,
"name": "Acme Corp",
"website_url": "https://acmecorp.com",
"status": "active",
"monitored_pages": 6,
"last_checked_at": "2026-03-23T14:30:00Z",
"changes_count": 23,
"has_battle_card": true
},
{
"id": 43,
"name": "Nexus Software",
"website_url": "https://nexus.io",
"status": "active",
"monitored_pages": 4,
"last_checked_at": "2026-03-23T14:30:00Z",
"changes_count": 15,
"has_battle_card": true
}
],
"meta": { "total": 2, "page": 1, "per_page": 25 }
}
The changes endpoint returns all detected changes across your competitors, sorted by date. You can filter by competitor, category, severity, and date range:
# Get changes from the last 7 days curl -s -H "Authorization: Bearer $RIVALCHECK_API_KEY" \ "https://app.rivalcheck.com/api/v1/changes?since=2026-03-16&limit=50"
Each change includes structured metadata:
{
"id": 891,
"competitor": { "id": 42, "name": "Acme Corp" },
"page_url": "https://acmecorp.com/pricing",
"category": "pricing",
"severity": "high",
"title": "Enterprise plan price increased from $299 to $349/mo",
"summary": "Acme Corp raised their Enterprise tier price by 17%. The Pro tier
remains unchanged. They also added a new 'Starter' tier at $29/mo,
suggesting a move to capture smaller accounts.",
"strategic_analysis": "This price increase signals confidence in their
enterprise value proposition. The new Starter tier opens a new segment
they previously ignored. Consider whether your mid-market positioning
now has more room to compete on value.",
"detected_at": "2026-03-22T09:15:00Z",
"screenshot_before_url": "https://cdn.rivalcheck.com/shots/...",
"screenshot_after_url": "https://cdn.rivalcheck.com/shots/..."
}
For many teams, pricing changes are the most urgent competitive signal. The API lets you filter by category directly:
# Get only pricing changes, high severity curl -s -H "Authorization: Bearer $RIVALCHECK_API_KEY" \ "https://app.rivalcheck.com/api/v1/changes?category=pricing&severity=high"
Battle cards synthesise everything RivalCheck knows about a competitor into an actionable sales document. They are generated by AI and updated when significant changes are detected:
# Get the battle card for Acme Corp (competitor ID 42) curl -s -H "Authorization: Bearer $RIVALCHECK_API_KEY" \ https://app.rivalcheck.com/api/v1/competitors/42/battle_card
See the Battle Card API guide for complete details on battle card generation and format options.
Here is a complete Python script that pulls the last week's changes, organises them by competitor and category, and generates a formatted report. Run this as a cron job or scheduled GitHub Action every Monday morning.
#!/usr/bin/env python3
"""
Weekly Competitive Intelligence Report Generator
Pulls data from the RivalCheck API and produces a formatted summary.
"""
import os
import json
import requests
from datetime import datetime, timedelta
from collections import defaultdict
API_BASE = "https://app.rivalcheck.com/api/v1"
API_KEY = os.environ["RIVALCHECK_API_KEY"]
headers = {"Authorization": f"Bearer {API_KEY}"}
def get_competitors():
"""Fetch all active competitors."""
resp = requests.get(f"{API_BASE}/competitors?status=active", headers=headers)
resp.raise_for_status()
return resp.json()["competitors"]
def get_changes(since_date):
"""Fetch all changes since a given date."""
all_changes = []
page = 1
while True:
resp = requests.get(
f"{API_BASE}/changes",
headers=headers,
params={"since": since_date, "page": page, "limit": 100}
)
resp.raise_for_status()
data = resp.json()
all_changes.extend(data["changes"])
if len(all_changes) >= data["meta"]["total"]:
break
page += 1
return all_changes
def get_battle_card(competitor_id):
"""Fetch the current battle card for a competitor."""
resp = requests.get(
f"{API_BASE}/competitors/{competitor_id}/battle_card",
headers=headers
)
if resp.status_code == 404:
return None
resp.raise_for_status()
return resp.json()
def generate_report():
"""Build the weekly CI report."""
since = (datetime.utcnow() - timedelta(days=7)).strftime("%Y-%m-%d")
competitors = get_competitors()
changes = get_changes(since)
# Group changes by competitor
by_competitor = defaultdict(list)
for change in changes:
by_competitor[change["competitor"]["name"]].append(change)
# Count by category
by_category = defaultdict(int)
for change in changes:
by_category[change["category"]] += 1
# Build report
report = []
report.append(f"# Weekly Competitive Intelligence Report")
report.append(f"Period: {since} to {datetime.utcnow().strftime('%Y-%m-%d')}")
report.append(f"Competitors monitored: {len(competitors)}")
report.append(f"Total changes detected: {len(changes)}")
report.append("")
# Summary by category
report.append("## Changes by Category")
for category, count in sorted(by_category.items(),
key=lambda x: x[1], reverse=True):
report.append(f" - {category.title()}: {count}")
report.append("")
# High-severity alerts
high_severity = [c for c in changes if c["severity"] == "high"]
if high_severity:
report.append("## High-Priority Alerts")
for change in high_severity:
report.append(f" [{change['competitor']['name']}] {change['title']}")
report.append(f" Analysis: {change['strategic_analysis']}")
report.append("")
# Per-competitor breakdown
report.append("## Competitor Details")
for comp_name, comp_changes in sorted(by_competitor.items()):
report.append(f"\n### {comp_name} ({len(comp_changes)} changes)")
for change in comp_changes:
severity_marker = "!" if change["severity"] == "high" else "-"
report.append(
f" {severity_marker} [{change['category']}] {change['title']}"
)
return "\n".join(report)
if __name__ == "__main__":
report = generate_report()
print(report)
# Optionally save to file
filename = f"ci_report_{datetime.utcnow().strftime('%Y%m%d')}.md"
with open(filename, "w") as f:
f.write(report)
print(f"\nReport saved to {filename}")
Extend this example
This script outputs Markdown, but you can easily adapt it to send an email (using smtplib), post to Slack (using the Slack Web API), or upload to Confluence. The data is the same — only the output format changes.
Once you have the basics working, these patterns unlock the full value of API-powered competitive intelligence.
Build a live dashboard that displays competitive activity alongside your own metrics. Use the changes endpoint with polling, or configure webhooks for push-based updates.
// React component polling the changes feed
const CompetitiveFeed = () => {
const [changes, setChanges] = useState([]);
useEffect(() => {
const fetchChanges = async () => {
const since = new Date(Date.now() - 7 * 86400000)
.toISOString().split("T")[0];
const resp = await fetch(
`https://app.rivalcheck.com/api/v1/changes?since=${since}`,
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
const data = await resp.json();
setChanges(data.changes);
};
fetchChanges();
const interval = setInterval(fetchChanges, 300000); // 5 min
return () => clearInterval(interval);
}, []);
return (
<div className="competitive-feed">
{changes.map(change => (
<ChangeCard key={change.id} change={change} />
))}
</div>
);
};
For real-time updates without polling, configure a webhook endpoint and use server-sent events or WebSockets to push updates to your frontend.
The highest-impact CI integration for most companies is connecting competitive data to their CRM. When a competitor changes pricing, every open deal against that competitor should be flagged.
# Webhook handler that updates Salesforce when a
# competitor pricing change is detected
from flask import Flask, request
from simple_salesforce import Salesforce
app = Flask(__name__)
sf = Salesforce(username="...", password="...", security_token="...")
@app.route("/webhooks/rivalcheck", methods=["POST"])
def handle_webhook():
event = request.json
if event["event"] != "change.detected":
return "OK", 200
change = event["data"]
# Only act on pricing changes
if change["category"] != "pricing":
return "OK", 200
competitor_name = change["competitor"]["name"]
# Find open opportunities with this competitor
opps = sf.query(
f"SELECT Id, Name, OwnerId FROM Opportunity "
f"WHERE Competitor__c = '{competitor_name}' "
f"AND StageName NOT IN ('Closed Won', 'Closed Lost')"
)
# Add a task to each opportunity owner
for opp in opps["records"]:
sf.Task.create({
"WhatId": opp["Id"],
"OwnerId": opp["OwnerId"],
"Subject": f"Competitive Alert: {change['title']}",
"Description": change["strategic_analysis"],
"Priority": "High",
"Status": "Not Started"
})
return "OK", 200
This pattern ensures sales reps see competitive updates in context — right next to the deal they are working, not buried in a Slack channel they do not check.
Product teams can use the API to automatically create planning items when competitors launch features or change their positioning. Here is an example that creates Linear issues for significant competitive moves:
# Create a Linear issue when a competitor ships a new feature
import requests
def create_competitive_insight_issue(change):
"""Create a Linear issue in the 'Competitive Insights' project."""
linear_api = "https://api.linear.app/graphql"
headers = {"Authorization": LINEAR_API_KEY}
mutation = """
mutation CreateIssue($input: IssueCreateInput!) {
issueCreate(input: $input) {
issue { id identifier url }
}
}
"""
variables = {
"input": {
"teamId": PRODUCT_TEAM_ID,
"projectId": CI_PROJECT_ID,
"title": f"[CI] {change['competitor']['name']}: {change['title']}",
"description": (
f"## Competitive Change Detected\n\n"
f"**Competitor:** {change['competitor']['name']}\n"
f"**Category:** {change['category']}\n"
f"**Severity:** {change['severity']}\n\n"
f"### Summary\n{change['summary']}\n\n"
f"### Strategic Analysis\n{change['strategic_analysis']}\n\n"
f"*Auto-generated by RivalCheck API*"
),
"priority": 2 if change["severity"] == "high" else 3,
"labelIds": [COMPETITIVE_LABEL_ID]
}
}
resp = requests.post(linear_api, json={
"query": mutation, "variables": variables
}, headers=headers)
return resp.json()
Combine the RivalCheck API with an LLM to generate executive-ready competitive briefings. Using the MCP integration, you can ask Claude to synthesize competitive data into a narrative format:
# Using the RivalCheck MCP server with Claude # Claude has access to your competitive data via MCP. # Prompt example for generating an executive briefing: """ Using the RivalCheck tools, pull all changes from the last 7 days and generate a 1-page executive briefing that covers: 1. Top 3 competitive moves we should respond to 2. Pricing landscape shifts 3. Feature parity changes 4. Recommended actions for product, sales, and marketing Format it as a professional memo for our leadership team. """
This replaces the typical 2-3 hour process of a product marketing manager compiling a weekly competitive update for the exec team.
| Dimension | Manual CI | API-Powered CI |
|---|---|---|
| Detection speed | Days to weeks | Hours (same day) |
| Coverage | 5-10 pages per competitor | All monitored pages, continuously |
| Time investment | 5-10 hours/week | 30 minutes/week to review |
| Battle card freshness | Updated quarterly | Updated on every significant change |
| Distribution | Email, shared doc | Slack, CRM, dashboards, AI agents |
| Scalability | Linear — more competitors = more time | Constant — add competitors via API |
| Consistency | Depends on the person, drops when busy | Runs every scheduled cycle without fail |
| Analysis depth | Surface-level, biased by familiarity | AI-powered strategic analysis on every change |
| Historical data | Whatever someone wrote down | Complete change history with screenshots |
Effective competitive monitoring goes beyond just checking pricing pages. Here are the five categories of competitor changes that drive strategic decisions, and how the RivalCheck API categorises each:
Pricing and packaging changes
Price increases, decreases, new tiers, removed plans, changed feature gating, usage-based pricing shifts, enterprise pricing updates. These are typically the highest-severity changes because they directly affect your competitive positioning and sales conversations.
Pages to monitor: /pricing, /plans, comparison pages, individual plan pages
API filter: category=pricing
Feature and product changes
New feature launches, feature removals, product line expansions, integrations added, platform updates. Track feature pages, changelog, and product overview pages to understand where competitors are investing their engineering resources.
Pages to monitor: /features, /product, /changelog, /integrations, /what-s-new
API filter: category=features
Messaging and positioning shifts
Tagline changes, value proposition updates, target audience shifts, new use cases highlighted, competitive comparisons added. These changes reveal strategic direction — when a competitor starts calling themselves an "enterprise platform" instead of a "startup tool," that is a signal.
Pages to monitor: Homepage, /about, /why-us, landing pages
API filter: category=messaging
Content and thought leadership
Blog posts, case studies, whitepapers, webinar announcements, press releases. Content changes reveal where competitors are focusing their marketing efforts and which customer segments they are targeting.
Pages to monitor: /blog, /resources, /customers, /case-studies
API filter: category=content
Company and team updates
Team page changes, leadership hires, job postings (via careers page), office locations, about page updates. A competitor adding a "Head of Enterprise Sales" to their team page tells you something about their strategic direction that their marketing will not reveal for months.
Pages to monitor: /about, /team, /careers, /company
API filter: category=company
The combination of automated monitoring and AI analysis creates a step change in competitive intelligence quality. Instead of raw "this page changed" alerts, you get structured, strategic insights.
AI-powered change detection
RivalCheck uses computer vision to compare page screenshots, not DOM structure. This means it catches visual changes that traditional text-diff tools miss — redesigns, new social proof badges, removed CTAs, layout shifts that signal repositioning. The AI then determines whether a change is cosmetic or strategically significant.
Example AI classification:
Change: "G2 Leader badge added to pricing page header"
Category: messaging
Severity: medium
Analysis: "Acme Corp has added third-party validation prominently to their pricing page, likely to reduce purchase hesitation. This suggests they are investing in social proof for conversion optimization. Consider whether your own G2 or Capterra ratings could serve a similar purpose."
Auto-generated battle cards
RivalCheck's AI synthesises all known information about a competitor — their pricing, features, messaging, recent changes, and positioning — into a structured battle card. These cards include sections for strengths, weaknesses, objection handling, and how to win, all kept current as new changes are detected.
Read the complete Battle Card API guide for details on generation, format options, and integration patterns.
Strategic analysis on every change
Every change detected by RivalCheck comes with an AI-generated strategic analysis field in the API response. This is not just a description of what changed — it is an assessment of why it matters to your business and what you might consider doing about it.
The analysis considers the change in context: a 10% price increase means different things for a bootstrapped startup versus a venture-backed competitor that just raised a Series C.
MCP: Conversational access to competitive data
The RivalCheck MCP server lets AI agents like Claude directly access your competitive intelligence data. This means you can have conversations like:
"What has Acme Corp changed on their pricing page in the last month?"
"Compare our pricing to all monitored competitors and identify where we are most expensive."
"Draft talking points for my sales call tomorrow against Nexus Software."
RivalCheck provides the complete competitive intelligence stack described in this guide: automated monitoring, AI-powered change detection, structured API access, webhooks, MCP integration, and auto-generated battle cards.
Start building in 5 minutes:
We use essential cookies to keep the site working. With your consent, we may also use analytics cookies to improve the experience. Privacy policy.