{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Community Posts Scraper & New Post Monitor",
    "description": "Posts from any YouTube channel's Posts (Community) tab: text, full links, images, polls with vote totals, quizzes with correct answers, shared videos, likes and comments. Monitoring mode returns only posts that are new since the last run, and can track poll vote counts.",
    "version": "0.1",
    "x-build-id": "5sfMKR2hwqmUAFDJb"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~youtube-community-posts-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-youtube-community-posts-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-community-posts-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-youtube-community-posts-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-community-posts-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-youtube-community-posts-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 (@MrBeast), a plain handle (MrBeast), a channel id (UC...), a channel URL (https://www.youtube.com/@MrBeast, /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, @MrBeast is read as an example and the output says so.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerChannel": {
            "title": "Maximum posts per channel",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many of each channel's newest posts to read (1 to 1,000). Filters are applied to these posts, and you are charged only for the post rows you receive. When a channel has more posts than this, a free more-posts-available row names it. In monitoring mode this is used only on the first run for a channel (and, with poll tracking on, as the number of newest posts whose vote counts are compared); later runs read until they reach the posts seen last time.",
            "default": 50
          },
          "postTypes": {
            "title": "Post types",
            "type": "array",
            "description": "Keep only these kinds of post. text = no attachment, image = one or more images, poll = a poll, quiz = a quiz, video = a shared video, playlist = a shared playlist. Empty = every kind.",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "image",
                "poll",
                "quiz",
                "video",
                "playlist"
              ],
              "enumTitles": [
                "Text only (no attachment)",
                "Image posts",
                "Polls",
                "Quizzes",
                "Shared videos",
                "Shared playlists"
              ]
            }
          },
          "maxPostAgeDays": {
            "title": "Only posts at most this many days old",
            "minimum": 0,
            "type": "integer",
            "description": "YouTube shows only a relative time (\"13 days ago\", \"1 month ago\", \"2 years ago\"), so this compares the displayed age counted as days (a week as 7, a month as 30, a year as 365): \"1 month ago\" counts as 30 days even if the post is 50 days old. When every post on a page is older than this, older pages are not read. A post whose age cannot be read is kept. 0 = no limit.",
            "default": 0
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only posts whose text, poll choices, shared video title or shared playlist title 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 posts whose text, poll choices, shared video title or shared playlist title contain any of these words.",
            "items": {
              "type": "string"
            }
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only posts that are new since the last run",
            "type": "boolean",
            "description": "Off = return each channel's newest posts, charged per post row. On = remember which posts each channel had and, on later runs, return only posts published since then (oldest first). Each channel checked costs a small per-check fee ($0.30 per 1,000 checks) whether or not it has a new post; new posts are also charged as post rows. Posts 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 return a post again later.",
            "default": false
          },
          "trackPollVotes": {
            "title": "Also return polls and quizzes whose vote count changed",
            "type": "boolean",
            "description": "Monitoring mode only. Among each channel's newest posts (up to maxPostsPerChannel), a poll or quiz seen on an earlier run is returned again, and charged as a post row, when the total vote count YouTube displays has changed, with previousVoteCount and voteCountDelta. YouTube displays the total rounded (1.7M votes), so a large poll can show the same figure for a long time, and the share of each choice is shown only to signed-in users who voted, so it is not in the output.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered and start over",
            "type": "boolean",
            "description": "Clears every remembered post and vote count for this Actor in your account before the run, so the next monitoring run treats every channel as new again. This affects all your monitoring runs, because posts are stored per channel rather than per list.",
            "default": false
          },
          "useProxy": {
            "title": "Use a proxy if YouTube answers with a bot check",
            "type": "boolean",
            "description": "Every page is requested directly first, which is the fastest and cheapest path and worked from Apify on every attempt when measured on 2026-09-14. If YouTube answers with a bot check, HTTP 429 or a page without the expected 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}