# Twitch Search & Streams Scraper (`cirkit/twitch-search-scraper`) Actor

Search Twitch channels, live streams, VODs and categories, no OAuth needed. Keyword search runs to Twitch's natural end (~1,000 channels per term, not 30) and category runs slice by language to beat Twitch's 30-row cap. Returns followers, viewers, uptime, category, tags, partner status.

- **URL**: https://apify.com/cirkit/twitch-search-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** Social media
- **Stats:** 6 total users, 4 monthly users, 94.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.30 / 1,000 result extracteds

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

## Twitch Search & Streams Scraper

**Scrape Twitch channels, live streams, VODs, and categories** with no OAuth application required. This **Twitch scraper** returns follower counts, live viewer counts, stream title and uptime, game and category, broadcaster language, tags, and partner or affiliate status.

No Twitch API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Twitch Search & Streams Scraper?

Twitch Search & Streams Scraper is an [Apify Actor](https://apify.com/actors) that extracts channels, live streams, VODs, and categories from [Twitch](https://www.twitch.tv) and returns them as clean, structured records. It goes deeper than Twitch's own interface allows: keyword search runs to its natural end at roughly 1,000 channels per term rather than stopping at 30, and category runs slice by language to break past Twitch's 30-row cap.

### What data can this Twitch scraper extract?

Every run writes one row per channel or stream. The full schema carries **46 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `recordType` | string | channel, video, category, or no_results for the single explanatory row written when a run legitimately matches... |
| `id` | string | Twitch numeric id for the channel, video or category. Stable across runs and the join key back to Twitch's own API. |
| `login` | string | Channel name as it appears in the twitch.tv URL, lowercase. The natural key for channel rows. |
| `displayName` | string | Channel name as the streamer capitalises it, including non-Latin scripts. |
| `name` | string | Category name. Category rows only. |
| `slug` | string | Category URL slug. Category rows only. |
| `url` | string | Canonical twitch.tv URL for the channel, video or category. |
| `title` | string | Video title. Video rows only. |
| `description` | string | Channel bio, or video description on video rows. |
| `profileImageUrl` | string | 300x300 channel avatar. |
| `primaryColorHex` | string | Channel accent colour as a hex string. |
| `accountCreatedAt` | string | ISO 8601 timestamp the Twitch account was registered. Useful for filtering out brand-new accounts. |
| `followers` | integer | Total follower count at scrape time. |
| `isPartner` | boolean | Whether the channel holds Twitch Partner status. |
| `isAffiliate` | boolean | Whether the channel holds Twitch Affiliate status. |
| `isStaff` | boolean | Whether the account belongs to Twitch staff. Twitch reports true or null rather than false, so null is normalised... |
| `isLive` | boolean | Whether the channel was broadcasting at the moment this row was scraped. |
| `streamId` | string | Id of the live broadcast. Null when the channel is offline. |
| `streamTitle` | string | Current stream title, falling back to the channel's configured title when offline. |
| `viewersCount` | integer | Concurrent viewers right now. Null when offline. |
| `streamStartedAt` | string | ISO 8601 timestamp the current broadcast began. |
| `streamUptimeSeconds` | integer | Seconds the current broadcast has been live, computed against the scrape time. |

See the **Output** tab in Apify Console for all 46 fields.

### How to scrape Twitch channels and streams

1. Open [Twitch Search & Streams Scraper](https://apify.com/cirkit/twitch-search-scraper) and click **Try for free**.
2. Pick a `mode` — channel search, live streams, VODs, or categories.
3. Add `searchTerms`, `categories`, or specific `channels`.
4. Filter with `languages`, `onlyLive`, and `minViewers`, and set `sortBy`.
5. Set `maxItems` to bound the run.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Twitch Search & Streams Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `mode` | string | Search runs a keyword search across Twitch. Category pulls the live streams currently in one or more directory... | **yes** |
| `searchTerms` | array | Keywords to search, one per line. Used only in Search mode. Each term is paginated to Twitch's natural end, which is... | `["valorant"]` |
| `searchIndex` | string | Which Twitch index to search. Channels and Videos paginate deeply. Categories returns a single page of about 29... | `"channels"` |
| `categories` | array | Directory categories to pull live streams from, used only in Category mode. Type them as they appear on Twitch, for... |  |
| `languages` | array | Which broadcaster languages to pull, used only in Category mode. Twitch serves at most 30 streams per request, so... |  |
| `channels` | array | Channel names or twitch.tv URLs to look up, used only in Channels mode. Returns the same row shape as the other... |  |
| `maxItems` | integer | Hard cap on rows written to the dataset across every term, category or channel in this run. You are billed per row,... | `100` |
| `sortBy` | string | Ordering for Category mode. Highest viewers first is the Twitch default; lowest viewers first surfaces small... | `"VIEWER_COUNT"` |
| `onlyLive` | boolean | Drop channels that are not broadcasting at the moment this runs. Filtering happens before billing, so you are never... | `false` |
| `minViewers` | integer | Drop live channels below this concurrent viewer count. Applied before billing. Leave empty for no floor. |  |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "mode": "search",
  "searchTerms": ["valorant", "speedrun"],
  "searchIndex": "channels",
  "maxItems": 500
}
```

### How much does it cost to scrape Twitch?

This Actor runs on **pay per result** pricing: **$0.0013 per record** ($1.3 per 1,000).

| Results | Approximate cost |
| --- | --- |
| 1,000 | $1.30 |
| 10,000 | $13.00 |
| 100,000 | $130.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Twitch Search & Streams Scraper at no cost.

### What can you build with Twitch data?

#### Find streamers for sponsorship campaigns

Follower counts, live viewer counts, and language filters let you build a shortlist matched to a campaign's audience and budget rather than to whoever appears on the front page.

#### Track a game's streaming footprint

Category runs show how many channels and viewers a title actually commands — the metric publishers use to judge a launch.

#### Monitor competitor streamers

Uptime, viewer counts, and stream titles over time reveal schedule and content strategy.

#### Research the live-streaming market

Partner and affiliate flags across a category show how professionalised a niche has become.

#### Build a discovery or analytics product

Consistent channel records with stable IDs make Twitch data straightforward to aggregate and serve.

### Twitch scraping tips and limits

- Twitch's own search UI shows only about 30 results. This Actor runs to roughly 1,000 channels per search term, which is why a broad term returns far more here than in the browser.
- Category runs are sliced by language to beat Twitch's 30-row cap — set `languages` explicitly for the markets you care about.
- Live viewer counts are a point-in-time snapshot. For meaningful averages, schedule repeated runs across the day rather than reading a single number.
- `onlyLive` plus `minViewers` is the fastest way to filter down to channels with real current audiences.

### Integrations and automation

Run Twitch Search & Streams Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Twitch dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [YouTube Search Scraper](https://apify.com/cirkit/youtube-search-scraper) | Video-side audience research on YouTube. |
| [YouTube Channel Scraper](https://apify.com/cirkit/youtube-channel-scraper) | YouTube channel profiles and full video lists. |
| [Steam Store Search Scraper](https://apify.com/cirkit/steam-store-search-scraper) | Game catalog, pricing, and review scores. |
| [Google Trends Scraper](https://apify.com/cirkit/google-trends-scraper) | Search demand for the games and creators you track. |

### Frequently asked questions

#### Do I need a Twitch developer account?

No. This Actor requires no OAuth application, no client ID, and no developer registration.

#### How many channels can I get for one search term?

Roughly 1,000 per term, which is where Twitch's own search naturally ends — far beyond the 30 the web interface displays.

#### Do I need a Twitch API key?

No. Twitch Search & Streams Scraper reads publicly available Twitch pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Twitch data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Twitch Search & Streams Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Twitch?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public channel and stream information Twitch publishes publicly, including broadcaster display names. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Twitch page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

## `mode` (type: `string`):

Search runs a keyword search across Twitch. Category pulls the live streams currently in one or more directory categories. Channels looks up a known list of channel names directly.

## `searchTerms` (type: `array`):

Keywords to search, one per line. Used only in Search mode. Each term is paginated to Twitch's natural end, which is roughly 1,000 channels or 700 videos per term.

## `searchIndex` (type: `string`):

Which Twitch index to search. Channels and Videos paginate deeply. Categories returns a single page of about 29 matches, because that is all Twitch's category index will serve.

## `categories` (type: `array`):

Directory categories to pull live streams from, used only in Category mode. Type them as they appear on Twitch, for example "Just Chatting" or "VALORANT". Slugs ("just-chatting") and directory URLs also work.

## `languages` (type: `array`):

Which broadcaster languages to pull, used only in Category mode. Twitch serves at most 30 streams per request, so this actor asks once per language to get past that cap - more languages means more streams. Leave empty to sweep the twelve languages that carry the most Twitch inventory.

## `channels` (type: `array`):

Channel names or twitch.tv URLs to look up, used only in Channels mode. Returns the same row shape as the other modes, live or offline.

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

Hard cap on rows written to the dataset across every term, category or channel in this run. You are billed per row, so this is also your cost ceiling. Must be 1 or more.

## `sortBy` (type: `string`):

Ordering for Category mode. Highest viewers first is the Twitch default; lowest viewers first surfaces small channels, which is what influencer discovery usually wants.

## `onlyLive` (type: `boolean`):

Drop channels that are not broadcasting at the moment this runs. Filtering happens before billing, so you are never charged for rows this removes. Category mode is always live by definition.

## `minViewers` (type: `integer`):

Drop live channels below this concurrent viewer count. Applied before billing. Leave empty for no floor.

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

Twitch's public GraphQL endpoint answers datacenter proxies, so the default Apify proxy is enough - residential is not needed and would cost roughly ten times more.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "valorant",
    "speedrun"
  ],
  "searchIndex": "channels",
  "categories": [
    "Just Chatting",
    "VALORANT"
  ],
  "languages": [
    "EN",
    "ES",
    "PT"
  ],
  "channels": [
    "shroud",
    "https://www.twitch.tv/kaicenat"
  ],
  "maxItems": 100,
  "sortBy": "VIEWER_COUNT",
  "onlyLive": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every Twitch channel, stream, video or category matched by this run, one row each.

## `resultsCsv` (type: `string`):

The same results as a downloadable CSV file.

# 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 = {
    "mode": "search",
    "searchTerms": [
        "valorant"
    ],
    "searchIndex": "channels",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/twitch-search-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 = {
    "mode": "search",
    "searchTerms": ["valorant"],
    "searchIndex": "channels",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/twitch-search-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 '{
  "mode": "search",
  "searchTerms": [
    "valorant"
  ],
  "searchIndex": "channels",
  "maxItems": 100
}' |
apify call cirkit/twitch-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/twitch-search-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/6waiwwhxExKinKT5f/builds/lhMpZjbdny2SLdQKa/openapi.json
