{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Comments Scraper API - Channel, Playlist & Video",
    "description": "Scrape YouTube comments from whole channels, playlists and search results, not just one video. Full nested reply threads, like counts flagged when YouTube rounds them, optional sentiment and keyword scoring, and delta-only re-runs for daily monitoring. Pay per comment, no run-start fee.",
    "version": "1.0",
    "x-build-id": "wC7M7cH7E1yQTqzLw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/vonsensey~youtube-comments-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-vonsensey-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/vonsensey~youtube-comments-scraper/runs": {
      "post": {
        "operationId": "runs-sync-vonsensey-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/vonsensey~youtube-comments-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-vonsensey-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": {
          "videoUrls": {
            "title": "YouTube videos, channels, playlists or search phrases",
            "type": "array",
            "description": "Anything YouTube: a video URL or 11-character id, a channel URL or @handle (its whole video tab is swept), a playlist URL, a /shorts tab, a YouTube search URL, or plain search text. Mix as many as you like in one run.",
            "default": [
              "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxComments": {
            "title": "Maximum comments for the whole run",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The hard ceiling on billable comments across every video in the run. This is what you pay for; set it and the run cannot cost more than this many comments.",
            "default": 1000
          },
          "maxCommentsPerVideo": {
            "title": "Maximum comments per video",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Spread the budget evenly when sweeping a channel or playlist. Leave at 0 to let a single video use the whole run budget.",
            "default": 0
          },
          "maxVideosPerSource": {
            "title": "Maximum videos per channel, playlist or search",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "How deep to go into each channel, playlist or search result before moving on. Ignored for single video URLs.",
            "default": 25
          },
          "sortBy": {
            "title": "Comment order",
            "enum": [
              "top",
              "newest"
            ],
            "type": "string",
            "description": "Top comments first (YouTube's own ranking), or newest first. Newest is the one to use for monitoring.",
            "default": "top"
          },
          "includeReplies": {
            "title": "Include reply threads",
            "type": "boolean",
            "description": "Expand every reply thread and return replies alongside top-level comments, each linked to its parent by threadId and parentCommentId. Replies count towards your comment budget.",
            "default": true
          },
          "maxRepliesPerThread": {
            "title": "Maximum replies per thread",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Caps how deep a single popular thread can go, so one comment with 5,000 replies cannot eat the whole run.",
            "default": 50
          },
          "enrichComments": {
            "title": "Add sentiment, keywords and question detection",
            "type": "boolean",
            "description": "Score every comment for sentiment, a toxicity triage signal, content keywords, writing system, whether it asks a question, and any video timestamps it cites. This is a lexicon signal for sorting comments at volume, not a moderation verdict. Billed as a separate enrichment event, only for comments actually scored.",
            "default": false
          },
          "onlyNewSinceLastRun": {
            "title": "Only return comments that are new since the last run",
            "type": "boolean",
            "description": "For scheduled monitoring. Remembers every comment id already returned under the same monitor name and skips them, so a daily run delivers and bills only what is genuinely new.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Names the saved history used by 'only new since last run'. Use a different name per watch (for example one per brand or channel) so separate schedules do not share state. Not a credential.",
            "default": "default"
          },
          "minLikes": {
            "title": "Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Skip comments below this many likes. Filtered comments are never delivered and never billed.",
            "default": 0
          },
          "filterKeywords": {
            "title": "Only comments containing these words",
            "type": "array",
            "description": "Case-insensitive. Leave empty to keep everything. Useful for pulling every mention of a product, a competitor or a complaint word out of a whole channel.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "onlyQuestions": {
            "title": "Only comments that ask a question",
            "type": "boolean",
            "description": "Keep only comments that read as questions. This is the fastest way to mine a channel for content ideas and FAQ material.",
            "default": false
          },
          "excludeAuthorReplies": {
            "title": "Exclude the creator's own comments",
            "type": "boolean",
            "description": "Drop comments written by the channel that published the video, so you get the audience and not the host.",
            "default": false
          },
          "includeVideoRows": {
            "title": "Include a per-video row",
            "type": "boolean",
            "description": "Adds one free row per video with its title, channel, view count and how many comments were returned. Always free.",
            "default": true
          },
          "emitSummary": {
            "title": "Add a run summary row",
            "type": "boolean",
            "description": "One free row at the end with totals, unique authors, top commenters, and — when enrichment is on — the sentiment split and top keywords.",
            "default": false
          },
          "maxCostUsd": {
            "title": "Hard spending limit for this run (USD)",
            "type": "string",
            "description": "Stop the run once it has charged this much. Leave empty for no ceiling.",
            "default": ""
          },
          "hl": {
            "title": "Language code",
            "type": "string",
            "description": "Two-letter language for YouTube's own strings, such as the relative published times.",
            "default": "en"
          },
          "gl": {
            "title": "Country code",
            "type": "string",
            "description": "Two-letter country YouTube should serve the pages for.",
            "default": "US"
          },
          "useProxy": {
            "title": "Route through a proxy",
            "type": "boolean",
            "description": "Off by default because this Actor does not need one. Turn it on only if you want traffic routed through Apify Proxy anyway.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Left empty the Actor runs direct, which is how it was measured and what it is priced for.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}