The "Integration Hell"
If you're building a social media dashboard, you know the pain:
- Twitter API uses OAuth 1.0a (sometimes).
- Instagram Graph API requires a Facebook Page link.
- TikTok API requires complex signing keys.
- YouTube API has strict quota limits.
Maintaining these 4 integrations is a full-time job.
In this guide, we'll build a Unified Data Pipeline using SociaVault. SociaVault is a social media scraper that unifies 25+ platforms into one simple API. We'll create a single class that can fetch data from any platform and return it in a standardized format.
The Tech Stack
- Node.js / TypeScript
- SociaVault API (The "Universal Adapter")
Step 1: The Standard Interface
First, we need to decide what a "Post" looks like in our system, regardless of where it came from.
// types.ts
interface StandardPost {
id: string;
platform: 'twitter' | 'instagram' | 'tiktok' | 'youtube';
content: string;
mediaUrl?: string;
author: string;
stats: {
views: number;
likes: number;
comments: number;
shares: number;
};
publishedAt: Date;
originalUrl: string;
}
Step 2: The Unified Service
Now, let's build the service that maps the specific API responses to our standard format.
// SocialPipeline.js
const axios = require('axios');
class SocialPipeline {
constructor(apiKey) {
this.client = axios.create({
baseURL: 'https://api.sociavault.com/v1/scrape',
headers: { 'x-api-key': apiKey }
});
}
async fetchFeed(platform, handle) {
switch (platform) {
case 'twitter': return this._fetchTwitter(handle);
case 'instagram': return this._fetchInstagram(handle);
case 'tiktok': return this._fetchTikTok(handle);
default: throw new Error(`Platform ${platform} not supported`);
}
}
async _fetchTwitter(handle) {
const res = await this.client.get('/twitter/user-tweets', { params: { handle } });
return res.data.data.tweets.map(t => ({
id: t.id,
platform: 'twitter',
content: t.text,
author: handle,
stats: {
views: t.views || 0,
likes: t.likes || 0,
comments: t.replies || 0,
shares: t.retweets || 0
},
publishedAt: new Date(t.created_at),
originalUrl: t.url
}));
}
async _fetchInstagram(handle) {
const res = await this.client.get('/instagram/posts', { params: { handle } });
return res.data.data.items.map(p => ({
id: p.id,
platform: 'instagram',
content: p.caption?.text || '',
mediaUrl: p.display_url,
author: handle,
stats: {
views: p.video_view_count || 0,
likes: p.like_count || 0,
comments: p.comment_count || 0,
shares: 0 // Instagram doesn't expose shares publicly
},
publishedAt: new Date(p.taken_at * 1000),
originalUrl: `https://instagram.com/p/${p.code}`
}));
}
async _fetchTikTok(handle) {
const res = await this.client.get('/tiktok/videos', { params: { handle } });
return res.data.data.videos.map(v => ({
id: v.id,
platform: 'tiktok',
content: v.desc,
mediaUrl: v.video.cover,
author: handle,
stats: {
views: v.stats.playCount,
likes: v.stats.diggCount,
comments: v.stats.commentCount,
shares: v.stats.shareCount
},
publishedAt: new Date(v.createTime * 1000),
originalUrl: `https://tiktok.com/@${handle}/video/${v.id}`
}));
}
}
module.exports = SocialPipeline;
Step 3: The "Universal Feed"
Now you can fetch everything in one go.
// main.js
const SocialPipeline = require('./SocialPipeline');
const pipeline = new SocialPipeline('YOUR_API_KEY');
async function getBrandFeed() {
const brand = {
twitter: 'nike',
instagram: 'nike',
tiktok: 'nike'
};
const promises = Object.entries(brand).map(([platform, handle]) =>
pipeline.fetchFeed(platform, handle)
);
const results = await Promise.all(promises);
const allPosts = results.flat();
// Sort by date (newest first)
allPosts.sort((a, b) => b.publishedAt - a.publishedAt);
console.log(`\n🔥 Universal Brand Feed (${allPosts.length} posts)`);
allPosts.slice(0, 5).forEach(post => {
console.log(`[${post.platform.toUpperCase()}] ${post.publishedAt.toISOString().split('T')[0]}`);
console.log(`"${post.content.substring(0, 50)}..."`);
console.log(`❤️ ${post.stats.likes} | 👁️ ${post.stats.views}`);
console.log('---');
});
}
getBrandFeed();
Why This Matters in 2025
Data normalization is the hardest part of social analytics. By abstracting the platform-specific quirks into a single pipeline, you reduce your codebase size by 80% and make your application resilient to API changes.
Next Steps
Simplify your stack.
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.