Company & Keyword News Monitor: New Articles, Deduped
Pricing
from $1.20 / 1,000 story returneds
Company & Keyword News Monitor: New Articles, Deduped
Watch companies and keywords in world news. Get only new articles since your last run, real publisher links, one row per story across outlets, and event tags. GDELT + your RSS feeds.
Pricing
from $1.20 / 1,000 story returneds
Rating
0.0
(0)
Developer
Southern Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Security
Limited permissionsShare
Watch companies, competitors and keywords across world news. Each run returns only the stories that are new since your last run. The same story from many outlets becomes one row, links go straight to the publisher, and every run gives you the same 25 spreadsheet-ready columns.
Typical uses: competitor monitoring ("Acme" + "outage" / "lawsuit" / "complaints"), PR and brand mentions, funding / layoffs / acquisition triggers for sales, and keyword alerts for a newsletter.
Read this first: what it is and what it isn't
- This is not a Google News scraper. Google allows its News RSS feeds only "within a personal feed reader for personal, non-commercial use", and scraping Google News pages gets blocked (that's the main complaint about Google News scrapers). This actor uses sources that permit this use and keep working:
- The GDELT Project: an open index of world news (tens of thousands of outlets, 50,000–110,000 English articles a day, plus ~150,000 a day translated from ~65 languages). It is free to use with attribution, so every row carries an
attributioncolumn. Keep it when you republish. - Your own RSS/Atom feeds (publishers, company newsrooms, blogs). It can also find a company's own newsroom feed from its domain.
- Hacker News (optional).
- The GDELT Project: an open index of world news (tens of thousands of outlets, 50,000–110,000 English articles a day, plus ~150,000 a day translated from ~65 languages). It is free to use with attribution, so every row carries an
- Coverage is GDELT's, not Google's. Most news sites are included, but some big outlets block GDELT's crawler or appear rarely (in our tests, a 24-hour search for "China" limited to reuters.com, bbc.co.uk, bbc.com and abc.net.au found a single ABC story). For must-have outlets, add their RSS feeds in
feedUrls. - Delay: about 15–60 minutes. GDELT publishes a file every 15 minutes, and an article usually shows up 15–60 minutes after it appears. For GDELT rows,
publishedAtis the time GDELT first saw the article (dateType = first_seen_by_gdelt), not the publisher's own timestamp. Feed and Hacker News rows carry the real publication time (dateType = published). - Matching is on headlines and links, plus organisations named in the body. It isn't a full-text keyword search:
- Keywords are matched in the headline and the link (and in feed summaries).
- Companies are also matched when GDELT lists them among the organisations named in the article text, if they're named at least twice (
minArticleMentions, default 2). These rows showmatchedIn = "article text". They are the most tangential, so filter onmatchedInif you only want headline mentions, or turnsearchArticleEntitiesoff.
- Keywords match literally. "raises" also finds "raises alarm", and "down" finds "breaks down". Prefer phrases ("funding round", "data breach", "outage"), use
excludeKeywords, or filter on theeventTypescolumn. - No article text. You get the headline, link, date, outlet, share image and (for feeds) the publisher's own summary. Paywalled content is not read.
- One run covers at most 7 days. Run a longer history week by week (
dateFrom/dateTo). History goes back to 19 Feb 2015. - A full 7-day backfill takes longer (about 10–16 minutes for 672 GDELT files). A daily or hourly monitor run usually finishes in seconds to a few minutes.
- Some feeds refuse automated readers (one company newsroom answered HTTP 500 in our tests). Failed feeds are listed in the
SOURCESrecord and are never charged.
How "new articles only" works
mode = "new_articles" (the default) remembers which stories and which GDELT hours each monitor has already handled. It keeps that memory in a named key-value store (monitorName, or one per saved task).
- First run: returns the last
lookbackHours(default 24). - Every later run: continues from where the previous one stopped. You only get (and pay for) stories you haven't seen, and an hour of news is never scanned twice.
- Same story, new outlet: a story you already received doesn't come back because one more outlet picked it up.
- Fresh start: use a new
monitorName.
Schedule it hourly, daily or weekly. The total cost is about the same, because you pay per hour of news scanned, not per run.
mode = "all_articles" returns everything in a window: dateFrom / dateTo, or the last lookbackHours.
- Dates can be plain dates (UTC), date-times or relative times ("3 days").
- A plain
dateToincludes that whole day. From2026-10-20to2026-10-21covers 48 hours.
Input example
{"companies": ["Atlassian (atlassian.com)", "Asana", "Meta | Facebook"],"keywords": ["outage", "data breach", "layoffs"],"matchLogic": "any","mode": "new_articles","monitorName": "competitor-news","lookbackHours": 24,"sources": ["gdelt", "feeds"],"feedUrls": ["https://techcrunch.com/feed/"],"excludeKeywords": ["stock price", "shares sold"]}
- Companies: a name, a domain, both (
"Acme Corp (acme.com)"), or variants separated by|. Legal suffixes (Inc, Ltd, Corp…) are ignored when matching. - Competitor complaints: set
matchLogic: "company_and_keyword". Then the company must be in the headline or link (or the article is on its own site or feed), and so must one of your keywords. A passing mention of the company in the body isn't enough there. - Other languages: set
languages: ["de","fr"](or"any"). Matching uses GDELT's English translation, but headlines stay in the original language. - Filters:
onlyDomainsandexcludeDomains, plusmaxArticles(newest first; in a monitor, the rest wait for the next run).
Output (25 columns, same order every run)
| Column | Meaning |
|---|---|
| storyKey | Stable id of the story (same across runs) |
| title, url, sourceDomain | Headline, publisher link (never a Google redirect), outlet |
| publishedAt, dateType, ageHours | Date (see above), what kind of date it is, and its age at run time |
| language | Two-letter language of the article |
| matchedCompanies, matchedKeywords, matchedIn | What matched and where: title, link, summary, article text, company site, company feed, your feed |
| eventTypes | Tags from the headline: funding, acquisition, ipo, earnings, layoffs, hiring, expansion, product, partnership, leadership, legal, regulatory, security, outage, complaints |
| tone | GDELT tone score (negative = negative coverage) |
| outletCount, otherOutlets, otherUrls | How many outlets ran this story, and the others' domains and links (; -separated text, so CSV columns stay fixed) |
| summary | Feed summary (feeds only) |
| imageUrl | Share image |
| source, feedUrl, hnUrl | gdelt / feed / hackernews, the feed it came from, the Hacker News discussion |
| isNew, firstSeenAt | Monitor mode: true for stories new to this monitor, and when the monitor first saw them |
| attribution | Source credit (GDELT requires citation) |
| scrapedAt | Run time |
Each run also writes:
- RUN_SUMMARY: counts, filters, what was not returned and why, and charged events.
- SOURCES: every source read, files, errors and coverage.
Pricing (pay per event)
| Event | Price | When |
|---|---|---|
| Story returned | $0.0015 | Per row. Duplicates and filtered-out articles are free. A monitor only returns new stories |
| Hour of world news scanned (English) | $0.0006 | Per hour of GDELT's English stream scanned. At least 1 per run when the stream is read; a monitor never scans the same hour twice |
| Hour of world news scanned (other languages) | $0.0015 | Only when you add languages other than English |
| RSS/Atom feed read | $0.0003 | Per feed read successfully; failed feeds are free |
Store discount tiers: free-plan and Bronze users pay the prices above. Silver gets 10% off and Gold (and higher) gets 20% off.
Examples:
- A daily English monitor costs $0.0144 per day for news scanning, plus $0.0015 per new story. For example, 30 new stories a day comes to about $0.06 a day.
- An hourly schedule costs the same per day as a daily one. Every run that checks GDELT is charged at least 1 news hour, even if GDELT has no new file since the previous run, so don't schedule more often than every 15 minutes (GDELT adds a file every 15 minutes). Hourly or daily is best.
- Invalid input and the self-test cost $0.
To cap spending, set the run's maximum cost. The actor stops returning rows at the cap and tells you how many it didn't return.
Reliability
- GDELT files are downloaded with retries and timeouts. A missing or not-yet-published file is skipped and reported, not guessed. If GDELT can't be reached at all, the run fails rather than return an empty "success", and nothing is charged for it.
- Bad input (no companies or keywords, an unknown language, an impossible date window, only broken feed URLs, a Google News feed) ends with a clear message and costs $0.
- A built-in self-test (
{"selfTest": true}) runs offline checks of matching, de-duplication, dates, feed parsing and memory, plus live checks of each source. The developer runs it daily.
FAQ
Why not Google News? Its feeds are licensed for personal, non-commercial feed readers only, and scraping it gets blocked. A tool that breaks every few weeks isn't a monitor.
Do I get Google redirect links? No. Every link points to the publisher's own article.
Why did I get an article that doesn't mention my company in the headline? Its matchedIn is "article text": GDELT found your company named at least twice in the article. Raise minArticleMentions or switch searchArticleEntities off.
Can I republish the results? Headlines and links, yes, with the attribution column. Article content belongs to the publishers.