{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Scraper: Likes & Dislikes, Comments, Viral Moments",
    "description": "Scrape YouTube search, channels (by name), playlists and videos with no API key: views, exact likes, estimated dislikes (Return YouTube Dislike, opt-in), top comments in each row, hashtags, links. No login. Export to CSV, JSON or Excel, or use via MCP in Claude and Cursor.",
    "version": "0.1",
    "x-build-id": "bLK4lAak7hMffqd9Y"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yugenox~youtube-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yugenox-youtube-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/yugenox~youtube-scraper/runs": {
      "post": {
        "operationId": "runs-sync-yugenox-youtube-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/yugenox~youtube-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-yugenox-youtube-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": {
          "searchTerms": {
            "title": "🔎 Search terms",
            "type": "array",
            "description": "Keywords to search on YouTube, as you'd type in the search bar. One or more.",
            "items": {
              "type": "string"
            }
          },
          "channels": {
            "title": "📺 Channels",
            "type": "array",
            "description": "Channel names, @handles, or channel URLs — pulls all their videos with full data. Great for creator analytics. One or more.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "YouTube video, channel, playlist or search URLs. One or more. (Hashtags go in the Hashtags field below.)",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "#️⃣ Hashtags",
            "type": "array",
            "description": "Hashtags to scrape, like \"lofi\", \"#lofi\" or https://www.youtube.com/hashtag/lofi — the videos on YouTube’s hashtag page (Max items per hashtag). Rows carry `hashtagVideoCount`, the hashtag’s total.",
            "items": {
              "type": "string"
            }
          },
          "findCreators": {
            "title": "🧑‍🎤 Find creators (lead finder)",
            "type": "array",
            "description": "Keywords to find YouTube CHANNELS for — one row per channel with country, joined date, total views, subscribers, social links (Instagram/TikTok/X handles), the \"has business email\" flag, emails the creator published publicly, and recent activity. Filters below.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Max videos per search term, channel tab, playlist or hashtag (and max channels per creator keyword). Channels: this applies to EACH tab you pick, so Videos + Shorts returns up to 2× this per channel.",
            "default": 10
          },
          "enrich": {
            "title": "Full video details",
            "type": "boolean",
            "description": "Fetch each video's full metadata (likes, description, keywords, category). Off = fast search-feed fields only.",
            "default": true
          },
          "includeDetails": {
            "title": "Full details (category, tags, exact duration)",
            "type": "boolean",
            "description": "Add category, keywords/tags, exact duration in seconds (Shorts included), the exact publish time and family-safe / unlisted flags.",
            "default": false
          },
          "includeSubtitles": {
            "title": "Include transcripts / subtitles",
            "type": "boolean",
            "description": "Download subtitles and the full transcript text (manual + auto-generated). Adds `transcript`, `subtitles` (SRT by default) and `availableSubtitles` to each video. Pricing: each video that comes back with transcript text adds one transcript event ($0.0015, i.e. $1.50 per 1,000) on top of the video row. Videos without captions (`transcript: null`) add nothing.",
            "default": false
          },
          "subtitleLanguages": {
            "title": "Subtitle languages",
            "type": "array",
            "description": "Language codes to download, in order of preference (e.g. \"en\", \"es\"). Empty = the video’s main track only: the caption track YouTube’s player turns on (usually the creator’s own captions), else the manual track in the spoken language, else the auto-generated one. Use \"*\" for every track — a TED talk can have 20+. The first manual track in this order becomes `transcript`, otherwise the auto-generated one. `availableSubtitles` always lists every track.",
            "items": {
              "type": "string"
            }
          },
          "subtitleFormat": {
            "title": "Subtitle format",
            "enum": [
              "srt",
              "vtt",
              "text",
              "segments"
            ],
            "type": "string",
            "description": "Format of each entry in `subtitles`. SRT is always included; pick another to add it.",
            "default": "srt"
          },
          "includeDislikes": {
            "title": "Include dislikes (estimated)",
            "type": "boolean",
            "description": "Add an estimated dislike count via Return YouTube Dislike (3rd-party estimate — YouTube removed public dislikes in 2021).",
            "default": false
          },
          "maxComments": {
            "title": "💬 Max comments per video",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "How many top comments to pull per video (0 = none). `commentsTruncated` is true on a row whose list stopped early (a page YouTube would not serve, or the run’s deadline).",
            "default": 0
          },
          "commentsSortBy": {
            "title": "Comment order",
            "enum": [
              "top",
              "newest"
            ],
            "type": "string",
            "description": "Top comments (YouTube's default) or newest first.",
            "default": "top"
          },
          "maxReplies": {
            "title": "Max replies per comment",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Also pull up to this many replies for each comment that has them, nested under `replies` (0 = none). The most-replied comments go first, and each video gets at most 20 reply pages (~200 replies in total).",
            "default": 0
          },
          "includeVideoInsights": {
            "title": "Video Intelligence pack",
            "type": "boolean",
            "description": "Most-replayed \"viral moments\" (with the words spoken and a timestamped clip link), music credits and sponsor signals (a heuristic: brands, promo codes, affiliate links). Works when YouTube shows a Most-replayed graph.",
            "default": false
          },
          "includeRelatedVideos": {
            "title": "Include related videos",
            "type": "boolean",
            "description": "With the Video Intelligence pack: add the related videos YouTube shows next to each video.",
            "default": false
          },
          "dateFilter": {
            "title": "Upload date",
            "enum": [
              "any",
              "hour",
              "today",
              "week",
              "month",
              "year"
            ],
            "type": "string",
            "description": "Only return videos uploaded within this window. Applies to search terms only, not to direct URLs.",
            "default": "any"
          },
          "sortBy": {
            "title": "Sorting order",
            "enum": [
              "relevance",
              "date",
              "views",
              "rating"
            ],
            "type": "string",
            "description": "How YouTube should order search results. Applies to search terms only, not to direct URLs.",
            "default": "relevance"
          },
          "lengthFilter": {
            "title": "Video length",
            "enum": [
              "any",
              "under4",
              "4to20",
              "over20"
            ],
            "type": "string",
            "description": "Only return videos of this length. Applies to search terms only.",
            "default": "any"
          },
          "videoFeatures": {
            "title": "Video features",
            "type": "array",
            "description": "Only return videos with ALL of these features. Applies to search terms only.",
            "items": {
              "type": "string",
              "enum": [
                "hd",
                "subtitles",
                "creativeCommons",
                "3d",
                "live",
                "purchased",
                "4k",
                "360",
                "location",
                "hdr",
                "vr180"
              ],
              "enumTitles": [
                "HD",
                "Subtitles/CC",
                "Creative Commons",
                "3D",
                "Live",
                "Purchased",
                "4K",
                "360°",
                "Location",
                "HDR",
                "VR180"
              ]
            },
            "default": []
          },
          "deepSearch": {
            "title": "Deep search (more results per term)",
            "type": "boolean",
            "description": "Keep paging every search term until Max items unique videos are found. Off (default) = the classic depth this actor has always had: a plain search (relevance order, no filters, no Shorts) reads 2 result pages — about 40 videos — whatever Max items says, while sorted or filtered searches page toward Max items. Turn on for large keyword pulls; you are billed per row, so a plain search with a high Max items then returns (and bills) up to that many rows.",
            "default": false
          },
          "includeShorts": {
            "title": "Include Shorts",
            "type": "boolean",
            "description": "Also collect YouTube Shorts from search results. Off by default: Shorts change which videos a search returns, so existing runs keep the previous long-form-only behaviour unless you turn this on.",
            "default": false
          },
          "maxShorts": {
            "title": "Max Shorts",
            "minimum": 0,
            "type": "integer",
            "description": "Cap how many Shorts (videos 60s or under) to include per search term. Leave empty for no cap; set 0 to exclude Shorts entirely."
          },
          "maxStreams": {
            "title": "Max live streams",
            "minimum": 0,
            "type": "integer",
            "description": "Cap how many live streams to include per search term. Leave empty for no cap; set 0 to exclude streams entirely."
          },
          "country": {
            "title": "Country",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter country code YouTube should rank results for (e.g. \"US\", \"IN\", \"KR\").",
            "default": "US"
          },
          "language": {
            "title": "Language",
            "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,4})?$",
            "type": "string",
            "description": "Interface language for search and hashtag results (e.g. \"en\", \"ko\", \"pt-BR\") — keeps original-language titles. Video details stay in English so numbers parse reliably.",
            "default": "en"
          },
          "channelContent": {
            "title": "Channel tabs",
            "type": "array",
            "description": "Which tabs to scrape for channels: Videos, Shorts and/or Live. Max items applies to each tab.",
            "items": {
              "type": "string",
              "enum": [
                "videos",
                "shorts",
                "streams"
              ],
              "enumTitles": [
                "Videos",
                "Shorts",
                "Live"
              ]
            },
            "default": [
              "videos"
            ]
          },
          "channelSortBy": {
            "title": "Channel sort",
            "enum": [
              "newest",
              "popular",
              "oldest"
            ],
            "type": "string",
            "description": "Newest first (default), most popular, or oldest first.",
            "default": "newest"
          },
          "publishedAfter": {
            "title": "Published after",
            "type": "string",
            "description": "Only channel videos published on or after this date — a date (2026-08-01) or a relative age (\"30 days\", \"2 weeks\", \"12 hours\", \"7d\"). A value the actor can’t read stops the run before anything is scraped or charged. Great for daily/weekly monitoring schedules. Older videos are skipped and not charged. With Full video details off, only the channel page’s relative dates (\"2 weeks ago\") are known, so a video is kept only when that date is surely inside the window."
          },
          "includeChannelAbout": {
            "title": "Add channel About data to videos",
            "type": "boolean",
            "description": "Add the channel's country, joined date, total views, links, social handles and public contact info to every video row (one extra request per channel).",
            "default": false
          },
          "minSubscribers": {
            "title": "Min subscribers",
            "minimum": 0,
            "type": "integer",
            "description": "Creator finder: skip channels with fewer subscribers."
          },
          "maxSubscribers": {
            "title": "Max subscribers",
            "minimum": 0,
            "type": "integer",
            "description": "Creator finder: skip channels with more subscribers (find micro-influencers)."
          },
          "creatorCountries": {
            "title": "Creator countries",
            "type": "array",
            "description": "Creator finder: only channels based in these countries (names or 2-letter codes, e.g. \"US\", \"Canada\").",
            "items": {
              "type": "string"
            }
          },
          "activeWithinDays": {
            "title": "Active within (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Creator finder: only channels that uploaded within this many days."
          },
          "requireContact": {
            "title": "Only creators with contact info",
            "type": "boolean",
            "description": "Creator finder: only channels that publish an email or have a business email on file. Only emails the creator published publicly are returned — never hidden ones.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy for YouTube. RESIDENTIAL is recommended: datacenter IPs hit YouTube bot checks on the video player and watch page.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "proxyStrategy": {
            "title": "Proxy strategy",
            "enum": [
              "configured",
              "auto"
            ],
            "type": "string",
            "description": "\"configured\" sends every request through the proxy above. \"auto\" sends YouTube's JSON endpoints (search, video pages, comments, channels) through Apify datacenter proxies and only the video player through the proxy above — faster, and it falls back to your proxy automatically if datacenter IPs get blocked.",
            "default": "configured"
          },
          "errorRowsInDataset": {
            "title": "Save \"not found\" rows in the dataset (billed)",
            "type": "boolean",
            "description": "Off (default): an input or video that returns nothing (unknown channel, no search results, empty playlist, unrecognized URL, private or deleted video) is listed in the ERRORS record of the run's key-value store and in the status message, and is not charged. On: it is also saved in the dataset as a row with `error` and `note`, the way earlier versions did, and each such row is billed as one result. Turn it on only if your integration reads those rows from the dataset.",
            "default": false
          },
          "_noResidential": {
            "title": "Run as an account without residential proxies",
            "type": "boolean",
            "description": "Internal (canaries): behave exactly like an account without the RESIDENTIAL proxy group.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}