Try
5,000 searches
$9.25
$1.85/1K searches
- Wire it into one agent
- Same API as the largest pack
- Credits never expire
Use case · news monitoring · topic=news, time_range=day
Watching a market, a competitor or a regulation means running the same searches every day and noticing what is new. A news search with page text turns that chore into a short script and a daily digest.
Quick answer
How do I monitor news with a search API?
Run a fixed list of queries once a day with news results from the past day, keep only URLs you have not seen, and summarise the new articles. LLMWebSearch returns news results with the first 3 articles read as Markdown, for one credit per query. Fifty topics checked daily use about 1,500 credits a month, from $1.20/1K searches. No KYC; pay in crypto.
Three parameters do most of the work. topic=news asks for news results instead of general web pages. time_range=day keeps only items from the past day. read=3 returns the text of the first three articles, so you can summarise them without opening each link.
A scheduler runs the script once a day, or every few hours for fast-moving topics. Each run sends the same queries, compares the URLs with those already seen and reports only the new ones.
Short, specific queries work best. Combine a name with an event: a company and "acquisition", a product and "recall", a law and "amendment". Broad queries return the same large outlets every day and hide the stories you care about.
Group queries by audience. A legal team, a product team and a sales team each want a different digest. One script can produce all three by tagging each query with its audience.
Use country and language when the news you need is local, for example country=fr and language=fr for French coverage.
// Run once a day (cron, a scheduler or an n8n Schedule trigger). Node.js 18+ (built-in fetch).
import fs from 'node:fs';
const API = 'https://llmwebsearch.com/api/v1/search';
const KEY = process.env.LLMWEBSEARCH_API_KEY;
const SEEN_FILE = './seen-urls.json';
const QUERIES = ['example corp product recall', 'example corp acquisition', 'example industry regulation'];
const seen = new Set(fs.existsSync(SEEN_FILE) ? JSON.parse(fs.readFileSync(SEEN_FILE, 'utf8')) : []);
const fresh = [];
for (const q of QUERIES) {
const res = await fetch(API, {
method: 'POST',
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ q, topic: 'news', time_range: 'day', max_results: 10, read: 3, max_chars: 3000 }),
});
if (!res.ok) {
console.error(q, res.status, await res.text());
continue;
}
const { results } = await res.json();
for (const r of results) {
if (seen.has(r.url)) continue; // the same story found by two queries is reported once
seen.add(r.url);
fresh.push({ query: q, title: r.title, url: r.url, published_at: r.published_at, text: r.content });
}
}
fs.writeFileSync(SEEN_FILE, JSON.stringify([...seen]));
for (const item of fresh) console.log(`${item.published_at ?? 'n/d'} ${item.title}\n ${item.url}`);Keep a list of URLs already reported and skip them on the next run. The script above stores that list in a small JSON file; a database table works the same way.
The same story often appears on several outlets, each with its own URL. Group results whose titles share most of their words, and show one headline with several links. The published_at field helps to order a group and to spot the first report.
Clear old URLs after a few weeks so the file does not grow forever. Stories older than your time_range cannot come back anyway.
Send the new articles to a model with a fixed instruction: one line per story, what happened, who is involved, and the source number. Ask it to merge items that describe the same event.
Because the article text is already in the results, the model summarises what the article says, not what the headline suggests. Keep each article short with max_chars around 3,000; the first paragraphs of a news story carry the essentials.
Articles behind a paywall or a login, and sites that refuse our reader. Those results still appear with their title, URL and snippet, and a content_status that explains the gap.
Our reader respects robots.txt: it introduces itself as LLMWebSearch, follows the rules a site writes for it or for all robots, and leaves out the content of any page it is not allowed to read. When a site turns our reader away, the result comes back without content and with the site's status: we never solve CAPTCHAs, sign in to accounts or work around a block or a paywall. For a paywalled outlet, the headline and snippet are often enough to flag the story; a person with a subscription can read the rest.
One credit per query per run. Fifty queries checked once a day use about 1,500 credits a month. 5,000 searches at $9.25 covers three months of that schedule.
Checking every three hours multiplies the count by eight: about 12,000 credits a month for the same fifty queries. 25,000 searches at $41.25 then covers two months. Reserve frequent checks for the few topics where hours matter.
Queries × runs per day × 30 days. Search credits have no expiry date: what you do not use this month is still there next year.
5,000 searches
$9.25
$1.85/1K searches
25,000 searches
$41.25
$1.65/1K searches
100,000 searches
$145
$1.45/1K searches
In every plan: Top 3 pages read as Markdown · Country, language, time and domain filters · Failed calls not charged · Credits never expire
Yes. Use a Schedule trigger and an HTTP Request node pointed at the search endpoint. The n8n page shows the settings.
Results come from a live web search run at the moment of your call, in the order the search engine ranks them; nothing is served from an old index. With time_range=day, only items from the past day are kept.
Yes. Set language and country per query, so one script can follow several markets.
Each result carries its position, title, URL, host, snippet and, when it was read, the page's main content as Markdown or plain text with its word count and publication date when known.
From $1.20/1K searches · no KYC
Get an API key