Discord Server Scraper — Members, Channels & Server Info
Pricing
Pay per usage
Discord Server Scraper — Members, Channels & Server Info
Extract Discord server information including member counts, online users, channels, categories, verification level, and metadata. Scrapes invite pages, server listing directories (Disboard, Discord.me, Top.gg), and the Discord Widget API. Export to JSON, CSV, or Excel. No login or bot token required
Pricing
Pay per usage
Rating
0.0
(0)
Developer

Ricardo Akiyoshi
Actor stats
0
Bookmarked
1
Total users
0
Monthly active users
12 hours ago
Last modified
Categories
Share
Discord Server Scraper
Extract Discord server information including member counts, online users, channel lists, categories, verification levels, and rich metadata. Works with invite links, server listing directories, and the Discord Widget API. No bot token or login required.
What It Does
This actor scrapes Discord server data from multiple sources and merges them into comprehensive, unified results.
Server-level data:
- Server name, description, and ID
- Member count and online count (approximate)
- Verification level (none, low, medium, high, very_high)
- Server icon, banner, and splash images
- Invite URL and invite code
- Server features (e.g., COMMUNITY, DISCOVERABLE, ANIMATED_ICON)
- Nitro boost count
- NSFW level
- Categories and tags (from listing sites)
Channel data (from Widget API):
- Channel names, IDs, and positions
- Only available if the server has widgets enabled
Member data (from Widget API):
- Online member usernames and statuses
- Current activity/game being played
- Only available if the server has widgets enabled
Three Scraping Strategies
The actor uses three complementary strategies and merges results for maximum data quality:
Strategy 1: Discord Invite API
The most reliable source. Given an invite code (e.g., discord.gg/python), the actor calls Discord's public invite API to get accurate member counts, server info, and metadata. No authentication needed.
Strategy 2: Server Listing Sites
Scrapes server data from popular Discord directories:
- Disboard.org -- Server pages and search results (discover servers by keyword)
- Discord.me -- Server profile pages
- Top.gg -- Server listing pages (with upvote counts)
Strategy 3: Discord Widget API
For servers with widgets enabled, fetches real-time channel lists and online member information. Automatically attempted for every server where we have a guild ID.
Input
| Field | Type | Default | Description |
|---|---|---|---|
serverUrls | array | [] | Discord server URLs (invite links, Disboard, Discord.me, Top.gg) |
maxResults | integer | 1000 | Maximum total results to return (0 = unlimited) |
includeMembers | boolean | true | Fetch online member data from Widget API |
includeChannels | boolean | true | Fetch channel data from Widget API |
searchDisboard | boolean | false | Enable Disboard keyword search |
searchKeywords | array | [] | Keywords to search on Disboard |
maxSearchPages | integer | 3 | Max Disboard search pages per keyword |
proxyConfiguration | object | - | Proxy settings for avoiding rate limits |
Supported URL Formats
https://discord.gg/pythonhttps://discord.com/invite/reactjshttps://disboard.org/server/123456789https://discord.me/servernamehttps://top.gg/servers/123456789
You can mix different URL types in a single run.
Example Input: Scrape Specific Servers
{"serverUrls": ["https://discord.gg/python","https://discord.gg/reactjs","https://discord.gg/typescript"],"maxResults": 100,"includeMembers": true,"includeChannels": true}
Example Input: Discover Servers by Topic
{"searchDisboard": true,"searchKeywords": ["programming", "gaming", "crypto"],"maxSearchPages": 5,"maxResults": 500,"includeMembers": false,"includeChannels": false}
Example Input: Mixed Sources
{"serverUrls": ["https://discord.gg/python","https://disboard.org/server/123456789","https://top.gg/servers/987654321"],"searchDisboard": true,"searchKeywords": ["AI"],"maxSearchPages": 2,"maxResults": 200}
Output
Each result is a merged object combining data from all available strategies:
{"serverId": "267624335836053506","serverName": "Python","serverDescription": "The official Python community server","memberCount": 385000,"onlineCount": 42000,"iconUrl": "https://cdn.discordapp.com/icons/267624335836053506/abc123.png?size=512","bannerUrl": "https://cdn.discordapp.com/banners/267624335836053506/def456.png?size=1024","splashUrl": null,"inviteCode": "python","inviteUrl": "https://discord.gg/python","verificationLevel": "high","features": ["COMMUNITY", "DISCOVERABLE", "INVITE_SPLASH", "NEWS", "ANIMATED_ICON"],"vanityUrlCode": "python","premiumSubscriptionCount": 14,"nsfwLevel": 0,"categories": ["Programming", "Technology", "Education"],"language": "English","channels": [{ "id": "267624335836053507", "name": "general", "position": 0 },{ "id": "267624335836053508", "name": "help", "position": 1 }],"members": [{"id": "123456789","username": "pythonista","status": "online","activity": { "name": "Visual Studio Code" }}],"inviteChannel": {"id": "267624335836053507","name": "general","type": 0},"sources": ["discord-invite-api", "discord-widget-api"],"scrapedAt": "2026-03-01T12:00:00.000Z"}
Note: channels and members arrays are only populated when the server has Discord widgets enabled. Many large servers disable widgets for privacy.
Use Cases
- Community Research -- Find and analyze Discord communities in any niche. Compare server sizes, activity levels, and features.
- Competitive Intelligence -- Monitor competitor Discord servers. Track member growth, online activity, and community engagement.
- Market Research -- Discover trending communities and topics. Understand what categories are growing fastest.
- Lead Generation -- Find active communities in your target market. Identify servers with engaged members who match your ideal customer profile.
- Brand Monitoring -- Track mentions and communities related to your brand across Discord directories.
- Academic Research -- Study online community dynamics, growth patterns, and engagement metrics at scale.
- Community Benchmarking -- Compare your server's stats against similar communities to identify growth opportunities.
- Content Strategy -- Discover what topics and categories attract the most engaged Discord communities.
Pricing (Pay-Per-Event)
This actor uses Apify's pay-per-event model:
- result-scraped: $0.004 per server successfully scraped
- actor-start: Charged once per run
You set a maximum budget per run, and the actor will never exceed it. Each server result (after deduplication and merging) counts as one event.
How to Run
On Apify Platform
- Go to the actor page on Apify Store
- Click "Start" or "Try for free"
- Enter your Discord server URLs or enable Disboard search
- Configure result limits and options
- Click "Run"
- Download results as JSON, CSV, or Excel
Locally
# Clone the repositorygit clone <repo-url>cd discord-scraper# Install dependenciesnpm install# Create input filemkdir -p ./storage/key_value_stores/defaultecho '{"serverUrls": ["https://discord.gg/python"],"maxResults": 10,"includeMembers": true,"includeChannels": true}' > ./storage/key_value_stores/default/INPUT.json# Runnpm start
Via Apify API
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/runs" \-H "Authorization: Bearer <YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{"serverUrls": ["https://discord.gg/python","https://discord.gg/reactjs"],"maxResults": 50,"includeMembers": true,"includeChannels": true}'
Via Apify Client (Node.js)
const { ApifyClient } = require('apify-client');const client = new ApifyClient({ token: '<YOUR_TOKEN>' });const run = await client.actor('<ACTOR_ID>').call({serverUrls: ['https://discord.gg/python'],searchDisboard: true,searchKeywords: ['programming'],maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} servers`);items.forEach(s => console.log(`${s.serverName}: ${s.memberCount} members`));
Via Apify Client (Python)
from apify_client import ApifyClientclient = ApifyClient("<YOUR_TOKEN>")run = client.actor("<ACTOR_ID>").call(run_input={"serverUrls": ["https://discord.gg/python"],"searchDisboard": True,"searchKeywords": ["programming"],"maxResults": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item['serverName']}: {item['memberCount']} members")
Technical Details
- Runtime: Node.js 18 on Apify platform
- Framework: Crawlee (CheerioCrawler) + Apify SDK v3
- API Sources: Discord Invite API v10, Discord Widget API, Disboard, Discord.me, Top.gg
- Rate limiting: 15 requests/minute for web pages, respectful delays between API calls
- Retries: 3 automatic retries per failed request
- Deduplication: Automatic by server ID to prevent duplicate results
- Memory: ~256 MB recommended for typical runs
Limitations
- Widget data: Channel and member lists are only available for servers that have enabled Discord widgets. Many large servers disable this feature.
- Member counts: The invite API provides approximate counts. Exact counts require bot access.
- Listing sites: Disboard, Discord.me, and Top.gg may rate-limit or block requests. Use Apify proxies for large-scale scraping.
- Private servers: Cannot scrape servers that require specific permissions or have disabled public invites.
- Rate limits: Discord's API has rate limits. The actor includes respectful delays, but very large runs may still encounter throttling.
- DOM changes: Listing site HTML structures may change. The actor includes multiple fallback selectors for resilience.
FAQ
Q: Do I need a Discord bot token? A: No. This actor uses only public APIs and web pages that don't require authentication.
Q: Why are channels/members arrays empty? A: The server has Discord widgets disabled. This is common for large or privacy-focused servers. The actor will still return all other available data.
Q: Can I scrape private/invite-only servers? A: Only if you have a valid invite link. The actor cannot bypass Discord's access controls.
Q: How accurate are the member counts? A: Discord's invite API returns "approximate" counts that are typically within 5% of the actual value. These update periodically.
Support
Built by Sovereign AI. For issues, feature requests, or custom scraping needs:
- Email: ricardo.yudi@gmail.com
- GitHub: https://github.com/ryudi84
Integration — Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("sovereigntaylor/discord-scraper").call(run_input={"searchTerm": "discord","maxResults": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item.get('title', item.get('name', 'N/A'))}")
Integration — JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('sovereigntaylor/discord-scraper').call({searchTerm: 'discord',maxResults: 50});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(item => console.log(item.title || item.name || 'N/A'));