Farcaster Channels: Discovery & Feeds
Master Farcaster channel discovery, trending content, member management, and feed algorithms using our Neynar-powered endpoints.
Overview
Farcaster channels are topic-based communities. Our API provides:
- Channel Discovery - Search, trending, bulk lookup
- Channel Feeds - Casts within channels
- Channel Members - Followers and active members
- User Channel Data - Channels a user follows
All Farcaster endpoints are prefixed with /api/farcaster/.
Neynar vs Warpcast
We provide both Warpcast (free) and Neynar (richer data) endpoints. Neynar endpoints are at /api/farcaster/neynar/... and provide more detailed data.
Prerequisites
npm install @atv-eth/x402-sdk
# or use curl/fetch directly
Channel Discovery
Get Channel by ID
// Basic (Warpcast)
const channel = await fetch('https://api.web3identity.com/api/farcaster/channel/ethereum');
const data = await channel.json();
console.log(`Channel: ${data.name}`);
console.log(`Description: ${data.description}`);
console.log(`Followers: ${data.followerCount.toLocaleString()}`);
// Rich data (Neynar)
const neynarChannel = await fetch('https://api.web3identity.com/api/farcaster/neynar/channel/ethereum');
const neynarData = await neynarChannel.json();
// Includes more metadata, moderators, etc.
Response:
{
"id": "ethereum",
"name": "Ethereum",
"description": "Discussion about Ethereum, the world computer",
"followerCount": 125678,
"imageUrl": "https://...",
"leadFid": 3,
"source": "warpcast",
"timestamp": "2026-02-09T08:30:00.000Z"
}
List All Channels
const channels = await fetch('https://api.web3identity.com/api/farcaster/channels');
const data = await channels.json();
console.log(`Found ${data.channels.length} channels`);
data.channels.forEach(ch => {
console.log(`/${ch.id} - ${ch.name} (${ch.followerCount.toLocaleString()} followers)`);
});
Bulk Channel Lookup
Get multiple channels in one request:
const ids = 'ethereum,base,farcaster,dev';
const bulk = await fetch(`https://api.web3identity.com/api/farcaster/neynar/channels/bulk?ids=${ids}`);
const data = await bulk.json();
data.channels.forEach(ch => {
console.log(`/${ch.id}: ${ch.follower_count} followers`);
});
Search Channels
const query = 'defi';
const search = await fetch(`https://api.web3identity.com/api/farcaster/neynar/channels/search?q=${query}`);
const data = await search.json();
console.log(`Channels matching "${data.query}":`);
data.channels.forEach(ch => {
console.log(` /${ch.id} - ${ch.name}`);
});
Trending Channels
Get Trending Channels
// Default: 7 days
const trending = await fetch('https://api.web3identity.com/api/farcaster/neynar/channels/trending');
// Custom time window: 1d, 7d, 30d
const trendingDaily = await fetch('https://api.web3identity.com/api/farcaster/neynar/channels/trending?time_window=1d&limit=10');
const data = await trendingDaily.json();
console.log('🔥 Trending Channels (24h):');
data.channels.forEach((ch, i) => {
console.log(`${i + 1}. /${ch.id} - ${ch.name}`);
});
Response:
{
"timeWindow": "1d",
"channels": [
{
"id": "base",
"name": "Base",
"description": "The L2 built by Coinbase",
"follower_count": 89234,
"object": "channel"
}
],
"count": 25,
"source": "neynar",
"timestamp": "2026-02-09T08:30:00.000Z"
}
Channel Feeds
Get Channel Feed
const feed = await fetch('https://api.web3identity.com/api/farcaster/channel/ethereum/feed?limit=20');
const data = await feed.json();
console.log(`Latest from /${data.channel}:`);
data.casts.forEach(cast => {
console.log(`@${cast.author?.username}: ${cast.text?.slice(0, 100)}...`);
console.log(` ❤️ ${cast.reactions?.likes_count || 0} 🔄 ${cast.reactions?.recasts_count || 0}`);
});
Paginated Channel Feed
async function* getChannelFeed(channelId, pageSize = 25) {
let cursor = '';
while (true) {
const url = `https://api.web3identity.com/api/farcaster/channel/${channelId}/feed?limit=${pageSize}${cursor ? `&cursor=${cursor}` : ''}`;
const response = await fetch(url);
const data = await response.json();
yield data.casts;
if (!data.next) break;
cursor = data.next;
}
}
// Usage
for await (const page of getChannelFeed('ethereum', 25)) {
console.log(`Got ${page.length} casts`);
// Process casts...
}
Channel Members
Get Channel Followers
const followers = await fetch('https://api.web3identity.com/api/farcaster/neynar/channel/base/followers?limit=25');
const data = await followers.json();
console.log(`Followers of /${data.channel}:`);
data.users.forEach(user => {
console.log(` @${user.username} (FID: ${user.fid})`);
});
// Pagination
if (data.next) {
const nextPage = await fetch(`https://api.web3identity.com/api/farcaster/neynar/channel/base/followers?cursor=${data.next}`);
}
Get Channel Members (Active)
const members = await fetch('https://api.web3identity.com/api/farcaster/neynar/channel/ethereum/members?limit=25');
const data = await members.json();
console.log(`Active members of /${data.channel}:`);
data.members.forEach(member => {
console.log(` @${member.user?.username} - Role: ${member.role}`);
});
User Channel Data
Get User's Channels
Find which channels a user follows:
const fid = 3; // dwr.eth
const channels = await fetch(`https://api.web3identity.com/api/farcaster/neynar/user/${fid}/channels?limit=50`);
const data = await channels.json();
console.log(`Channels followed by FID ${data.fid}:`);
data.channels.forEach(ch => {
console.log(` /${ch.id} - ${ch.name}`);
});
User Feeds
For You Feed (Algorithmic)
const fid = 3;
const forYou = await fetch(`https://api.web3identity.com/api/farcaster/neynar/feed/for-you/${fid}?limit=25`);
const data = await forYou.json();
console.log('📱 For You Feed:');
data.casts.forEach(cast => {
console.log(`@${cast.author?.username}: ${cast.text?.slice(0, 80)}...`);
});
Following Feed (Chronological)
const following = await fetch(`https://api.web3identity.com/api/farcaster/neynar/feed/following/${fid}?limit=25`);
const data = await following.json();
console.log('👥 Following Feed:');
data.casts.forEach(cast => {
console.log(`@${cast.author?.username}: ${cast.text?.slice(0, 80)}...`);
});
Trending Content
Trending Casts
const trending = await fetch('https://api.web3identity.com/api/farcaster/trending/casts');
const data = await trending.json();
console.log('🔥 Trending Casts:');
data.casts.forEach(cast => {
console.log(`@${cast.author}: ${cast.text?.slice(0, 100)}...`);
console.log(` ❤️ ${cast.likes} 🔄 ${cast.recasts}`);
});
Trending Users
const users = await fetch('https://api.web3identity.com/api/farcaster/neynar/users/trending?limit=10');
const data = await users.json();
console.log('📈 Trending Users:');
data.users.forEach((user, i) => {
console.log(`${i + 1}. @${user.username} - ${user.follower_count?.toLocaleString()} followers`);
});
Power Users
const power = await fetch('https://api.web3identity.com/api/farcaster/neynar/users/power?limit=25');
const data = await power.json();
console.log('⚡ Power Badge Holders:');
data.users.forEach(user => {
console.log(` @${user.username} - ${user.follower_count?.toLocaleString()} followers`);
});
Cast Details & Conversations
Get Cast by Hash
const hash = '0x1234...';
const cast = await fetch(`https://api.web3identity.com/api/farcaster/neynar/cast/${hash}`);
const data = await cast.json();
console.log(`Cast by @${data.cast.author?.username}:`);
console.log(data.cast.text);
console.log(`❤️ ${data.cast.reactions?.likes_count} 🔄 ${data.cast.reactions?.recasts_count} 💬 ${data.cast.replies?.count}`);
Get Conversation Thread
const conversation = await fetch(`https://api.web3identity.com/api/farcaster/neynar/cast/${hash}/conversation?reply_depth=3`);
const data = await conversation.json();
console.log('Conversation thread:');
function printThread(cast, depth = 0) {
const indent = ' '.repeat(depth);
console.log(`${indent}@${cast.author?.username}: ${cast.text?.slice(0, 50)}...`);
(cast.direct_replies || []).forEach(reply => printThread(reply, depth + 1));
}
printThread(data.conversation.cast);
Get Cast Reactions
// Likes
const likes = await fetch(`https://api.web3identity.com/api/farcaster/neynar/cast/${hash}/reactions?type=likes&limit=25`);
// Recasts
const recasts = await fetch(`https://api.web3identity.com/api/farcaster/neynar/cast/${hash}/reactions?type=recasts&limit=25`);
const likesData = await likes.json();
console.log(`Users who liked this cast:`);
likesData.reactions.forEach(r => console.log(` @${r.user?.username}`));
Get Cast Quotes
const quotes = await fetch(`https://api.web3identity.com/api/farcaster/neynar/cast/${hash}/quotes?limit=10`);
const data = await quotes.json();
console.log(`Quote casts:`);
data.quotes.forEach(q => {
console.log(`@${q.author?.username}: ${q.text?.slice(0, 100)}...`);
});
User Profiles
Get User by FID
const fid = 3;
const user = await fetch(`https://api.web3identity.com/api/farcaster/user/${fid}`);
const data = await user.json();
console.log(`@${data.user.username}`);
console.log(`Display: ${data.user.display_name}`);
console.log(`Bio: ${data.user.profile?.bio?.text}`);
console.log(`Followers: ${data.user.follower_count}`);
console.log(`Following: ${data.user.following_count}`);
Get User by Username
const username = 'dwr';
const user = await fetch(`https://api.web3identity.com/api/farcaster/username/${username}`);
const data = await user.json();
console.log(`Found: @${data.user.username} (FID: ${data.user.fid})`);
Lookup by Ethereum Address
const address = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
const user = await fetch(`https://api.web3identity.com/api/farcaster/address/${address}`);
const data = await user.json();
console.log(`Address ${address.slice(0, 10)}... is @${data.username}`);
User Casts & Activity
const fid = 3;
// User's casts
const casts = await fetch(`https://api.web3identity.com/api/farcaster/user/${fid}/casts?limit=20`);
// Popular casts
const popular = await fetch(`https://api.web3identity.com/api/farcaster/neynar/user/${fid}/popular`);
// Activity (replies + recasts)
const activity = await fetch(`https://api.web3identity.com/api/farcaster/neynar/user/${fid}/activity?limit=25`);
Search
Search Users
const query = 'vitalik';
const search = await fetch(`https://api.web3identity.com/api/farcaster/neynar/search/users?q=${query}&limit=10`);
const data = await search.json();
console.log(`Users matching "${data.query}":`);
data.users.forEach(u => {
console.log(` @${u.username} - ${u.display_name}`);
});
Search Casts
const query = 'ethereum merge';
const search = await fetch(`https://api.web3identity.com/api/farcaster/neynar/search/casts?q=${encodeURIComponent(query)}&limit=25`);
const data = await search.json();
console.log(`Casts about "${data.query}":`);
data.casts.forEach(c => {
console.log(`@${c.author?.username}: ${c.text?.slice(0, 80)}...`);
});
Building a Channel Explorer
Complete example:
async function exploreChannel(channelId) {
const [channel, feed, members, trending] = await Promise.all([
fetch(`https://api.web3identity.com/api/farcaster/neynar/channel/${channelId}`).then(r => r.json()),
fetch(`https://api.web3identity.com/api/farcaster/channel/${channelId}/feed?limit=10`).then(r => r.json()),
fetch(`https://api.web3identity.com/api/farcaster/neynar/channel/${channelId}/members?limit=10`).then(r => r.json()),
fetch('https://api.web3identity.com/api/farcaster/neynar/channels/trending?time_window=7d&limit=5').then(r => r.json())
]);
return {
channel: {
id: channel.channel?.id,
name: channel.channel?.name,
description: channel.channel?.description,
followers: channel.channel?.follower_count,
imageUrl: channel.channel?.image_url
},
recentCasts: feed.casts?.map(c => ({
author: c.author?.username,
text: c.text?.slice(0, 100),
likes: c.reactions?.likes_count,
timestamp: c.timestamp
})),
topMembers: members.members?.slice(0, 5).map(m => m.user?.username),
relatedTrending: trending.channels?.map(c => c.id)
};
}
// Usage
const exploration = await exploreChannel('ethereum');
console.log(JSON.stringify(exploration, null, 2));
Endpoint Reference
| Endpoint | Description | Source |
|---|---|---|
/api/farcaster/channels | List all channels | Warpcast |
/api/farcaster/channel/:id | Get channel | Warpcast |
/api/farcaster/channel/:id/feed | Channel feed | Neynar |
/api/farcaster/neynar/channel/:id | Rich channel data | Neynar |
/api/farcaster/neynar/channels/bulk | Bulk lookup | Neynar |
/api/farcaster/neynar/channels/search | Search channels | Neynar |
/api/farcaster/neynar/channels/trending | Trending channels | Neynar |
/api/farcaster/neynar/channel/:id/followers | Channel followers | Neynar |
/api/farcaster/neynar/channel/:id/members | Channel members | Neynar |
/api/farcaster/neynar/user/:fid/channels | User's channels | Neynar |
/api/farcaster/neynar/feed/for-you/:fid | For You feed | Neynar |
/api/farcaster/neynar/feed/following/:fid | Following feed | Neynar |
/api/farcaster/trending/casts | Trending casts | Neynar |
/api/farcaster/neynar/users/trending | Trending users | Neynar |
/api/farcaster/neynar/users/power | Power users | Neynar |
/api/farcaster/neynar/cast/:hash | Cast details | Neynar |
/api/farcaster/neynar/cast/:hash/conversation | Conversation thread | Neynar |
/api/farcaster/neynar/cast/:hash/reactions | Cast reactions | Neynar |
/api/farcaster/neynar/cast/:hash/quotes | Quote casts | Neynar |
/api/farcaster/neynar/search/users | Search users | Neynar |
/api/farcaster/neynar/search/casts | Search casts | Neynar |
Rate Limits & Pricing
- Free tier: 100 calls/day
- Neynar endpoints: $0.01 - $0.02 per call
- Warpcast endpoints: $0.005 per call
Next Steps
- The Graph Queries - ENS and DeFi subgraph data
- Bitcoin Deep Dive - Bitcoin blockchain data
- x402 Integration - Setting up payments