DEV Community

Алексей Спинов
Алексей Спинов

Posted on

How to Build a Bluesky Analytics Dashboard with the AT Protocol API

Bluesky grew 302% in 2025 (10M → 41M users). If you're building analytics tools for this platform, here's a complete guide using the AT Protocol.

What We'll Build

A dashboard that tracks:

  • Account growth (followers over time)
  • Post engagement (likes, reposts, replies per post)
  • Hashtag trends (which tags are gaining traction)
  • Content performance (best posting times, top formats)

Step 1: Profile Analytics

Fetch any account's stats:

const API = "https://public.api.bsky.app";

// Resolve handle to DID
const { did } = await fetch(
  `${API}/xrpc/com.atproto.identity.resolveHandle?handle=bsky.app`
).then(r => r.json());

// Get profile
const profile = await fetch(
  `${API}/xrpc/app.bsky.actor.getProfile?actor=${did}`
).then(r => r.json());

console.log(profile.followersCount);  // 32,420,172
console.log(profile.postsCount);      // 725
Enter fullscreen mode Exit fullscreen mode

Step 2: Engagement Metrics

Fetch posts with engagement data:

const feed = await fetch(
  `${API}/xrpc/app.bsky.feed.getAuthorFeed?actor=${did}&limit=50`
).then(r => r.json());

const metrics = feed.feed.map(item => ({
  text: item.post.record.text.substring(0, 50),
  likes: item.post.likeCount,
  reposts: item.post.repostCount,
  replies: item.post.replyCount,
}));

// Calculate engagement rate
const totalEngagement = metrics.reduce((sum, m) =>
  sum + m.likes + m.reposts, 0
);
const engagementRate = totalEngagement / (metrics.length * profile.followersCount) * 100;
console.log(`Engagement rate: ${engagementRate.toFixed(4)}%`);
Enter fullscreen mode Exit fullscreen mode

Step 3: Hashtag Tracking

For hashtag search, you need authentication:

// Create session
const session = await fetch("https://bsky.social/xrpc/com.atproto.server.createSession", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ identifier: "your.handle", password: "app-password" })
}).then(r => r.json());

// Search posts by hashtag
const results = await fetch(
  `https://bsky.social/xrpc/app.bsky.feed.searchPosts?q=%23tech&limit=50`,
  { headers: { Authorization: `Bearer ${session.accessJwt}` } }
).then(r => r.json());
Enter fullscreen mode Exit fullscreen mode

Pre-Built Tools

If you don't want to build from scratch, I created 4 Bluesky tools on Apify:

  1. Bluesky Scraper — profiles and posts (no auth needed)
  2. Bluesky Feed Monitor — engagement analytics with keyword filtering
  3. Bluesky Hashtag Tracker — track hashtag trends with top authors
  4. Bluesky Profile Batch — look up 100+ profiles at once

All free on Apify Store — search knotless_cadence bluesky.

Who This Is For

  • Analytics platforms (BlueSkyHunter, BskyGrowth, Blueview) — use as data backend
  • SMM tools (Buffer, Metricool) — adding Bluesky support
  • Brand monitoring — track mentions without manual searching
  • Researchers — study decentralized social network dynamics

Bluesky's open AT Protocol makes it the most developer-friendly social platform. If you're building tools, now is the time — the platform is growing fast and there's room for everyone.

Top comments (0)