{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Channel Videos & Views Scraper - No Blocked Paths",
    "description": "Turn monitoring on and every later run returns only the videos it has not returned before, so you are never charged twice. Every video on a channel with its view count, length and publish date, read only through paths YouTube's robots.txt allows, and every row names the channel that published it.",
    "version": "0.1",
    "x-build-id": "avL4gPdMvGDmL454P"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~youtube-channel-videos/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-youtube-channel-videos",
        "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-channel-videos/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-youtube-channel-videos",
        "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-channel-videos/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-youtube-channel-videos",
        "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": "Handles (@mkbhd), channel ids (UC...) or channel URLs. A mistyped handle is reported as 'no such channel' rather than guessed, because YouTube's robots.txt disallows /results and this Actor does not use search.",
            "default": [
              "@mkbhd"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerChannel": {
            "title": "Maximum videos per channel",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "How far down the channel's videos tab to go. The tab holds about 30 videos (measured 2026-09-06); the RSS feed other scrapers use holds 15, and is disallowed by robots.txt anyway.",
            "default": 30
          },
          "maxVideos": {
            "title": "Maximum videos to return",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many rows to return in total. You are charged for the rows you actually receive. Each video costs one extra page request for its view count.",
            "default": 100
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only videos I have not seen",
            "type": "boolean",
            "description": "Off = return the videos on the tab, charged per row only. On = remember what was returned and, on later runs, return only what is new; already-returned videos are skipped without even opening their page. **Monitoring adds a flat access fee of $5, charged once per calendar month (UTC) on the first monitoring run of that month**, on top of the per-row price. That fee is what pays for watching on the days when nothing was posted - those runs return no rows and cost nothing else. Runs with monitoring off never trigger it.",
            "default": false
          },
          "monitorMode": {
            "title": "What counts as new",
            "enum": [
              "new-videos",
              "any-change"
            ],
            "type": "string",
            "description": "New videos only = a video is returned once, ever. Any change = a video is returned again when its view count or title changes, which is how you build a view-growth history.",
            "default": "new-videos"
          },
          "resetMonitoringState": {
            "title": "Forget what was already returned",
            "type": "boolean",
            "description": "Clear the remembered videos before this run, so everything counts as new again.",
            "default": false
          },
          "minViews": {
            "title": "Minimum view count",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Keep a video only if it has at least this many views. 0 = no limit. Videos whose view count could not be read are kept, because unknown is not the same as low.",
            "default": 0
          },
          "maxViews": {
            "title": "Maximum view count",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Keep a video only if it has at most this many views. 0 = no limit.",
            "default": 0
          },
          "minLengthSeconds": {
            "title": "Minimum length (seconds)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep a video only if it runs at least this long. 0 = no limit. Use 62 to skip Shorts.",
            "default": 0
          },
          "maxLengthSeconds": {
            "title": "Maximum length (seconds)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep a video only if it runs at most this long. 0 = no limit. Use 61 to keep only Shorts.",
            "default": 0
          },
          "publishedAfter": {
            "title": "Published on or after (YYYY-MM-DD)",
            "type": "string",
            "description": "Keep only videos published on or after this date. Videos with an unreadable publish time are kept."
          },
          "onlyOwnedByChannel": {
            "title": "Only videos actually published by the channel",
            "type": "boolean",
            "description": "Every row already reports whether the video's own page names the channel you asked for. Turn this on to drop the ones that do not match. Rows where the owner could not be read are kept, because unknown is not the same as wrong.",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep a video only if one (Any) or all (All) of these appear in the title or channel name.",
            "default": [],
            "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 a video if any of these appear in the same fields.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "useProxy": {
            "title": "Use an Apify proxy",
            "type": "boolean",
            "description": "On by default, and worth leaving on. Requested from Apify's own IP, YouTube returns the watch page with HTTP 200 but with the player data missing, which makes every video unreadable; through a proxy the data is there. If a page comes back without it, the run switches to a proxy session and tries again.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}