# Discord Public Server Search & Watchlist (`jpmarketdata/discord-public-server-directory`) Actor

Find public Discord communities by keyword or category, or refresh a server URL watchlist. Export names, descriptions, member/online counts, locale and source order; visible details include tags and join links. No login. $0.75/1k servers. Unofficial.

- **URL**: https://apify.com/jpmarketdata/discord-public-server-directory.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.75 / 1,000 unique public server delivereds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Discord Public Server Search & Watchlist

Find relevant public communities by keyword/category and refresh selected server URLs for community market research. Export community names, descriptions, aggregate members/online counts, source locale and configuration flags. URL watchlist rows can also include visible categories, tags, join link, boosts and creation time. This unofficial Actor uses the official anonymous directory HTML.

### Input

Use queries, optional category, and/or serverUrls. Up to5 query/category discovery sources and50 direct public server URLs. Combined inputs must satisfy a preflight workload estimate of1 robots request + direct URL count + discovery source count × ceil(maxServersPerSource/12) <=90; reduce the per-source limit or split runs otherwise. Five queries with50 direct URLs work at the default50 per-source ceiling (76 estimated requests); five queries at200/source permit up to4 direct URLs (90 estimated requests). Network delays and rate limits can still exhaust the300-second deadline before delivery. Empty input defaults to queries=\["python"]; when any source field is supplied, omitted source fields are empty. Category-only input browses that category. maxServersPerSource defaults50 with200 ceiling; maxItems defaults500 with1000 ceiling. Category options are Gaming, Entertainment, Education, Music, Science & Tech. URL watchlists accept only exact discord.com/servers/SLUG-ID detail URLs.

### Output

One serverId produces one row with screened name/description, sourceUrl, approximate memberCount/onlineCount, sourceInputs, sourceRank, coverage and observedAt. Search rows also preserve visible locale, verified/partnered flags and features where provided. Direct detail rows add only visible categories, tags, public inviteUrl, boostCount and createdAt. Optional unavailable fields are omitted. Source search metadata can be older than detail-page counters; observations are snapshots, not a verified growth rate. Preserve source rank and do not sort silently. SUMMARY records request/page counts, source estimated totals, distinct rows, filtering and cap/actual-next-link stops; it is uncharged in key-value storage. Keyword queries return the currently accessible anonymous SSR search window, which can end below the source estimate while the HTML still advertises later offsets. An empty window stops only when both JSON-LD and source search hit state explicitly contain no records; SUMMARY marks publicWindowEnded, continuationAdvertised, last attempted/nonempty offsets and next advertised URL. This is a bounded window boundary, never completion of all indexed communities. Result totals are estimates and do not promise complete coverage. Category browsing follows its separately available pages.

### Charging

$0.00075 per unique delivered server through server-exported; $0.75/1000. No actor-specific start event or trial. Required sources are fully collected into a bounded sanitized buffer before any delivery/billing. A source failure leaves zero rows/events. Duplicate matches merge sourceInputs and are delivered/charged once. Filtered records, metadata and SUMMARY are uncharged. A run with no delivered servers fails without charging; mixed evidenced empty queries appear in SUMMARY when another source returns rows.

### Limits

256MB, HTTP/HTML only; no login, token, API credentials, paid API, proxy, browser or media downloads. Search pages typically12 rows; follow actual rel=next offset links and require strictly increasing offset plus distinct progress. Short pages alone are not exhaustion. Reject changed/duplicate-only pages, unsafe next URLs, missing counts and blocked/login responses. At most90 requests,15-second request timeout,3-second spacing (at most20 requests/minute), up to2 bounded retries for429 with a numeric Retry-After of at most30 seconds,2MiB response cap and300-second whole-run timeout. Requests stay in discord.com/servers; public invite links are returned as metadata and never visited. Rich search fields use a bounded static-literal lexer on source SSR payloads; never execute source JavaScript. Direct watchlist supports bulk known communities, not personal or private server membership.

### Privacy

Collect aggregate community metadata only. Omit all user/member identifiers, account profiles, channels, messages, contacts, credentials, precise locations and media URLs/files. Public directory community IDs/names and join links are kept only for community attribution. Contact patterns, @mentions, unsafe links and secret-like strings are redacted from name/description/tags before persistence. A server may be associated with a person and pattern screening does not guarantee full anonymization. No automated joining, messaging, personal enrichment or inferred user characteristics.

### Source and terms

Discord robots currently permits public /servers HTML; prohibited /channels, /profile and general /api paths are never requested. Recheck robots every run and honor Disallow. Current terms restrict scraping without written consent and commercialization of source data. Exact applicable excerpts and DR-0007 treatment are recorded in the scout with strict public/aggregate guards. Free alternatives include manual directory browsing and maintaining your own client; paid value is managed bounded discovery/watchlist exports and scheduling, not privileged access. Independent creation review and private cloud default/nondefault/max-load verification remain release gates.

### If something goes wrong

- **Wrong number or a failed run?** Open a ticket on the **Issues** tab. I read every one and reply within 2 business days (Japan time).
- **You never get a fake "empty" result.** If the site can't be read, the run fails and says so.
- **Delivered rows only.** One validated unique row is one billable event. Duplicates, summaries, failed acquisition and undelivered rows are not charged.
- **Checked every week.** An automatic test runs this tool weekly; if the site changes, I fix it.
- **Public source data only.** No login or member/applicant records. Contact patterns are screened before delivery; prose may still name people.

### More tools by the same author

- [Mercari Japan Sold Prices — What Items Really Sell For](https://apify.com/jpmarketdata/mercari-japan-price-checker)
- [Yahoo! Auctions Japan Sold Prices — Median, Range, Bids](https://apify.com/jpmarketdata/yahoo-auction-sold-comps)

All tools (Japan marketplaces, real estate, jobs, racing, prediction markets): <https://apify.com/jpmarketdata>

### Disclaimer

Unofficial, independent tool — **not affiliated with, endorsed by, or sponsored by Discord**. Product names and logos belong to their owners and only say where the data comes from. Data is read from public pages, for market research; check before you act on it.

# Actor input Schema

## `queries` (type: `array`):

Up to five ordinary keyword/phrase searches of the official public directory. Omitted sources are empty; only empty input defaults to python.

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

Optional category filter for every query; with no queries, browse this category.

## `serverUrls` (type: `array`):

Up to50 exact discord.com/servers/SLUG-ID public detail URLs. No invites, channels, user/member endpoints or private server data.

## `maxServersPerSource` (type: `integer`):

At most200 distinct public directory rows per query/category. Source result count is an estimate; actual next links are followed, with explicit non-exhaustive coverage. Combined workload estimate1+URL count+discovery count\*ceil(limit/12) must be<=90; reduce this limit or split inputs otherwise.

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

Maximum unique delivered/billed server records, including URL watchlist. Duplicates merge sourceInputs.

## Actor input object example

```json
{
  "queries": [
    "python"
  ],
  "maxServersPerSource": 50,
  "maxItems": 500
}
```

# Actor output Schema

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

Public server aggregate counts and visible community metadata, with source provenance.

# 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 = {
    "queries": [
        "python"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/discord-public-server-directory").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 = { "queries": ["python"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/discord-public-server-directory").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 '{
  "queries": [
    "python"
  ]
}' |
apify call jpmarketdata/discord-public-server-directory --silent --output-dataset

```

## MCP server setup

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

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/cSP6ODhvz1Tvpn77e/builds/d9edLoMXxcflKtrhl/openapi.json
