# Twitch Email Scraper (`khadinakbar/twitch-email-scraper`) Actor

Extract business emails and social links from Twitch channels by username, category, or keyword. HTTP-only, cookieless, MCP-ready.

- **URL**: https://apify.com/khadinakbar/twitch-email-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Lead generation, Social media, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 channel scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Twitch Email Scraper

Extract **business emails and social links from Twitch channels** — by username, by category/game, or by keyword search. Built for sponsorship outreach, influencer marketing, and B2B lead generation. HTTP-only via Twitch's public GraphQL API: **no login, no cookies, no browser.** MCP-ready for AI agents.

### What it does

Give it Twitch channels (or a category, or a keyword) and it returns one clean record per channel containing the streamer's **business email**, normalized **social links** (Twitter/X, Instagram, YouTube, TikTok, Discord, and more), follower count, partner/affiliate status, live status, and current game. Emails are pulled from the channel **About description** and **info panels** — including common obfuscation like `name [at] domain [dot] com`.

### When to use it

- **Sponsorship & influencer agencies** — find streamer business contacts by game niche.
- **Brand outreach teams** — build targeted creator lists for a category (e.g. every live "Valorant" streamer).
- **Lead generation** — turn a keyword or a follower list into an enriched contact sheet.
- **AI agents (MCP)** — a single tool call that turns a Twitch handle into structured contact JSON.

Not for: scraping chat messages, VODs, clips, or stream analytics — this actor is focused on channel contact data.

### Three input modes (auto-detected)

| Mode | Set this input | What happens |
|------|----------------|--------------|
| **Direct** | `usernames` or `startUrls` | Scrapes exactly those channels. |
| **Category** | `category` (e.g. `Just Chatting`) | Discovers live streamers in that game, then scrapes them. |
| **Search** | `searchQuery` (e.g. `valorant`) | Finds channels matching the keyword, then scrapes them. |

Precedence when more than one is set: **Direct → Category → Search.**

### Output

One dataset record per channel:

| Field | Description |
|-------|-------------|
| `login` / `displayName` | Channel handle and display name |
| `url` | Public channel URL |
| `emails` / `primaryEmail` | All business emails found / the best one |
| `hasEmail` | Quick boolean filter for leads |
| `socials` | Normalized links keyed by platform |
| `socialLinks` | Every external link found |
| `followers` | Total follower count |
| `isPartner` / `isAffiliate` | Monetization tier |
| `isLive` / `primaryGame` / `liveViewers` | Live stream context |
| `lastBroadcastAt` / `accountCreatedAt` | ISO 8601 timestamps |
| `profileImageUrl` / `primaryColorHex` | Branding |
| `description` | Channel About text |
| `scrapedAt` | ISO 8601 scrape time |

#### Example record

```json
{
  "login": "pokimane",
  "displayName": "pokimane",
  "url": "https://www.twitch.tv/pokimane",
  "emails": ["teampokimane@wmeagency.com"],
  "primaryEmail": "teampokimane@wmeagency.com",
  "hasEmail": true,
  "socials": {
    "twitter": "https://twitter.com/pokimanelol",
    "instagram": "https://www.instagram.com/pokimanelol/",
    "youtube": "https://www.youtube.com/pokimane",
    "tiktok": "https://www.tiktok.com/@poki",
    "discord": "https://www.discord.gg/poki"
  },
  "followers": 9458747,
  "isPartner": true,
  "isLive": true,
  "primaryGame": "Just Chatting",
  "scrapedAt": "2026-06-21T00:00:00.000Z"
}
````

### Pricing — Pay Per Event

| Event | Price | When |
|-------|-------|------|
| Actor start | $0.00005 | Once per run |
| Channel scraped | **$0.005** | Each channel returned |
| Email found | **$0.02** | Bonus, only when an email is extracted |

You pay a small flat fee per channel processed and a premium only when a real email is found — so you never overpay for channels that have no contact. Pay-Per-Usage (compute + proxy) is also available; the platform lets you choose at run time. Set **Max channels** to cap spend on any run.

Typical email hit rate is **30–70%** depending on niche (gaming partners and business-managed channels list emails more often than hobby streamers).

### Example inputs

Direct usernames:

```json
{ "usernames": ["pokimane", "shroud", "https://twitch.tv/ninja"] }
```

Every live streamer in a category:

```json
{ "category": "Just Chatting", "maxResults": 200, "onlyWithEmail": true }
```

Keyword search:

```json
{ "searchQuery": "speedrun", "maxResults": 100 }
```

### Using it from an AI agent (MCP)

This actor is exposed through the Apify MCP server as `apify--twitch-email-scraper`. An agent can call it with a single handle or a category and receive structured contact JSON, ideal for "find me sponsorship contacts for Valorant streamers" style tasks.

### FAQ

**Do I need a Twitch account or cookies?** No. It uses Twitch's public, cookieless GraphQL API.

**Why do some channels have no email?** Not every streamer lists a business email. Enable `onlyWithEmail` to drop those from the output and keep a clean leads list.

**Does it find emails hidden behind "at"/"dot" obfuscation?** Yes — bracketed/parenthesized forms like `[at]` and `[dot]` are decoded.

**Can I scrape thousands of channels?** Yes, up to 5000 per run. Use Category or Search to discover them, and `maxResults` to control cost.

**Which categories work?** Any Twitch category — the name must match exactly (e.g. `Grand Theft Auto V`, `Just Chatting`).

### Legal & compliance

This actor collects only **publicly available** information that Twitch serves to anonymous visitors (channel About text, public info panels, and public profile fields). It does not bypass authentication or access private data. You are responsible for using the scraped data in compliance with Twitch's Terms of Service, the GDPR/CCPA, and any applicable anti-spam laws (e.g. CAN-SPAM). Use business emails for legitimate, consent-respecting outreach only.

### Related actors

- **youtube-channel-email-extractor** — same contact-enrichment job for YouTube.
- **instagram-profile-scraper** — bios, contact info, and stats for Instagram.
- **contact-details-scraper** — emails, phones, and socials from any website.

# Actor input Schema

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

Twitch channels to scrape directly. Accepts bare logins, @handles, or full URLs (e.g. "pokimane", "@shroud", "https://twitch.tv/ninja"). Use this when you already know the channels. Leave empty to discover channels via Category or Search instead.

## `startUrls` (type: `array`):

Alternative to Usernames: a list of full twitch.tv channel URLs as plain strings. Merged with Usernames if both are set. Use this when your source system outputs URLs. Not for category/directory URLs — only channel pages.

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

Discover live streamers in a Twitch category and scrape them. Must match the Twitch category name exactly (e.g. "Just Chatting", "Valorant", "Grand Theft Auto V"). Used only when Usernames/URLs are empty. NOT a keyword search — for fuzzy matching use Search query.

## `searchQuery` (type: `string`):

Find Twitch channels matching a free-text keyword, then scrape them (e.g. "valorant", "speedrun", "cooking"). Used only when Usernames/URLs and Category are empty. Returns up to ~100 channels. NOT an exact category — for a full game directory use Category.

## `maxResults` (type: `integer`):

Maximum number of channels to scrape this run. Caps cost and runtime. Defaults to 100; hard maximum 5000. In category/search modes this also bounds how many channels are discovered.

## `onlyWithEmail` (type: `boolean`):

When enabled, channels without any extracted email are processed but NOT written to the dataset, so you only pay the channel-scraped fee and get a clean leads-only output. Defaults to false (every channel is emitted). Useful for pure lead-generation runs.

## `proxyConfiguration` (type: `object`):

Proxy settings used for Twitch GraphQL requests. Defaults to Apify Proxy (datacenter) for IP rotation on large jobs. Twitch's public API is global, so datacenter proxy is sufficient; you rarely need to change this.

## Actor input object example

```json
{
  "usernames": [
    "pokimane",
    "https://twitch.tv/ninja"
  ],
  "startUrls": [
    "https://www.twitch.tv/pokimane"
  ],
  "category": "Just Chatting",
  "searchQuery": "valorant",
  "maxResults": 100,
  "onlyWithEmail": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

One record per Twitch channel with emails, social links, and channel stats. Download as JSON, CSV, Excel, HTML, or RSS.

# 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": [
        "pokimane",
        "shroud"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/twitch-email-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 = {
    "usernames": [
        "pokimane",
        "shroud",
    ],
    "maxResults": 100,
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "pokimane",
    "shroud"
  ],
  "maxResults": 100
}' |
apify call khadinakbar/twitch-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/twitch-email-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Twitch Email Scraper",
        "description": "Extract business emails and social links from Twitch channels by username, category, or keyword. HTTP-only, cookieless, MCP-ready.",
        "version": "0.1",
        "x-build-id": "GtDnjHg6PqZ4r3ScW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~twitch-email-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-twitch-email-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~twitch-email-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-twitch-email-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~twitch-email-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-twitch-email-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "usernames": {
                        "title": "Twitch usernames or URLs",
                        "type": "array",
                        "description": "Twitch channels to scrape directly. Accepts bare logins, @handles, or full URLs (e.g. \"pokimane\", \"@shroud\", \"https://twitch.tv/ninja\"). Use this when you already know the channels. Leave empty to discover channels via Category or Search instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Twitch channel URLs (alternative)",
                        "type": "array",
                        "description": "Alternative to Usernames: a list of full twitch.tv channel URLs as plain strings. Merged with Usernames if both are set. Use this when your source system outputs URLs. Not for category/directory URLs — only channel pages.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "category": {
                        "title": "Category / game name",
                        "type": "string",
                        "description": "Discover live streamers in a Twitch category and scrape them. Must match the Twitch category name exactly (e.g. \"Just Chatting\", \"Valorant\", \"Grand Theft Auto V\"). Used only when Usernames/URLs are empty. NOT a keyword search — for fuzzy matching use Search query."
                    },
                    "searchQuery": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Find Twitch channels matching a free-text keyword, then scrape them (e.g. \"valorant\", \"speedrun\", \"cooking\"). Used only when Usernames/URLs and Category are empty. Returns up to ~100 channels. NOT an exact category — for a full game directory use Category."
                    },
                    "maxResults": {
                        "title": "Max channels",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of channels to scrape this run. Caps cost and runtime. Defaults to 100; hard maximum 5000. In category/search modes this also bounds how many channels are discovered.",
                        "default": 100
                    },
                    "onlyWithEmail": {
                        "title": "Only output channels with an email",
                        "type": "boolean",
                        "description": "When enabled, channels without any extracted email are processed but NOT written to the dataset, so you only pay the channel-scraped fee and get a clean leads-only output. Defaults to false (every channel is emitted). Useful for pure lead-generation runs.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings used for Twitch GraphQL requests. Defaults to Apify Proxy (datacenter) for IP rotation on large jobs. Twitch's public API is global, so datacenter proxy is sufficient; you rarely need to change this.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
