{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Playlist Scraper - Videos, Views & Order, No API Key",
    "description": "For playlist exports, new-upload alerts and course or podcast tracking: YouTube playlist videos as rows with position, title, URL, channel, length, views and age, plus the playlist's title, owner and total views. First 100 videos. No API key or quota. Monitoring returns only new videos.",
    "version": "0.1",
    "x-build-id": "6K06LhMOoqXFDCP4b"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~youtube-playlist-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-youtube-playlist-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-playlist-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-youtube-playlist-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-playlist-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-youtube-playlist-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": {
          "playlists": {
            "title": "YouTube playlist URLs or ids",
            "type": "array",
            "description": "Playlists to read: https://www.youtube.com/playlist?list=PL... (with or without the scheme), a watch URL that contains &list=, or the playlist id itself (PL..., UU... for a channel's uploads, OLAK5uy_... for an album). One per line; commas and spaces also separate entries. A repeated playlist is read and charged once and the repeat gets a free 'duplicate' row. Private playlists, mixes (RD...) and personal lists (Watch later, Liked videos) cannot be read and come back as free rows. If you leave this field out with monitoring off, one example playlist is read; with monitoring on it is required. An empty list is rejected. Up to 500 playlists per run.",
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerPlaylist": {
            "title": "Maximum videos per playlist",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "With monitoring off, at most this many videos are returned from each playlist, starting from position 1. The page YouTube serves without signing in shows at most the first 100 videos of a playlist, so 100 is the highest useful value. In monitoring mode it does not apply: every new video on the first page is returned.",
            "default": 100
          },
          "maxResults": {
            "title": "Maximum video rows in total",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "With monitoring off, reading stops once this many charged video rows have been returned across all playlists, and a free row says how many videos and playlists were not returned because of it. In monitoring mode it does not limit the new videos returned: every playlist in the list is checked, as far as the run's maximum total charge allows.",
            "default": 1000
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only videos added since the last run",
            "type": "boolean",
            "description": "Off = every run returns the videos on each playlist's first page, charged per row. On = the Actor remembers which videos it returned for each playlist and, on later runs, returns only videos on the first page that it has not returned before for that playlist. The first run returns every video on the first page once to set the baseline. Only the first page (up to 100 videos) is visible: a video added at the end of a playlist that already shows 100 videos is not seen. **In monitoring mode every playlist that is read costs $0.30 per 1,000 checks, new videos or not** (unavailable playlists, bot checks and invalid input are free), plus the row price for the new videos returned. Example: 20 playlists every hour = 14,400 checks a month = $4.32. The first run of each playlist also pays the row price for its baseline (up to 100 videos = up to $0.80 per playlist, once). The Actor reads only as many playlists as the run's maximum total charge can pay for with a check and one video row each. Videos are remembered per playlist; do not put the same playlist in two schedules that can run at the same time.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered for these playlists and start over",
            "type": "boolean",
            "description": "Clears the remembered videos of every playlist in this run's list, so this run (in monitoring mode) returns every video on their first page again as a first check. Playlists that are not in the list keep what was remembered for them. Turn it off again after one run: left on in a schedule, every run returns every video and charges the row price for it.",
            "default": false
          },
          "useProxy": {
            "title": "Use a proxy if YouTube answers with a bot check",
            "type": "boolean",
            "description": "Every page is requested directly first. Only if YouTube answers a page with a bot check, an error or no response is that page retried through a proxy session (datacenter first, then residential); the next page is requested directly again. With it off, that answer is retried directly and then returned as a free 'blocked' row, and no proxy is paid for.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}