# Discord Username Checker · Bulk, CSV & Sheets \[No Login] (`memo23/discord-username-checker`) Actor

Check thousands of Discord usernames at once: available, taken or invalid with Discord's own reason, plus the check time. Paste names or link a CSV, TXT or Google Sheet. Optional free-name suggestion for taken names. No account, no token, no proxy setup. Unanswered names are free.

- **URL**: https://apify.com/memo23/discord-username-checker.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, Developer tools
- **Features:** Limited permissions
- **Stats:** 23 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.90 / 1,000 username checkeds

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 Username Checker

Find out which Discord usernames are free to claim, in bulk. Paste a list or link a CSV, TXT or Google Sheet, and get one row per name: **available**, **taken** or **invalid**, with Discord's own reason for every refused name and the exact time it was checked.

![How the Discord Username Checker works: names or a file in, available, taken or invalid out](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-discord-username-checker.png)

### Why Use This Scraper?

- **Bulk in one run.** Thousands of names per run, from a pasted list, a CSV, a TXT, a JSON list or a Google Sheet link.
- **Discord's own verdict.** Every answer comes from Discord's sign-up check, so "available" means Discord would accept the name right now.
- **Reasons, not just "no".** Refused names come back with Discord's reason code and message: too short or long, a character Discord does not allow, repeated dots, or a word Discord reserves (`discord`, `nitro`, `clyde` and others).
- **A free alternative for every miss.** Turn on suggestions and each taken or invalid name gets the name Discord itself offers in its place.
- **Only answers are billed.** A name Discord did not answer comes back with status `unknown` and costs nothing. Names that break Discord's basic rules are answered on the spot and cost nothing either.
- **No account, no token, no setup.** Nothing to log in to and nothing to configure besides the list.

### Overview

Discord moved every account to unique usernames in 2023, and good names went fast. This actor tells you which of your candidate names can still be registered, so you can pick a handle for yourself, a brand, a bot or a community before someone else does.

Every unique name on your list becomes one dataset row. The row says whether Discord would accept the name today, why it would refuse it, how long the name is, where it sat in your list, and when it was checked. Rows are written as answers arrive, so a large list fills the dataset steadily and you can sort by `position` to get your original order back.

The actor checks names, nothing else. It does not look up who owns a taken name, and it never registers or reserves anything.

### Supported Inputs

#### Name forms

| You enter | Checked as | Note |
|---|---|---|
| `coolname` | `coolname` | Plain names |
| `CoolName` | `coolname` | Upper case is folded to lower case, as Discord does |
| `@coolname` | `coolname` | Mentions |
| `coolname#1234` | `coolname` | Pre-2023 tags; the number is not part of a username |
| `alpha, beta; gamma` | `alpha`, `beta`, `gamma` | Commas and semicolons separate names in the list field |
| `cool gamer` | `cool gamer` | Stays one entry and comes back invalid (spaces are not allowed), with a suggested valid name if suggestions are on |

Repeated names (after folding case and removing `@` and tags) are checked once.

#### File links

| File | How names are read |
|---|---|
| TXT | One name per line |
| CSV or TSV with a header | The column named `username`, `user name`, `name`, `handle` or `tag` (any case) |
| CSV without a matching header | The first column of each line |
| A single comma-separated line | Every value on the line |
| JSON | An array of strings, or of objects with a `username`, `name` or `handle` field |

Share links work as they are: a Google Sheet shared as "anyone with the link" (the tab in the link is the one read), a GitHub file page, a Pastebin page and a Dropbox share link are turned into their download form for you.

#### Unsupported inputs

- Discord user IDs and profile links (`discord.com/users/123...`). The actor checks names, not accounts.
- Server names, server invites and channel names. For servers, see the Discord Server Scraper below.
- Private files that need a login to download. Share the file publicly or paste the names.

### Use Cases

| Who | What they do with it |
|---|---|
| Gamers and streamers | Shortlist a handle across dozens of spellings and grab the first free one |
| Brands and agencies | Check brand, product and campaign names before a launch, and spot names that are already taken |
| Handle hunters | Scan generated lists of short or dictionary names for free ones |
| Community and bot builders | Make sure the bot, mod and staff names you plan to use can be registered |
| Developers | Add an availability check to a sign-up flow, a name generator or a Discord tool through the API |
| Researchers | Measure how crowded the namespace is for a word list or a naming pattern |

### How It Works

1. **Give it names.** Paste them into "Usernames", link one or more files, or both.
2. **Names are cleaned.** Case is folded, `@` and old `#1234` tags are dropped, repeats are removed.
3. **Discord's basic rules are applied first.** Names Discord would refuse for length, characters or repeated dots are marked invalid straight away, free of charge.
4. **Every other name is checked with Discord.** The answer is available, taken, or invalid with Discord's reason (reserved words are Discord's list, so those are always asked).
5. **One row per name lands in the dataset,** with the optional suggested free name and the check time. Export as JSON, CSV, Excel or through the API.

### Input Configuration

#### Input fields

| Field | Type | Default | What it does |
|---|---|---|---|
| `usernames` | array of strings | - | Names to check, one per line. Commas and semicolons also separate names. Accepts `name`, `@name`, `name#1234`. |
| `usernameFileUrls` | array of strings | - | Links to TXT, CSV, TSV or JSON files with more names, including Google Sheets, GitHub, Pastebin and Dropbox share links. |
| `suggestAlternatives` | boolean | `false` | For each taken or invalid name, add the name Discord offers in its place at sign-up. |
| `maxUsernames` | integer | all | Stop after this many unique names. |

At least one name, from the list or a file, is needed.

#### Example: a short list

```json
{
    "usernames": ["jason", "gamer", "pixel.fox.2026"]
}
```

#### Example: a Google Sheet plus suggestions

```json
{
    "usernameFileUrls": ["https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit#gid=0"],
    "suggestAlternatives": true
}
```

#### Example: the first 500 names of a large file

```json
{
    "usernameFileUrls": ["https://example.com/names.txt"],
    "maxUsernames": 500
}
```

### Output Overview

Each row is one unique name. `status` is the field to filter on:

- `available`: Discord would accept the name right now.
- `taken`: someone already has it.
- `invalid`: Discord would refuse it. `reasonCode` and `reason` say why.
- `unknown`: Discord gave no answer for this name during the run. The row is free; run the name again later.

`available` repeats the verdict as `true` / `false` (`null` for `unknown`), which is handy for spreadsheet filters.

### Output Samples

Real rows from a test run on 2026-11-06, with suggestions on.

#### Taken, with Discord's suggestion

```json
{
    "username": "jason",
    "status": "taken",
    "available": false,
    "usernameLength": 5,
    "reasonCode": null,
    "reason": null,
    "suggestedUsername": "jason051761",
    "input": "jason",
    "position": 1,
    "checkedAt": "2026-11-06T05:58:31.118Z"
}
```

#### Available

```json
{
    "username": "zq.hunter.n7x2q",
    "status": "available",
    "available": true,
    "usernameLength": 15,
    "reasonCode": null,
    "reason": null,
    "suggestedUsername": null,
    "input": "zq.hunter.n7x2q",
    "position": 11,
    "checkedAt": "2026-11-06T05:58:30.402Z"
}
```

#### Invalid: a word Discord reserves

```json
{
    "username": "discordfan",
    "status": "invalid",
    "available": false,
    "usernameLength": 10,
    "reasonCode": "USERNAME_INVALID_CONTAINS",
    "reason": "Username cannot contain \"discord\"",
    "suggestedUsername": "di5cordfan0922",
    "input": "discordfan",
    "position": 7,
    "checkedAt": "2026-11-06T05:58:31.790Z"
}
```

#### Invalid: a space in the name

```json
{
    "username": "has space",
    "status": "invalid",
    "available": false,
    "usernameLength": 9,
    "reasonCode": "USERNAME_INVALID_CHARACTERS",
    "reason": "Username can only use letters, numbers, underscores and periods.",
    "suggestedUsername": "hasspace",
    "input": "has space",
    "position": 9,
    "checkedAt": "2026-11-06T05:58:29.874Z"
}
```

### Key Output Fields

#### Verdict

- `status`: `available`, `taken`, `invalid` or `unknown`
- `available`: `true`, `false`, or `null` when Discord gave no answer
- `reasonCode`: Discord's code for an invalid name (`BASE_TYPE_BAD_LENGTH`, `USERNAME_INVALID_CHARACTERS`, `USERNAME_INVALID_REPEATING_DOTS`, `USERNAME_INVALID_CONTAINS`), or `NO_ANSWER` for `unknown`
- `reason`: the matching message in plain English

#### The name

- `username`: the name as Discord would store it (lower case, no `@`, no tag)
- `usernameLength`: number of characters, for filtering short names
- `suggestedUsername`: Discord's own offer for a taken or invalid name (only with `suggestAlternatives`)

#### Tracking

- `input`: what you entered, exactly
- `position`: the name's place in your list after repeats were removed (list names first, then files in the order given)
- `checkedAt`: ISO 8601 time of the check, UTC

### FAQ

#### How accurate is "available"?

It is Discord's own answer at `checkedAt`. Names change hands all the time, so a name that is free now can be taken minutes later. Claim the ones you want soon after the run.

#### Why is a name marked invalid when nobody has it?

Discord refuses some names whoever asks: fewer than 2 or more than 32 characters, anything other than `a-z`, `0-9`, `_` and `.`, two dots in a row, or a reserved word such as `discord`, `nitro`, `clyde`, `wumpus`, `hypesquad` or `snowsgiving`. The row's `reason` says which rule applies.

#### What does `unknown` mean, and am I charged for it?

Discord did not give an answer for that name during the run, after several tries. It is rare (none in test runs of 200 and 545 names), the row is free, and running the name again later normally answers it.

#### Why is `suggestedUsername` empty for some taken names?

Discord sometimes has no offer, mostly for very short, common names such as `john` or `mike`. The field is then empty, as it is when suggestions are off. Discord's offers change from one request to the next, so a later run may fill it.

#### Is a suggested name guaranteed to be free?

It is the name Discord itself offers at sign-up for that input, so it was free when offered. It is not checked a second time; run it through the checker if you want a separate row for it.

#### Can I check names with upper-case letters?

Yes. Discord folds usernames to lower case, so `CoolName` and `coolname` are the same name. The row shows both: `input` as you typed it and `username` as Discord stores it.

#### Does it work with old `name#1234` tags?

Yes. The `#1234` part is dropped and the name is checked as a new-style username.

#### How many names can I check in one run?

There is no fixed cap on paid plans. Test runs on Apify checked 200 names in 17 seconds and about 11 names a second on a 10,000-word list, so 10,000 names take roughly 15 minutes. Free Apify plans check the first 100 names per run.

#### What happens when my spending limit is reached?

The run stops starting new checks, keeps every row it already wrote, and the log says how many names were left unchecked. Unchecked names cost nothing.

#### Can it tell me who owns a taken name?

No. The actor reports whether a name can be registered. It does not look up accounts or profiles.

#### How am I billed?

One event per name Discord answered: available, taken, or invalid with Discord's reason. Names that break Discord's basic length, character and dot rules are answered without asking Discord and are free. `unknown` rows are free. Suggestions add no charge.

### Support

Found a bug or need a field? Open an issue on the actor's [Issues tab](https://apify.com/memo23/discord-username-checker/issues). Issues are answered quickly.

### Additional Services

Need availability checks on a schedule, other platforms in the same run, or results sent to a spreadsheet, webhook or database? Open an issue describing what you need, or email muhamed.didovic@gmail.com for custom work.

### Explore More Scrapers

- [Discord Server Scraper](https://apify.com/memo23/discord-server-scraper): member counts, online counts, boosts and invite details for public Discord servers
- [Username Social Media Finder](https://apify.com/memo23/username-social-finder): see where else a username is registered, across 50+ sites
- [Social Profile Finder](https://apify.com/memo23/social-profile-finder): find a creator's accounts across platforms
- [TikTok User Search](https://apify.com/memo23/tiktok-user-search-scraper): find TikTok creators by keyword

Full list at [apify.com/memo23](https://apify.com/memo23).

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/discord-username-checker`).

**Purpose:** bulk check whether Discord usernames can be registered right now: available, taken, or invalid with Discord's reason code. No login.

**Minimal input:**

```json
{ "usernames": ["jason", "pixel.fox.2026", "discordfan"], "suggestAlternatives": true }
```

**Output:** one dataset row per unique name: username, status (`available` / `taken` / `invalid` / `unknown`), available (boolean or null), usernameLength, reasonCode, reason, suggestedUsername, input, position, checkedAt.

**Behaviors an agent should know:**

- Names are folded to lower case and stripped of `@` and `#1234` tags before checking; repeats are checked once.
- Rows arrive in completion order. Sort by `position` for input order.
- `usernameFileUrls` accepts TXT, CSV (username/name/handle column), JSON and Google Sheet share links.
- `suggestedUsername` is filled only with `suggestAlternatives: true`, and Discord has no offer for some short common names.
- Billing: one `username-checked` event per name Discord answered. Rule-breaking names answered locally, `unknown` rows and suggestions are free.
- Set `maxUsernames` to cap a run; free Apify plans stop at 100 names per run.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Discord Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The actor asks only the question Discord answers publicly for anyone choosing a username: whether a name can be registered. It does not log in, read accounts, messages or servers, or register or reserve any name. Users are responsible for ensuring their use complies with Discord's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

discord username checker, discord username availability, check discord username, discord name checker, discord handle checker, bulk discord username checker, discord username available, discord username taken, Apify discord, discord username finder, discord username generator list, short discord usernames, rare discord usernames, discord handle availability API, username availability checker, brand name availability, social handle checker, gamer tag checker, discord bot name check, username sniping, discord pomelo usernames

# Actor input Schema

## `usernames` (type: `array`):

One name per line. Commas also separate names. Accepted: plain names (coolname), mentions (@coolname) and old tags (coolname#1234). Upper case is folded to lower case, as Discord does. Repeated names are checked once.

## `usernameFileUrls` (type: `array`):

Links to files with more names: a TXT with one name per line, a CSV with a username, name or handle column (else the first column is read), or a JSON list. Google Sheets (shared as "anyone with the link"), GitHub, Pastebin and Dropbox share links work as they are.

## `suggestAlternatives` (type: `boolean`):

For every taken or invalid name, add the name Discord itself offers in its place at sign-up (jason -> jason089601, "cool gamer" -> coolgamer09435). Discord has no offer for some very short common names; the field is then empty. Adds a second or two per name, no extra charge.

## `maxUsernames` (type: `integer`):

Stop after this many names. Leave empty to check the whole list. Your run's spending limit also stops the run: names not checked by then are listed in the log and cost nothing.

## Actor input object example

```json
{
  "usernames": [
    "jason",
    "gamer",
    "pixel.fox.2026"
  ],
  "suggestAlternatives": false
}
```

# Actor output Schema

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

Every checked username with its status, Discord's reason for invalid names, an optional suggested free name and the check time.

# 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 = {
    "usernames": [
        "jason",
        "gamer",
        "pixel.fox.2026"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/discord-username-checker").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 = { "usernames": [
        "jason",
        "gamer",
        "pixel.fox.2026",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/discord-username-checker").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 '{
  "usernames": [
    "jason",
    "gamer",
    "pixel.fox.2026"
  ]
}' |
apify call memo23/discord-username-checker --silent --output-dataset

```

## MCP server setup

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

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/rL6tkFQ02mKztxhvH/builds/pLLAkxV093RnXJRfV/openapi.json
