Facebook Page Analytics Without Admin Access: Track Any Competitor
Facebook's native analytics only work for pages you manage. You can see your own Page Insights, but you can't see a competitor's follower growth, engagement rates, or posting frequency. That's a massive blind spot.
With SociaVault's API, you can pull public data from any Facebook page — no admin access required. Here's how to analyze competitors, track page performance, and benchmark your own results.
Get Any Facebook Page's Profile
Pull comprehensive page data including followers, likes, and basic info:
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = 'https://api.sociavault.com/v1/scrape';
const headers = { 'X-API-Key': API_KEY };
async function getFacebookPage(handle) {
const res = await fetch(
`${BASE}/facebook/profile?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const data = (await res.json()).data;
if (!data) {
console.log(`Page not found: ${handle}`);
return null;
}
console.log(`\nFacebook Page: ${data.name || handle}`);
console.log(` Followers: ${(data.followers || data.follower_count || 0).toLocaleString()}`);
console.log(` Likes: ${(data.likes || data.like_count || 0).toLocaleString()}`);
console.log(` Category: ${data.category || 'N/A'}`);
console.log(` Website: ${data.website || 'N/A'}`);
console.log(` Description: ${(data.about || data.description || '').substring(0, 200)}`);
return data;
}
getFacebookPage('cocacola');
Python version:
import os
import requests
API_KEY = os.environ["SOCIAVAULT_API_KEY"]
BASE = "https://api.sociavault.com/v1/scrape"
HEADERS = {"X-API-Key": API_KEY}
def get_facebook_page(handle):
r = requests.get(f"{BASE}/facebook/profile", headers=HEADERS, params={"handle": handle})
data = r.json().get("data", {})
if not data:
print(f"Page not found: {handle}")
return None
followers = data.get("followers") or data.get("follower_count", 0)
likes = data.get("likes") or data.get("like_count", 0)
print(f"\nFacebook Page: {data.get('name', handle)}")
print(f" Followers: {followers:,}")
print(f" Likes: {likes:,}")
print(f" Category: {data.get('category', 'N/A')}")
return data
get_facebook_page("cocacola")
Analyze Page Posts
Pull recent posts and analyze engagement patterns:
async function analyzePagePosts(handle) {
const res = await fetch(
`${BASE}/facebook/profile/posts?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const posts = (await res.json()).data || [];
if (posts.length === 0) {
console.log('No posts found');
return;
}
// Calculate engagement metrics
const metrics = posts.map(post => {
const reactions = post.reactions || post.reaction_count || post.likes || 0;
const comments = post.comments || post.comment_count || 0;
const shares = post.shares || post.share_count || 0;
const totalEng = reactions + comments + shares;
return {
text: (post.text || post.message || '').substring(0, 100),
reactions,
comments,
shares,
totalEng,
type: post.type || post.media_type || 'unknown'
};
});
// Sort by engagement
metrics.sort((a, b) => b.totalEng - a.totalEng);
// Summary stats
const avgEng = metrics.reduce((s, m) => s + m.totalEng, 0) / metrics.length;
const avgReactions = metrics.reduce((s, m) => s + m.reactions, 0) / metrics.length;
const avgComments = metrics.reduce((s, m) => s + m.comments, 0) / metrics.length;
const avgShares = metrics.reduce((s, m) => s + m.shares, 0) / metrics.length;
console.log(`\nPost Analysis: ${handle}`);
console.log(` Posts analyzed: ${metrics.length}`);
console.log(` Avg reactions: ${Math.round(avgReactions).toLocaleString()}`);
console.log(` Avg comments: ${Math.round(avgComments).toLocaleString()}`);
console.log(` Avg shares: ${Math.round(avgShares).toLocaleString()}`);
console.log(` Avg total engagement: ${Math.round(avgEng).toLocaleString()}`);
console.log(`\n Top 3 Posts:`);
metrics.slice(0, 3).forEach((m, i) => {
console.log(` ${i + 1}. "${m.text}..." — ${m.totalEng.toLocaleString()} engagement`);
});
return { handle, postCount: metrics.length, avgEng: Math.round(avgEng), posts: metrics };
}
analyzePagePosts('nike');
Compare Competitor Pages
Run a side-by-side comparison of multiple Facebook pages:
async function comparePages(handles) {
const results = [];
for (const handle of handles) {
// Get profile
const profileRes = await fetch(
`${BASE}/facebook/profile?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const profile = (await profileRes.json()).data;
// Get posts
const postsRes = await fetch(
`${BASE}/facebook/profile/posts?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const posts = (await postsRes.json()).data || [];
const followers = profile?.followers || profile?.follower_count || 0;
const totalEng = posts.reduce((sum, p) => {
return sum + (p.reactions || p.reaction_count || p.likes || 0)
+ (p.comments || p.comment_count || 0)
+ (p.shares || p.share_count || 0);
}, 0);
const avgEng = posts.length > 0 ? Math.round(totalEng / posts.length) : 0;
results.push({
handle,
name: profile?.name || handle,
followers,
likes: profile?.likes || profile?.like_count || 0,
recentPosts: posts.length,
avgEngagement: avgEng,
engRate: followers > 0 ? ((avgEng / followers) * 100).toFixed(3) : '0'
});
await new Promise(r => setTimeout(r, 1500));
}
results.sort((a, b) => b.followers - a.followers);
console.log('\nFacebook Page Comparison:');
console.table(results.map(r => ({
Page: r.name,
Followers: r.followers.toLocaleString(),
Likes: r.likes.toLocaleString(),
'Avg Eng': r.avgEngagement.toLocaleString(),
'ER %': r.engRate
})));
return results;
}
comparePages(['cocacola', 'pepsi', 'drpepper', 'redbull']);
Content Type Performance Analysis
Understand which types of posts perform best for a page:
async function analyzeContentTypes(handle) {
const postsRes = await fetch(
`${BASE}/facebook/profile/posts?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const posts = (await postsRes.json()).data || [];
const types = {};
for (const post of posts) {
const type = post.type || post.media_type || 'text';
if (!types[type]) {
types[type] = { count: 0, totalEng: 0 };
}
types[type].count++;
types[type].totalEng += (post.reactions || post.reaction_count || post.likes || 0)
+ (post.comments || post.comment_count || 0)
+ (post.shares || post.share_count || 0);
}
console.log(`\nContent Type Performance: ${handle}`);
console.log('─'.repeat(50));
for (const [type, data] of Object.entries(types)) {
const avg = Math.round(data.totalEng / data.count);
console.log(` ${type.padEnd(15)} ${data.count} posts — avg eng: ${avg.toLocaleString()}`);
}
}
analyzeContentTypes('nike');
Facebook Content Performance Benchmarks
| Content Type | Average ER | Notes |
|---|---|---|
| Video (native) | 0.15-0.30% | Best performing format on Facebook |
| Live Video | 0.20-0.50% | Highest reach per follower |
| Image | 0.10-0.20% | Bread and butter content |
| Link | 0.05-0.10% | Lowest engagement (links reduce reach) |
| Text only | 0.08-0.15% | Works for engagement bait |
| Reels | 0.15-0.35% | Growing reach, Meta pushing these |
Facebook Group Intelligence
You can also monitor public Facebook Groups related to your industry:
async function analyzeGroup(groupUrl) {
const res = await fetch(
`${BASE}/facebook/group?url=${encodeURIComponent(groupUrl)}`,
{ headers }
);
const data = (await res.json()).data;
if (!data) {
console.log('Group not found');
return null;
}
console.log(`\nGroup: ${data.name || 'Unknown'}`);
console.log(` Members: ${(data.members || data.member_count || 0).toLocaleString()}`);
console.log(` Privacy: ${data.privacy || 'N/A'}`);
console.log(` Description: ${(data.description || '').substring(0, 200)}`);
return data;
}
Tracking Page Growth Over Time
Facebook doesn't provide historical data, but you can build your own by snapshotting daily:
import os
import json
import requests
from datetime import date
API_KEY = os.environ["SOCIAVAULT_API_KEY"]
BASE = "https://api.sociavault.com/v1/scrape"
HEADERS = {"X-API-Key": API_KEY}
def snapshot_pages(handles, filename="fb-snapshots.json"):
"""Take daily snapshots of Facebook page metrics"""
# Load existing snapshots
try:
with open(filename) as f:
snapshots = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
snapshots = []
today = str(date.today())
daily = {"date": today, "pages": {}}
for handle in handles:
r = requests.get(f"{BASE}/facebook/profile", headers=HEADERS, params={"handle": handle})
data = r.json().get("data", {})
daily["pages"][handle] = {
"followers": data.get("followers") or data.get("follower_count", 0),
"likes": data.get("likes") or data.get("like_count", 0),
}
import time
time.sleep(1)
snapshots.append(daily)
with open(filename, "w") as f:
json.dump(snapshots, f, indent=2)
print(f"Snapshot saved for {today}: {len(daily['pages'])} pages")
# Show growth if we have previous data
if len(snapshots) >= 2:
prev = snapshots[-2]
print(f"\nGrowth since {prev['date']}:")
for handle in handles:
curr = daily["pages"].get(handle, {}).get("followers", 0)
old = prev["pages"].get(handle, {}).get("followers", 0)
if old > 0:
change = curr - old
pct = (change / old * 100)
print(f" {handle}: {change:+,} ({pct:+.2f}%)")
# Run daily via cron
snapshot_pages(["cocacola", "pepsi", "nike", "adidas"])
Facebook Analytics vs. Native Insights
| Feature | Native Facebook Insights | SociaVault API |
|---|---|---|
| Your own page | ✅ Full access | ✅ |
| Competitor pages | ❌ No access | ✅ Public data |
| Post-level stats | ✅ Detailed | ✅ Reactions, comments, shares |
| Historical data | ✅ Up to 2 years | Build your own with snapshots |
| API access | Meta Business Suite API (complex) | Simple REST API |
| Cost | Free (for your page) | 1 credit per request |
| Demographics | ✅ For your page | ❌ |
The key value: competitor data. Facebook gives you zero visibility into competitor performance through native tools.
Get Started
Sign up free — start tracking any Facebook page's performance today.
Related Reading
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.