{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Channel Scraper & Tracker - Videos, Subscribers, Alerts",
    "description": "YouTube channel scraper, stats, analytics, no login or API key: exact total views, subscribers, videos. YouTube channel finder by topic, playlist, hashtag scraper. YouTube competitor analysis: compare channels, upload pace, median views. YouTube channel monitor: new videos, growth, alerts. API, MCP.",
    "version": "0.1",
    "x-build-id": "Oyo1e3s8ZHgCn6Ma4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/akhil_rajesh~youtube-channel-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-akhil_rajesh-youtube-channel-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/akhil_rajesh~youtube-channel-scraper/runs": {
      "post": {
        "operationId": "runs-sync-akhil_rajesh-youtube-channel-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/akhil_rajesh~youtube-channel-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-akhil_rajesh-youtube-channel-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": {
          "channels": {
            "title": "Channels",
            "type": "array",
            "description": "YouTube channels: a handle (@mkbhd), a channel link (youtube.com/@mkbhd, youtube.com/channel/UC..., youtube.com/user/...) or a channel id (UC...). Up to 1,000. A name YouTube has no channel for gets a free 'notFound' row. Playlist and hashtag links work here too.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Find channels by topic",
            "type": "array",
            "description": "Topics, such as 'woodworking' or 'home cooking', up to 20. Each is read as the YouTube hashtag of its words, which names 7 to 25 real channels; Google pages per term adds more. Found channels get the same lists as typed ones. Tick Channel rows only for a list of channels. An API run that sets nothing else returns channel rows.",
            "items": {
              "type": "string"
            }
          },
          "playlists": {
            "title": "Playlists",
            "type": "array",
            "description": "Public playlists: a link (youtube.com/playlist?list=PL...) or an id. Each gives a row for the playlist and its first 100 videos, each naming its own channel.",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "Hashtags, with or without #. Each gives a row with YouTube's counts and the videos on its page: up to about 37, new and old mixed, with exact views. That is one page: more would take YouTube's own API, which its robots.txt rules out.",
            "items": {
              "type": "string"
            }
          },
          "maxVideos": {
            "title": "Videos per channel",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Newest long videos per channel. 100 at most: that is what a channel's list shows without YouTube's API. Set all four lists to 0 for channel figures alone. With Only changes: the newest videos each run watches.",
            "default": 30
          },
          "maxShorts": {
            "title": "Shorts per channel",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Newest Shorts per channel (100 at most). YouTube's Shorts list shows views but no dates or lengths.",
            "default": 0
          },
          "maxStreams": {
            "title": "Live streams per channel",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Newest live streams per channel, past, live now and upcoming (100 at most).",
            "default": 0
          },
          "maxPopular": {
            "title": "Popular videos per channel",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The channel's most popular long videos, as YouTube ranks them (100 at most), with popularRank.",
            "default": 0
          },
          "maxListVideos": {
            "title": "Videos per playlist or hashtag",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Videos per playlist or hashtag, in the page's order (100 at most: what a page shows).",
            "default": 100
          },
          "maxChannelsPerTerm": {
            "title": "Channels per topic",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Most channels a topic finds, Google's first when it is on.",
            "default": 20
          },
          "googlePagesPerTerm": {
            "title": "Google pages per topic",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Also search Google for each topic, to find established channels a hashtag misses. 0 is off. It starts Apify's Google Search Scraper in your account, which charges you for what it reads on top of this Actor: each page set here is 2 Google pages per topic, $0.0045 a page on the free plan and down to $0.0018 on Gold, on a run capped at $0.50 or more. It needs a plan that can run Store Actors.",
            "default": 0
          },
          "channelsOnly": {
            "title": "Channel rows only",
            "type": "boolean",
            "description": "Return one row per channel, without a row per video: its lists are still read, so the row has its median views, upload pace and counts per kind. The cheapest way to compare many channels. Playlists and hashtags give their own row alone. With Only changes, the channels' figures are tracked alone."
          },
          "originalTitles": {
            "title": "The channel's own titles",
            "type": "boolean",
            "description": "On by default. YouTube shows English readers the titles a channel translated, so each list is read a second time for the title the channel wrote; the translation goes in titleEnglish. Turn it off to read each list once, in about half the time, and get the English titles. Keywords and Exclude words match both.",
            "default": true
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Most rows a run returns (channel, playlist, hashtag and video rows), shared between them. With Only changes: most changes a run returns, with one channel row per channel on top (the rest of the changes come with the next run).",
            "default": 1000
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Only videos from about this time on: a date ('2026-10-01'), or an amount of time back from now ('7 days', '2 weeks', '1 month'). About, since YouTube words ages in days, weeks, months and years. Shorts show no dates, so this doesn't filter them."
          },
          "minViews": {
            "title": "Minimum views",
            "minimum": 0,
            "type": "integer",
            "description": "Only videos with at least this many views, as YouTube rounds them. Live streams in progress show none, so they are left out."
          },
          "keywords": {
            "title": "Only titles containing",
            "type": "array",
            "description": "Only videos whose title has any of these words or phrases ('iphone', 'review'). Case and accents don't matter.",
            "items": {
              "type": "string"
            }
          },
          "excludeWords": {
            "title": "Exclude words",
            "type": "array",
            "description": "Leave out videos whose title has any of these words or phrases ('sponsored', '#shorts').",
            "items": {
              "type": "string"
            }
          },
          "onlyChanges": {
            "title": "Only changes since the last run",
            "type": "boolean",
            "description": "Track your channels: each run returns a row per channel with what it gained (subscribers, total views, videos) and only what changed since the last run with the same channels and filters: new videos, removed videos, changed titles, streams that went live. The first run saves what's there as the baseline and returns it as firstRun. Schedule it (every hour, every day) to monitor channels. Channels only: playlists, hashtags and topics aren't tracked."
          },
          "changeTypes": {
            "title": "Changes to return",
            "type": "array",
            "description": "Which changes Only changes returns. Leave empty for new videos, removed videos, changed titles and streams that went live.",
            "items": {
              "type": "string",
              "enum": [
                "newVideo",
                "removed",
                "titleChanged",
                "wentLive",
                "viewsJump"
              ],
              "enumTitles": [
                "New videos",
                "Removed videos",
                "Changed titles",
                "Went live",
                "View jumps"
              ]
            }
          },
          "viewsJumpPercent": {
            "title": "View jump (%)",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "With View jumps among the changes: report a watched video whose views rose this much since the last report. Views are rounded, and a video under 1,000 views never counts.",
            "default": 25
          },
          "alertWebhookUrl": {
            "title": "Alert webhook URL",
            "type": "string",
            "description": "Post each run's changes to Slack, Discord or Microsoft Teams (their incoming-webhook URL), or to any HTTPS endpoint that takes JSON (Zapier, Make, n8n). Switches on Only changes. The first run posts a short 'alerts are set up' message."
          },
          "telegramBotToken": {
            "title": "Telegram bot token (alerts to Telegram)",
            "type": "string",
            "description": "Post each run's changes to a Telegram chat through your own bot: its token from @BotFather (123456789:AAH...). Add the bot to the chat (to a channel as an admin that can post). Switches on Only changes."
          },
          "telegramChatId": {
            "title": "Telegram chat id",
            "type": "string",
            "description": "Where the bot posts: a public channel or group (@mychannel), or a chat id (-1001234567890 for a private group or channel; your own id for a direct message, from @userinfobot)."
          },
          "alertChangeTypes": {
            "title": "Alert on",
            "type": "array",
            "description": "Which changes are posted. Leave empty for new videos.",
            "items": {
              "type": "string",
              "enum": [
                "newVideo",
                "removed",
                "titleChanged",
                "wentLive",
                "viewsJump"
              ],
              "enumTitles": [
                "New videos",
                "Removed videos",
                "Changed titles",
                "Went live",
                "View jumps"
              ]
            }
          },
          "historyName": {
            "title": "History name",
            "type": "string",
            "description": "Keep a separate history for this monitor (a-z, 0-9 and hyphens). Leave empty to share the default one: histories are kept per channel and filters anyway."
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Not needed: YouTube's channel pages answer Apify's servers directly. You can use your own proxies or Apify's datacenter proxies; residential proxies aren't available in this Actor."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}