Restaurant Social Media Intelligence: Track Competitors & Food Trends
Social media drives restaurant discovery more than Yelp ever did. TikTok made "Dubai chocolate" a global sensation overnight. Instagram decides which restaurants have lines around the block. A single viral food video can turn a local spot into a destination.
If you run a restaurant, food brand, or hospitality business, you need to know: What are competitors posting? Which food trends are exploding? Who are the local food influencers worth partnering with?
Here's how to answer all of that with data.
Monitor Competitor Restaurants
Track how competitor restaurants perform on social media:
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 compareRestaurants(handles) {
const results = [];
for (const handle of handles) {
// Instagram profile
const profileRes = await fetch(
`${BASE}/instagram/profile?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const profile = (await profileRes.json()).data;
// Recent posts
const postsRes = await fetch(
`${BASE}/instagram/posts?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const posts = (await postsRes.json()).data || [];
const avgLikes = posts.reduce((sum, p) => sum + (p.like_count || 0), 0) / Math.max(posts.length, 1);
const avgComments = posts.reduce((sum, p) => sum + (p.comment_count || 0), 0) / Math.max(posts.length, 1);
results.push({
handle,
followers: profile?.follower_count || 0,
posts: profile?.media_count || 0,
avgLikes: Math.round(avgLikes),
avgComments: Math.round(avgComments),
bio: profile?.biography || '',
website: profile?.external_url || ''
});
await new Promise(r => setTimeout(r, 1000));
}
console.log('\nRestaurant Social Media Comparison:');
console.table(results.map(r => ({
Restaurant: `@${r.handle}`,
Followers: r.followers.toLocaleString(),
'Avg Likes': r.avgLikes.toLocaleString(),
'Avg Comments': r.avgComments,
'ER %': ((r.avgLikes + r.avgComments) / Math.max(r.followers, 1) * 100).toFixed(2)
})));
return results;
}
// Example: Compare pizza restaurants in NYC
compareRestaurants([
'joesPizzaNYC',
'princestpizza',
'lucalibrooklyn',
'difara_pizza'
]);
Track Food Trends on TikTok
TikTok creates food trends faster than any other platform. Monitor what's gaining traction:
async function trackFoodTrends(keywords) {
const trends = [];
for (const keyword of keywords) {
const res = await fetch(
`${BASE}/tiktok/search/videos?query=${encodeURIComponent(keyword)}`,
{ headers }
);
const videos = (await res.json()).data || [];
const totalViews = videos.reduce((sum, v) => sum + (v.stats?.playCount || 0), 0);
const avgLikes = videos.reduce((sum, v) => sum + (v.stats?.diggCount || 0), 0) / Math.max(videos.length, 1);
trends.push({
keyword,
videoCount: videos.length,
totalViews,
avgLikes: Math.round(avgLikes),
topCreator: videos[0] ? (videos[0].author?.uniqueId || 'unknown') : 'N/A'
});
await new Promise(r => setTimeout(r, 1000));
}
trends.sort((a, b) => b.totalViews - a.totalViews);
console.log('\nFood Trend Report:');
console.table(trends.map(t => ({
Trend: t.keyword,
Videos: t.videoCount,
'Total Views': t.totalViews.toLocaleString(),
'Avg Likes': t.avgLikes.toLocaleString(),
'Top Creator': `@${t.topCreator}`
})));
return trends;
}
// Track current food trends
trackFoodTrends([
'dubai chocolate bar',
'birria tacos',
'croissant recipe',
'bento box lunch',
'korean corn dog',
'cottage cheese recipes',
'protein ice cream',
'smash burger',
'matcha latte art',
'sourdough bread'
]);
Why This Matters for Restaurants
When a food trend is blowing up on TikTok, restaurants that add it to their menu (and post about it) get free exposure. Track trends weekly and you'll always know what to put on your specials board.
Find Local Food Influencers
Food influencers drive real foot traffic. Find the ones in your area:
async function findFoodInfluencers(city) {
const searchTerms = [
`${city} food`,
`${city} restaurants`,
`${city} foodie`,
`best eats ${city}`
];
const creators = [];
for (const term of searchTerms) {
const res = await fetch(
`${BASE}/tiktok/search/users?query=${encodeURIComponent(term)}`,
{ headers }
);
const users = (await res.json()).data || [];
for (const user of users.slice(0, 5)) {
const handle = user.uniqueId || user.unique_id;
// Check if already in list
if (creators.some(c => c.handle === handle)) continue;
const profileRes = await fetch(
`${BASE}/tiktok/profile?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const profile = (await profileRes.json()).data;
if (!profile) continue;
const followers = profile.stats?.followerCount || 0;
if (followers < 1000) continue;
creators.push({
handle,
name: profile.user?.nickname,
followers,
likes: profile.stats?.heartCount || 0,
videos: profile.stats?.videoCount || 0,
bio: profile.user?.signature || '',
searchTerm: term
});
await new Promise(r => setTimeout(r, 800));
}
}
creators.sort((a, b) => b.followers - a.followers);
console.log(`\nFood Influencers — ${city}:`);
creators.forEach(c => {
console.log(` @${c.handle} — ${c.followers.toLocaleString()} followers | ${c.videos} videos`);
});
return creators;
}
// Find food influencers in your city
findFoodInfluencers('Austin');
Food Influencer Tier Guide
| Tier | Followers | Best For | Typical Cost |
|---|---|---|---|
| Nano (1K–5K) | Local food bloggers | Free meal + social mention | Comped meal |
| Micro (5K–25K) | City-level food accounts | Restaurant reviews | $100-300 + meal |
| Mid (25K–100K) | Regional food influencers | Launch campaigns | $500-2,000 |
| Macro (100K+) | National food creators | Brand awareness | $2,000-10,000 |
For most restaurants, nano and micro food influencers deliver the best ROI. They have highly local audiences — exactly the people who might actually visit your restaurant.
Analyze What Content Works for Restaurants
async function analyzeRestaurantContent(handle) {
const res = await fetch(
`${BASE}/instagram/posts?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const posts = (await res.json()).data || [];
const categories = {
food_photo: { patterns: ['dish', 'menu', 'special', 'new'], posts: [], avgEng: 0 },
behind_scenes: { patterns: ['kitchen', 'chef', 'behind', 'making', 'prep'], posts: [], avgEng: 0 },
customer: { patterns: ['thank', 'review', 'customer', 'guest', 'visit'], posts: [], avgEng: 0 },
event: { patterns: ['event', 'live', 'tonight', 'weekend', 'happy hour'], posts: [], avgEng: 0 },
team: { patterns: ['team', 'staff', 'hiring', 'family', 'crew'], posts: [], avgEng: 0 },
};
for (const post of posts) {
const caption = (post.caption?.text || '').toLowerCase();
const eng = (post.like_count || 0) + (post.comment_count || 0);
for (const [cat, config] of Object.entries(categories)) {
if (config.patterns.some(p => caption.includes(p))) {
config.posts.push({ ...post, engagement: eng });
break;
}
}
}
console.log(`\nContent Analysis for @${handle}:`);
for (const [cat, config] of Object.entries(categories)) {
if (config.posts.length === 0) continue;
const avg = config.posts.reduce((s, p) => s + p.engagement, 0) / config.posts.length;
console.log(` ${cat}: ${config.posts.length} posts, avg engagement: ${Math.round(avg).toLocaleString()}`);
}
}
analyzeRestaurantContent('shake_shack');
Restaurant Content That Typically Performs Best
| Content Type | Engagement Level | Why It Works |
|---|---|---|
| Food close-ups | Very high | People eat with their eyes first |
| Behind-the-kitchen | High | Authenticity and craft appeal |
| TikTok recipe reveals | Very high | Shareability and save-worthy |
| Customer UGC reposts | Medium-high | Social proof |
| Staff features | Medium | Humanizes the brand |
| Menu announcements | Medium | Actionable (drives visits) |
| Event promos | Low-medium | Limited audience interest |
Monitor Reviews and Mentions
Track what people are saying about your restaurant across platforms:
import os
import requests
import time
API_KEY = os.environ["SOCIAVAULT_API_KEY"]
BASE = "https://api.sociavault.com/v1/scrape"
HEADERS = {"X-API-Key": API_KEY}
def monitor_restaurant_mentions(restaurant_name, city=""):
"""Search for restaurant mentions across platforms"""
query = f"{restaurant_name} {city}".strip()
mentions = {"twitter": [], "threads": [], "reddit": []}
# Twitter
r = requests.get(f"{BASE}/twitter/search", headers=HEADERS, params={"query": query})
mentions["twitter"] = r.json().get("data", [])
time.sleep(1)
# Threads
r = requests.get(f"{BASE}/threads/search", headers=HEADERS, params={"query": query})
mentions["threads"] = r.json().get("data", [])
time.sleep(1)
# Reddit
r = requests.get(f"{BASE}/reddit/search", headers=HEADERS, params={"query": query})
mentions["reddit"] = r.json().get("data", [])
total = sum(len(v) for v in mentions.values())
print(f"\nMentions for '{query}':")
print(f" Twitter: {len(mentions['twitter'])}")
print(f" Threads: {len(mentions['threads'])}")
print(f" Reddit: {len(mentions['reddit'])}")
print(f" Total: {total}")
# Simple sentiment check
positive_words = ["amazing", "best", "love", "delicious", "incredible", "perfect", "must try"]
negative_words = ["terrible", "worst", "awful", "disgusting", "overrated", "never again", "food poisoning"]
all_texts = []
for platform, posts in mentions.items():
for post in posts:
text = ""
if platform == "twitter":
text = post.get("legacy", {}).get("full_text", "") or post.get("full_text", "")
elif platform == "threads":
text = post.get("caption", {}).get("text", "") if isinstance(post.get("caption"), dict) else ""
elif platform == "reddit":
text = post.get("title", "") + " " + post.get("selftext", "")
all_texts.append(text.lower())
pos = sum(1 for t in all_texts if any(w in t for w in positive_words))
neg = sum(1 for t in all_texts if any(w in t for w in negative_words))
print(f"\n Sentiment: {pos} positive, {neg} negative, {len(all_texts) - pos - neg} neutral")
return mentions
monitor_restaurant_mentions("Shake Shack", "NYC")
Weekly Restaurant Competitive Report
Automate a weekly report that covers all your local competitors:
async function weeklyRestaurantReport(competitors) {
const report = [];
for (const handle of competitors) {
const profileRes = await fetch(
`${BASE}/instagram/profile?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const profile = (await profileRes.json()).data;
const postsRes = await fetch(
`${BASE}/instagram/posts?handle=${encodeURIComponent(handle)}`,
{ headers }
);
const posts = (await postsRes.json()).data || [];
// Get last 7 days of posts (approximate)
const recentPosts = posts.slice(0, 7);
const totalEng = recentPosts.reduce(
(sum, p) => sum + (p.like_count || 0) + (p.comment_count || 0), 0
);
report.push({
restaurant: handle,
followers: profile?.follower_count || 0,
postsThisWeek: recentPosts.length,
totalEngagement: totalEng,
avgEngPerPost: Math.round(totalEng / Math.max(recentPosts.length, 1)),
topPostCaption: recentPosts[0]?.caption?.text?.substring(0, 80) || 'N/A'
});
await new Promise(r => setTimeout(r, 1500));
}
console.log('\n📊 Weekly Restaurant Report');
console.log(`Generated: ${new Date().toLocaleDateString()}\n`);
console.table(report.map(r => ({
Restaurant: `@${r.restaurant}`,
Followers: r.followers.toLocaleString(),
'Posts/Week': r.postsThisWeek,
'Avg Eng': r.avgEngPerPost.toLocaleString()
})));
}
Get Started
Sign up free — track your restaurant competitors and local food trends starting 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.