Discord Server Directory Scraper
Pricing
from $1.68 / 1,000 item extracteds
Discord Server Directory Scraper
Browse Discord’s official public server directory by category and export ranked server identity, descriptions, tags, audience estimates, locale, and links.
Pricing
from $1.68 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
12 days ago
Last modified
Categories
Share
Browse the Discord server directory and export public community records for partnership research, landscape analysis, and repeatable prospect refreshes. This Actor reads Discord's official public category pages—without a Discord account or bot token—and turns ranked listings into clean dataset rows.
Choose one supported category, choose where pagination starts, and optionally apply a keyword to each discovered server's name, description, and public tags. Results include stable server identity, description, category, tags, approximate member and online counts, locale, vanity invite, official detail URL, source page, rank, and observation time.
What does this Discord server scraper do?
The Actor follows Discord's server-rendered public directory pages rather than scraping messages, members, or private guild data.
It can:
- browse All, Gaming, Music, Entertainment, Science & Tech, or Education;
- advance through the official directory in 12-listing offset pages;
- locally filter discoverable records by keyword;
- enrich listings with public boost counts, feature flags, tags, locale and invites from their Discord detail pages;
- optionally skip details for economical count/rank snapshots with
includeDetails: false; - preserve the directory rank and exact page where each record was observed;
- save results to Apify's default dataset for JSON, CSV, Excel, XML, and API export.
It does not search all Discord servers, read channels, enumerate members, or access private content.
Who is it for
- Partnership teams finding public communities in a relevant category.
- Community managers refreshing a shortlist of visible neighboring communities.
- Market researchers comparing audience-size signals across a ranked directory window.
- Analysts building repeatable category snapshots for downstream change comparison.
- Developers feeding public Discord community metadata into a data warehouse or CRM review queue.
Why use the official directory route?
The source scope is explicit. Every discovered record comes from discord.com/servers, and every row carries its source page and official detail URL.
That gives you:
- clearer provenance than an undisclosed third-party index;
- official public descriptions and category placement;
- approximate audience signals as Discord displays them;
- pagination controls that can reproduce a defined ranked window;
- no requirement to provide a Discord user token, bot token, or server membership.
Discord's directory is curated and dynamic, so it is not a complete inventory of Discord communities.
What data can I extract?
| Field | Type | Meaning |
|---|---|---|
serverId | string | Stable Discord guild snowflake from the public detail URL. |
name | string | Public server name. |
description | string or null | Public directory description. |
category | string | Public category or the selected category fallback. |
tags | string[] | Public discovery keywords when present. |
approximateMemberCount | integer or null | Approximate total-member count shown at observation time. |
approximateOnlineCount | integer or null | Approximate online count shown at observation time. |
premiumSubscriptionCount | integer or null | Public boost count from the matching server detail payload; absent is null, never inferred zero. |
features | string[] | Public guild feature flags; empty when absent, unavailable or skipped. |
enrichmentStatus | string | enriched: matching guild payload recognized; unavailable: fetch/parse failed; skipped: details disabled. Optional fields can be absent even when enriched. |
locale | string or null | Preferred public locale when exposed. |
vanityCode | string or null | Vanity invite code when exposed. |
inviteUrl | URL or null | Public vanity invite link when exposed. |
detailUrl | URL | Official Discord server detail page. |
iconUrl | URL or null | Public server icon asset. |
bannerUrl | URL or null | Public discovery banner asset. |
rank | integer | Position in the selected category window, including startOffset. |
sourceUrl | URL | Exact category/offset page where the record appeared. |
observedAt | date-time | UTC timestamp when the Actor produced the row. |
Counts are snapshots and may change between runs. The Actor labels them approximate rather than presenting them as exact membership records.
How to scrape Discord's public server directory
- Open the Actor input page.
- Select a directory
category. - Optionally enter a
keyword, such asroblox. - Set
maxItemsto the maximum number of matched rows you need. - Set
maxPageshigh enough to inspect a useful directory window. - Keep
startOffsetat0, or use a multiple of 12 to continue later. - Run the Actor and open the Discord servers dataset view.
- Export the results or connect the dataset to your workflow.
The prefilled Gaming + Roblox input is deliberately small and produces real public records.
Input parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
category | No | all | One of all, gaming, music, entertainment, science-and-tech, or education. |
keyword | No | empty | Trimmed, case-insensitive local substring filter over name, description, and (with details enabled) public tags; maximum 100 characters. |
includeDetails | No | true | Fetch public details. Set false for listing-only snapshots: zero detail requests, keyword searches name/description only, selected category fallback, and unavailable detail fields null/empty. |
maxItems | No | 50 | Maximum matching records to save, from 1 to 500. |
maxPages | No | 10 | Maximum 12-listing pages to inspect, from 1 to 100. |
startOffset | No | 0 | Non-negative multiple of 12 used as the first directory offset. |
proxyConfiguration | No | direct | Optional Apify/custom proxy. Direct access is the default. |
Search-intent input
{"category": "gaming","keyword": "roblox","maxItems": 10,"maxPages": 4,"startOffset": 0}
Category export input
{"category": "music","maxItems": 12,"maxPages": 1,"startOffset": 0}
Listing-only count and rank snapshot
{"category": "music","includeDetails": false,"maxItems": 12,"maxPages": 1}
A full page normally needs one request instead of thirteen. Identity, description, counts, assets, rank and provenance remain available. category uses the selected category (All for all); tags/features are empty and locale, vanity, invite and boost count are null. enrichmentStatus is skipped. This reduces network work, not the published per-row price.
Continuing from a later directory page
{"category": "education","maxItems": 24,"maxPages": 2,"startOffset": 24}
How keyword filtering works
Discord's public SEO directory pages expose category browsing, not an anonymous global keyword API. The Actor therefore:
- fetches each selected category page;
- reads its 12 discoverable listing cards;
- requests public detail enrichment unless
includeDetailsis false; - combines the server name, description, and available public tags (name/description only in listing-only mode);
- applies your case-insensitive keyword locally;
- saves only matching rows until
maxItemsormaxPagesis reached.
A selective keyword may require more pages. An empty result means no inspected record matched; it does not prove that no Discord community exists for the term.
Example output
A real local run against the Gaming category produced this shape:
{"serverId": "1376018788041887795","name": "Steal a Brainrot","description": "Welcome to the official Steal a Brainrot server! 🧠","category": "Gaming","tags": ["brainrot", "roblox"],"approximateMemberCount": 7799840,"approximateOnlineCount": 286961,"locale": "en-US","vanityCode": "brainrots","inviteUrl": "https://discord.gg/brainrots","detailUrl": "https://discord.com/servers/steal-a-brainrot-1376018788041887795","iconUrl": "https://cdn.discordapp.com/icons/1376018788041887795/f9f69ceda1bb918075ee1b2fd4cb5fcc.png?size=256","bannerUrl": "https://cdn.discordapp.com/discovery-splashes/1376018788041887795/7a06ebb2b3d4cb427a4c4358ec29cfa2.jpg?size=2048&format=auto","rank": 1,"sourceUrl": "https://discord.com/servers/gaming","observedAt": "2026-09-08T15:30:25.056Z"}
Values above are an observation, not a promise that counts or ranking remain unchanged.
How much does it cost to scrape Discord server directory records?
The Actor uses pay-per-event pricing:
- one
startevent per run; - one
itemevent for each dataset row actually produced.
You are not charged an additional item event for detail enrichment, filtered-out listings, duplicates, or an empty result. A saved listing fallback is still one charged row even when its optional detail page is unavailable. The run stops before saving further rows when its item charge budget is exhausted. Tier prices and worked examples shown in the Apify Console are the authoritative current prices. Larger account tiers receive the tier curve configured on the Actor.
Use fewer pages for a targeted snapshot. Increase maxPages only when a selective keyword or larger ranked window requires it.
Recurring community discovery workflow
For a repeatable partnership-research pipeline:
- keep category,
maxPages, andstartOffsetfixed; - schedule the Actor daily, weekly, or monthly;
- export
serverId, rank, counts, andobservedAtto your warehouse; - compare by
serverIdrather than by mutable server name; - review new records, moved ranks, and count changes;
- have a person assess relevance before outreach.
The Actor outputs observations only. It does not maintain history or calculate deltas inside a single run.
Pagination and scale tips
- Each source page currently contains up to 12 listings.
startOffsetmust be divisible by 12.- Rank is
startOffset + card position, so later windows remain interpretable. maxItemslimits saved matches;maxPageslimits inspected source pages.- With a keyword, the Actor may inspect many nonmatching cards before reaching
maxItems. - Without a keyword, one page can normally produce 12 records.
- For separate windows, avoid overlapping offsets if you plan to merge datasets.
Directory composition can change while a long run is in progress. Deduplicate merged exports by serverId and keep observedAt.
Reliability and failure behavior
The Actor retries transient network errors, HTTP 429, and temporary 5xx responses twice. It does not blindly retry malformed input, stable 4xx responses, or unexpected page shapes.
A stale directory card can occasionally point to a removed detail page. The Actor keeps useful listing fields with enrichmentStatus: unavailable and optional detail fields null/empty. An HTML 200 alone is not enrichment success: a matching guild payload must be recognized. Optional failures are counted, not reported individually as fatal errors.
The run fails on non-HTML, malformed directory cards or unrecognized empty pages. A recognized empty directory payload is legitimate exhaustion. A page with only already-seen IDs stops with no_new_ids, avoiding duplicate rows and charges.
Run coverage summary
Open Run coverage summary in Output, or read RUN_SUMMARY from the default key-value store. The bounded JSON contains pagesFetched (successful directory responses), cardsScanned (cards considered before limits), duplicates, filteredOut, detailSuccesses, detailFailures, detailSkips, rowsSaved, and stopReason. Detail counters cover unique considered cards, including filtered-out ones. Stop reasons are max_items, max_pages, directory_exhausted, no_new_ids, budget_limit, or error. Filter-empty runs succeed with zero rows and an explanatory summary. Fetch retries are not additional pages. Fatal runs save the partial summary when cleanup is possible.
Error diagnostics and privacy
Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL query strings are removed; reports are retained for 30 days. Raw HTML and public-detail fallback failures are not sent as individual error reports.
Proxy guidance
Direct requests are the tested default and avoid proxy transfer costs. Supply proxyConfiguration only when your environment requires it or Discord applies a regional/network restriction.
The Actor keeps one coherent proxy session for the run. It does not silently escalate to residential proxies. If you explicitly choose a paid proxy group, your platform proxy usage depends on that configuration.
Export and integrations
Use the default dataset with:
- JSON for applications and AI workflows;
- CSV or Excel for analyst review;
- the Dataset API for data warehouses;
- Make, Zapier, Google Sheets, Slack, or webhooks for automation;
- scheduled Actor runs for repeatable snapshots.
A useful CRM pattern is to retain serverId as the external key, detailUrl as provenance, and counts plus observedAt as time-varying observations.
REST API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~discord-server-directory-search/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"category": "gaming","keyword": "roblox","maxItems": 10,"maxPages": 4,"startOffset": 0}'
For production code, prefer the Authorization: Bearer header rather than putting a token in a stored URL.
JavaScript API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/discord-server-directory-search').call({category: 'music',maxItems: 12,maxPages: 1,startOffset: 0,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python API example
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation-lab/discord-server-directory-search").call(run_input={"category": "entertainment","maxItems": 24,"maxPages": 2,"startOffset": 0,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Use with MCP and AI agents
Claude Code setup
Add the Apify MCP server to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/discord-server-directory-search"
Claude Desktop, Cursor, and VS Code setup
Use this equivalent remote MCP configuration in Claude Desktop, Cursor, or VS Code:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/discord-server-directory-search"}}}
Example prompts:
- “Run the Discord Server Directory Scraper for the Gaming category, filter for Roblox, and return 10 records.”
- “Export the first 12 Music directory records and summarize the audience-size distribution.”
- “Run the same Entertainment directory window as last month and compare rows by serverId.”
Always review extracted records before using them for outreach or automated decisions.
Data handling and support
This Actor uses no AI models or external AI provider. Public community metadata is processed in memory and saved to your Apify dataset; aggregate counters go to the run key-value store. The Actor does not retain a separate raw-HTML cache. Dataset, key-value store and log retention follow your Apify account settings; delete these resources in Console or through the Apify API when no longer needed. Sanitized private error reports expire after 30 days.
Apify hosts runtime, storage and optional explicitly selected proxy traffic. No third-party data API or extra credential is required. Your selected platform/proxy usage is metered by Apify; we add no undisclosed off-platform fee. Direct requests and no proxy are the default. Our private GlitchTip service receives only sanitized repair diagnostics as described above, not normal exported datasets.
For help, open an issue through this Actor's Apify Store support tab. Include a run link and a non-sensitive description rather than credentials.
Responsible use and legality
This Actor is independently operated by Automation Lab and is not affiliated with or endorsed by Discord. Discord names and marks identify the source only.
This Actor accesses public Discord directory and public server-detail pages. It does not bypass authentication or collect channel messages, member lists, email addresses, or private server data.
You are responsible for your use of the output. Follow Discord's applicable terms, robots guidance, privacy and marketing laws, and your organization's data-retention rules. Public availability does not automatically authorize spam, profiling, or unsolicited bulk contact. Use partnership lists for relevant, respectful, human-reviewed research.
Limitations
- Only servers listed in Discord's official public directory can be discovered.
- Supported categories follow Discord's current public category sitemap.
- Keyword filtering is local to the pages inspected, not global full-text search.
- Counts and rank are approximate point-in-time signals.
- Public tags, locale, and vanity invites may be absent.
- A removed detail page can leave enrichment fields null while listing fields remain valid.
- The Actor does not join servers, scrape members/messages, send invitations, or contact administrators.
- Discord can change its HTML, category set, or pagination behavior.
Troubleshooting
Why did my keyword return fewer rows than maxItems?
maxItems is a ceiling, not a guarantee. Increase maxPages, broaden the keyword, or remove it to inspect all records in the selected category window.
Why are enrichment fields empty or null?
Check enrichmentStatus: skipped means includeDetails was false; unavailable means detail retrieval/parsing failed; enriched means the matching payload was recognized but optional fields may still be absent. Null boost count is unknown, not zero; an empty feature array does not establish that the server lacks capabilities. The row retains its stable server ID, listing metadata and source page.
Why does startOffset fail validation?
Use 0, 12, 24, 36, or another non-negative multiple of 12.
Should I enable a proxy?
Not by default. Direct mode is tested. Add a proxy only for an observed network/geography issue or your own infrastructure policy.
Does an empty result mean the community does not exist?
No. It means none of the directory records inspected within maxPages matched the local keyword.
FAQ
Do I need a Discord token?
No. The Actor reads public official directory pages and does not accept Discord credentials.
Can it scrape messages or members?
No. That is intentionally outside this Actor's public-directory scope.
Can it search by any keyword?
It can locally filter discovered records by any string up to 100 characters. Coverage depends on the category pages and page limit you choose.
Can I monitor changes?
Schedule repeat runs with identical inputs, then compare rows by serverId and observation time in your own storage. The Actor supplies consistent observations but does not persist a historical diff.
Are member counts exact?
No. They are approximate public values displayed by Discord.
Related Automation Lab Actors
This Actor is intentionally standalone for official public Discord community discovery. No currently verified Automation Lab Actor adds a necessary adjacent step without changing the data scope, so this README does not recommend an unrelated product merely to create a cross-link.