YouTube Comments Scraper avatar

YouTube Comments Scraper

Pricing

from $0.80 / 1,000 stored comment or replies

Go to Apify Store
YouTube Comments Scraper

YouTube Comments Scraper

Export public YouTube comments and replies to JSON, CSV or Excel. Choose Top or Newest order and set a total row limit. Each reply keeps its parent comment ID. No YouTube login or API key needed.

Pricing

from $0.80 / 1,000 stored comment or replies

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

YouTube Comments Scraper gets public comments and replies from YouTube videos. Add video URLs or IDs, choose Top or Newest order, and export one row for each saved comment or reply as JSON, CSV, or Excel. No YouTube login or API key is needed.

The price is $0.05 per start + $0.80 per 1,000 saved rows. Replies count as rows too. A video with comments turned off or no visible comments can return an empty table. A limit or source failure can leave a partial result. Open Run summary to check what happened.

YouTube Comments Scraper: public comments, optional replies, IDs and export

Independent tool: This Actor is not made, approved, or sponsored by YouTube or Google.

Table of contents

What it does

Get a current public sample of comments from up to 50 videos in one run. Supported input forms include watch URLs, youtu.be, Shorts URLs, live video URLs, and 11-character video IDs. Live chat is outside this product.

Top-level comments load first for each video. Optional replies load next and keep their parent comment ID. To leave room for replies, set maxTopLevelCommentsPerVideo below maxComments. These are limits, not promises.

Good fit

  • Read feedback on a known public video or a small set of videos.
  • Export comment text, likes, public author fields, and reply links.
  • Match repeated exports by stable comment IDs in your own system.

Not a fit

This Actor does not find videos, download media, score sentiment, or post comments. It cannot recover deleted comments or read private, held, hidden, member-only, or login-only comments. It does not provide a fixed historical snapshot or exact posting dates.

Quick start

  1. Open Input. A new form suggests a public Blender video in startUrls.
  2. Keep that example or add your public video URL or ID.
  3. Keep sort=TOP, maxComments=100, and includeReplies=false for a first run.
  4. Click Start. Set a maximum charge in Run options when needed.
  5. Open Comments and replies. Check videoId, text, and isReply.
  6. Open Run summary to check the result and stop reason for each video.

This input is the example suggested by the schema. Other omitted fields use the runtime defaults listed below. An API request with {} is invalid; it does not silently use the demo video.

{
"startUrls": ["https://www.youtube.com/watch?v=aqz-KE-bpKQ"],
"includeReplies": false
}

Expected result: up to 100 top-level rows in Top order. A full 100-row result costs $0.08 in comment events. The source can return fewer rows or fail; check the report even when Apify shows SUCCEEDED.

Use cases

JobInput choiceUseful fieldsNext step
Read feedbackOne video, TOP, small maxCommentstext, likeCount, videoIdExport a table for review
Read recent commentssort=NEWESTpublishedTimeText, topLevelPositionCheck the displayed source order
Study a discussionReplies on, smaller top-level capisReply, parentCommentId, threadIdGroup rows by parent
Match repeat exportsSame video in later runsid, recordKey, retrievedAtDeduplicate in your own system

The Actor performs a fresh collection each time. It does not keep a change history, filter unchanged rows, or run sentiment analysis.

Input

Fields and defaults

Every field except startUrls is optional. A runtime default applies when the field is omitted. A prefill is the example in a fresh visual form. Changing the prefill does not change the API default.

FieldTypeRuntime defaultUI prefillAllowed values and effect
startUrlsstring array, requiredNoneOne public Blender watch URL1–50 IDs or supported HTTPS URLs; each string at most 2,048 characters
sortstringTOPNoneTOP or NEWEST; pinned comments can lead either order
maxCommentsinteger100None1–10,000 rows across all videos, including replies
maxTopLevelCommentsPerVideointeger10000None1–10,000 top-level rows per video; lower it to leave space for replies
includeRepliesbooleanfalsefalseLoad replies after admitted top-level comments
maxRepliesPerCommentinteger50None0–1,000 replies per saved parent; 0 disables reply work
maxRequestsPerVideointeger600None1–600 source attempts per video, including replies and retries
maxTotalRequestsinteger2000None1–2,000 source attempts across the run
concurrencyinteger1None1–4 videos at once; use 1 for predictable ordering
maxRunSecondsinteger1800None30–1,800 seconds; source work stops early to save its report
proxyConfigurationobjectAutomatic, see belowNoneLegacy API connection control; hidden from the form
proxyConfiguration.useApifyProxybooleanRequired when the object is suppliedNonefalse for Direct; true for the supported Apify proxy route
proxyConfiguration.apifyProxyGroupsstring arrayRESIDENTIAL when enabledNoneOnly RESIDENTIAL; enabled missing or empty groups use this group
proxyConfiguration.apifyProxyCountrystringUS when enabledNoneAn uppercase two-letter code; only US has historical release evidence

The request, concurrency, time, and legacy proxy fields remain available in JSON input. The visual form shows the product limits, including the top-level cap needed for replies.

Duplicate video IDs are processed once in first-input order, including when URLs differ. Empty arrays, null inputs, unsupported URLs, bad values, unknown fields, and custom proxy URLs fail validation before a source request. Supported links use HTTPS and an exact YouTube host. Channel and playlist links are not video inputs. A Direct proxy object must not include group or country settings.

Interacting settings

WhenWhat happensRecommended action
Top-level rows reach maxCommentsNo room remains for replies or later videosLower the per-video top-level cap or raise the total within its maximum
Replies are on and their cap is 0Replies are not requestedUse a positive reply cap to request replies
proxyConfiguration is omittedDirect below 4,000 requested rows; Residential US from 4,000 to 10,000Start small; proxy access depends on the active Apify account settings
Platform timeout is shorter than maxRunSecondsThe shorter deadline applies, with time reserved for the reportSet both to allow the work you need
Platform timeout is longerThe internal 1,800-second maximum still appliesA longer timeout does not remove source limits
A request, byte, row, or charge cap is reachedSaved rows remain; the report marks the affected scope partialRead the stop reason before another run

Example with replies

{
"startUrls": ["https://www.youtube.com/watch?v=aqz-KE-bpKQ"],
"sort": "TOP",
"maxComments": 20,
"maxTopLevelCommentsPerVideo": 3,
"includeReplies": true,
"maxRepliesPerComment": 2
}

This requests up to three top-level rows and up to two replies for each saved parent. At most nine rows fit this scope, so the maximum comment-event charge for this single video is $0.0072. A parent may have fewer public replies. A reply is linked to its saved parent; excluded parents are outside the scope.

Output

Saved rows

The default Dataset contains one row per unique saved comment or reply. There are no status or error rows in this table. All listed fields exist in each saved row; optional source values are JSON null when unavailable.

FieldTypeMeaning and empty-value rule
itemTypestringAlways comment
idstringStable source comment ID; a missing ID is a source-format failure
recordKeystringyoutube:<videoId>:<id>; deduplication key within one run
videoIdstringThe normalized video ID
videoUrlstringCanonical HTTPS watch URL, including for Shorts input
threadIdstringThe top-level comment ID for this discussion
isReplybooleantrue for a reply
parentCommentIdstring or nullExact saved parent ID for replies; null for top-level rows
textstringSource display text, up to 100,000 characters; plain text, not HTML
likeCountinteger or nullNon-negative source snapshot; abbreviated labels are approximate
authorobjectContains the three public author fields below
author.displayNamestring or nullPublic display name when available
author.channelIdstring or nullPublic channel ID when available
author.channelUrlstring or nullValidated YouTube channel URL when available
isPinnedboolean or nullSource pinned signal; null for replies
isHeartedboolean or nullCreator-heart signal when available
authorIsCreatorboolean or nullSource channel-owner signal when available
isEditedboolean or nullThe source display-time edited marker when available
publishedTimeTextstring or nullDisplay time such as 2 hours ago; can be rounded or localized
publishedAtnullAlways null: this source does not provide an exact posting date
sortstringRequested TOP or NEWEST
topLevelPositionintegerOne-based parent position within this video's collected top-level rows
replyPositioninteger or nullOne-based position within the parent reply stream; null for top-level rows
retrievedAtISO date stringActor collection time in UTC, not the posting date
sourcestringAlways youtube-innertube

Text keeps Unicode, emoji, and line breaks exposed by the source parser. The Actor does not invent dates from relative labels or add avatars or profile enrichment. A false flag is different from an unavailable null flag.

Output example from the quick start

This is a shortened row from a real run of the quick-start input. Comment IDs, text, and author data are omitted from this public example. The full table has all fields described above.

{
"itemType": "comment",
"videoId": "aqz-KE-bpKQ",
"videoUrl": "https://www.youtube.com/watch?v=aqz-KE-bpKQ",
"isReply": false,
"parentCommentId": null,
"likeCount": 1900,
"publishedAt": null,
"sort": "TOP",
"topLevelPosition": 1,
"replyPosition": null,
"retrievedAt": "2026-10-08T09:17:19.761Z",
"source": "youtube-innertube"
}

Reports and result states

Output links open the default Dataset through comments and the key-value store record RUN_SUMMARY through runSummary. There is no separate OUTPUT JSON record. The report includes runOutcome, route, row counts, source requests, decoded bytes, retries, stopReasons, per-video outcomes, and reconciliation showing saved rows versus charged events.

SituationDatasetRun summary and next action
Comments foundUnique comment/reply rowsCheck per-video top-level and reply completeness
ZERO_COMMENTSEmpty for that videoThe source explicitly showed zero; no fabricated row
COMMENTS_DISABLEDEmpty for that videoThe source explicitly says comments are off
VIDEO_UNAVAILABLE or PRIVATE_OR_RESTRICTEDEmpty for that videoCheck public availability; restricted reasons are not always distinguishable
A limit is reachedRows already saved remainPARTIAL_LIMIT; check which limit stopped collection
A later source request failsRows already saved remainThe affected scope is partial; the run can fail
Ambiguous empty, block, or source-format failureCan be empty or partialAMBIGUOUS_EMPTY, REQUEST_BLOCKED, RATE_LIMITED, or source error; retry only a small scope
Invalid input or resourcesEmptyINVALID_INPUT or INVALID_RESOURCES; check input or run options separately

Top-level and reply completeness are separate. NOT_REQUESTED means replies were off or their cap was zero. NOT_STARTED means that work did not start, for example because the total row limit was already full.

COMPLETE_VISIBLE_SNAPSHOT means the visible source chain ended for that video, sort, and scope during the run. It does not mean all historical comments or all replies for parents excluded by your limits. Other states include PARTIAL_LIMIT, PARTIAL_SOURCE_FAILURE, and PARTIAL_SOURCE_CHANGED.

Pricing and limits

Applied price

The applied price is $0.05 per start + $0.0008 per unique saved comment or reply, including platform usage. Apify automatically charges the standard apify-actor-start event; the Actor does not charge a second start event. At the recommended 512 MB, one start is charged. Up to 1 GB this is one event; above 1 GB, each additional GB adds another start event. There is no video event.

Saved rowsStart + comment charges at 512 MB
0$0.05
20$0.066
100$0.13
1,000$0.85

A valid empty video has no comment event, but the start charge still applies. A failed run has the start charge and charges for rows already saved, if any. Duplicates within a run and failed writes have no comment event. A later run is a new collection and can charge for the same comments again. There is no filter-only or unchanged-monitor mode.

Use maxComments and Apify's maxTotalChargeUsd to bound the total start and comment charges. At 512 MB, allow at least $0.0508 for one row, $0.13 for 100, or $0.20 with room to spare. A limit below the start price cannot collect rows. The Actor checks remaining event capacity before saving another row. Account credit rules still apply. Publisher-owned validation runs are not proof of a separate customer's payment.

Collection limits

Hard limits are 50 videos and 10,000 saved rows per run. Work also stops at the configured request/time caps or at 256 MiB of decoded source responses. Each response is at most 5 MiB. A reply thread has a 50-attempt request ceiling. Temporary source failures have at most three retries; retries use the same request budget. Redirects and custom source destinations are rejected.

A limit is not a guarantee of that many available results. Large reply scopes need more source requests. Direct access can be blocked. Residential US was used in historical 10,000-row validation; this is not a current speed or availability promise. Regional, age, login, or moderation controls are not bypassed.

API and export

The same JSON input works through the Apify Actor runs API. Use Actor ID MFdWh1uHMcLLKVG0g or cliqtomedia~youtube-comments-scraper. Omit the build selector to use the public default. Set timeout=300, memory=512, and a small maxTotalChargeUsd for the quick-start example. Read defaultDatasetId and defaultKeyValueStoreId from the run response, then get the rows and RUN_SUMMARY. See Apify's run and results guide.

Download the Dataset as JSON, CSV, or Excel from Apify. JSON keeps the nested author object and nullable values. Check how your chosen table export shows nested fields before using it in another tool.

Apify tasks and schedules can run a saved input again. Each run gets a fresh snapshot and charges saved rows again. The Actor has no built-in monitor state or custom integration setup. Existing account tasks, schedules, and integrations are managed separately.

Troubleshooting

Replies are on, but there are no reply rows

Check replyParentsEligible, repliesCompleteness, and the total stop reason. If top-level rows reached maxComments, replies had no room. Lower maxTopLevelCommentsPerVideo below the total and run a small sample again. Use the reply example above. Some saved parents have no visible replies.

The run saved no rows

Read the per-video outcome in Run summary. Disabled, zero, unavailable, restricted, and blocked results have different meanings. Confirm public video access. AMBIGUOUS_EMPTY means the Actor could not prove why the source was empty; it is a failure, not a zero-comment claim.

The run stopped early or timed out

Check result, request, time, byte, reply, and charge limits. A shorter Apify run timeout also shortens source work. Saved rows remain useful, but read the report before assuming that collection ended normally. Retry a smaller scope.

The source failed or changed

Do not repeat a large batch. Try one small public video. If it fails again, report the safe details listed below. Do not add cookies, private credentials, or custom proxy URLs to bypass a restriction.

FAQ

Is this an official YouTube or Google tool?

No. It is an independent Actor and is not made, approved, or sponsored by YouTube or Google.

Does it use the official YouTube Data API?

No. It reads the public website's InnerTube comments surface through YouTube.js. That interface is not a public supported API and can change.

Does this YouTube comment scraper need an API key?

No. It does not accept a Google API key, OAuth token, YouTube account, or cookies. For a separate official API client, Google documents commentThreads.list; that API is not this Actor's source.

Can I export comments from multiple videos, including Shorts?

Yes. Use up to 50 supported public video URLs or IDs. Duplicate videos are processed once. Live video URLs refer to comments, not live chat.

Can I download YouTube comments as CSV or Excel?

Yes. Open the results table and choose JSON, CSV, or Excel. Each saved comment or reply is one row. JSON preserves the complete nested shape.

Can it get every comment or recover deleted comments?

No. It gets the public comments visible during the run and inside your limits. It cannot recover deleted, hidden, held, private, or member-only comments.

Are replies included?

Only when includeReplies=true and maxRepliesPerComment>0. Leave room in maxComments by choosing a smaller per-video top-level cap. Every saved reply counts toward the total and price.

Why is publishedAt null?

The source gives display text such as 2 hours ago. Converting a rounded label into an exact date would add accuracy the source did not provide. The original label stays in publishedTimeText; publishedAt stays null.

Can I use the rows for analysis?

You can export rows for permitted research or analysis. The Actor does not score sentiment, profile people, or join data from other sources.

Privacy and allowed use

Public comment text, names, and channel details can still be personal data and user-created content. Use only data you are allowed to collect, keep it secure, and handle valid correction or deletion requests. The Actor does not give you a license to republish comments.

Do not use it for harassment, stalking, doxxing, mass profiling, sensitive-trait inference, spam, automated outreach, targeting minors, or bypassing private, member, login, location, age, or moderation controls.

Support

Use this Actor's Apify Issues page for technical questions or bugs. Include the run ID, build ID, UTC start time, selected sort and limits, reply setting, and safe result codes/counters from RUN_SUMMARY. No response-time promise is offered.

Never post comment text, author data, private video URLs, cookies, tokens, authorization headers, raw source responses, page tokens, session data, or proxy URLs in a public Issue. Use a private publisher contact for a privacy or security report.