Google Trends Scraper - search interest by place, as structured rows
Google Trends is one of the few genuinely free windows onto demand, and one of the most awkward to use at scale. The interface is built for looking at one term at a time, and the number it shows resists being copied into a spreadsheet without losing the context that makes it meaningful. The Google Trends Scraper returns the same breakdown as rows: one per location per term, each carrying the term, the place, the place's code, the relative score, the region the run was scoped to, the timeframe and the resolution. Submit up to 1,000 queries in a run, choose a window from the past hour to the past five years, pick a region and how finely to cut it, and export as CSV, JSON or Excel.
The eight columns on this page are measured, not assumed. They are the header row of real Livescraper trends exports, identical across 31 runs and matching the JSON keys exactly, and every number quoted comes from the 1,726 rows those runs returned across 852 distinct locations. That matters because the published reference documents the request side thoroughly - timeframe codes, resolutions, region codes - and does not enumerate the response columns at all. One limit of our evidence is worth stating: those runs used only two distinct queries, a single term and a two-term comparison. That is enough to establish how the output is shaped, how the columns relate and how the settings change what comes back; it is not enough to say how any particular term of yours will score, which is what the free tier is for.
Four measured behaviours matter more than the column list. First, resolution defaults to city, and at city level 91% of our rows scored zero against 15% at region level and 3% at DMA - a single term rarely registers in an individual town, so the default setting quietly produces a long tail of blanks. Second, geo_code follows an exact rule: present on every region and DMA row, absent on all 600 in-country city rows, and holding a two-letter country code on worldwide runs, which means an empty value describes the resolution rather than a failed lookup. Third, the timeframe that comes back is humanised - you send a code and the row says "Past day" - so a value from the export will not round-trip into a request. Fourth, a pipe-separated comparison returns one row per term per place, exactly two rows per location in every comparison run we made, which doubles both the row count and the bill.
The value column deserves its own warning, because misreading it is the most common way this data goes wrong. It is a relative index from 0 to 100, not a count of anything. One hundred marks the peak of the slice you requested and every other place is scored against it, so the same term in the same region over two different timeframes produces two incompatible scales. It also means the 100 can be missing: in five of our twenty-two populated runs no location reached it, three because the peak belonged to the other term in a comparison and two because every city-level value was zero. Read correctly, though, the shape is exactly what most teams want - a ranked, comparable, re-runnable picture of where attention sits, with enough context on each row that a file still explains itself months later. Start free: your first 500 rows cost nothing and need no credit card.