Local news from Google News: put the city in the query, not the location
We tested Google News by city two ways. The location parameter changed 1 result in 13; the city in the query text gave local outlets and no shared links.
CrawlerData teamPublished 6 min read
Contents
If you want to know what a city is reading, say for PR, a local business or a regional publisher, the obvious move is to ask for a city. Several Google endpoints accept a location parameter for that, so we tried it on Google News. It barely did anything. Putting the city in the search text did exactly what we wanted.
This guide has the measurements for both approaches, the Python to run either, and a note on where location does work. Everything comes from requests we ran in October 2026 with the Google News API. News changes by the minute, so your results will differ.
How we ran it
We used 10 topics with local interest: city council, weather, traffic, restaurant opening, high school football, real estate, crime, school board, things to do this weekend and jobs. We ran them for four cities, Austin, Brooklyn, Denver and Miami, with country set to us, in two ways:
- The
locationparameter, for exampleAustin,Texas,United States, with the plain topic as the query. We also ran each topic with no location as a baseline. That is 50 requests. - The city in the query text, for example
austin city council. That is 40 requests.
It is a small set we picked, checked once. It shows how each approach behaves, not how Google News works in general.
The location parameter barely changes the news
Google accepted location without complaint, and the results hardly moved:
- A request returned a median of 13 results, from 10 to 22.
- Two different cities shared 11.9 links on average for the same topic. That is about nine in ten.
- A city compared with no location at all shared 11.9 links too, so setting a location was no more different than not setting one.
- Across the four cities, only 6 of 553 titles, 1%, named the city.
The sources told the same story. For city council, the first five outlets were almost identical for all five runs: KUT, Inquirer.com, Mother Jones, Axios and one or two others. A few results did shift. A Dallas TV station, WFAA, appeared fourth for high school football in Austin and in the baseline, but not elsewhere. FOX 5 New York appeared fifth for weather in Brooklyn only. That is about one result in 13.
The city in the query is local
Putting the city in the search text changed everything. We ran the same 10 topics with queries such as austin city council:
| Measure | Result |
|---|---|
| Results per search | 10 for every search |
| Links shared between any two cities | 0 |
| Titles that named the city | 285 of 400 (71%) |
| Distinct sources across the four cities | 178 |
| Sources that appeared for only one city | 157 |
And the outlets were local:
| City | Titles naming the city | Leading sources |
|---|---|---|
| Austin | 79% | Austin American-Statesman (17), KXAN Austin (10), KVUE (7), FOX 7 Austin (6) |
| Denver | 66% | The Denver Post (14), Denver Gazette (11), 9News (9), Denverite (5) |
| Miami | 78% | Miami Herald (10), CBS News (8), NBC 6 South Florida (6) |
| Brooklyn | 62% | News12 | Brooklyn (8), Brooklyn Eagle (5), MaxPreps (5), ABC7 New York (4) |
For city council, the first results by city were:
austin KUT, KXAN Austin, Austin American-Statesman, The Austin Bulldog
denver Axios, Denverite, The Denver Post, Denver Gazette, City and County of Denver
miami Miami Herald, The Miami Student, WPLG Local 10, CBS News
brooklyn hometownsource.com, Brooklyn Eagle, MinneapoliMedia, Brooklyn Eagle
City names are ambiguous
The last line shows the catch. brooklyn city council returned hometownsource.com and MinneapoliMedia, outlets that appear to be in Minnesota, next to the Brooklyn Eagle in New York. miami city council included The Miami Student, a university paper. Brooklyn scored 62% on city names in titles, the lowest of the four, and the ambiguity is a likely reason, though we did not test it.
The fix is the one a person would use: add the state. austin tx city council is a clearer request than austin city council. In a quick test with the state added, 8 of 10 titles named Austin.
Where location does work
We did not want to leave the impression that location is useless, so we checked the other endpoints:
google-search: yes, strongly. Forplumber, Austin and Brooklyn shared 1 of 8 or 9 organic results, and the local packs listed businesses in each city. Forbest pizzaandcoffee shopthey shared 3 of 9. Details are in Google results by country.google-local: yes. See local rank tracking.google-images: no. Forcoffee shopandrestaurant interior, Austin and Brooklyn shared 94 and 100 of 100 images.google-news: barely, as above.
So use location for search and local results, and the city name in the query for news.
The code
Put your key in an environment variable:
export CRAWLERDATA_API_KEY="YOUR_API_KEY"
import os
import time
from collections import Counter
import requests
API_URL = "https://api.crawlerdata.com/v1/jobs"
HEADERS = {"Authorization": f"Bearer {os.environ['CRAWLERDATA_API_KEY']}"}
def google_news(query, country="us", location=None, retries=4):
params = {"query": query, "country": country}
if location:
params["location"] = location
body = {"endpoint": "google-news", "params": params, "queue": "live"}
for attempt in range(retries):
resp = requests.post(API_URL, json=body, headers=HEADERS, timeout=180)
if resp.status_code == 429:
time.sleep(int(resp.headers.get("retry-after", 10)))
continue
resp.raise_for_status()
job = resp.json()["job"]
if job["status"] == "completed":
return resp.json()["result"]["news_results"]
if "retry" in (job["error"] or "").lower(): # "service is busy" and "temporarily blocked" both say retry
time.sleep(5 * (attempt + 1))
continue
raise RuntimeError(job["error"])
raise RuntimeError("News search failed after retries")
def local_news(topic, city, state):
"""City in the query text. 'Austin' is not unique, so add the state: 'austin tx city council'."""
return google_news(f"{city} {state} {topic}")
def city_share(results, city):
"""Share of results whose title names the city."""
hits = sum(1 for r in results if city.lower() in r["title"].lower())
return hits, len(results)
def top_sources(results, n=5):
return Counter(r["source"] for r in results).most_common(n)
On city council for Austin, both ways side by side:
by_text = local_news("city council", "austin", "tx")
by_param = google_news("city council", location="Austin,Texas,United States")
query text : (8, 10) [('KUT', 2), ('City of Austin, Texas (.gov)', 1), ('KXAN Austin', 1), ('Austin Current', 1)]
location : (1, 10) [('KUT', 1), ('Inquirer.com', 1), ('KBTX News 3', 1), ('KSL News', 1)]
links shared: 1
Eight of ten titles named Austin with the city in the query text, and one of ten with location. The two result lists shared one link.
A local news monitor
For a local business or a publisher, the useful version is a daily list for each city and topic, with new links flagged. The monitor from our Google News guide works unchanged: call local_news() instead of google_news(), keep the links you have seen and treat the rest as new. To see which outlets cover your city most, count the sources, as in which publishers dominate Google News.
What it costs
Every request is 1 credit, on every queue. Starter is $1.00 per 1,000 requests and the largest pack is $0.30 per 1,000, see pricing.
| What you run | Requests | At $1.00 per 1,000 | At $0.30 per 1,000 |
|---|---|---|---|
| This study, query-text part | 40 | $0.04 | $0.012 |
| 5 topics in 20 cities, daily for a month | 3,000 | $3.00 | $0.90 |
| 5 topics in 50 cities, hourly for a month | 180,000 | $180.00 | $54.00 |
Failed requests are not charged. The tests behind this guide, including the location comparisons on the other endpoints, used about 115 credits.
Next steps
You now know how location behaves on four endpoints, that the city belongs in the query for news, and you have code that fetches local news by city. The Google News API page lists every parameter with a full example response, and the news and brand monitoring page shows how teams use it.
Frequently asked questions
- How do I get local news for a city from Google News?
- Put the city in the query text, for example austin tx city council. In our October 2026 test of 10 topics in 4 cities, that gave 10 results per search, 71% of the titles named the city, and the four cities shared no links at all. Add the state, because several city names are not unique.
- Does the location parameter work on Google News?
- The google-news endpoint accepts it, but it barely changed the results. Two cities shared 11.9 links on average for the same topic, against 11.9 between a city and no location at all, and only 1% of titles named the city. Use the query text instead.
- Where does the location parameter work?
- On google-search and google-local it changed the results a lot. For plumber, Austin and Brooklyn shared 1 of 8 organic results, and the local packs listed businesses in each city. On google-images, Austin and Brooklyn shared 94 and 100 of 100 images for two searches.
- Which outlets show up for a city?
- With the city in the query, the leaders were local: Austin American-Statesman, KXAN and KVUE for Austin, The Denver Post and Denver Gazette for Denver, and the Miami Herald for Miami. Of 178 sources, 157 appeared for only one city.
- What goes wrong with city names?
- They can mean several places. Brooklyn city council returned outlets that appear to be in Minnesota, and miami city council included a university paper. Add the state, such as brooklyn ny.
- How much does a city-by-city news check cost?
- 1 credit per search. Our 40 searches for 10 topics in 4 cities cost 40 credits, $0.04 at the Starter rate of $1.00 per 1,000 requests. Watching 5 topics in 20 cities every day is 3,000 credits a month, or $3.00.
- Google News
- Local news
- Google News API
- Geo-targeting
- Python
- Data