Build a Competitor Analysis Tool for 42 Social Platforms
Build a competitor analysis tool for social data: pull profiles, compute engagement rates, measure posting cadence, and track brand mentions via one API.

Build a Competitor Analysis Tool for 42 Social Platforms
A competitor analysis tool for social media gives you programmatic access to your competitors' profiles, post performance, and brand mentions across every platform they're active on — without clicking through dashboards or hitting per-platform paywalls.
Your competitor is active on TikTok, YouTube, Instagram, and Reddit. Your current tool monitors two of those — and charges per platform for the other two. The data you're missing is the data that matters most.
Web-traffic tools like SpyFu and SimilarWeb tell you which keywords a competitor ranks for and how many visits their site gets. That's useful. But it tells you nothing about which of their Reels is pulling 800k views, how often they post, which creators are amplifying their product launch, or what their cross-platform share of voice looks like relative to yours. Social suites like Hootsuite cover that terrain but start at $99/month and expose no programmatic API — there's no way to pull the data into your own pipeline, your BI tool, or an LLM agent.
Here is how to build that pipeline. The examples below are real, runnable API calls — profiles, posts, cadence analysis, and a cross-platform brand-mention search, all through a single API key.
What Is Social Media Competitor Analysis — and What Does a Real Competitor Analysis Tool Cover?
Social media competitor analysis is the process of measuring your competitors' owned social performance and comparing it to your own across a defined set of dimensions. According to Sprout Social's competitive analysis framework, a meaningful social competitor audit covers five dimensions: share of voice, engagement rate by content type, posting cadence, audience demographics overlap, and content gap identification.
The tool landscape fragments into three tiers:
Tier 1 — All-in-one social media analytics tools (Hootsuite, Sprout Social, Buffer): These cover the social layer well at a dashboard level. Hootsuite's competitive analysis module, powered by Talkwalker AI, monitors competitor social performance and brand sentiment across platforms. The trade-off is price and closed data: they are dashboards, not APIs. You cannot script against them, pipe their data into Postgres, or run them inside an AI agent.
Tier 2 — Web and SEO tools (SpyFu, SimilarWeb, Moz, SEranking): Genuinely useful for keyword gaps, backlink analysis, and traffic estimation. Moz's competitive research focuses on domain authority and search rankings — no social data layer. SimilarWeb surfaces social as a traffic source for a website, but it does not show you a competitor's post-level engagement, follower growth trend, or TikTok Reels cadence. SpyFu has no social data at all — it is entirely Google-centric.
Tier 3 — Programmatic/API access (the developer layer): This is the gap. No tool in the top results offers an API that returns normalized competitor social data across multiple platforms in a single schema. Developers building competitor intelligence pipelines, AI agents doing brand monitoring, or data teams who need raw post-level data need direct programmatic access — not a screenshot in a dashboard.
The SocialCrawl API fills that gap: 42 platforms, 264 endpoints, one unified response schema, one auth header. It is the programmatic competitor analysis tool for the developer layer — where the dashboard tools stop and your own data pipeline begins.
What Do You Need to Build a Competitor Analysis Tool?
To follow this guide end to end, you need:
- A SocialCrawl API key. Sign up at socialcrawl.dev and grab a key from the dashboard. The visual Explorer lets you see your data before writing a single line of code — useful for verifying that a competitor's handle resolves correctly before you build around it. See the full supported platform list to confirm coverage for every platform you need.
- cURL or any HTTP client. All examples use cURL first, then Python for the pipeline sections. The API is plain REST — you can use
fetch,httpx,axios, or any language you like. - Competitor handles per platform. For each competitor, note their:
- Instagram username (e.g.,
@nike) - TikTok username (e.g.,
@nike) - YouTube channel ID or handle (e.g.,
@Nikeor theUC...channel ID from the URL) - Reddit username if they have one (
u/brand)
- Instagram username (e.g.,
- Optional: Python 3.x with
httpx. The pipeline sections usehttpxfor async requests. Install withpip install httpx.
Step 1 — Pull a Competitor's Social Profile in One Request
The fastest way to start building your competitor analysis tool is a profile lookup. This returns follower count, average engagement metrics, and posting frequency — all normalized to the same field names regardless of platform.
Instagram profile:
curl "https://www.socialcrawl.dev/v1/instagram/profile?handle=nike" \
-H "x-api-key: YOUR_API_KEY"
Example response (condensed — every response is wrapped in the same envelope, with the documented fields under data):
{
"success": true,
"platform": "instagram",
"endpoint": "profile",
"data": {
"author": {
"id": "13460080",
"username": "nike",
"display_name": "Nike",
"avatar_url": "https://...",
"bio": "Spotlighting athlete and brand stories.",
"url": "https://www.instagram.com/nike",
"verified": true,
"private": false,
"followers": 302000000,
"following": 81,
"posts_count": 1847,
"likes_count": null,
"joined_at": null
},
"computed": {
"engagement_rate": 0.0179,
"language": null,
"content_category": "other",
"estimated_reach": 5400000
}
},
"credits_used": 1,
"credits_remaining": 99420,
"request_id": "req_...",
"cached": false
}
Notice engagement_rate and content_category under data.computed — those are computed fields. The API calculates engagement rate from post-level data and infers a content category, so you get normalized outputs, not raw counts you have to post-process yourself. The computed block is the differentiator: the same lookup that returns the raw profile also hands you the derived metrics.
TikTok profile — identical pattern:
curl "https://www.socialcrawl.dev/v1/tiktok/profile?handle=nike" \
-H "x-api-key: YOUR_API_KEY"
The response schema is the same. data.author.followers, data.author.posts_count, data.computed.engagement_rate — same field names across both platforms. That is what "42 platforms, one envelope" means in practice: you write one data-processing function and it works for every platform you add to your competitor list. (Note: on TikTok, computed.engagement_rate is clamped to a maximum of 1.0.) The same pattern holds for the Instagram endpoints and TikTok endpoints — and every other platform in the registry.
Run this call for every competitor on every platform you care about. Store the results and you have your baseline.
Step 2 — Collect Recent Posts and Compute Engagement Rate
Profile-level metrics tell you the average. Post-level data tells you where the spikes are — which content format is outperforming, which campaigns landed, and what your competitor is doubling down on.
curl "https://www.socialcrawl.dev/v1/instagram/profile/posts?handle=nike" \
-H "x-api-key: YOUR_API_KEY"
The resource is profile/posts, and pagination is cursor-based — the envelope returns data.next_cursor (pass it back as next_max_id for the next page). Each item pairs a post object with its own computed block:
{
"success": true,
"platform": "instagram",
"endpoint": "profile/posts",
"data": {
"items": [
{
"post": {
"id": "C_abc123",
"url": "https://www.instagram.com/p/C_abc123/",
"content": {
"text": "Just do it. #nike #running",
"media_urls": ["https://..."],
"thumbnail_url": "https://...",
"duration_seconds": 18
},
"author": {
"username": "nike",
"display_name": "Nike",
"avatar_url": "https://...",
"verified": true
},
"engagement": {
"views": 4200000,
"likes": 245000,
"comments": 1820,
"shares": null,
"saves": null
},
"flags": { "nsfw": false, "spoiler": false, "pinned": false, "deleted": false },
"published_at": "2026-06-10T14:22:00Z"
},
"computed": { "engagement_rate": 0.082 }
}
],
"next_cursor": "...",
"total": 1847
},
"credits_used": 1,
"credits_remaining": 99419
}
Engagement lives under post.engagement (likes, comments, shares, views, saves), the caption is the full post.content.text, and the per-post computed.engagement_rate is normalized the same way as on the profile — so you can slice post performance without writing your own engagement math. On Instagram, shares is null and views is only populated for video posts.
Here is a Python function that fetches the last 50 posts for a list of competitors and computes the average engagement rate per competitor:
import httpx
from statistics import mean
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://www.socialcrawl.dev/v1"
def compute_competitor_engagement(handles: list[str], platform: str = "instagram") -> dict:
"""
Fetch recent posts per competitor and return average engagement rate.
engagement_rate is a computed field on every post — we average across posts.
"""
results = {}
with httpx.Client(headers={"x-api-key": API_KEY}) as client:
for handle in handles:
resp = client.get(
f"{BASE_URL}/{platform}/profile/posts",
params={"handle": handle},
)
resp.raise_for_status()
items = resp.json()["data"]["items"]
if items:
rates = [
item["computed"]["engagement_rate"]
for item in items
if item.get("computed", {}).get("engagement_rate") is not None
]
results[handle] = {
"avg_engagement_rate": mean(rates) if rates else 0,
"post_count": len(items),
"platform": platform,
}
return results
# Example usage
competitors = ["nike", "adidas", "newbalance"]
comparison = compute_competitor_engagement(competitors)
for brand, data in comparison.items():
print(f"{brand}: {data['avg_engagement_rate']:.3%} avg engagement ({data['post_count']} posts)")
If you want to compute engagement rate manually — for example, using a follower-normalized formula — the math is:
engagement_rate = (likes + comments + shares) / followers * 100
The API pre-computes this on every post, but understanding the formula matters when you're comparing across platforms with different virality mechanics (TikTok views vs. Instagram follower base).
Step 3 — How Do You Measure Posting Cadence and Find Content Gaps?
Engagement rate answers "how well does their content perform?" Posting cadence answers "how hard are they pushing?" Together, they tell you whether a competitor is winning because they publish excellent content or because they publish constantly.
Using the items array from Step 2, computing weekly cadence is a date-window operation over each post.published_at:
from datetime import datetime, timedelta, timezone
def analyze_cadence(items: list[dict], window_days: int = 90) -> dict:
"""
Compute posts-per-week over a rolling window from post.published_at.
`items` is data["items"] from /profile/posts — each entry is {post, computed}.
"""
cutoff = datetime.now(timezone.utc) - timedelta(days=window_days)
recent = [
it for it in items
if datetime.fromisoformat(
it["post"]["published_at"].replace("Z", "+00:00")
) > cutoff
]
weeks = window_days / 7
return {
"posts_per_week": round(len(recent) / weeks, 1),
"total_posts": len(recent),
}
Run this across your three competitors and you get output like:
nike: 4.2 posts/week
adidas: 3.8 posts/week
newbalance: 2.1 posts/week
A competitor publishing twice as often is pushing twice as hard for reach — and a cadence ramp-up is one of the earliest signals of an incoming launch.
Deriving a format signal client-side (optional): The API does not return a post-format classifier field, but you can derive a rough one yourself: a post with post.content.duration_seconds set is a video, multiple post.content.media_urls suggests a carousel, and a single image is a static post. Treat this as a client-side heuristic, not an API-provided label — it is good enough to spot "this competitor leans heavily on video" without overclaiming precision.
Content gap identification: Compare your client-side format mix against each competitor's. If a competitor's video posts pull far higher computed.engagement_rate than their stills, and you barely publish video, that's a content gap with a concrete format signal — not a vague recommendation to "post more video."
A real limitation to name: LinkedIn competitor page engagement is not accessible via official API to third parties — the LinkedIn Marketing API restricts company page analytics to page administrators only. Any tool claiming full LinkedIn competitor engagement data is either working from aggregated web indices or using unofficial methods. SocialCrawl covers LinkedIn public profile data, but post-level engagement for competitors is a known gap in the entire industry, not just here.
Step 4 — Fan Out Across All Platforms with One Search Call
Steps 1–3 require knowing which platform a competitor is active on and looking them up individually. Step 4 handles the case where you don't want to specify platforms — you want to ask "where is this brand being talked about?" and get a ranked, cross-platform answer.
GET /v1/search/everywhere fans out your query across multiple sources in parallel — set them with sources= (TikTok, Instagram, YouTube, Reddit, X, and more) — and returns a unified, deduplicated, relevance-ranked feed. It is the cross-platform analytics layer of your competitor analysis tool: one call, every source you name, ranked results:
curl "https://www.socialcrawl.dev/v1/search/everywhere?query=nike+new+product&sources=tiktok,instagram,youtube,reddit" \
-H "x-api-key: YOUR_API_KEY"
The query param is query and the source list is sources (a platforms= param is silently ignored). Condensed response shape — items are LLM-planned, RRF-fused, and reranked, so each carries scoring metadata and the underlying per-source hits nested under source_items:
{
"success": true,
"data": {
"query": "nike new product",
"plan": { "...": "LLM query plan" },
"sources_called": ["tiktok", "instagram", "youtube", "reddit"],
"sources_succeeded": ["tiktok", "instagram", "youtube", "reddit"],
"sources_failed": [],
"coverage": 1.0,
"partial_failure": false,
"items": [
{
"candidate_id": "c_001",
"item_id": "tt_...",
"source": "tiktok",
"title": "Nike just dropped something wild",
"url": "https://www.tiktok.com/@sneakerhead_usa/video/...",
"snippet": "Nike just dropped something wild — first look at the new ...",
"freshness": 83,
"engagement": 56,
"rrf_score": 0.031,
"final_score": 0.94,
"rerank_score": 0.91,
"cluster_id": 2,
"source_items": [
{
"author": "@sneakerhead_usa",
"published_at": "2026-06-16T18:45:00Z"
}
]
}
],
"items_by_source": { "tiktok": ["..."], "youtube": ["..."] },
"clusters": ["..."]
},
"credits_used": 20,
"credits_remaining": 99399
}
Share of voice from this data is straightforward. Count mentions per platform and normalize:
def compute_share_of_voice(items: list[dict]) -> dict:
"""
SoV = (brand_mentions_on_source / total_mentions) * 100
`items` is data["items"] from /search/everywhere; each item has a `source`.
"""
source_counts = Counter(r["source"] for r in items)
total = sum(source_counts.values())
return {
source: round((count / total) * 100, 1)
for source, count in source_counts.items()
}
One important pricing note: GET /v1/search/everywhere costs a flat 20 credits per call regardless of how many platforms you fan out to. Factor that into your scheduling math — a daily run for 5 competitors costs 100 credits/day. For continuous competitor monitoring, scheduling this call alongside the profile lookups from Steps 1–3 gives you a complete competitor analysis tool in a single daily job.
Step 5 — Which Creators Are Amplifying Your Competitors?
You now know what your competitor is posting and how it performs. This step answers a different question: who else is posting about your competitor? Which creators, reviewers, or community accounts are driving organic amplification?
Use the same search endpoint with the competitor's handle as the query:
curl "https://www.socialcrawl.dev/v1/search/everywhere?query=%40nike&sources=tiktok,youtube,reddit,twitter" \
-H "x-api-key: YOUR_API_KEY"
Sort the returned items by final_score (or rerank_score) descending. The top results are the creators generating the most amplification for that brand's name — the per-item source_items[0].author tells you who.
The practical use case: your competitor just launched a product. You run this query. You find the 10 creators driving the organic spike. You check whether any of them have ever mentioned your brand. If they haven't, that's a creator gap — a high-engagement voice in your category that your competitor has captured and you haven't.
This surfaces public posts that mention the handle or brand name. It does not expose private partnership agreements, paid deal terms, or dark social. What it does give you is the public amplification layer — which is often more useful for strategy than knowing a deal exists.
How Do You Put It All Together? A Minimal Competitor Intelligence Pipeline
Here is a minimal CompetitorPipeline class that wires Steps 1–5 into a single schedulable run. This is the core of any programmatic competitor analysis tool: one daily job, multiple platforms, output you own. For endpoint details and credit costs, see the API docs.
import httpx
from collections import Counter
from statistics import mean
from datetime import datetime, timedelta, timezone
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://www.socialcrawl.dev/v1"
class CompetitorPipeline:
def __init__(self, competitors: list[str], platforms: list[str]):
self.competitors = competitors
self.platforms = platforms
self.client = httpx.Client(headers={"x-api-key": API_KEY}, timeout=30.0)
def run(self) -> dict:
report = {}
for handle in self.competitors:
report[handle] = {}
for platform in self.platforms:
try:
profile = self._fetch_profile(handle, platform)
items = self._fetch_posts(handle, platform)
report[handle][platform] = {
"profile": profile,
"cadence": self._cadence(items),
"avg_engagement_rate": self._avg_engagement(items),
}
except httpx.HTTPStatusError as e:
report[handle][platform] = {"error": str(e)}
return report
def _fetch_profile(self, handle: str, platform: str) -> dict:
r = self.client.get(f"{BASE_URL}/{platform}/profile", params={"handle": handle})
r.raise_for_status()
return r.json()["data"]
def _fetch_posts(self, handle: str, platform: str) -> list:
r = self.client.get(
f"{BASE_URL}/{platform}/profile/posts",
params={"handle": handle},
)
r.raise_for_status()
return r.json()["data"]["items"]
def _avg_engagement(self, items: list) -> float:
rates = [
it["computed"]["engagement_rate"]
for it in items
if it.get("computed", {}).get("engagement_rate") is not None
]
return mean(rates) if rates else 0.0
def _cadence(self, items: list, window_days: int = 30) -> dict:
cutoff = datetime.now(timezone.utc) - timedelta(days=window_days)
recent = [
it for it in items
if datetime.fromisoformat(
it["post"]["published_at"].replace("Z", "+00:00")
) > cutoff
]
return {
"posts_per_week": round(len(recent) / (window_days / 7), 1),
"total_posts": len(recent),
}
# Run it
pipeline = CompetitorPipeline(
competitors=["nike", "adidas", "newbalance"],
platforms=["instagram", "tiktok"],
)
report = pipeline.run()
Estimated credit cost for a daily run covering 3 competitors × 2 platforms: approximately 12 credits (6 profile lookups + 6 post-list calls, assuming standard-tier pricing). Add search/everywhere for brand mention monitoring: 60 credits (3 competitors × 20cr flat). Total: ~72 credits per daily run.
Scheduling: GitHub Actions with a daily cron trigger (0 9 * * *) works cleanly for this. Store the output as JSON in your repo or push it to a Postgres table. For a real-time push-alert layer, you would want a message queue — but that is outside what a daily-pull competitor analysis pipeline needs.
What this pipeline does not do: real-time alerts on competitor posts as they land, historical archive lookups beyond the post lookback window, or LinkedIn competitor post engagement (covered above — API limitation). If you need historical depth or LinkedIn, Brandwatch and Sprout Social have data archives that go back years. This approach excels at freshness, programmatic access, and running inside your own infrastructure.
Frequently Asked Questions
What should you analyze when doing competitor analysis?
For social-specific competitor analysis, the five most actionable dimensions are:
- Engagement rate by content type — not just overall engagement, but broken down by Reels vs. carousels vs. static posts. A competitor might have low overall engagement but dominate in one format.
- Posting cadence — how often they publish and at what times. Cadence changes often signal strategic shifts (a ramp-up before a launch, a slowdown during a rebrand).
- Share of voice — their mention count relative to total category mentions across platforms. This is the metric that tells you whether you're winning the attention competition.
- Top-performing content — the 10–20% of posts driving the majority of engagement. These are the templates worth studying.
- Creator amplification — who outside the brand is posting about them and driving reach.
Audience demographic overlap (who follows both them and you) is also valuable, but that data is harder to access programmatically since most platforms restrict demographic breakdowns to page administrators.
How do you track competitors on social media?
Three options, roughly by effort and fidelity:
Manual monitoring: Visit their profiles, note recent posts, export what you can. Free. Not scalable past 2–3 competitors, and you'll miss context the moment you stop checking.
Dashboard tools: Hootsuite, Sprout Social, Rival IQ. These work well for teams that live in dashboards and don't need programmatic access. Expect $50–$500/month depending on depth and platform coverage.
API-based automation: Pull data programmatically, store it in your own database, query it however you need. The SocialCrawl API covers 42 platforms with a unified schema. You write the pipeline once; it runs on a schedule and feeds whatever reporting layer you already have.
Which is the best free competitor analysis tool?
"Free" means different things depending on what you need:
- Native platform analytics (Instagram Insights, TikTok Analytics): Free, but only shows your own account's data — no competitor visibility.
- YouTube Data API v3: Free up to 10,000 units/day — enough for light competitor monitoring on YouTube specifically.
- SocialCrawl Explorer: See your data before writing a single line of code. The Explorer is free to use for initial exploration — verify that the endpoints you need return the data you expect, check competitor profile responses, explore the schema. The Explorer is the fastest way to determine whether the API covers your use case before committing to a paid plan.
For a full cross-platform pipeline at scale, you will hit API quotas or plan limits at some point. The relevant question is not "which tool is free" but "which tool's data is worth paying for when you need scale."
How often should you analyze your competitors?
It depends on how fast your competitive landscape moves:
- Daily automated pull: For brands in fast-moving categories (consumer products, fashion, gaming), daily post-collection lets you spot a competitor product launch, a viral moment, or a creator campaign within 24 hours.
- Weekly manual review: For most teams, a weekly review of the automated pipeline output is enough to stay informed without generating noise.
- Quarterly strategic analysis: Deep dives on content strategy, share-of-voice trends, and audience shifts belong in quarterly planning cycles — not in daily dashboards.
The pipeline in this guide is designed to run daily and require only weekly attention.
What metrics should you track for competitor analysis?
At the post level: post.engagement.likes, post.engagement.comments, post.engagement.shares, post.engagement.views, and the derived per-post computed.engagement_rate. The full caption sits in post.content.text, and post.published_at drives cadence.
At the account level: data.author.followers, data.author.posts_count, and data.computed.engagement_rate.
At the category level: share of voice (cross-platform mention share), content gap (formats they dominate that you don't), and creator amplification (high-engagement voices promoting them but not you).
Can you analyze competitors' social media strategies without a tool?
You can, but the ceiling is low. Without a tool, you're limited to what you can manually view on each platform's public interface — which means no historical trend data, no cross-platform aggregation, and no engagement rate computation unless you do the arithmetic by hand.
Building directly on platform APIs is technically free but fragmented: TikTok, Instagram, YouTube, and X all have different auth flows, rate limits, and response schemas. The YouTube Data API v3 is free up to 10,000 units/day but quota-limited at scale. The X API v2 requires a $100/month Basic plan for meaningful read access to search and timelines. Meta's Graph API restricts competitor page engagement data — you can fetch public page metadata, but detailed post analytics require the page admin's token.
If you're building something beyond a one-time audit, a unified API is the practical path — it cuts out 4–5 separate API integrations and gives you a consistent schema from day one.
How do you benchmark against competitors on social media?
Benchmarking requires a baseline — your own numbers for the same period. Without it, you're looking at absolute numbers that have no context.
The process:
- Pull your own profile and post data for the last 30, 60, and 90 days.
- Pull the same data for each competitor over the same windows.
- Compute engagement rate, posts-per-week, and top-performing content type for all accounts.
- Compare deltas: you're looking for trends, not snapshots. A competitor whose engagement rate dropped 30% over 90 days is more interesting than one whose rate is higher but stable.
- Segment by platform — a brand that outperforms you on Instagram may underperform on TikTok. Platform-level disaggregation is where the real strategic signal lives.
This pipeline covers the core mechanics of programmatic social competitor analysis. Three things it does not handle: real-time push alerts when a competitor publishes, historical archives beyond the standard post lookback window, and LinkedIn competitor engagement (an industry-wide API limitation, not a SocialCrawl gap). Check the API docs for current endpoint coverage, and use the Explorer to verify your specific platforms and competitors resolve before you build around them.
For more posts on building with social data, see the SocialCrawl blog.
If there's a platform you need for competitor monitoring that isn't covered, the Explorer search box is the fastest way to find out — and the fastest way to surface what's missing.
Related posts

IG Follower Export Tools: 5 Ways to Download Your List
5 ig follower export tool methods: Chrome extensions, web SaaS, Graph API, and social APIs. ToS risk tiers, free options, and scale ceilings in one table.
Social Media Engagement Rate Benchmarks 2026: TikTok vs Instagram vs YouTube (1,269 Posts Analyzed)
We measured engagement rate on 1,269 recent posts from 79 major accounts. TikTok's median beats Instagram and YouTube in all 6 categories. Full data + method.

Fetch MCP Server: What It Does, Where It Fails, and the Walled-Garden Gap
What a fetch MCP server actually does, the implementations worth knowing in 2026, the security model, and where it stops: walled gardens.
