{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Subscriber Count Scraper - Channel Statistics Monitor",
    "description": "Subscribers, total views, video count, join date and country for any YouTube channel from its About panel. Total views and video count are unrounded; the subscriber count is flagged as rounded. Monitoring mode returns a channel only when a count moves, with the change since last run.",
    "version": "0.1",
    "x-build-id": "K0c3pHuNYQ9G3UsY8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~youtube-subscriber-count-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-youtube-subscriber-count-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/neverempty~youtube-subscriber-count-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-youtube-subscriber-count-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/neverempty~youtube-subscriber-count-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-youtube-subscriber-count-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": "YouTube channels",
            "type": "array",
            "description": "One channel per line, in any of these forms, mixed freely: @handle (@mkbhd), a plain handle (mkbhd), a channel id (UC...), a channel URL (https://www.youtube.com/@mkbhd, /channel/UC..., /c/Name, /user/Name, with or without https://), or a video URL (watch?v=, youtu.be, /shorts/) - for a video, the channel that uploaded it is read. Every row names the channel YouTube actually returned (channelId, handle, channelTitle) and says in channelMatchesInput whether it is the handle or id you typed. The same channel given twice is read and charged once. Up to 1,000 lines per run. If left empty, @mkbhd is read as an example and the output says so.",
            "items": {
              "type": "string"
            }
          },
          "maxChannels": {
            "title": "Maximum channels to return",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many channel rows to return in total when monitoring is off (1 to 1,000). You are charged only for the channel rows you actually receive; rows that explain a missing channel are free. Not used in monitoring mode: there every changed channel is returned, and the run's maximum total charge caps cost - a channel is checked only if the limit leaves room for its check and its row.",
            "default": 100
          },
          "monitoringMode": {
            "title": "Monitoring mode: return a channel only when its counts change",
            "type": "boolean",
            "description": "Off = return every channel you listed, charged per row. On = remember each channel's counts and, on later runs, return a channel only when a count actually moved, with the previous value and the change (subscriberDelta, totalViewsDelta, videoCountDelta). Each channel checked costs a small per-check fee ($0.30 per 1,000 checks) whether or not it changed; changed channels are also charged as rows. Counts are remembered per channel, not per list, so adding a channel to the list does not re-charge the others. Do not put the same channel in two monitoring schedules that can run at the same time: overlapping runs keep each other's channels, but Apify's key-value store has no atomic update, so the same channel saved by both at once can come back again later.",
            "default": false
          },
          "monitorMode": {
            "title": "What counts as a change",
            "enum": [
              "any-change",
              "subscriber-change",
              "video-change"
            ],
            "type": "string",
            "description": "Any change = subscriber count, total views or video count moved. Subscriber change only = the subscriber count YouTube displays moved; above 1,000 subscribers YouTube displays it to three significant figures (21.3M), so a large channel can show the same value for days while it is growing. Video count change only = the number of public videos moved, which is how you catch new uploads or removed videos.",
            "default": "any-change"
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered and start over",
            "type": "boolean",
            "description": "Clears every remembered count for this Actor in your account, so the next monitoring run returns each channel once again. This affects all your monitoring runs, because counts are stored per channel rather than per list.",
            "default": false
          },
          "minSubscribers": {
            "title": "Minimum subscribers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop channels whose displayed subscriber count is below this. A channel that shows no subscriber count is kept. 0 = no minimum.",
            "default": 0
          },
          "maxSubscribers": {
            "title": "Maximum subscribers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop channels whose displayed subscriber count is above this. A channel that shows no subscriber count is kept. 0 = no maximum.",
            "default": 0
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Keep only channels whose About panel shows one of these countries, written as YouTube writes them in English (United States, India, Germany). Channels that show no country are dropped when this is set. Empty = all countries.",
            "items": {
              "type": "string"
            }
          },
          "onlyVerified": {
            "title": "Verified channels only",
            "type": "boolean",
            "description": "Keep only channels whose name carries YouTube's Verified badge or the Official Artist Channel badge (the badge text is returned in channelBadge).",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only channels whose title, description, handle or channel keywords contain these words.",
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Any = at least one keyword. All = every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop channels whose title, description, handle or channel keywords contain any of these words.",
            "items": {
              "type": "string"
            }
          },
          "useProxy": {
            "title": "Use a proxy if YouTube answers with a bot check",
            "type": "boolean",
            "description": "Every channel page is requested directly first, which is the fastest and cheapest path and worked from Apify on 4 of 4 attempts when measured on 2026-09-14. If YouTube answers with a bot check, HTTP 429 or a page without the channel data, the run switches to a proxy session and tries again (up to 3 attempts). With this off, such a page is returned as an uncharged row instead.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}