Discord Server Directory Scraper avatar

Discord Server Directory Scraper

Pricing

from $1.68 / 1,000 item extracteds

Go to Apify Store
Discord Server Directory Scraper

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

Automation Lab

Maintained by Community

Actor 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?

FieldTypeMeaning
serverIdstringStable Discord guild snowflake from the public detail URL.
namestringPublic server name.
descriptionstring or nullPublic directory description.
categorystringPublic category or the selected category fallback.
tagsstring[]Public discovery keywords when present.
approximateMemberCountinteger or nullApproximate total-member count shown at observation time.
approximateOnlineCountinteger or nullApproximate online count shown at observation time.
premiumSubscriptionCountinteger or nullPublic boost count from the matching server detail payload; absent is null, never inferred zero.
featuresstring[]Public guild feature flags; empty when absent, unavailable or skipped.
enrichmentStatusstringenriched: matching guild payload recognized; unavailable: fetch/parse failed; skipped: details disabled. Optional fields can be absent even when enriched.
localestring or nullPreferred public locale when exposed.
vanityCodestring or nullVanity invite code when exposed.
inviteUrlURL or nullPublic vanity invite link when exposed.
detailUrlURLOfficial Discord server detail page.
iconUrlURL or nullPublic server icon asset.
bannerUrlURL or nullPublic discovery banner asset.
rankintegerPosition in the selected category window, including startOffset.
sourceUrlURLExact category/offset page where the record appeared.
observedAtdate-timeUTC 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

  1. Open the Actor input page.
  2. Select a directory category.
  3. Optionally enter a keyword, such as roblox.
  4. Set maxItems to the maximum number of matched rows you need.
  5. Set maxPages high enough to inspect a useful directory window.
  6. Keep startOffset at 0, or use a multiple of 12 to continue later.
  7. Run the Actor and open the Discord servers dataset view.
  8. 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

ParameterRequiredDefaultDescription
categoryNoallOne of all, gaming, music, entertainment, science-and-tech, or education.
keywordNoemptyTrimmed, case-insensitive local substring filter over name, description, and (with details enabled) public tags; maximum 100 characters.
includeDetailsNotrueFetch 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.
maxItemsNo50Maximum matching records to save, from 1 to 500.
maxPagesNo10Maximum 12-listing pages to inspect, from 1 to 100.
startOffsetNo0Non-negative multiple of 12 used as the first directory offset.
proxyConfigurationNodirectOptional 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:

  1. fetches each selected category page;
  2. reads its 12 discoverable listing cards;
  3. requests public detail enrichment unless includeDetails is false;
  4. combines the server name, description, and available public tags (name/description only in listing-only mode);
  5. applies your case-insensitive keyword locally;
  6. saves only matching rows until maxItems or maxPages is 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 start event per run;
  • one item event 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:

  1. keep category, maxPages, and startOffset fixed;
  2. schedule the Actor daily, weekly, or monthly;
  3. export serverId, rank, counts, and observedAt to your warehouse;
  4. compare by serverId rather than by mutable server name;
  5. review new records, moved ranks, and count changes;
  6. 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.
  • startOffset must be divisible by 12.
  • Rank is startOffset + card position, so later windows remain interpretable.
  • maxItems limits saved matches; maxPages limits 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 os
from apify_client import ApifyClient
client = 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().items
print(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.

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.