{
  "openapi": "3.0.1",
  "info": {
    "title": "GoodShort Scraper - Catalog, Episodes & Engagement",
    "description": "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.",
    "version": "0.1",
    "x-build-id": "yvq39XsBdddHJzZT7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~goodshort-catalog-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-goodshort-catalog-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/abotapi~goodshort-catalog-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-goodshort-catalog-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/abotapi~goodshort-catalog-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-goodshort-catalog-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "TRENDING",
              "GENRE",
              "TAG",
              "SEARCH",
              "FULL_CATALOG",
              "URLS"
            ],
            "type": "string",
            "description": "TRENDING reads the homepage rails. GENRE walks genre pages. TAG searches tags (or sweeps the tag index). SEARCH runs keyword searches. FULL_CATALOG walks every genre plus the tag index. URLS scrapes pasted GoodShort links.",
            "default": "TRENDING"
          },
          "genres": {
            "title": "Genres",
            "type": "array",
            "description": "Genre names for GENRE mode (Fantasy, Urban, Romance, Thriller, Superpower, Ancient, Action, Myth, Sci-Fi, LGBTQIA+, Suspense). Leave empty for all 11 genres.",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags",
            "type": "array",
            "description": "Tag keywords for TAG mode (e.g. revenge, ceo, billionaire). Each tag is searched through all its pages.",
            "items": {
              "type": "string"
            }
          },
          "crawlTagIndex": {
            "title": "Sweep the whole tag index",
            "type": "boolean",
            "description": "Walk every tag on the tag index (/tags/all, thousands of tags) in TAG or FULL_CATALOG mode. Slow and large: combine with Max items.",
            "default": false
          },
          "maxTags": {
            "title": "Max tags to sweep",
            "type": "integer",
            "description": "Stop the tag-index sweep after this many tags. Blank or 0 means every tag on the index."
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keywords for SEARCH mode. Each keyword is walked through all its result pages.",
            "default": [
              "billionaire"
            ],
            "items": {
              "type": "string"
            }
          },
          "listingUrls": {
            "title": "GoodShort URLs",
            "type": "array",
            "description": "GoodShort URLs for URLS mode: title pages (goodshort.com/drama/...), episode pages (resolve to their title), genre pages (/dramas/...), tag pages (/tag/...), the tag index (/tags/all), channels (/channel/...) and searches (/search/...).",
            "default": [
              {
                "url": "https://www.goodshort.com/drama/nanny-for-hire-mommy-forever-31001684652"
              },
              {
                "url": "https://www.goodshort.com/episode/nanny-for-hire-mommy-forever-31001684652/001-62495257"
              },
              {
                "url": "https://www.goodshort.com/tag/revenge-playlets-videos"
              },
              {
                "url": "https://www.goodshort.com/dramas/romance-137-playlets"
              },
              {
                "url": "https://www.goodshort.com/channel/Most-Trending"
              },
              {
                "url": "https://www.goodshort.com/search/billionaire"
              },
              {
                "url": "https://www.goodshort.com/tags/all"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "fetchDetails": {
            "title": "Full title enrichment",
            "type": "boolean",
            "description": "Fetch each title's full profile: synopsis, exact views, follows, full tag list, author, status, dates, related titles and the episode list. Adds the detail-enrichment charge per title. Without it you still get the browse card: id, title, url, cover, genres and engagement counts.",
            "default": true
          },
          "fetchEpisodes": {
            "title": "Collect full episode lists",
            "type": "boolean",
            "description": "Walk every episode page of each enriched title: number, duration, price, free/paid, publish time and stream URL. Part of detail enrichment, no extra charge.",
            "default": true
          },
          "maxEpisodes": {
            "title": "Max episodes per title",
            "type": "integer",
            "description": "Stop collecting episodes per title after this many. 0 means every episode."
          },
          "maxPages": {
            "title": "Max pages per browse",
            "type": "integer",
            "description": "How many browse pages (genre, search, tag) to walk per scope. Leave blank or 0 for unlimited until Max items is reached."
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Stop after this many title records. Episodes nested inside a title do not count as items. 0 means no limit.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "The catalog API answers from any exit; residential is the default for consistency. For large or frequent runs, the residential proxy group gives more headroom."
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "ID of an interrupted run to continue. The run picks up after the last title already saved. Leave empty for a fresh run."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "Compare titles against the previous run for the same scope (state key) and only emit NEW or UPDATED rows (plus optional EXPIRED tombstones). Unchanged titles are skipped and not charged.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Name of the remembered baseline for incremental mode. Defaults to a hash of the current scope, so two runs with the same settings compare against each other automatically."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records",
            "type": "boolean",
            "description": "In incremental mode, also emit rows classified UNCHANGED (handy for full snapshots or debugging).",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired tombstones",
            "type": "boolean",
            "description": "In incremental mode, emit an EXPIRED row for titles present in the baseline but missing from this run. Tombstones respect Max items.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Extra dataset fields that must NOT mark a record UPDATED when they change (engagement counters and signed stream URLs are ignored by default).",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per title, not the full JSON — the complete record stays in the dataset. Leave empty to skip.",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}