# Username Availability Checker (`maximedupre/username-availability-checker`) Actor

Check usernames across supported public platforms in one run. Get per-platform available, taken, invalid, or unresolved results with profile links and reasons when available.

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

## Pricing

$0.45 / 1,000 availability checks

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

### 🔎 Check username availability across public platforms

Founders, marketers, creators, agencies, and developers can use Username Availability Checker to test candidate usernames or handles across supported public platforms. It returns one row per candidate with a normalized handle and per-platform available, taken, invalid, or unresolved results, plus profile links and reasons when available. Use the rows to compare names before choosing a brand, creator, or product handle.

- Compare short Instagram name ideas with **[5 Letter Instagram Usernames Available](https://apify.com/maximedupre/username-availability-checker/examples/5-letter-instagram-usernames-available)** in one run.
- Test four-letter Instagram name ideas with **[4 Letter Instagram Usernames Available](https://apify.com/maximedupre/username-availability-checker/examples/4-letter-instagram-usernames-available)** before choosing a handle.
- Use **[Social Media Name Checker Free](https://apify.com/maximedupre/username-availability-checker/examples/social-media-name-checker-free)** to review candidate names across the selected platforms.
- Run **[Social Media Username Search Free](https://apify.com/maximedupre/username-availability-checker/examples/social-media-username-search-free)** to compare several handles in one input.
- Start **[Instant Username Search](https://apify.com/maximedupre/username-availability-checker/examples/instant-username-search)** when you need a fresh check for a shortlist.

#### 📊 Per-platform username results

The default dataset has one row for each submitted candidate. Each row keeps the submitted candidate beside its normalized handle and the platform results. A platform result reports `available`, `taken`, `invalid`, or `unresolved`. `available` and `taken` are reported only when the source signal is definitive. A public profile link or a reason is included when the source provides one.

**Returned data**

Use the rows to see which platforms have a candidate, which checks need review, and which submitted values were rejected by a platform's username rules. An `unresolved` result is not treated as proof that a username is available or taken.

#### ▶️ Check many handles in one run

1. Set **Check usernames on** to **Selected platforms** or **Full catalog**.
2. If you choose **Selected platforms**, pick one or more values in **Platforms**.
3. Add one or more usernames or handles to **Usernames or handles**. You can also add a full Gmail address such as `name@gmail.com`.
4. Start the run and open the default dataset to review or export the rows.

The selected scope applies to every candidate in the run. Each run is a point-in-time check of public source signals. Run it again when you need a new check.

#### ⚙️ Input

Add one candidate list and one platform scope for each run.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `platformScope` | string | Required. Use `selected` to check the platforms in `platforms`, or `all` to check the full supported catalog for every candidate. |
| `platforms` | array of strings | Choose one or more platforms when `platformScope` is `selected`: `instagram`, `facebook`, `x`, `linkedin`, `tiktok`, `youtube`, `reddit`, `pinterest`, `threads`, `bluesky`, `mastodon`, `github`, `gitlab`, `npm`, `devto`, `twitch`, `kick`, `discord`, `steam`, `roblox`, or `gmail`. |
| `candidates` | array of strings | Required. Add one or more usernames or handles. Each value is checked on every platform in the selected scope. A full Gmail address such as `name@gmail.com` is also accepted. |

**Input example**

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

```json
{
  "platformScope": "selected",
  "platforms": [
    "github",
    "instagram",
    "youtube",
    "gmail"
  ],
  "candidates": [
    "octocat"
  ]
}
```

#### 🧾 Output

The Output tab opens the default dataset overview. Each dataset row contains one candidate and its per-platform checks. The tables below cover the output link and the complete dataset row shape.

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | link | Opens the checked candidates and their platform results in the default dataset overview. |

**Dataset row**

| Field | Type | What it does |
| --- | --- | --- |
| `candidate` | string | The submitted username or handle for this row. |
| `normalizedHandle` | string | The normalized username or handle used for the checks. |
| `platformResults` | array of objects | The results for the platforms checked for this candidate. |
| `platformResults[].platform` | string | The platform checked for this candidate. |
| `platformResults[].verdict` | string | The outcome: `available`, `taken`, `invalid`, or `unresolved`. Available or taken is reported only when the source signal is definitive. |
| `platformResults[].profileUrl` | URL | The public profile URL checked for the platform, when the source provides one. |
| `platformResults[].reason` | string | Extra source context for an invalid, unresolved, or otherwise explained platform outcome, when available. |

This complete row is from a successful current-beta run with the full catalog selected.

```json
{
  "candidate": "octocat@gmail.com",
  "normalizedHandle": "octocat",
  "platformResults": [
    {
      "platform": "instagram",
      "verdict": "unresolved",
      "reason": "The source response was not definitive after retries. Manual review is needed."
    },
    {
      "platform": "facebook",
      "verdict": "unresolved",
      "reason": "The source response was not definitive after retries. Manual review is needed."
    },
    {
      "platform": "x",
      "verdict": "taken",
      "profileUrl": "https://x.com/octocat"
    },
    {
      "platform": "linkedin",
      "verdict": "unresolved",
      "reason": "The source response was not definitive after retries. Manual review is needed."
    },
    {
      "platform": "tiktok",
      "verdict": "taken",
      "profileUrl": "https://www.tiktok.com/@octocat"
    },
    {
      "platform": "youtube",
      "verdict": "taken",
      "profileUrl": "https://www.youtube.com/channel/UCuLNZr-IbDjSLgwQBFgQgIQ"
    },
    {
      "platform": "reddit",
      "verdict": "taken",
      "profileUrl": "https://www.reddit.com/user/octocat/"
    },
    {
      "platform": "pinterest",
      "verdict": "taken",
      "profileUrl": "https://www.pinterest.com/octocat/"
    },
    {
      "platform": "threads",
      "verdict": "unresolved",
      "reason": "The source response was not definitive after retries. Manual review is needed."
    },
    {
      "platform": "bluesky",
      "verdict": "available",
      "reason": "Invalid app.bsky.actor.getProfile params: Invalid AT identifier (got \"octocat\")"
    },
    {
      "platform": "mastodon",
      "verdict": "taken",
      "profileUrl": "https://mastodon.social/@octocat"
    },
    {
      "platform": "github",
      "verdict": "taken",
      "profileUrl": "https://github.com/octocat"
    },
    {
      "platform": "gitlab",
      "verdict": "available",
      "reason": "GitLab returned an empty exact username result."
    },
    {
      "platform": "npm",
      "verdict": "taken",
      "profileUrl": "https://www.npmjs.com/~octocat"
    },
    {
      "platform": "devto",
      "verdict": "taken",
      "profileUrl": "https://dev.to/octocat"
    },
    {
      "platform": "twitch",
      "verdict": "taken",
      "profileUrl": "https://www.twitch.tv/octocat"
    },
    {
      "platform": "kick",
      "verdict": "taken",
      "profileUrl": "https://kick.com/octocat"
    },
    {
      "platform": "discord",
      "verdict": "taken"
    },
    {
      "platform": "steam",
      "verdict": "taken",
      "profileUrl": "https://steamcommunity.com/id/Octocat/"
    },
    {
      "platform": "roblox",
      "verdict": "taken"
    },
    {
      "platform": "gmail",
      "verdict": "taken"
    }
  ]
}
```

The `unresolved` verdict means that the source did not give a definitive answer. Review its `reason` before making a decision. Availability can change after the check time, so treat these rows as point-in-time signals.

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary event is `username-platform-availability-checked`, which represents one check for one submitted username on one supported platform. Review the current Apify pricing panel for the live price and billing details.

#### 🔌 Integrations

Open the default dataset in Apify, read the rows through the Apify API, export them for another workflow, or schedule the same one-list, one-scope check again. A later run is a new point-in-time check and does not create historical change tracking.

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

#### ❓ FAQ

##### What does `available` or `taken` mean?

It is the source's definitive availability signal for that platform at the time of the check. It does not prove account ownership or guarantee that the status will stay the same.

##### What does `unresolved` mean?

The source response was not clear enough to classify the username. The Actor keeps the result as `unresolved` and includes a reason when available instead of guessing.

##### Why is a username marked `invalid`?

The platform rejected the candidate under its username rules or returned an invalid-input response. Read the platform result's `reason` when one is available.

##### Can I check a full Gmail address?

Yes. Add a full address such as `name@gmail.com` to `candidates`. The result keeps the submitted candidate and reports the normalized handle used for checks.

##### Can I check several usernames and platforms together?

Yes. Add several candidates and use either a selected platform list or the full supported catalog. One scope applies to every candidate in the run.

##### Does this Actor create or reserve accounts?

No. It only checks public availability signals. It does not create, reserve, claim, sign in to, or manage accounts or handles.

##### Is this an official platform tool, and does it prove ownership?

No. It is an independent Apify Actor. A public availability signal is not proof of ownership, inbox access, or account control.

##### Can I use the results for trademark or legal clearance?

No. The results help with operational naming research, but they are not trademark, legal, domain-registration, or business-name clearance.

### 📝 Changelog

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

- Initial release.

### 🆘 Support

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

### 🔗 Related Actors

- [Gmail Username Availability Checker](https://apify.com/maximedupre/gmail-username-checker): Check Gmail registration availability when your candidate list is only for Gmail.
- [Cross-Platform Username OSINT](https://apify.com/maximedupre/cross-platform-osint-monitoring): Map public accounts and profile context for a handle when availability is not the only question.
- [Username Availability Checker](https://apify.com/easyapi/username-availability-checker): Compare candidate handles across a broad set of social platforms.
- [Username Availability Checker](https://apify.com/sync-network/username-availability-checker): Run another bulk username check across its supported services.
- [Instagram Username Availability Checker + Profile Intel](https://apify.com/goat255/instagram-username-availability-checker): Focus on Instagram availability and review profile details for taken handles.

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

# Actor input Schema

## `platformScope` (type: `string`):

Choose selected platforms to check or check the full supported catalog. The choice is used for every candidate in this run.

## `platforms` (type: `array`):

Choose one or more supported platforms to check for every candidate. Use this field when Check usernames on is set to Selected platforms.

## `candidates` (type: `array`):

Enter one or more usernames or handles. You can also enter a full Gmail address such as name@gmail.com. Each value is checked on every platform in the selected scope.

## Actor input object example

```json
{
  "platformScope": "selected",
  "platforms": [
    "github",
    "instagram",
    "youtube",
    "gmail"
  ],
  "candidates": [
    "octocat"
  ]
}
```

# Actor output Schema

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

Open one row per candidate with its normalized handle and per-platform verdicts, profile links, and reasons when available.

# 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 = {
    "platformScope": "selected",
    "platforms": [
        "github",
        "instagram",
        "youtube",
        "gmail"
    ],
    "candidates": [
        "octocat"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/username-availability-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 = {
    "platformScope": "selected",
    "platforms": [
        "github",
        "instagram",
        "youtube",
        "gmail",
    ],
    "candidates": ["octocat"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/username-availability-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 '{
  "platformScope": "selected",
  "platforms": [
    "github",
    "instagram",
    "youtube",
    "gmail"
  ],
  "candidates": [
    "octocat"
  ]
}' |
apify call maximedupre/username-availability-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/username-availability-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/UREh8VaaArmzjPR3g/builds/eje5zcng1zVh118pN/openapi.json
