GoodShort Scraper - Catalog, Episodes & Engagement
Pricing
from $1.20 / 1,000 title records
GoodShort Scraper - Catalog, Episodes & Engagement
Scrape the GoodShort short-drama catalog: titles with exact views, follows, genres and trope tags, synopses, covers, full episode lists with prices and stream URLs. Browse trending rails, genres, tags and search, or paste title and listing URLs. Resume, incremental updates and MCP export included.
Pricing
from $1.20 / 1,000 title records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
GoodShort Scraper: Short-Drama Catalog, Episodes & Engagement
GoodShort Scraper turns GoodShort into a clean short-drama data API. Get title listings with exact views, follows, genres and trope tags, full episode lists with prices, durations and stream URLs, synopses, covers and engagement signals. Browse trending rails, genres, tags and keyword search, or paste title and listing URLs, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Five ways in. Browse trending rails, genres, tags and the full tag index, run keyword searches, or paste title, episode, genre, tag, channel and search URLs. No URL building needed.
- Full episode depth. Every enriched title carries its complete episode list with per-episode price, free/paid flags, durations, publish times and stream URLs, plus free-episode counts and where the paywall starts.
- Engagement signals. Exact views alongside the on-site display string, follower counts, praise counts, per-episode durations and a derived 0-100 lead score per title.
- Catalog breadth. Genre pages plus the whole tag index reach thousands of titles, far beyond the homepage rails.
- Related titles. Every enriched title carries its recommendations with links for crawl expansion.
- Built for schedules. Incremental mode returns only new and changed titles on recurring runs, and a refused run fails loudly instead of returning an empty dataset.
Use Cases
- Content analysts: track what is charting across genres and tags with exact views and follow counts.
- Licensors and studios: map trope-tag coverage, episode counts, paywall depth and release cadence across thousands of titles.
- Lead generation teams: collect author handles, title metadata and engagement tiers for outreach.
- AI agents and dashboards: feed structured catalog and episode data into your own tools.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id / title / url | "31001684652" / "Sample Drama" / GoodShort link to the title |
views / viewsDisplay / viewsDisplayParsed | 1002215 / "3.1M" / 3100000 |
follows / praiseCount | 518830 / 24196 |
episodeCount / episodesCollected | 62 / 62 |
genres / tags / tagUrls | ["Romance"] / ["Billionaire", "Revenge"] / tag page links |
description / cover | synopsis / cover image URL |
author / studio | "nana" (author handle, both keys) |
status / language / novelType | "Completed" / "ENGLISH" / "ORIGINAL" |
releaseDate / lastChapterName / lastUpdatedAt | "2025-08-15" / "062" / last update time |
freeEpisodes / hasPaidEpisodes / paidFromEpisode | 8 / true / "009" |
totalPlayTimeSec | 11811 (summed episode durations) |
episodes | number, duration, price, free/paid, publish time, stream URL, prev/next ids |
relatedTitles | recommended titles with URLs |
leadScore | 87.5 (derived 0-100 score) |
rail / genre / tag / searchQuery | discovery context of the row |
A note on reviews: GoodShort publishes no user reviews, comments or ratings on any public surface (every counter is zero upstream and no comment endpoint exists), so this actor ships engagement signals instead of a reviews dataset.
How to Use
- Pick a mode:
Trending rails,Browse by genre,Browse by tag,Keyword search,Full catalogorScrape pasted URLs. - For browse modes, narrow by genre, tag or keyword; for URLs, paste GoodShort links.
- Switch on Full title enrichment and Collect full episode lists as needed.
- Set Max items to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Trending now:
{"mode": "TRENDING","fetchDetails": true,"maxItems": 20}
One genre, cards only:
{"mode": "GENRE","genres": ["Romance"],"fetchDetails": false,"maxItems": 100}
Tag sweep with enrichment:
{"mode": "TAG","tags": ["revenge", "billionaire"],"fetchDetails": true,"maxItems": 200}
Paste links (titles, episodes, genres, tags, channels, searches):
{"mode": "URLS","listingUrls": [{ "url": "https://www.goodshort.com/drama/sample-drama-31001684652" },{ "url": "https://www.goodshort.com/tag/revenge-playlets-videos" }],"fetchDetails": true,"maxItems": 50}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/goodshort-catalog-scraper").call(run_input={"mode": "TRENDING", "maxItems": 10})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["views"], item["episodeCount"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/goodshort-catalog-scraper').call({ mode: 'TRENDING', maxItems: 10 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How maxItems shapes a browse
Genre, search and tag scopes come in pages (about 12 titles each). A run stops once maxItems is reached, so a capped run returns the strongest matches first. To collect a whole scope, raise maxItems or set it to 0, and optionally cap pages with maxPages.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same scope. Each title is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only withemitExpired, and never billed past yourmaxItems).stateKeynames or shares the stored state. Rotating fields such as signed stream URLs, view counters and related-title rails never mark a title as updated. With incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | TRENDING | TRENDING, GENRE, TAG, SEARCH, FULL_CATALOG or URLS. |
genres | array | all 11 | Genre names for GENRE mode; empty means every genre. |
tags | array | (none) | Tag keywords for TAG mode. |
crawlTagIndex | boolean | false | Sweep the whole tag index in TAG or FULL_CATALOG mode. |
maxTags | integer | unlimited | Stop the tag-index sweep after this many tags. |
searchQueries | array | billionaire | Keywords for SEARCH mode. |
listingUrls | array | sample | GoodShort URLs for URLS mode. |
fetchDetails | boolean | true | Full title enrichment. Adds the detail-enrichment charge per title. |
fetchEpisodes | boolean | true | Full episode lists. Part of detail enrichment, no extra charge. |
maxEpisodes | integer | unlimited | Stop collecting episodes per title after this many. |
maxPages | integer | unlimited | Browse pages per scope; blank or 0 = unlimited. |
maxItems | integer | 20 | Stop after this many titles (0 = no limit). |
proxy | object | residential | Connection setting. Residential exits are the default. |
resumeFromRunId | string | (none) | Continue one interrupted run. |
incrementalMode | boolean | false | Return only new and changed titles on scheduled runs. |
stateKey | string | (none) | Name or share an incremental-mode state. |
emitUnchanged | boolean | false | Also return (and bill) unchanged titles. |
emitExpired | boolean | false | Also return (and bill) expired titles. |
ignoreFieldsForChanges | array | (none) | Extra fields that never mark a title as updated. |
mcpConnectors | array | (none) | Pipe result summaries into your apps via MCP connectors. |
notionParentPageUrl | string | (none) | Notion parent page for the Notion connector. |
maxNotifyListings | integer | 50 | Cap on items written per connector. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
Title record:
{"platform": "goodshort","id": "31001684652","title": "Sample Drama","url": "https://www.goodshort.com/drama/sample-drama-31001684652","views": 1002215,"viewsDisplay": "3.1M","follows": 518830,"episodeCount": 62,"episodesCollected": 62,"genres": ["Romance"],"tags": ["Billionaire", "Revenge"],"author": "nana","status": "Completed","releaseDate": "2025-08-15","freeEpisodes": 8,"paidFromEpisode": "009","episodes": [{ "episodeId": "62495257", "number": "001", "price": 0, "isFree": true }],"leadScore": 87.5,"changeType": "NEW"}
The Episodes output tab (one row per episode) and the Full titles tab (enriched titles) are available as dataset views.
Plan Requirement
The default proxy setting works out of the box, and the actor rotates connections automatically when one is refused. For large or frequent runs, the residential proxy group gives more headroom; pick it under Connection. If your Apify plan does not include proxy access, the run fails with a clear message instead of returning an empty result; a paid plan with proxy access is required.
FAQ
How much does it cost?
You pay per title returned, with full enrichment billed only when you switch it on. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape GoodShort?
This actor collects only publicly available catalog data: titles, episode lists, engagement counts and synopses. You are responsible for how you use it: follow the site's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Titles and counts are generally facts, but cover art, synopses and video streams may be subject to third-party rights.
Can I get only new or changed titles on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated titles, and unchanged ones are not billed.
Why did a run return fewer titles than the site shows?
The run stops at Max items, strongest matches first. Set it higher, or to 0, to collect more of the scope. Episodes attached to a title do not count toward maxItems.
Why did my run fail instead of returning an empty dataset?
If the data source refuses every request, the run stops with a clear message so "no results" is never confused with "nothing could be read". Run it again in a few minutes. If only some titles could be read, you still get what was found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 More scrapers you might like
Pair this actor with these related scrapers from the same team:
| 🧩 WEBTOON Scraper Scrape the WEBTOON catalog into structured data. Extract series, genres, rankings and... | 🧩 AniList Anime & Manga Scraper Scrape AniList anime and manga: titles (romaji/English/native), scores, popularity... |
| ⚽ JioHotstar Scraper Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes... | 🧩 TuneIn Scraper Scrape TuneIn by keyword, category, genre, location or URL. Extract stations and podcasts... |
| 🧩 Anghami Scraper Scrape Anghami's public catalog by keyword or player URL. Rows carry their kind (song... | 🧩 MyAnimeList Scraper Scrape MyAnimeList anime and manga by keyword, ranking chart or URL. Extract titles... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.