{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Video & Shorts Comments Scraper with Replies",
    "description": "Scrape comments and replies from YouTube videos and Shorts: text, author, likes, reply count, posted time, pinned and hearted flags. Top or newest order, only-new mode for scheduled runs. $0.25 per 1,000 comments, failures are free. Final test: all 68 videos with comments returned them.",
    "version": "1.0",
    "x-build-id": "iLKvtk1gXnILxFYhC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/heyitsgautham~youtube-comments-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-heyitsgautham-youtube-comments-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/heyitsgautham~youtube-comments-scraper/runs": {
      "post": {
        "operationId": "runs-sync-heyitsgautham-youtube-comments-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/heyitsgautham~youtube-comments-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-heyitsgautham-youtube-comments-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": {
          "videos": {
            "title": "YouTube videos",
            "type": "array",
            "description": "Video URLs or 11-character video IDs. Accepts watch, youtu.be, Shorts, embed and live links. For the latest videos of a channel or playlist, or the top videos of a search, use the next two fields.",
            "items": {
              "type": "string"
            }
          },
          "channelsAndPlaylists": {
            "title": "Channels and playlists",
            "type": "array",
            "description": "Optional. YouTube channel or playlist URLs. The scraper takes the latest videos of each channel, or the first videos of each playlist, and scrapes their comments. Accepts @handle, /channel/UC..., /c/... and /user/... links, playlist links with list=..., and bare @handles, UC channel IDs or PL playlist IDs. Listing the videos is free, and each comment is charged as usual.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Optional. YouTube searches. The scraper takes the top videos of each search in YouTube's order and scrapes their comments. The search is free, and each comment is charged as usual.",
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerSource": {
            "title": "Max videos per channel, playlist or search",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "How many videos to take from each channel, playlist or search. Channels go newest first. 0 means all videos, up to 20,000. Max comments per video still applies to each one. Does not limit the videos field.",
            "default": 10
          },
          "includeShorts": {
            "title": "Include Shorts",
            "type": "boolean",
            "description": "Channels only. Off: regular videos and past live streams. On: every upload, Shorts included.",
            "default": false
          },
          "maxComments": {
            "title": "Max comments per video",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many rows per video. Replies count toward the limit. Set 0 to get every comment.",
            "default": 100
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "top",
              "newest"
            ],
            "type": "string",
            "description": "Top comments is YouTube's default order. Runs with Only new since the last run on always read newest first.",
            "default": "top"
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Adds replies right after their parent comment, with isReply set to true and parentId pointing to the parent.",
            "default": false
          },
          "maxRepliesPerComment": {
            "title": "Max replies per comment",
            "minimum": 0,
            "type": "integer",
            "description": "Caps replies per comment thread when replies are on. Set 0 for all replies.",
            "default": 10
          },
          "includeVideoInfo": {
            "title": "Include video info",
            "type": "boolean",
            "description": "Adds videoTitle, videoViewCount and videoCommentCount to every comment row, right after videoId. videoCommentCount is the exact count YouTube shows, which includes replies. Free, and each comment costs the same.",
            "default": false
          },
          "onlyNewSinceLastRun": {
            "title": "Only new since the last run",
            "type": "boolean",
            "description": "For scheduled runs. Returns only comments and replies this actor has not returned to you before for the same video and filters, and nothing older than the newest one it returned last time. These runs read comments newest first whatever Sort by says, and stop at the first page with nothing new. The first run returns the newest comments up to your limit and remembers them. The memory is a key-value store named youtube-comments-scraper-monitor in your Apify account.",
            "default": false
          },
          "publishedAfter": {
            "title": "Published after",
            "pattern": "^$|^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$|^\\d+\\s*(minute|hour|day|week|month|year)s?(\\s+ago)?$",
            "type": "string",
            "description": "Only comments and replies published on or after this date. Use a date such as 2026-10-01, an ISO time such as 2026-10-01T12:00:00Z (UTC), or a relative value such as 7 days, meaning the last 7 days. With newest-first order the run stops as soon as it reaches older ones. YouTube shows only relative times such as 3 days ago, so this cutoff is approximate, to within one unit of that time."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many videos to fetch in parallel.",
            "default": 10
          },
          "useProxy": {
            "title": "Use residential proxy",
            "type": "boolean",
            "description": "Leave on. YouTube blocks cloud IPs.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}