NEWS.md
gtrends_with_backoff() now gives “no data returned” responses their own short retry budget (empty_retry, default 4) instead of the full hard-error retry ladder. A genuinely empty (zero-volume) window never recovers, so retrying it 10-20 times only wastes time; a few quick attempts still let a transient rate limit (which can present as “no data”) recover, then the window is accepted as empty.retry lowered to 6 and max_wait to 30s. An exhausted hard error still aborts the keyword (caught by proc_index(), which keeps the keyword’s existing data) - deliberately, so a rate-limited keyword stays unchanged rather than being overwritten with zeros. A re-run on a fresh runner IP then fills it in cleanly. Together this keeps a throttled backfill from grinding for hours (previously ~40 min per throttled query) and makes it safe to simply re-run until every index comes through.gtrends_with_backoff() now paces queries via options(trendecon.query_pause = <seconds>) to stay under Google’s rate limiter (off by default). Pacing prevents rate limits far more reliably than recovering from them, which matters for high-volume bursts like the gap backfill.proc_keyword_backfill_daily() retries more generously by default.proc_trendecon_ch(), proc_trendecon_de() and proc_trendecon_at() now process each index independently. If one index (or a single keyword within it) fails, the remaining indices still run and every index that succeeds is written to data/<geo> immediately. Previously a single failed query aborted the whole daily run and committed nothing. The three functions now delegate to a shared internal proc_trendecon() worker and return a per-index status data frame.
proc_index() isolates each keyword download in a tryCatch(), so a keyword whose retries are exhausted no longer aborts its index; the index is rebuilt from whatever data exists on disk (fresh where the download worked, previous values otherwise).
gtrends_with_backoff() now uses jittered exponential backoff (capped) instead of linear waits, retries more times by default, and treats a broader set of errors as transient (any 5xx, rate/quota limits, and network/curl failures, in addition to the previous non-200 and 429 cases).