# Twitch Clip Details Scraper (`scrapingmonkey/twitch-clip-details-scraper`) Actor

Extract public Twitch clip metadata including titles, broadcasters, categories, languages, durations, views, thumbnails, and video offsets.

- **URL**: https://apify.com/scrapingmonkey/twitch-clip-details-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

Extract public Twitch clip metadata from links or clip slugs. **Twitch Clip Details Scraper** returns clip identity, title, channel, category, language, views, duration, thumbnail and available VOD offset information.

Turn a selected clip list into a structured reference catalog with each clip’s public context kept in one row.

| At a glance | Details |
|---|---|
| 📥 Input | Enter Twitch clip slugs, clips.twitch.tv URLs, or official channel /clip/ URLs. Supported tracking parameters are accepted. |
| 📤 Output | One clip per success row, with source input retained |
| 📄 Pagination | Each clip is an individual lookup. There is no result-page setting. |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 HTTP requests concurrently with automatic retries |
| 💾 Delivery | One Apify dataset view, useful flat columns and complete nested JSON |

### What the Twitch Clip Details scraper collects 📦

The Actor retrieves each selected clip and its available source-video context. It does not require scanning the channel’s clip list first.

Data can include:

- Clip ID, slug, canonical URL and title
- Broadcaster channel and category when supplied
- Language, views and duration in seconds
- Available thumbnail reference
- VOD offset and featured or curation flags when returned

### How to collect clip details from Twitch 🚀

1. Enter one or more supported inputs in `inputList`.
2. Review the supported input format.
3. Start the Actor.
4. Open the **Clip details** dataset view and review the individual records.
5. Export the dataset or retrieve it from your application.

```json
{
  "inputList": [
    "https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ"
  ]
}
```

Each clip is an individual lookup. There is no result-page setting.

### Twitch clip details data and complete output 📦

| Field | Type | Meaning |
|---|---|---|
| `input` | string | Original submitted input. |
| `status` | string | Result status: success or failed. |
| `type` | string or null | Normalized result entity type. |
| `id` | string or null | Identifier of this object, preserved as a string. |
| `slug` | string or null | Public identifier used in this object’s URL. |
| `url` | string or null | Public source URL for this object. |
| `title` | string or null | Public title supplied for this object. |
| `language` | string or null | Source language code supplied for the clip. |
| `duration_seconds` | number or null | Duration in seconds, retaining fractional values when supplied. |
| `view_count` | integer or null | Visible view count at collection time; not a unique-viewer estimate. |
| `thumbnail_url` | string or null | Available thumbnail image URL. |
| `video_offset_seconds` | integer or null | Available start offset of the clip within its source VOD, in seconds. |
| `is_featured` | boolean or null | Source flag indicating a featured clip when supplied. |
| `is_auto_curated` | boolean or null | Source flag indicating automatic clip curation when supplied. |
| `broadcaster` | object or null | Public channel associated with the clip. |
| `broadcaster.id` | string or null | Identifier of this object, preserved as a string. |
| `broadcaster.login` | string or null | Twitch channel login used in its public URL. |
| `broadcaster.display_name` | string or null | Public display name, preserving the source capitalization. |
| `broadcaster.url` | string or null | Public source URL for this object. |
| `broadcaster.profile_image_url` | string or null | Available public channel profile-image URL. |
| `broadcaster.primary_color_hex` | string or null | Public channel theme color in hexadecimal form. |
| `broadcaster.is_partner` | boolean or null | Public Twitch Partner flag when supplied. |
| `game` | object or null | Available game or category metadata for the parent object. |
| `game.id` | string or null | Identifier of this object, preserved as a string. |
| `game.slug` | string or null | Public identifier used in this object’s URL. |
| `game.name` | string or null | Public name of this blog or nested object. |
| `game.display_name` | string or null | Public display name, preserving the source capitalization. |
| `game.url` | string or null | Public source URL for this object. |
| `game.box_art_url` | string or null | Available category or game cover-image URL. |
| `participants` | array or null | Available participant channel references returned for the clip. |
| `participants[].id` | string or null | Identifier of this object, preserved as a string. |
| `participants[].login` | string or null | Twitch channel login used in its public URL. |
| `participants[].display_name` | string or null | Public display name, preserving the source capitalization. |
| `participants[].url` | string or null | Public source URL for this object. |
| `participants[].profile_image_url` | string or null | Available public channel profile-image URL. |
| `participants[].primary_color_hex` | string or null | Public channel theme color in hexadecimal form. |
| `participants[].is_partner` | boolean or null | Public Twitch Partner flag when supplied. |

Every top-level output field appears in these complete examples. The success example is normalized from a public response; its values are a snapshot and can change. Nested arrays remain inside their parent result.

Complete representative success result:

```json
{
  "input": "https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ",
  "status": "success",
  "type": "clip",
  "id": "2358589597",
  "slug": "TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ",
  "url": "https://clips.twitch.tv/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ",
  "title": "F Shroud",
  "language": "EN",
  "duration_seconds": 28,
  "view_count": 562646,
  "thumbnail_url": "https://static-cdn.jtvnw.net/twitch-video-assets/twitch-vap-video-assets-prod-us-west-2/5696a6a8-e053-4c2e-a54c-5ca62c48102e/landscape/thumb/thumb-0000000000-1920x1080.jpg",
  "video_offset_seconds": 48930,
  "is_featured": false,
  "is_auto_curated": false,
  "broadcaster": {
    "id": "37402112",
    "login": "shroud",
    "display_name": "shroud",
    "url": "https://www.twitch.tv/shroud",
    "profile_image_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/c754eebf-745b-4e0a-814a-10bcaecaabbc-profile_image-70x70.png",
    "primary_color_hex": "00ADFF",
    "is_partner": null
  },
  "game": {
    "id": "515024",
    "slug": "diablo-iv",
    "name": "Diablo IV",
    "display_name": "Diablo IV",
    "url": "https://www.twitch.tv/directory/category/diablo-iv",
    "box_art_url": null
  },
  "participants": null
}
```

Complete failed result:

```json
{
  "input": "https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ",
  "status": "failed",
  "type": null,
  "id": null,
  "slug": null,
  "url": null,
  "title": null,
  "language": null,
  "duration_seconds": null,
  "view_count": null,
  "thumbnail_url": null,
  "video_offset_seconds": null,
  "is_featured": null,
  "is_auto_curated": null,
  "broadcaster": null,
  "game": null,
  "participants": null
}
```

A failed row preserves `input`, sets `status` to `failed`, and sets every other top-level field to `null`. The run log records the reason. Optional successful fields can be null or empty when Twitch does not supply them. Object fields are exposed through useful columns in the single **Clip details** view; arrays are not expanded into extra result rows.

### Input requirements and pagination settings ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | array of strings | Yes | None | Enter Twitch clip slugs, clips.twitch.tv URLs, or official channel /clip/ URLs. Supported tracking parameters are accepted. At least `1` item. |

Enter supported clip URLs or clip slugs. A clip slug is the identifier in its public link; a numeric video ID belongs in Video Details Scraper.

Enter a clip slug, a `https://clips.twitch.tv/SLUG` URL or a `https://www.twitch.tv/CHANNEL/clip/SLUG` URL. Plain channel links and `/videos/ID` links are different input types and do not identify a clip.

Duplicate normalized inputs are processed once. Within the collection for one source input, repeated records are removed while distinct interactions or objects remain separate. The same object returned for different source inputs retains its source relationship.

There is no result-page setting. Each unique target is looked up individually, and nested fields remain within that result row.

### Twitch clip details use cases 🎯

#### Clip reference catalogs

Keep titles, channels, categories and thumbnails for selected public clips.

#### Source-video reference review

Preserve available VOD offsets for later manual checks.

#### Clip metadata comparisons

Compare duration, language and visible views in your own spreadsheet.

### Pricing and saved-result behavior 💰

Check the Actor’s **Pricing** tab for the active pricing model and current rate. Store settings can change, so this README does not claim a fixed price or runtime.

Under dataset-item pricing:

- Each successful result represents one clip for its source input.
- An invalid or unavailable input, an input with no accessible results, or an exhausted request can produce a `failed` row.
- Retry attempts and supporting requests do not create extra dataset rows by themselves.
- Nested media, profile information and other arrays remain part of their parent row.
- A normal empty continuation after earlier successes creates no additional row.
- Saved failed rows are not assumed to be free; check their treatment in the active pricing configuration.

More inputs can produce more saved rows. Start with a small run and check actual usage before increasing the workload.

### Twitch clip details API 🔌

Replace `$ACTOR_ID` with the identifier shown in this Actor’s **API** tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ"]}'
```

Download the dataset in JSON, CSV, Excel or other formats available in the Console, or retrieve it through the Apify API. Use schedules, webhooks and Apify integrations to connect results to Google Sheets, Make, Zapier, cloud storage or your own application. These connections are configured separately by the user.

### Reliability, retries, and public-data limits ⚠️

Collection uses pure HTTP with up to five concurrent requests. Invalid syntax and confirmed missing, removed or unavailable targets stop without unnecessary retries. Temporary network or proxy failures, timeouts, blocking responses, malformed data, throttling and server errors allow up to five total attempts per request.

Successful earlier pages remain saved if a later request fails. A normal end after saved results is not retried. An input with no accessible results can receive a failed row; that alone does not prove that its underlying source does not exist. An exhausted later request can add a failed row while preserving previous output.

Clip metadata does not include a complete channel-clip list, clip comments, media downloads or a guaranteed accessible source VOD. Offset and optional category fields can be null.

Twitch controls public availability, ranking and optional fields. Result counts can be affected by duplicates, removed content and changes during a run. A page budget is a collection limit, not a promise of exhaustive coverage.

An invalid string within a valid input list does not stop other inputs. Invalid overall configuration, such as a non-string list item or a wrong page-count type, exits before source requests. Startup failures, unavailable dataset storage or an unrecoverable result-save error can still stop the whole run. A failed save is not retried as a new scraping request.

### Frequently asked questions ❓

#### Does it find every clip from a channel?

No. It processes the specific clip links or slugs you submit.

#### Can it return where the clip starts in the source video?

It retains the available VOD offset. An offset can be missing and does not guarantee that the source video remains accessible.

#### Does it collect clip comments?

No. Clip comments are outside this Actor’s output.

#### Does it require a Twitch account or personal cookies?

No. You do not need to provide a Twitch account, password or personal session cookie. Collection uses HTTP without opening a browser.

#### What happens to invalid or unavailable inputs?

Invalid individual inputs are recorded as failed without a source request. Confirmed missing or unavailable targets stop without unnecessary retries. Temporary failures allow up to five total attempts per request; other inputs and earlier saved results remain available.

#### Can I export results or run the same input again?

Yes. Export the default dataset or retrieve it through the Apify API. You can create an Apify schedule and connect completed runs to your own workflow.

### Support, responsible use, and related actors 🛟

For a reproducible issue, use the Actor’s **Issues** tab and provide the run ID, approximate time, a safe public input, expected behavior and actual result. Include the mode or page budget when relevant. Never share access tokens, personal cookies or proxy credentials.

Use public data responsibly and follow applicable privacy, copyright, contractual and platform requirements before storing, analyzing or redistributing collected information.

# Actor input Schema

## `inputList` (type: `array`):

Enter Twitch clip slugs, clips.twitch.tv URLs, or official channel /clip/ URLs. Supported tracking parameters are accepted.

## Actor input object example

```json
{
  "inputList": [
    "https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ"
  ]
}
```

# Actor output Schema

## `clips` (type: `string`):

One dataset row per public result. Check success or failed status.

# 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 = {
    "inputList": [
        "https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/twitch-clip-details-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 = { "inputList": ["https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/twitch-clip-details-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 '{
  "inputList": [
    "https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ"
  ]
}' |
apify call scrapingmonkey/twitch-clip-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/twitch-clip-details-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/xLDydMl14357m1vWf/builds/2a9mS8RRYBBsmbNnM/openapi.json
