# Discord Server Scraper (`maximedupre/discord-scraper`) Actor

Find public Discord servers by keyword and optional category. Get one structured row per server with server IDs, names, descriptions, member counts, media, languages, categories, keywords, features, boosts, publication status, and vanity URLs. No Discord account credential is needed.

- **URL**: https://apify.com/maximedupre/discord-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.50 / 1,000 public servers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🔎 Find public Discord servers by keyword

Researchers, community teams, marketers, and developers can use Discord Scraper to find publicly listed Discord servers with one or more keywords. It returns one structured row per discovered server with server identity, descriptions, member and online counts, media URLs, language, categories, keywords, enabled features, boosts, publication status, and vanity URL information. Use the data to compare communities, find public spaces for a topic, or build a starting list for research. No buyer-supplied Discord account credential is needed.

- Find public Discord servers for a topic with **[Find Discord Servers](https://apify.com/maximedupre/discord-scraper/examples/find-discord-servers)**.
- Discover public server listings with one or more keywords using **[Discord Server Discovery](https://apify.com/maximedupre/discord-scraper/examples/discord-server-discovery)**.
- Search public Discord server listings with **[Discord Server Search](https://apify.com/maximedupre/discord-scraper/examples/discord-server-search)**.
- Collect public server metadata with **[Discord Server Scraper](https://apify.com/maximedupre/discord-scraper/examples/discord-server-scraper)**.
- Start a keyword-based public server run with **[Discord Scraper Bot](https://apify.com/maximedupre/discord-scraper/examples/discord-scraper-bot)**.

#### 🗂️ Public Discord server metadata

Each saved row describes a public Discord server found in the public listing source. The required fields are `serverId` and `name`. When the source provides them, rows also include descriptions, member counts, media URLs, language, categories, keywords, enabled features, boost details, publication status, and a vanity URL. Optional fields are omitted when the listing does not provide them.

#### ▶️ Search public Discord server listings

Add one or more keywords, optionally choose a supported server category, and set `maxItems` when you want to stop after a certain number of saved servers. Leave `maxItems` empty to return all available results until the source is exhausted. Start the run, then open the `results` link or the default dataset.

#### ⚙️ Input

Use one or more keywords to search public Discord server listings. Add a category to narrow the search, or set `maxItems` to stop sooner.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `keywords` | array of strings | Searches public Discord server listings for each submitted keyword. At least one non-empty keyword is required. |
| `category` | string | Optionally narrows the search to one supported Discord server category. Leave it empty to search all supported categories. |
| `maxItems` | integer | Stops after this many servers are returned in the run. Leave it empty to return all available results until the source is exhausted. |

The input schema has no upper bound for `maxItems`. The public source can return up to 3,000 discovered servers per keyword under the documented source boundary.

**Example input**

This is the public input from a successful current-beta default-input run:

```json
{
  "keywords": [
    "gaming"
  ],
  "maxItems": 10
}
```

#### 🧾 Output

The Actor returns a link to the default dataset. Each saved dataset row uses one public server shape. The required fields are `serverId` and `name`; other fields are optional and appear when the listing provides them.

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | string | Links to the public Discord server rows in the default dataset for this run. |

**Dataset row**

| Field | Type | What it does |
| --- | --- | --- |
| `serverId` | string | Stable Discord ID of the discovered server. |
| `name` | string | Displayed name of the discovered server. |
| `description` | string, optional | Description published for the server listing. |
| `memberCount` | integer, optional | Number of members reported for the server. |
| `onlineMemberCount` | integer, optional | Number of online members reported for the server. |
| `iconUrl` | string, optional | URL of the server icon when the listing provides one. |
| `bannerUrl` | string, optional | URL of the server banner when the listing provides one. |
| `splashUrl` | string, optional | URL of the server splash image when the listing provides one. |
| `language` | string, optional | Primary language reported for the server listing. |
| `categories` | array of strings, optional | Categories assigned to the server listing. |
| `keywords` | array of strings, optional | Keywords published for the server listing. |
| `features` | array of strings, optional | Discord features enabled for the server. |
| `boostCount` | integer, optional | Number of server boosts reported for the server. |
| `boostTier` | integer, optional | Server boost tier reported for the server. |
| `publicationStatus` | string, optional | Publication status reported for the server listing. |
| `vanityUrl` | string, optional | Public vanity URL for the server when one is available. |

**Example server row**

This complete row comes from a successful current-beta run:

```json
{
  "serverId": "368233883193573377",
  "name": "Dynamo Gaming 🇮🇳",
  "description": "Built on Aaditya 'Dynamo' Sawant’s legacy of passion & precision. We bridge the gap between the screen and our 300k+ community. Live the \"Patt Se Headshot\" spirit. Join the Clan! ⚡",
  "memberCount": 370763,
  "onlineMemberCount": 771,
  "iconUrl": "https://cdn.discordapp.com/icons/368233883193573377/a_b1cbfb75a106af1c4ba79548d31a0f3b.png?size=256",
  "bannerUrl": "https://cdn.discordapp.com/banners/368233883193573377/a_3e2622a7ca237dd2d1dd444e9a14468f.gif?size=1024",
  "splashUrl": "https://cdn.discordapp.com/discovery-splashes/368233883193573377/91ff42d0262db7fe721322f06385285b.png?size=1024",
  "language": "English",
  "categories": [
    "Esports",
    "Emoji",
    "Gaming",
    "General Chatting",
    "Content Creator"
  ],
  "keywords": [
    "Dynamo",
    "Dynamogaming",
    "HTRP",
    "HYDRARP",
    "Hydra",
    "Hydra dynamo"
  ],
  "features": [
    "ACTIVITY_FEED_DISABLED_BY_USER",
    "ANIMATED_ICON",
    "AUDIO_BITRATE_128_KBPS",
    "AUDIO_BITRATE_256_KBPS",
    "AUTO_MODERATION",
    "BANNER",
    "BYPASS_SLOWMODE_PERMISSION_MIGRATION_COMPLETE",
    "CHANNEL_ICON_EMOJIS_GENERATED",
    "COMMUNITY",
    "CONSIDERED_EXTERNALLY_DISCOVERABLE",
    "DISCOVERABLE",
    "ENABLED_DISCOVERABLE_BEFORE",
    "ENHANCED_ROLE_COLORS",
    "GUILD_HOME_TEST",
    "GUILD_ONBOARDING",
    "GUILD_ONBOARDING_EVER_ENABLED",
    "GUILD_ONBOARDING_HAS_PROMPTS",
    "GUILD_TAGS",
    "GUILD_WEB_PAGE_VANITY_URL",
    "INVITE_SPLASH",
    "MAX_FILE_SIZE_50_MB",
    "MEMBER_VERIFICATION_GATE_ENABLED",
    "MEMBER_VERIFICATION_ROLLOUT_TEST",
    "NEWS",
    "NEW_THREAD_PERMISSIONS",
    "PARTNERED",
    "PIN_PERMISSION_MIGRATION_COMPLETE",
    "PREVIEW_ENABLED",
    "ROLE_ICONS",
    "SERVER_PROFILES_TEST",
    "SOUNDBOARD",
    "STAGE_CHANNEL_VIEWERS_150",
    "STAGE_CHANNEL_VIEWERS_50",
    "TEXT_IN_VOICE_ENABLED",
    "THREADS_ENABLED",
    "TIERLESS_BOOSTING",
    "TIERLESS_BOOSTING_SYSTEM_MESSAGE",
    "VANITY_URL",
    "VIDEO_BITRATE_ENHANCED",
    "VIDEO_QUALITY_1080_60FPS",
    "VIDEO_QUALITY_720_60FPS",
    "VIP_REGIONS",
    "WELCOME_SCREEN_ENABLED"
  ],
  "boostCount": 19,
  "boostTier": 2,
  "publicationStatus": "public",
  "vanityUrl": "https://discord.gg/dynamogaming"
}
```

#### 💳 Pricing

**Pay per event**

This Actor uses pay-per-event pricing. You are charged for each public server saved with the metadata the source provides. If no public server is saved, this per-server event is not charged.

#### 🔌 Integrations

**Apify access**

Open the `results` link in Apify or read the default dataset through the Apify API. You can export the saved rows for your own research, report, or data workflow.

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens when I leave `maxItems` empty?

The Actor returns all available results until the source is exhausted. The source boundary is up to 3,000 discovered servers per keyword.

##### Can I search with more than one keyword?

Yes. Add one or more keywords in the same run. You can also add one supported category to narrow the public server search.

##### Does this Actor scrape messages or server members?

No. It discovers public server listings and returns their available metadata. It does not scrape channel message history, direct messages, or server member lists.

##### Do I need a Discord account token?

No buyer-supplied Discord account credential is needed. The Actor is limited to publicly listed server discovery.

##### What if the public listing does not include every field?

Optional fields such as descriptions, counts, media URLs, categories, features, boosts, and vanity URLs appear only when the listing provides them. The required `serverId` and `name` fields identify each saved row.

##### Can it access private Discord communities?

No. It searches public server listings only and does not access private or non-discoverable communities.

##### Is there a fixed maximum for `maxItems`?

No fixed upper bound is set in the input schema. Set a value to stop after that many returned servers, or leave it empty to continue until the source is exhausted.

### 📝 Changelog

**v0.0** (03-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~discord-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Telegram Channels Scraper](https://apify.com/maximedupre/telegram-channels-scraper) - Find public Telegram channels by keyword for cross-platform community research.
- [Facebook Group Profile Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper) - Turn known public Facebook group sources into structured community profiles.
- [YouTube Channel Search Scraper](https://apify.com/maximedupre/youtube-channel-search-scraper) - Find public YouTube channels from keywords for creator and community research.
- [Telegram Info Scraper](https://apify.com/maximedupre/telegram-info-scraper) - Enrich known public Telegram channels, groups, bots, and profiles with public metadata.
- [Twitch Stream Schedules](https://apify.com/maximedupre/twitch-stream-schedules) - Find public Twitch channels by search terms and review their public schedules.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `keywords` (type: `array`):

Enter one or more keywords. The Actor searches public Discord server listings for each keyword and returns structured server metadata.

## `category` (type: `string`):

Optional. Enter one supported Discord server category to narrow the results. Leave this empty to search all supported categories.

## `maxItems` (type: `integer`):

Optional. Stop after this many servers are returned in the run. Leave this empty to continue until the source has no more results.

## Actor input object example

```json
{
  "keywords": [
    "gaming"
  ],
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

Open the public Discord server results from this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "gaming"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/discord-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["gaming"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/discord-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "gaming"
  ],
  "maxItems": 10
}' |
apify call maximedupre/discord-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/discord-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Pcc0Sgx6QWAX3SUCe/builds/Zpt1NAimqMJOMe17o/openapi.json
