How to Build a Multi-Source News Feed for AI Agents in 2026
Merge Google, Bing and DuckDuckGo News into one deduplicated, sentiment-scored feed for AI agents and RAG. Topic in, structured feed out. No API key.
News is one of the hardest grounding tasks for an AI agent: it’s time-sensitive (yesterday’s answer is wrong today), fragmented (no single source has everything), and noisy (the same story gets republished dozens of times across wire services). An agent that browses one publisher gets a partial view; an agent that hits a single commercial news API gets rate-limited or billed per call. This guide covers how to merge three news sources into one clean, deduplicated, sentiment-scored feed — a grounding layer you can drop straight into a prompt or a vector store — with no API key and no browser.
What you get per article
Every article arrives as a flat record — 15 fields, predictable shape, ISO dates, nullable values — designed to feed straight into an LLM or an index:
query— the topic, keyword or company this item was found for (tags each row in bulk mode).title— the article headline.url— link to the full article.snippet— the article summary from the RSS description, HTML-stripped, first ~500 chars.source— the outlet name (e.g.TechCrunch).sourceDomain— the publisher domain (techcrunch.com).sourceFeeds— which feeds surfaced this item (googleNews,bingNews,duckduckgoNews).publishedAt/publishedDate— the raw feed timestamp, plus a normalizedYYYY-MM-DDdate (may be null if the feed omits one).language— the locale used for the query (e.g.en-US).sentimentScore— a normalized value in the-1..+1range.sentimentLabel—positive,negativeorneutral.imageUrl— article thumbnail, when the feed provides one.duplicateCount— how many raw copies (across sources and outlets) merged into this one row.scrapedAt— ISO 8601 scrape timestamp.
The two fields that make this more than a headline dump are duplicateCount and sourceFeeds: together they tell you how widely a story was syndicated and which aggregators surfaced it — a signal in its own right for judging how big a story is.
How the sources actually work
The actor doesn’t drive a browser or hold per-source API keys. It reads three providers’ public RSS feeds over direct HTTP, fans them out per query in parallel, and merges the results:
- Google News — RSS, with
hl(language) andgl(country) parameters for localization. - Bing News — RSS.
- DuckDuckGo News — RSS.
You pick any subset via the sources field; using all three is strictly better up to your maxResults cap, because the dedup step folds the overlap away and the duplicateCount reflects the merge.
The merge is a two-stage deduplication:
- Exact key dedup — on
source-domainplus a normalized title prefix. This catches the identical article republished at the same URL. - Fuzzy title dedup — token-Jaccard title similarity above 0.72. This catches wire and syndicated stories that are phrased slightly differently across outlets and collapses them into one row.
Sentiment runs as a fast AFINN-style lexicon — roughly 250 weighted terms plus negation handling — over each headline and snippet, normalized to -1..+1 with a positive/negative/neutral label. No ML model, no heavy dependency, no cold start.
A single-topic input:
{
"mode": "topic",
"query": "openai",
"sources": ["googleNews", "bingNews", "duckduckgoNews"],
"maxPerSource": 50,
"maxResults": 100,
"daysBack": 7,
"sentiment": true
}
The actor has three modes: topic (one keyword), company (brand news by name or domain), and bulk (many topics, one merged feed per topic in a single run):
{
"mode": "bulk",
"queries": ["openai", "anthropic", "mistral ai", "electric vehicles", "AI regulation"],
"daysBack": 7,
"maxResults": 40
}
▶ Run the News Intelligence Scraper on Apify — one topic in, a deduplicated sentiment-scored feed merged from Google, Bing and DuckDuckGo News out. No API key, no browser. Export to JSON, CSV or Excel — or wire it into an MCP server for agents.
The access reality
Because this reads public RSS rather than scraping bot-defended search pages, there’s no anti-bot wall to engineer around — but there are real constraints to design for:
- RSS is recency-bounded. RSS feeds return recent items, typically the last few days to weeks depending on the source and query.
daysBackfilters within that window (0–365, where 0 disables the filter); it can’t reach further back than the feeds themselves carry. UsedaysBack: 7for dashboards,30for trend reports. - Per-source caps.
maxPerSource(1–200, default 50) caps what’s pulled from each feed per query;maxResults(1–2000, default 200) caps the final deduplicated count saved per query. - Rate limits on RSS. Route through the Apify datacenter proxy (
useApifyProxy) to avoid per-IP throttling when you hit the feeds at volume. - Empty runs are free. A query that matches nothing yields zero items and is not charged.
Example output
A single deduplicated article that two feeds surfaced:
{
"query": "openai",
"title": "OpenAI announces new reasoning model",
"url": "https://techcrunch.com/2026/07/01/openai-reasoning-model",
"snippet": "The company said the new model improves on prior reasoning benchmarks while cutting latency…",
"source": "TechCrunch",
"sourceDomain": "techcrunch.com",
"sourceFeeds": ["googleNews", "bingNews"],
"publishedDate": "2026-07-01",
"sentimentScore": 0.42,
"sentimentLabel": "positive",
"duplicateCount": 3,
"scrapedAt": "2026-07-02T12:00:00.000Z"
}
sourceFeeds shows Google and Bing both carried it; duplicateCount: 3 means three raw copies merged into this row — the story was syndicated widely.
Use cases
- Brand & reputation monitoring — watch a company name across three feeds, collapse syndications, and track the sentiment trend over 30 days.
- Market intelligence — query a basket of industry keywords weekly and build a sentiment-weighted news index.
- Event grounding — answer “why did X move?” by pulling this week’s deduped news for the entity, sorting by sentiment, and summarizing the negative cluster.
- Competitor tracking — monitor rival names and surface only genuinely new items; dedup kills the wire echo chamber so you’re not re-reading the same story ten times.
- RAG freshness — embed the latest N items per topic into a vector store so answers cite current events instead of stale training data.
- Crisis detection — run hourly on a watchlist and alert when the negative-sentiment item count crosses a threshold.
Why the AI-agent angle matters
This is built as an agent-grounding layer, not a human-facing news reader. The schema is the tell: flat fields, ISO dates, nullable values, per-item attribution. An agent passes a topic and gets back a clean JSON table it can read, summarize or cite — no HTML parsing, no browsing, no per-source client code. Expose it through an MCP server or Apify tool integration and the agent pulls a fresh, deduplicated, sentiment-tagged feed straight into its context. One call returns what would otherwise be three rate-limited API integrations plus a dedup pipeline.
Build it yourself vs. use the managed actor
You could wire up three RSS parsers yourself. What you’d then maintain:
- Three feed formats — Google, Bing and DuckDuckGo RSS differ in structure, date formats and how they name outlets.
- The dedup pipeline — the two-stage exact-plus-fuzzy merge is the hard part, and the Jaccard threshold needs tuning to avoid collapsing distinct stories or leaving syndications through.
- Sentiment — a lexicon with negation handling, or a heavier ML dependency.
- Feed drift — Google News RSS parameters and endpoints change; DuckDuckGo’s feed shape shifts.
Pricing is pay-per-result — one charge per saved deduplicated item, no platform fee to calculate, and zero-result runs are free. Because dedup happens before billing, you’re charged for unique stories, not for the syndicated noise.
Common pitfalls
Specific gotchas for a news-grounding pipeline:
- The sentiment is a lexicon, not a transformer. It’s excellent for trends and ranking (“show me the most negative items”) and weaker on sarcasm and domain jargon. For production-grade sentiment, post-process the items with an LLM. It’s also English-centric — treat labels as approximate for non-English queries, or disable
sentimententirely. - Some items lack a
publishedDate. When a feed omitspubDate, the item is kept (it may still be relevant) but sorted last; the rawpublishedAtstring is preserved when available. Don’t drop null-date rows blindly. - Snippet, not full text. You get
titleplus the RSSsnippet(~500 chars), not the article body. For full text, pass theurlinto a content extractor downstream. duplicateCountis a syndication signal, not a quality one. A high count means wide syndication, which often tracks story importance — but promotional wire spam also syndicates widely. Read it as reach, not merit.- Localization is Google-only. The
language(hl) andcountry(gl) parameters apply to the Google News feed. Bing and DuckDuckGo don’t take the same locale controls, so a non-English query still leans on Google for locale precision. - More sources is better, up to your cap. Using all three raises coverage and improves dedup — but your
maxResultsstill caps the saved count per query, so set it with the merge in mind.
Wrapping up
The value here isn’t any single feed — it’s the merge: three sources cross-deduplicated into one clean, attributed, sentiment-tagged table an agent or a dashboard can consume directly. If you’re grounding an LLM, running brand monitoring, or building a news dataset, a managed actor hands you that layer in one call with the dedup and sentiment already solved.
▶ Open the News Intelligence Scraper on Apify — up to 2,000 deduplicated, sentiment-scored articles per query from three sources in one run. No API key, no browser. Export to JSON, CSV or Excel. Start on Apify’s free monthly credit.
Related guides
How to Build a Deep-Research Retrieval Layer for AI Agents
Give an agent a topic and get ranked web sources, full-page Markdown, and recent news with citations — keyless multi-source retrieval for RAG and grounding.
How to Extract Structured Data from Any URL in 2026
Turn any web page into clean JSON without an LLM: parse schema.org JSON-LD, OpenGraph, tables, prices and contacts deterministically — no API key, no browser.
How to Add Live Web Search to AI Agents (No API Key)
Give your LLM fresh, citable search results without a Tavily or SerpAPI key. How live SERP extraction works: ranked results plus Markdown page content for RAG.