← All posts

News Search API Guide: Fresh Results by Country and Language

news search api guide

Quick answer: To get news results for a query, use a search API with a freshness window (last hour, day, or week) so you're filtering by publish time instead of relevance alone. To search a specific country or language, set both the country and language parameters explicitly, because they control different things: country shapes which sources and rankings you see, language filters what the articles are written in. Then dedupe, because one wire story becomes twenty near-identical results.

News search looks like regular search with a date filter. It isn't. It has its own failure modes, and I want to walk through the four that matter: freshness, locale, duplication, and volume.

Freshness Windows: The Parameter That Defines News Search

Regular web search optimizes for the best page ever written on a topic. News search optimizes for the best page written recently, and "recently" needs to be explicit.

Most news-capable APIs expose a freshness or time-range parameter with values like past hour, past day, past week, past month. Which window you want depends entirely on the job:

Use case Window Why
Breaking-news alerting Past hour Anything older is already stale
Daily brand monitoring digest Past day Matches the digest cadence
Weekly competitor roundup Past week Catches slower trade press
Trend and background research Past month or none Recency matters less than coverage

Two things nobody tells you about freshness windows. First, tighter windows return fewer and worse-ranked results, because the index has had less time to score them, so expect more noise in a one-hour window than a one-day window. Second, "publish date" is self-reported by publishers and frequently wrong, so if timing is critical (finance, especially), verify dates from the fetched article content rather than trusting the search metadata.

Country vs Language: Set Both, They're Not the Same Thing

This is the most common locale mistake, so here's the distinction plainly:

  • Country (often country or gl): which market's index and rankings you get. It determines source weighting, so German outlets rank up for de even for English queries.
  • Language (often search_lang or hl): what language the returned articles are written in.

They combine in useful, non-obvious ways. Country de with language en gets you English-language coverage of the German market, which is exactly what you want for monitoring a market you don't read the language of. Country de with language de gets you what a German reader actually sees, which is what you want for brand perception in that market.

If you set only one, the API guesses the other, and it usually guesses "US English", silently. If you've set up locale parameters on Brave's API, this maps directly to what I covered in the Brave Search API setup guide.

The Dedup Problem: One Story, Twenty URLs

Wire services are why news search results feel spammy. Reuters writes one story, and it appears on dozens of syndication partners with different URLs, tweaked headlines, and different publish timestamps.

For a human skimming results that's an annoyance. For a pipeline it's poison: your brand monitor fires twenty alerts for one event, or your RAG pipeline embeds the same article twenty times and drowns out everything else.

A dedup pass that works well in practice, in order of cheapness:

  1. Canonical URL and domain clustering. Many syndicated copies declare the original via canonical tags, and you can collapse those for free if you fetch the pages.
  2. Title similarity. Normalized titles within an edit distance of each other, published within a few hours, are one story. This alone kills most wire duplicates.
  3. Content similarity. Embed the first few hundred words and cluster. Catches rewrites that title matching misses. Only worth it at volume.

Full page content makes all three tiers dramatically easier, which is a real argument for retrieving articles as complete markdown rather than snippets. I made the general case in search results with full page content, and news is where it pays off hardest.

The Pattern in Code

Here's the shape of a news monitoring pull. On link.sc the search request is deliberately minimal, a q string plus an engine, so scope recency in the query itself and slice the result list client-side.

curl https://api.link.sc/v1/search \
  -H "x-api-key: lsc_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "Acme Corp acquisition news",
    "engine": "google"
  }'

That returns serpData.results, each item carrying a title, targetUrl, description, and realPosition. There's no per-result content in the search response, so full markdown for any article is one more call:

curl https://api.link.sc/v1/fetch \
  -H "x-api-key: lsc_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/article", "format": "markdown"}'

And the processing loop around it, sketched in Python:

import requests
from difflib import SequenceMatcher

API = "https://api.link.sc/v1"
HEADERS = {"x-api-key": "lsc_your_key"}

def similar(a: str, b: str) -> bool:
    return SequenceMatcher(None, a.lower(), b.lower()).ratio() > 0.8

def fresh_news(query: str):
    r = requests.post(f"{API}/search",
        headers=HEADERS,
        json={"q": query, "engine": "google"})
    results = r.json()["serpData"]["results"][:20]  # slice client-side

    unique = []
    for res in results:
        if not any(similar(res["title"], u["title"]) for u in unique):
            unique.append(res)

    articles = []
    for res in unique:  # fetch full content only for survivors
        page = requests.post(f"{API}/fetch",
            headers=HEADERS,
            json={"url": res["targetUrl"], "format": "markdown"})
        articles.append({**res, "content": page.json()["content"]})
    return articles  # deduped, full-content articles

Parameter names vary a bit across providers, so check the link.sc quickstart for the exact request shape, but the pattern (window, locale pair, content, dedup) transfers to any news API.

Use Cases and How Their Requirements Differ

Brand monitoring wants recall over precision: a one-day window, broad queries including misspellings, and aggressive dedup so one press release doesn't become twenty alerts. Latency matters less than coverage.

Finance and trading signals invert that: one-hour windows, verified publish times, and precision over recall, because acting on a duplicated or backdated story costs real money. This is the use case where you should trust nothing you didn't fetch and verify yourself.

Competitive intelligence lives on the country-language matrix from earlier: run the same query across each market you care about and diff what each locale's press is saying. The differences between markets are often the entire insight.

LLM answer engines need news search as a routing decision: "what happened with X this week" should hit a news-filtered search, not general web search, or you'll synthesize an answer from a two-year-old explainer. More on that pipeline in real-time web search for LLMs.

What I'd Tell You to Watch Out For

Publisher paywalls will eat some fraction of your fetches, so track your extraction success rate per domain and drop chronic failures from alerting. Timestamps lie, as mentioned, so verify from content when it matters. And query volume adds up quickly when you're polling many queries across many locales on a tight window, so cache within your freshness window: polling a one-day window every ten minutes is paying 144 times for one day of news.

Get the window right, set both locale parameters, dedupe before anything downstream sees the results. That's 90% of production news search.


Monitor the news in any market with one API call: get your free link.sc key and start with 500 credits a month.