{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Channel Scraper & Monitor - New Videos, Live Alerts",
    "description": "YouTube channel monitor: scrape channels by URL or @handle for subscribers, YouTube new videos, uploads, Shorts and live streams. YouTube alerts for new uploads to Discord, Telegram, Slack or webhook. No login, no proxies, no API key. $0.0013 per row.",
    "version": "0.1",
    "x-build-id": "ZFD9dtN8jN1tkhO5O"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lukehunter~youtube-stats-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lukehunter-youtube-stats-tracker",
        "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/lukehunter~youtube-stats-tracker/runs": {
      "post": {
        "operationId": "runs-sync-lukehunter-youtube-stats-tracker",
        "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/lukehunter~youtube-stats-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-lukehunter-youtube-stats-tracker",
        "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": [
          "channelUrls"
        ],
        "properties": {
          "channelUrls": {
            "title": "YouTube channel URLs or @handles",
            "type": "array",
            "description": "REQUIRED. YouTube channels to read, as channel URLs or @handles, e.g. [\"https://www.youtube.com/@mkbhd\", \"@veritasium\"]; /channel/UC..., /c/name and /user/name also work. Up to 5,000 per run. Channel pages only: video links (watch, youtu.be, shorts) stop the run with a clear message, because this Actor never bypasses YouTube's sign-in on video pages. A trailing tab (/videos) is ignored; choose tabs below.",
            "items": {
              "type": "string"
            }
          },
          "tabs": {
            "title": "Tabs to read",
            "type": "array",
            "description": "Which channel tabs to read: \"videos\" (about 30 latest), \"shorts\" (about 48), \"streams\" (past live streams), \"channels\" (featured channels, for influencer discovery). Default [\"videos\"]. Each extra tab adds billed rows, e.g. [\"videos\", \"shorts\"]. A channel row is always added once per channel. In change mode each tab is tracked separately.",
            "items": {
              "type": "string",
              "enum": [
                "videos",
                "shorts",
                "streams",
                "channels"
              ],
              "enumTitles": [
                "Videos",
                "Shorts",
                "Live (streams)",
                "Featured channels (discover similar channels)"
              ]
            },
            "default": [
              "videos"
            ]
          },
          "discoverDepth": {
            "title": "Discover similar channels (depth)",
            "minimum": 0,
            "maximum": 1,
            "type": "integer",
            "description": "0 (default): only the channels you list. 1: also read the channels they feature, to find similar creators (needs \"channels\" in tabs, e.g. [\"channels\"]). One hop, never deeper. Discovered channels are de-duplicated, capped by Maximum discovered channels, marked discoveredFrom, and count toward Maximum rows.",
            "default": 0
          },
          "maxDiscoveredChannels": {
            "title": "Maximum discovered channels",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Only with discoverDepth 1. Maximum extra channels to read, integer 1-200, default 20, e.g. 10. Each costs one request and at least one billed channel row, so with Maximum rows this is your cost cap. Ignored when depth is 0.",
            "default": 20
          },
          "output": {
            "title": "What to return",
            "enum": [
              "channelsAndVideos",
              "channelsOnly"
            ],
            "type": "string",
            "description": "\"channelsAndVideos\" (default): one channel row plus one row per video, short or stream on the selected tabs. \"channelsOnly\": just the channel row (subscribers, video count), cheapest for a stats check, e.g. for 200 channels. Every delivered row is one billed result; a channel with 30 videos is up to 31 rows.",
            "default": "channelsAndVideos"
          },
          "outputFormat": {
            "title": "Output size: full or compact",
            "enum": [
              "full",
              "compact"
            ],
            "type": "string",
            "description": "\"full\" (default): every field. \"compact\": a much smaller row for AI agents, with numeric counts (subscriberCount, viewCount, durationSeconds), titles, URLs and ids, and no display strings, avatar URLs, timestamps or empty fields. Charging is identical in both formats. Example: \"compact\" when results are read into an LLM context.",
            "default": "full"
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum rows returned (channel and video rows together), integer 1-5000, default 100. Also your cost cap: $0.0013 per row. One channel is up to 31 rows with the Videos tab (49 with Shorts). For a quick test use 10, e.g. one channel with maxItems 10.",
            "default": 100
          },
          "onlyChangedSinceLastRun": {
            "title": "New uploads only (change mode)",
            "type": "boolean",
            "description": "true returns only videos, shorts or streams not seen on a previous scheduled run, plus a channel row when its subscriber or video count changed. Default false: a normal one-off run returns the current rows. Agents making one-off calls should leave it false. Example: run daily on a Schedule with true to get new uploads only; nothing unchanged is charged. The first run delivers everything.",
            "default": false
          },
          "stateStoreName": {
            "title": "Change mode: state store name",
            "type": "string",
            "description": "Only used when change mode is on. Name of the key-value store that remembers which videos and counts were already seen between scheduled runs, e.g. \"youtube-stats-tracker-state\". Letters, numbers and hyphens only. Leave the default unless several tasks need separate histories.",
            "default": "youtube-stats-tracker-state"
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Post results to a Discord channel. In Discord: Server Settings -> Integrations -> Webhooks -> New Webhook -> choose the channel -> Copy Webhook URL. Example: https://discord.com/api/webhooks/<id>/<token>. Leave empty to skip Discord."
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Post results to Telegram. Create a bot by chatting with @BotFather on Telegram (send /newbot) and paste the token it gives you, e.g. 123456789:AA.... Needs \"Telegram chat ID\" below. Leave empty to skip Telegram."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Where the bot should post: a numeric chat id (e.g. 123456789, or -1001234567890 for a group or channel) or a public @channelusername. The bot must be added to that chat or channel first (as an administrator for a channel), and for a private chat you must press Start on the bot. Needs \"Telegram bot token\" above."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Post results to a Slack channel (Block Kit cards, up to 10 per message). Create an incoming webhook at api.slack.com/apps -> Create New App -> Incoming Webhooks -> Add New Webhook to Workspace. Example: https://hooks.slack.com/services/T000/B000/XXXX. Leave empty to skip Slack."
          },
          "slackCompatibleWebhookUrl": {
            "title": "Slack-compatible webhook URL (Mattermost, Rocket.Chat)",
            "type": "string",
            "description": "Post results to a Mattermost or Rocket.Chat incoming webhook, which accept Slack-style webhook payloads. Must be a public https:// address, e.g. https://chat.example.com/hooks/abc123 (no localhost, private IP or .local/.internal hosts). These apps do not render Slack Block Kit, so they get a plain Markdown list. For real Slack use \"Slack webhook URL\" above. Leave empty to skip."
          },
          "teamsWebhookUrl": {
            "title": "Microsoft Teams webhook URL (Workflows)",
            "type": "string",
            "description": "Post results to a Teams channel as an Adaptive Card. In Teams: channel -> ... -> Workflows -> \"Post to a channel when a webhook request is received\" -> copy the URL. The host must end in .logic.azure.com or .powerplatform.com, e.g. https://prod-12.westeurope.logic.azure.com/workflows/... The retired Office 365 connector webhooks are not supported. Leave empty to skip Teams."
          },
          "googleChatWebhookUrl": {
            "title": "Google Chat webhook URL",
            "type": "string",
            "description": "Post results to a Google Chat space. In the space: Apps & integrations -> Webhooks -> Add webhook -> copy the URL. Example: https://chat.googleapis.com/v1/spaces/<space>/messages?key=...&token=.... Leave empty to skip Google Chat."
          },
          "ntfyTopic": {
            "title": "ntfy topic",
            "type": "string",
            "description": "Get a phone push with no account via ntfy (ntfy.sh). Install the ntfy app, subscribe to a topic name, and enter the same name here. Anyone who knows the topic can read it, so pick a long, unguessable name (letters, numbers, - and _), e.g. acme-leads-7k2x9q. At most 10 individual pushes per run, then one \"...and N more\". Leave empty to skip ntfy."
          },
          "ntfyServer": {
            "title": "ntfy server",
            "type": "string",
            "description": "Only used with \"ntfy topic\". Leave as https://ntfy.sh, or enter the public https:// address of your own ntfy server, e.g. https://ntfy.example.com.",
            "default": "https://ntfy.sh"
          },
          "ntfyToken": {
            "title": "ntfy access token (optional)",
            "type": "string",
            "description": "Only used with \"ntfy topic\", for a self-hosted server or a reserved topic that needs a login. An access token from ntfy (starts with tk_, e.g. tk_abc123...). Leave empty for open topics."
          },
          "pushoverUserKey": {
            "title": "Pushover user key",
            "type": "string",
            "description": "Get a phone push via Pushover. Your user key (30 characters, e.g. uQiRzpo4DXghDmr9QzzfQu27cmVRsG) is shown on the Pushover dashboard (pushover.net). Needs \"Pushover app token\" below. At most 10 individual pushes per run, then one \"...and N more\". Leave empty to skip Pushover."
          },
          "pushoverAppToken": {
            "title": "Pushover app token",
            "type": "string",
            "description": "The API token of a Pushover application you create at pushover.net/apps/build (name it after this Actor), e.g. azGDORePK8gMaC0QOYAMyEEuzJnyUi. Needs \"Pushover user key\" above."
          },
          "webhookUrl": {
            "title": "Generic JSON webhook URL (Zapier, Make, n8n, Pipedream, IFTTT, Home Assistant)",
            "type": "string",
            "description": "POST the delivered rows as JSON to any public https:// URL: {source, actor, runId, count, items}. At most 100 rows per POST; every delivered row is sent regardless of the max-notifications cap. For example, route results to email, a spreadsheet or any app. Localhost, private IP and .local/.internal addresses are rejected. Leave empty to skip."
          },
          "maxNotifications": {
            "title": "Max notifications per run",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Caps how many results are sent to chat and phone channels per run (Discord, Telegram, Slack, Teams, Google Chat, ntfy, Pushover), 1-100, default 25 (e.g. 10). Extra results are still in the dataset. The generic webhook is not capped. Only used when a destination above is set.",
            "default": 25
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}