Quarra
Guide · Google Trends

Google Trends daily data over years, and any number of terms on one scale

Past nine months Google Trends goes weekly, and every request is rescaled to its own 0 to 100. Two methods from the research literature address both, and our Actor runs them for you.

Measurements dated October 2026; methods from West (2020) and Eichenauer et al. (2022).

The short answer

Google Trends gives daily points only for short ranges (about nine months), and every request is scaled 0 to 100 on its own, so terms from two requests cannot be compared. Two methods published in the research literature address both: chaining overlapping windows and fixing them to Google's own weekly curve for daily data over years, and a bank of reference queries (G-TAB) for putting any number of terms on one scale. You can implement them yourself or let our Actor do it; this page explains both.

Why the website stops you

  • Daily data. Google picks the resolution of a curve from the length of the range: minutes and hours for days, daily for a few months, then weekly past about nine months, and monthly beyond five years or so. Asking for “2019 to 2026” gives weekly points whatever you do.
  • Eight terms, each request on its own scale. Since its January 2026 redesign, the Explore page compares up to eight terms; pytrends, for one, still sends five. Every request is rescaled so its highest point is 100, so values from two requests cannot be put side by side.
  • Small terms. A term searched a thousand times less than another gets zeros next to it, because Google rounds to whole numbers.

Google's official API alpha (applications only, see our guide to the Trends API and pytrends) addresses the scale problem with values that are consistent across requests, over a rolling five years.

Doing it yourself

For daily data: request overlapping windows short enough for Google to serve daily points, and chain them by rescaling each window on the days it shares with the previous one. Chaining alone accumulates the sampling noise of every overlap. The published fix (Eichenauer et al., Economic Inquiry, 2022) is to benchmark the chained daily curve to Google's weekly curve over the whole range, so that its weekly averages match.

For many terms: the G-TAB method (West, 2020) builds an anchor bank, reference queries from very popular ones down to queries thousands of times smaller, each measured against the next. A term is placed against the anchor closest to its size, so it gets real numbers instead of zeros, as a share of the interest of a reference query.

Both need many requests, and every request is exposed to Google serving different versions of the same curve (up to 9 points apart in our measurements, see our guide to the Trends API and pytrends). That is the part we automated.

Daily data with our Actor

Set dailyResolution to true on a range longer than nine months. The Actor returns a daily series benchmarked to Google's weekly curve (and to the monthly curve beyond five years). This one is a daily curve on YouTube search since January 2024, averaged over all samples:

{
  "searchTerms": ["minecraft"],
  "startDate": "2024-01-01",
  "dailyResolution": true,
  "property": "youtube",
  "sampleAggregation": "mean"
}

Rows carry scale: "dailyStitched", with decimals. Several terms in one run share one scale: each daily curve is rescaled on a direct Google comparison of the terms over the whole range. A term too small to appear next to the others gets a free missing row, and a term Google refuses gets its own error row while the others are delivered.

How it holds up: in our replay tests, with a simulated sampling noise of 15% per day, plain chaining drifted by 7.3% in the yearly level over 5 years and by 15.5% since 2008; benchmarked to the weekly curve, 1.1% and 1.4%. A benchmarked daily curve matches Google's weekly averages to within rounding. Two things to know: years before a term existed come back as zeros, and days in a period where Google's weekly or monthly curve is zero are zero, even if a daily window showed an isolated value there.

A real daily curve

This is the output of the input above, run on the published build on October 9, 2026: 1,013 daily points for “minecraft” on YouTube search, worldwide (geo empty), the last one partial; the summary counts the 1,012 complete days. Below are the free summary row and the curve row (in the dataset the curve comes first), with some fields left out and the timeline shortened to the first three and the last two of its 1,013 points:

{
  "dataType": "summary",
  "term": "minecraft",
  "geo": "",
  "timeRange": "2024-01-01 2026-10-09",
  "property": "youtube",
  "scale": "dailyStitched",
  "points": 1012,
  "firstDate": "2024-01-01T00:00:00Z",
  "lastDate": "2026-10-08T00:00:00Z",
  "latestValue": 4.77,
  "average": 8.912,
  "peakValue": 100,
  "peakDate": "2024-10-15T00:00:00Z",
  "changePercent": -4.9,
  "yearOverYearPercent": 2.6,
  "trend": "stable"
}
{
  "dataType": "interestOverTime",
  "term": "minecraft",
  "geo": "",
  "timeRange": "2024-01-01 2026-10-09",
  "property": "youtube",
  "scale": "dailyStitched",
  "timeline": [
    {"date": "2024-01-01T00:00:00Z", "value": 5.82, "isPartial": false, "valueStdError": 0, "samples": 4},
    {"date": "2024-01-02T00:00:00Z", "value": 6.06, "isPartial": false, "valueStdError": 0, "samples": 4},
    {"date": "2024-01-03T00:00:00Z", "value": 6.15, "isPartial": false, "valueStdError": 0, "samples": 4},
    {"date": "2026-10-08T00:00:00Z", "value": 4.77, "isPartial": false, "valueStdError": 0, "samples": 5},
    {"date": "2026-10-09T00:00:00Z", "value": 4.12, "isPartial": true, "valueStdError": 0, "samples": 5}
  ]
}

Because of sampleAggregation: "mean", each point carries samples, the number of independent answers it averages, and valueStdError. The last point is isPartial while its day is not over. The run took 7 results, which is $0.0292 at Starter plan rates ($0.025 to start, $0.0006 each) and $0.0334 on the Free plan.

Many terms, on one scale

Two modes, for two needs. With comparisonMode: "compare" and more than five terms, the batches are linked through the strongest term measured (or the pivotTerm you name). It suits a handful more terms of similar size. With "calibrated", the Actor builds an anchor bank for the location and range and places every term on its scale. This is for lists of terms of very different sizes, up to 500 per run:

{
  "searchTerms": ["air fryer", "rice cooker", "stand mixer", "espresso machine", "slow cooker", "toaster oven"],
  "comparisonMode": "calibrated",
  "geo": "United States",
  "startDate": "2025-01-01",
  "endDate": "2025-12-31"
}

Values are a percentage of the average interest of the reference term (scaleReference, for example Google in the United States), and each point has valueLow and valueHigh, a 95% interval from Google's rounding. A term calibrated today and one calibrated next month, same location and fixed dates, are on the same scale.

Measured on Google in the United States over the past 12 months in October 2026: coffee and tea placed this way kept their direct ratio within 0.1%, with a plus or minus 1.3 to 1.5% interval.

One term, several places or periods

{
  "searchTerms": ["running shoes"],
  "comparisonMode": "compareLocations",
  "geo": "US; GB; AU",
  "timeRange": "today 12-m"
}

Two to five locations land on one scale, each with its own regional map. comparePeriods does the same for two to five periods of equal length, for example this year's first nine months against last year's:

{
  "searchTerms": ["sunscreen"],
  "comparisonMode": "comparePeriods",
  "periods": ["2025-01-01 2025-09-30", "2026-01-01 2026-09-30"],
  "geo": "FR"
}

From Python

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/google-trends-scraper").call(run_input={
    "searchTerms": ["air fryer", "rice cooker", "stand mixer", "espresso machine", "slow cooker", "toaster oven"],
    "comparisonMode": "calibrated",
    "geo": "United States",
    "startDate": "2025-01-01",
    "endDate": "2025-12-31",
    "maxItems": 100,
})
for row in client.dataset(run.default_dataset_id).iterate_items():
    if row["dataType"] == "summary":
        print(row["term"], row["scale"], row["average"], row["peakDate"])

Tested with apify-client 3.2. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

The summary row is free and has one line per term (latest value, average, peak and its date, change over the range, trend). The row layout is the one shown in our guide to the Trends API and pytrends; add unwind=timeline,regions,queries,trends&clean=true&format=csv to the dataset items URL for one line per day.

Limits

  • The calibrated scale is relative to its reference term, in one location over one range. Values from two locations or two ranges are not on the same scale, as on Google Trends.
  • A relative range such as “past 12 months” moves every day. For values that stay comparable from month to month, use fixed dates.
  • Very small terms get wider valueLow and valueHigh intervals.
  • Over five terms in compare mode, a term far weaker than all the others has only the precision of Google's whole numbers; the run status says how wide its margin is.
  • Values are relative interest, not search counts, and Google can refresh its data between two runs. On 100 terms run twice 15 minutes apart, 89% of the points were identical.

What it costs

A run starts at $0.025. A daily curve counts one result per Google request it needs (one per window, plus the weekly curve it is benchmarked to), and the windows over periods where Google's curve is zero are not charged. On the Free plan: a daily curve over 12 months costs $0.0286 (3 Google requests) and over 5 years $0.0382 (11); the 33 months of the example above took 7 requests. Eight terms on one scale with a pivot cost $0.0346; ten terms on the calibrated scale $0.125 ($0.01 per calibrated term); a hundred terms with curve and regions $0.265. Building the anchor bank is free. Paid plans are cheaper per result.

If Google refuses the standard connection, the affected results are charged one extra premium connection result each ($0.30 per 1,000 on Free and Starter, $0.40 on Scale, $0.55 on Business and above), on top of their own price. It is not charged when the standard connection works, on small runs, for Trending now lists or calibrated terms, or when you use your own proxy. The run status says how many results were charged. You can cap spending with maxItems and the maximum cost per run in the run options.

Run it on the Apify Store

A run starts at $0.025; one curve costs about $0.026 on the Free plan. Errors and empty results are not charged, and you can set a maximum cost per run.