All notable, user-facing capabilities of the YouTube Data Scraper. This is a
feature log rather than a strict per-release history; it summarizes what the
actor can do.
-
A run that hits its charge limit no longer forgets the records it never
delivered. When the run's maximum charge is reached the platform writes only
part of the batch and reports success; those unwritten records were counted as
delivered and recorded as seen, so a later run would skip them. Only what the
platform accepted now counts.
-
A record chosen by incremental mode arrives complete. The reordering that
picks the new items ran after the detail and translation fetches, so a newly
chosen record could be delivered - and charged - without the description,
category or translation it was supposed to carry, while three enriched records
were discarded.
-
A channel that could not be read is no longer delivered as a record. A
blocked or invalid response produced a row with no channel id, no title and no
fields, charged like any other result. It now counts as a failed target.
-
You are told when a channel has no Shorts or Live list and the run used the
channel's main video list instead.
-
compact works. It was overridden by the detail level's own default, so
ticking it changed nothing and the run still paid for a detail fetch per video.
-
Bare playlist IDs are accepted, as the input has always said. A pasted
PL... id used to be skipped and the run finished with zero rows.
-
The same video returned by two searches takes one slot of the result limit
instead of two.
-
With RAG output, an item with no text to embed is no longer recorded as
delivered - it produced no document, so it stayed suppressed for ever.
-
Expired notices are counted correctly when only part of a run's results
could be saved, and notifications, the run summary and the connected-app export
now all describe what actually reached the dataset.
-
The result limit now really bounds the detail fetching. The cap on how
many videos get enriched was computed, logged, and then not applied - the run
still fetched a watch page for every video it had discovered, which under
incremental mode is far more than the limit. Same for localized titles.
-
A video that both search and trending found is no longer re-delivered every
run. The two copies collapse into one record, but only that record's
identity was remembered, so the other one counted as new for ever.
-
maxShorts: 0 no longer expires Shorts that are still there. Removing
every Short left the run claiming full coverage of a channel it had filtered.
-
Two spellings of the same link take one slot. watch?v=A and youtu.be/A
each consumed a slot of the result limit before the duplicate was removed, so
a third, different target could be skipped.
-
A playlist is no longer paginated past the per-target limit - with a
per-target limit of 1 the run walked hundreds of entries to keep one.
-
Turning on RAG output, replies, a different transcript format, or another
channel tab now uses its own incremental state, instead of inheriting a
bucket that reports everything as unchanged. Runs already using the defaults
keep the state they have - nothing is re-delivered.
-
A refused transcript is no longer recorded as delivered when RAG output is
on.
-
The pricing table said a result is charged once per source item, never per
chunk. The FAQ said the opposite, and the FAQ was right: every record
written to the dataset is charged, and with a chunk size each chunk is a
record. The table now says so.
-
An incremental feed no longer starves behind its own result limit. With
maxResults set, the limit was applied to the raw discovery order before the
change detector ran — so a run could keep N items you had already received and
slice off the one new item just past the cut, delivering nothing, run after
run. Items the run has not seen before (or that changed) now sort ahead of the
rest, so the limit keeps the ones you are actually waiting for, and their
comments and transcripts are the ones fetched.
-
A long transcript is charged once, not once per dataset write. With RAG
chunking on, a transcript whose chunks spanned two writes was charged the
transcript event twice, against a contract that promises one charge per source
item.
-
A record the dataset refuses is now always identifiable, including RAG
documents (whose fields live under metadata) and transcripts trimmed by
transcriptFields — previously those could be recorded as delivered and never
re-sent. A trimmed transcript now always keeps its videoId and language,
which a consumer needs to join it to anything anyway.
-
One upload is one record, whichever surface found it. A video reached by
both a search and Trending was delivered — and charged — twice, because the two
surfaces label it differently internally.
-
maxShorts no longer produces false "removed" notices. Like the other
filters, it drops present videos, so a Short displaced by another Short could
be reported as removed and billed as a notice.
-
country reaches a pasted channel URL too. The search path carried the
locale; the explicit channel path did not.
-
A run that reaches its time limit delivers what it collected. Every video
in a batch starts before the deadline and an in-flight fetch cannot be
interrupted, so one batch could outlive the whole budget and the run was killed
with its results still in memory. Each video's detail, comment and transcript
fetch is now bounded by the time actually left. Measured on the sibling actor:
the same job went from delivering nothing to delivering 1,400 records.
-
The run time limit is honoured again. The graceful stop read one
environment variable while the platform supplies another, and its safety margin
was smaller than the wall-clock guard's — so it never ran, and the guard ended
the process with results still buffered.
-
Aliases now win over the canonical field. The platform writes every
declared default into the input, so limit, lang, geo and proxy were
dead whenever their canonical field had a default — limit: 1 could still
collect and charge up to fifty records. An alias is only ever typed on purpose,
so it is the explicit signal; a value that cannot be used for the field (a typo
in a number) is ignored rather than allowed to shadow yours.
-
A trending-only run no longer pays for a search it throws away. With only
Trending enabled, each query still ran a full search whose results nothing
consumed — and those discarded sources ate the discovery budget, which could
leave Trending itself with nothing to collect.
-
maxResultsPerQuery counts the channel record. The cap is documented as
videos and channels per target, but the channel record was emitted without
consuming a slot, so a cap of 5 returned one channel plus five videos.
-
Run counts, run metadata and notifications now describe what was actually
delivered. After de-duplication was added they still counted the duplicates
that were no longer pushed.