
Apify Financial News
- 111 installs
- 239 repo stars
- Updated June 29, 2026
- apify/awesome-skills
apify-financial-news is a Claude skill that discovers and extracts financial news for tracked portfolio companies across 33 verified Tier 1 sources plus a Google News fallback using Apify Actors.
About
A skill that discovers and extracts financial news for tracked portfolio companies across 33 verified Tier 1 sources like Bloomberg, Reuters, FT, and WSJ, plus a broad Google News fallback. It builds per-company queries, discovers headlines, deduplicates and routes each domain to a mandated extractor Actor, cleans the text, and outputs source tables. An analyst uses it to run a news scan or monitor financial press.
- Discovers and extracts financial news for portfolio companies
- Covers 33 verified Tier 1 sources plus a broad Google News fallback
- Routes each domain to a mandated extractor and estimates run cost
Apify Financial News by the numbers
- 111 all-time installs (skills.sh)
- Ranked #516 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
apify-financial-news capabilities & compatibility
Requires an Apify account; roughly $0.10-0.50 per single company and $1-5 per full portfolio scan in Apify credits.
- Capabilities
- web scraping · research · news monitoring
- Use cases
- research · web scraping · web search
- Pricing
- Bring your own API key
What apify-financial-news says it does
Discover and extract financial news for portfolio companies via Apify Actors.
33 Tier 1 sources organized in 4 categories (Global / Pan-European / Institutional / CEE Local).
**Estimated cost**: $0.10–0.50 per single company, $1–5 per full portfolio scan.
npx skills add https://github.com/apify/awesome-skills --skill apify-financial-newsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 111 |
|---|---|
| repo stars | ★ 239 |
| Last updated | June 29, 2026 |
| Repository | apify/awesome-skills ↗ |
What it does
Discover and extract financial news for portfolio companies from vetted sources via routed Apify Actors.
Who is it for?
News scans and financial-press monitoring for portfolio companies
Skip if: Marketing or social-listening tasks and morning-briefing formatting (out of scope)
When should I use this skill?
The user asks to find news about a company, monitor financial press, or run a news scan for a portfolio company.
What you get
Verified financial news for each company is discovered, extracted, cleaned, and tabled.
- Tier 1 and Tier 2 news tables
- Cleaned article text per source
By the numbers
- 33 Tier 1 sources
- 4 source categories
- $0.10-0.50 per single company
Files
Financial News Intelligence
Discover and extract financial news for portfolio companies via Apify Actors. Two modes:
- Single company — news scan for one company.
- Portfolio scan — same pipeline run across multiple companies.
33 Tier 1 sources organized in 4 categories (Global / Pan-European / Institutional / CEE Local). Tier 2 = broad Google News fallback for unverified domains.
Estimated cost: $0.10–0.50 per single company, $1–5 per full portfolio scan.
Prerequisites
- Apify access — preferred:
apifyCLI (npm install -g apify-cli && apify login); fallback: Apify MCP connector (call-actortool). CLI is faster and preferred when both are available. - Python 3 +
pip install readability-lxml lxml(for theextract_and_clean.pypost-processor) - Companies data at
${CLAUDE_PLUGIN_ROOT}/data/companies.json
${CLAUDE_PLUGIN_ROOT} is the plugin's root directory (where .claude-plugin/ lives). It is resolved automatically by Claude Code when the plugin is installed, or set to the --plugin-dir path during development.
Workflow checklist
Copy this and tick boxes as you progress:
Task Progress:
- [ ] Step 0: Verify prerequisites — try `apify --version && apify info`; if unavailable, check for `call-actor` MCP tool; if neither, tell user to install apify CLI or Apify MCP connector. Also verify: `python3 -c "from readability import Document; print('OK')"` (install: `pip install readability-lxml lxml`)
- [ ] Step 1: Build queries (look up company in data/companies.json or construct manually)
- [ ] Step 2: Discovery — pick 8-12 sources by region, run 2-phase Google News
- [ ] Step 3: Dedup + route (Tier 1 = whitelisted domain → verified extractor; Tier 2 = broad → rag-web-browser)
- [ ] Step 4: Extract & clean (run extractor, then extract_and_clean.py)
- [ ] Step 5: Output Tier 1 + Tier 2 tables to userConstraints
Allowed Apify Actors (exhaustive — do NOT use others)
| Actor | Purpose |
|---|---|
data_xplorer/google-news-scraper-fast | Google News discovery |
louvre/rss-news-aggregator | RSS discovery |
rodrigo_pacelli/headline-news-scraper | Headline discovery |
jamie_tran/bloomberg-article-scraper | Bloomberg extraction |
romy/bloomberg-news-scraper | Bloomberg fallback |
workhard3000/news-intelligence-rag-extractor | Paywall extraction |
apify/rag-web-browser | Free/soft-paywall + Tier 2 |
stanvanrooy6/universal-ai-web-scraper | Hard paywall (Barron's, MarketWatch) — $0.25/page |
Do NOT use any other actor. Do NOT use WebSearch, WebFetch, or browser tools.
Extractor routing (mandatory — do NOT substitute)
| Extractor | Domains |
|---|---|
jamie_tran/bloomberg-article-scraper | bloomberg.com |
workhard3000/news-intelligence-rag-extractor | ft.com, wsj.com, economist.com, morningstar.com, asia.nikkei.com, caixinglobal.com, zawya.com, euobserver.com, reuters.com |
apify/rag-web-browser | cnbc.com, forbes.com, investors.com, lesechos.fr, afr.com, scmp.com, euronews.com, intellinews.com, handelsblatt.com, politico.eu, eubusiness.com, eureporter.co, ecb.europa.eu, + all 7 CEE Local |
stanvanrooy6/universal-ai-web-scraper | barrons.com, marketwatch.com |
| REST API (presscorner) | ec.europa.eu |
Full per-source config: reference/SOURCE_CONFIGS.md. Machine-readable: data/sources.json.
Pipeline
Step 1: Build queries
Look up company in ${CLAUDE_PLUGIN_ROOT}/data/companies.json. Key fields under queries: gnews_en, gnews_cz, bloomberg.
For non-portfolio companies, construct manually: quoted full legal name + ticker OR variant + geographic qualifier.
Query rules:
- Use
"InPost SA"notInPost(quoted full names avoid false positives — see reference/EUROPEAN_COMPANIES_GUIDE.md) - Per-source
site:operator:site:bloomberg.com "InPost SA" OR "INPST" - FT tip: use
site:ft.com/content/(bareft.comreturns stock-data pages) - Valid timeframes:
"1h","1d","7d","1y","all"(NOT"30d") - Tickers < 4 chars: always pair with full company name
- ALWAYS set
decodeUrls: trueon Google News input
Step 2: Discovery
Do NOT search all 33 sources. Pick 8–12 based on company region.
Regional priorities
| Region | Priority Sources |
|---|---|
| CZ | ČTK, IntelliNews, Reuters, Bloomberg, POLITICO EU, FT, Handelsblatt |
| PL | PAP, IntelliNews, Reuters, Bloomberg, POLITICO EU, FT |
| HU | Telex.hu, HVG.hu, VG.hu, IntelliNews, Reuters, Bloomberg |
| BG | BTA, IntelliNews, Reuters, Bloomberg, Euronews |
| SK | TASR, IntelliNews, Reuters, Bloomberg, Handelsblatt |
| Western Europe | Bloomberg, Reuters, FT, Handelsblatt, Les Echos, POLITICO EU |
| US / Global | Bloomberg, Reuters, WSJ, FT, CNBC, Forbes, Barron's |
| Asia / MENA | Bloomberg, Reuters, SCMP, Nikkei, Caixin, Zawya |
| EU Regulatory | POLITICO EU, EUobserver, EUbusiness, EU Reporter, EC Press Corner, ECB |
Two-phase Google News strategy
Phase 1 — Targeted (per priority source, with site:):
apify call data_xplorer/google-news-scraper-fast \
--input '{"keywords":["site:bloomberg.com \"InPost SA\" OR \"INPST\""],"maxArticles":10,"timeframe":"7d","region_language":"US:en","decodeUrls":true,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}' \
--user-agent apify-awesome-skills/apify-financial-news \
--output-dataset > discovery_bloomberg.jsonPhase 2 — Broad (always run, no site: operator). Classify results by domain in Step 3 — whitelisted → Tier 1, others → Tier 2.
CEE local-language discovery: For CEE companies, run additional queries with region_language set to CZ:cs, PL:pl, HU:hu, BG:bg, SK:sk. See region_language field per source in data/sources.json.
EC Press Corner — direct REST API (no Actor)
curl -s "https://ec.europa.eu/commission/presscorner/api/documents?reference=IP/26/614&language=en"Parse IP_XX_NNN reference IDs from Google News titles to construct API calls.
RSS / Headline discovery (optional)
For sources with RSS, you can supplement GNews with louvre/rss-news-aggregator (max 10 feeds per run; split into batches). For 6 sources, rodrigo_pacelli/headline-news-scraper works (CNBC, SCMP, Nikkei, Caixin, Zawya tag-pages-only, Handelsblatt). RSS/headline output is unfiltered — filter client-side by company name in title/description. Full feed list: reference/PIPELINE_DETAIL.md.
Step 3: Dedup & route
1. Collect URLs from all discovery runs. 2. Classify by domain: whitelist (33 Tier 1 sources) → Tier 1; other → Tier 2. 3. Filter non-article URLs: /quote/, /stock/, /sitemap, /author/, /tag/, /key-metrics/, /newsletters/, /topic/, /profile/, redirectUrl=. 4. Filter by company name/ticker in title. 5. Deduplicate (URL normalize). 6. Route Tier 1 URLs to verified extractor per routing table. 7. Route Tier 2 URLs to apify/rag-web-browser.
Low-coverage fallback (< 3 articles): broaden timeframe to "1y", run Phase 2 if skipped, try local-language queries.
Step 4: Extract & clean
Run the extractor per the routing table. For rag-web-browser calls, use outputFormats: ["html"].
After extraction, run extract_and_clean.py on the dataset to strip nav/menus/footers via readability-lxml. The script auto-detects format: HTML cleaned via readability-lxml, already-clean output (Bloomberg scraper, workhard3000) passes through.
DATASET_ID=$(apify call apify/rag-web-browser \
--input '{"query":"<ARTICLE_URL>","maxResults":1,"outputFormats":["html"],"requestTimeoutSecs":40,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]},"removeCookieWarnings":true}' \
--user-agent apify-awesome-skills/apify-financial-news \
--json | jq -r '.defaultDatasetId')
python3 ${CLAUDE_PLUGIN_ROOT}/skills/apify-financial-news/reference/scripts/extract_and_clean.py "$DATASET_ID"The --json flag returns run metadata including defaultDatasetId. Errors produce non-zero exit code so the pipeline fails fast.
Step 5: Output
Two tables to the user — Tier 1 (verified) and Tier 2 (broad). Per article: source, title, author, date, char count, URL.
## News Intelligence: InPost (INPST.AS) — Last 7 days
### Tier 1 — Verified Sources (2)
| Source | Title | Author | Date | Chars | URL |
|--------|-------|--------|------|-------|-----|
| bloomberg.com | InPost Readies AI Shopping Assistant | K. Krasuski | 2026-03-19 | 7,577 | … |
### Tier 2 — Broad Discovery (5)
| Source | Title | Date | Chars | URL |
|--------|-------|------|-------|-----|
| seekingalpha.com | InPost expands parcel locker network | 2026-03-18 | 1,200 | … |
*Sources: 6 verified queried | 5 broad | Cost: $0.15*Macro context
For country-level economic context, use these alongside news scans:
- ING Think (
think.ing.com) — daily CEE FX/rates viaapify/rag-web-browser(~11K chars). Best free open-access CEE macro source. - IMF (
imf.org) — Article IV concluding statements viaapify/rag-web-browser(~22K chars). - ECB (
ecb.europa.eu) — already in Tier 1. - Central banks (ČNB, NBP, MNB, BNB, NBS) — direct URL extraction; see reference/MACRO_SOURCES.md.
Critical gotchas
- ALWAYS `decodeUrls: true` in Google News (encoded redirects break ALL extractors).
- "InPost" is ambiguous — matches "post-Maduro". Use
"InPost SA"for precision. - RSS max 10 feeds per run — split into batches.
- Zawya headline-scraper returns tag pages, NOT articles — exclude from headline runs.
- Reuters needs RESIDENTIAL proxy — without it, returns 386 chars.
- Reuters: rag-web-browser returns 0 chars on ~60% of URLs — use workhard3000 only.
- Morningstar `.co.uk` URLs fail with workhard3000 — use
.comURLs for extraction. - WSJ livecoverage pages fail — skip URLs matching
wsj.com/livecoverage/. - FT: rag-web-browser returns 16 chars ('Client Challenge') — use workhard3000.
- Forbes: workhard3000 returns 0 chars — use rag-web-browser.
- Barron's / MarketWatch cost $0.25/page — use selectively for high-value articles.
- Caixin URLs must be complete — truncated URLs fail extraction.
- EC Press Corner is an Angular SPA —
rag-web-browserreturns 0 chars. Use REST API.
Full failure-mode catalog: reference/PIPELINE_DETAIL.md, reference/SOURCE_CONFIGS.md.
Reference
- data/sources.json — machine-readable: 33 sources × discovery × extractor × cost × gotchas
- reference/SOURCE_CONFIGS.md — per-source curl examples, run IDs, output samples
- reference/PIPELINE_DETAIL.md — RSS feeds, headline sources, warnings, failed paths, source quick-reference table
- reference/MACRO_SOURCES.md — ING Think, IMF, central banks
- reference/EUROPEAN_COMPANIES_GUIDE.md — European company handling tips
- reference/MORNING_NOTE_DETAIL.md — HTML output spec (archived; out of scope for this skill)
- reference/scripts/extract_and_clean.py, reference/scripts/clean_article.py — readability-lxml post-processors
{
"_metadata": {
"version": "1.1",
"last_updated": "2026-04-27",
"source": "Adapted from portfolio-research/news-intelligence/references/PIPELINE_DETAIL.md (quick-reference table lines 96-136, critical warnings 138-152, failed paths 154-172)",
"actors_allowed": [
"data_xplorer/google-news-scraper-fast",
"louvre/rss-news-aggregator",
"rodrigo_pacelli/headline-news-scraper",
"jamie_tran/bloomberg-article-scraper",
"romy/bloomberg-news-scraper",
"workhard3000/news-intelligence-rag-extractor",
"apify/rag-web-browser",
"stanvanrooy6/universal-ai-web-scraper"
],
"categories": [
"Global",
"Pan-European",
"Institutional",
"CEE Local"
],
"tier1_count": 33,
"upstream_issues": [
"PIPELINE_DETAIL.md (lines 9-11, 58-59): duplicate '**Actor**: ...' lines (cosmetic typo). Preserved verbatim per project verbatim-copies rule.",
"PIPELINE_DETAIL.md (line 86): free-floating numbered '3.' in 'Non-Article URL Filter Patterns' section is an orphan from a removed numbered list. Preserved verbatim.",
"PIPELINE_DETAIL.md Source Quick Reference Table (lines 96-136) lacks an explicit 'Global' category header for sources 1-20. Source SKILL.md (lines 22-29) authoritatively categorizes Les Echos (#12), Euronews (#18), IntelliNews (#19), Handelsblatt (#20) as Pan-European. Our data/sources.json follows SKILL.md categorization (16 Global / 8 Pan-European / 2 Institutional / 7 CEE Local), not the implicit grouping in PIPELINE_DETAIL.md table.",
"PIPELINE_DETAIL.md table uses 'present' (MarketWatch #10 chars_verified) and 'varies' (IntelliNews RSS volume) as placeholders for non-numeric values. Our sources.json represents these as null for consistency.",
"PIPELINE_DETAIL.md ECB row (#26) gives chars range '6,950–85,009'; EC Press Corner (#25) gives '9,000+'. Both encoded as chars_verified=null in our data, with quantitative info preserved in gotchas array."
]
},
"sources": [
{
"id": "afr",
"name": "Australian Financial Review",
"domain": "afr.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.afr.com/rss/feed.xml",
"rss_volume_typical": 20,
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 1231,
"gotchas": [
"Paywall tightened — was 4,399 chars in earlier audit, now 1,231",
"APAC focus, limited European coverage"
]
},
{
"id": "barrons",
"name": "Barron's",
"domain": "barrons.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "stanvanrooy6/universal-ai-web-scraper",
"cost_per_article_usd": 0.25,
"chars_verified": 3387,
"gotchas": [
"$0.25/page — use selectively for high-value articles only",
"No RSS (returns 403); headline-scraper returns 0"
]
},
{
"id": "bloomberg",
"name": "Bloomberg",
"domain": "bloomberg.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://feeds.bloomberg.com/markets/news.rss",
"rss_volume_typical": 30,
"extractor": "jamie_tran/bloomberg-article-scraper",
"extractor_fallback": "romy/bloomberg-news-scraper",
"cost_per_article_usd": 0.02,
"chars_verified": 7577,
"gotchas": [
"ALWAYS decodeUrls: true (encoded GNews redirects break Bloomberg extractors)",
"Use \"InPost SA\" not \"InPost\" to avoid post-Maduro/post-ESG false positives",
"Hard paywall — GNews + RSS only discovery"
]
},
{
"id": "caixin",
"name": "Caixin Global",
"domain": "caixinglobal.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"headlines"
],
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 4166,
"gotchas": [
"URLs must be complete — truncated URLs fail extraction",
"rag-web-browser fetches wrong page — do NOT use",
"Headlines volume low (7 articles)"
]
},
{
"id": "cnbc",
"name": "CNBC",
"domain": "cnbc.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss",
"headlines"
],
"rss_url": "https://www.cnbc.com/id/100003114/device/rss/rss.html",
"rss_volume_typical": 30,
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 4865,
"gotchas": []
},
{
"id": "economist",
"name": "The Economist",
"domain": "economist.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.economist.com/finance-and-economics/rss.xml",
"rss_volume_typical": 300,
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 14256,
"gotchas": [
"Best RSS coverage of all 33 sources (300 articles)",
"Byline always 'The Economist' — no individual authors",
"rag-web-browser returns 0 chars — do NOT use"
]
},
{
"id": "forbes",
"name": "Forbes",
"domain": "forbes.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.forbes.com/business/feed2",
"rss_volume_typical": 25,
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 4969,
"gotchas": [
"workhard3000 returns 0 chars — do NOT use",
"natasha.lekh Forbes actor under maintenance — do NOT use"
]
},
{
"id": "ft",
"name": "Financial Times",
"domain": "ft.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.ft.com/rss/home",
"rss_volume_typical": 13,
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 6960,
"gotchas": [
"rag-web-browser returns 16 chars ('Client Challenge') — do NOT use",
"GNews query: use site:ft.com/content/ (bare ft.com returns stock pages)"
]
},
{
"id": "ibd",
"name": "Investor's Business Daily",
"domain": "investors.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 6722,
"gotchas": [
"GNews coverage limited for non-US companies",
"RSS returns 403",
"mscraper IBD actor is $20/mo, US tickers only — do NOT use"
]
},
{
"id": "marketwatch",
"name": "MarketWatch",
"domain": "marketwatch.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.marketwatch.com/rss/topstories",
"rss_volume_typical": 10,
"extractor": "stanvanrooy6/universal-ai-web-scraper",
"cost_per_article_usd": 0.25,
"chars_verified": null,
"gotchas": [
"$0.25/page — use selectively",
"rag-web-browser returns HTTP 500 — completely blocked",
"Cheap fallback: workhard3000 returns excerpts only (448-878 chars)"
]
},
{
"id": "morningstar",
"name": "Morningstar",
"domain": "morningstar.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.morningstar.co.uk/uk/news/rss.aspx",
"rss_volume_typical": 20,
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 35256,
"gotchas": [
".co.uk URLs fail with workhard3000 — use .com URLs only for extraction",
"janbruinier Morningstar actor is for fund ratings, not news — do NOT use"
]
},
{
"id": "nikkei",
"name": "Nikkei Asia",
"domain": "asia.nikkei.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss",
"headlines"
],
"rss_url": "https://asia.nikkei.com/rss/feed/nar",
"rss_volume_typical": 50,
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 5723,
"gotchas": [
"Best headline coverage (60 articles)",
"RSS has title + link only, no description"
]
},
{
"id": "reuters",
"name": "Reuters",
"domain": "reuters.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 2632,
"gotchas": [
"RESIDENTIAL proxy mandatory — without it: 386 chars",
"Deprecated all public RSS feeds — GNews only",
"rag-web-browser returns 0 chars on ~60% of URLs even with RESIDENTIAL — do NOT use",
"dadhalfdev/reuters-scraper-per-event ignores keyword param — do NOT use",
"headline-news-scraper returns 0 — do NOT use"
]
},
{
"id": "scmp",
"name": "South China Morning Post",
"domain": "scmp.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss",
"headlines"
],
"rss_url": "https://www.scmp.com/rss/91/feed",
"rss_volume_typical": 50,
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 1819,
"gotchas": [
"Paywall tightened — was 3,014 chars, now 1,819"
]
},
{
"id": "wsj",
"name": "Wall Street Journal",
"domain": "wsj.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://feeds.a.dj.com/rss/RSSMarketsMain.xml",
"rss_volume_typical": 20,
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 4748,
"gotchas": [
"wsj.com/livecoverage/ URLs fail extraction — skip them",
"byline and publishedDate are null in workhard3000 — get from GNews/RSS metadata"
]
},
{
"id": "zawya",
"name": "Zawya",
"domain": "zawya.com",
"category": "Global",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 12681,
"gotchas": [
"Headline-scraper returns category/tag pages (/primarykeyword/OIL), NOT article URLs — exclude from headline runs",
"rag-web-browser returns HTTP 500 — do NOT use"
]
},
{
"id": "eubusiness",
"name": "EUbusiness",
"domain": "eubusiness.com",
"category": "Pan-European",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 4828,
"gotchas": []
},
{
"id": "euobserver",
"name": "EUobserver",
"domain": "euobserver.com",
"category": "Pan-European",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "workhard3000/news-intelligence-rag-extractor",
"cost_per_article_usd": 0.025,
"chars_verified": 3001,
"gotchas": [
"Use autoArchive: true in workhard3000 input (paywall bypass)",
"rag-web-browser hits 'Unlock article' paywall — do NOT use as primary"
]
},
{
"id": "eureporter",
"name": "EU Reporter",
"domain": "eureporter.co",
"category": "Pan-European",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 5921,
"gotchas": []
},
{
"id": "euronews",
"name": "Euronews",
"domain": "euronews.com",
"category": "Pan-European",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.euronews.com/rss?level=theme&name=business",
"rss_volume_typical": 50,
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 10917,
"gotchas": []
},
{
"id": "handelsblatt",
"name": "Handelsblatt",
"domain": "handelsblatt.com",
"category": "Pan-European",
"language": "DE",
"discovery_methods": [
"gnews",
"rss",
"headlines"
],
"rss_url": "https://www.handelsblatt.com/contentexport/feed/schlagzeilen",
"rss_volume_typical": 50,
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 10435,
"region_language": "DE:de",
"gotchas": [
"German content — use region_language: DE:de for GNews queries"
]
},
{
"id": "intellinews",
"name": "IntelliNews",
"domain": "intellinews.com",
"category": "Pan-European",
"language": "EN",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.intellinews.com/rss/",
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 10744,
"gotchas": [
"RSS volume varies",
"Niche source — excellent for PPF/CEE coverage",
"publishedDate null in workhard3000 — get from RSS/GNews metadata"
],
"rss_volume_typical": null
},
{
"id": "lesechos",
"name": "Les Echos",
"domain": "lesechos.fr",
"category": "Pan-European",
"language": "FR",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 2832,
"region_language": "FR:fr",
"gotchas": [
"French content — use region_language: FR:fr for GNews queries",
"RSS returns 403 — GNews only",
"Paywall tightened — was 9,257 chars, now 2,832"
]
},
{
"id": "politico-eu",
"name": "POLITICO Europe",
"domain": "politico.eu",
"category": "Pan-European",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 7677,
"gotchas": [
"Premium/paywalled articles return partial content — still useful for headline + lead"
]
},
{
"id": "ec-press-corner",
"name": "EC Press Corner",
"domain": "ec.europa.eu",
"category": "Institutional",
"language": "EN",
"discovery_methods": [
"gnews",
"rest_api"
],
"extractor": "REST API (presscorner)",
"rest_api_url": "https://ec.europa.eu/commission/presscorner/api/documents",
"cost_per_article_usd": 0,
"chars_verified": null,
"gotchas": [
"Article length 9000+ chars verified; no upper bound captured (PIPELINE_DETAIL.md:126).",
"DO NOT use rag-web-browser — Angular SPA returns 0 chars",
"Parse IP_XX_NNN reference IDs from GNews titles to construct API calls",
"Subdomain pages (energy.ec.europa.eu, research.ec.europa.eu) extract fine with rag-web-browser"
]
},
{
"id": "ecb",
"name": "European Central Bank",
"domain": "ecb.europa.eu",
"category": "Institutional",
"language": "EN",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": null,
"gotchas": [
"Press releases ~6,950 chars; projection reports up to 85,009 chars",
"First ~400 chars are nav boilerplate — strip or ignore",
"Excellent for SK and BG (eurozone members)"
]
},
{
"id": "bta",
"name": "BTA — Bulgarska Telegrafna Agentsia",
"domain": "bta.bg",
"category": "CEE Local",
"language": "BG",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 10851,
"region_language": "BG:bg",
"gotchas": [
"No RSS feeds",
"BTA web search is JS rendered — returns empty results",
"Only Google News site:bta.bg works"
]
},
{
"id": "ctk",
"name": "ČTK / České noviny",
"domain": "ceskenoviny.cz",
"category": "CEE Local",
"language": "CZ",
"discovery_methods": [
"gnews",
"rss"
],
"rss_url": "https://www.ceskenoviny.cz/sluzby/rss/ekonomika.php",
"rss_volume_typical": 50,
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 4596,
"region_language": "CZ:cs",
"gotchas": [
"Search on ceskenoviny.cz does NOT work (JS rendered, returns shell only)",
"Additional RSS: https://www.ceskenoviny.cz/sluzby/rss/cr.php (50 articles)"
]
},
{
"id": "hvg",
"name": "HVG.hu",
"domain": "hvg.hu",
"category": "CEE Local",
"language": "HU",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 4883,
"region_language": "HU:hu",
"gotchas": [
"Respected independent weekly (since 1968)"
]
},
{
"id": "pap",
"name": "PAP — Polska Agencja Prasowa",
"domain": "pap.pl",
"category": "CEE Local",
"language": "PL",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 9232,
"region_language": "PL:pl",
"gotchas": [
"PAP RSS is blocked by WAF (Incapsula)",
"PAP web search returns false positives (3-letter string match)",
"Only Google News site:pap.pl works reliably"
]
},
{
"id": "tasr",
"name": "TASR — Tlačová agentúra Slovenskej republiky",
"domain": "tasr.sk",
"category": "CEE Local",
"language": "SK",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 3956,
"region_language": "SK:sk",
"gotchas": [
"Google News returns generic titles ('Tlačová agentúra Slovenskej republiky') — extraction needed to determine article content",
"TASR web search redirects to homepage (SPA)",
"No RSS feeds"
]
},
{
"id": "telex",
"name": "Telex.hu",
"domain": "telex.hu",
"category": "CEE Local",
"language": "HU",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 8216,
"region_language": "HU:hu",
"gotchas": [
"Best Hungarian extraction quality among tested sources",
"Independent outlet, ex-index.hu journalists — high editorial credibility"
]
},
{
"id": "vg",
"name": "Világgazdaság",
"domain": "vg.hu",
"category": "CEE Local",
"language": "HU",
"discovery_methods": [
"gnews"
],
"extractor": "apify/rag-web-browser",
"cost_per_article_usd": 0.005,
"chars_verified": 9906,
"region_language": "HU:hu",
"gotchas": [
"Hungarian business daily — strongest GNews presence among HU sources",
"First ~900 chars contain navigation/ticker noise — article body starts after"
]
}
]
}
European Companies Guide — Portfolio Focus
Shared reference for handling European companies across all analysis skills.
SEC Filing Availability
- Many European companies don't file with SEC (no CIK)
- ADR-listed European companies (e.g. AUTL) DO have SEC filings
- For non-SEC filers, look for annual reports on company investor relations pages
- For EU-listed companies, use Yahoo Finance and FMP as primary data sources
Reporting Frequency
- Quarterly reporting may be limited — semi-annual reporting is common for EU firms
- When quarterly data is unavailable, use semi-annual figures and interpolate cautiously
- Check company IR page for reporting calendar
Currency Handling
- Use EUR as base currency unless company reports in local currency
- Apply current FX rates from Yahoo Finance or Alpha Vantage
- Note currency of each data point in output tables
- Key portfolio currencies: CZK, PLN, SEK, HUF, BGN, TRY, GBP, USD
Data Source Priority (for non-SEC filers)
1. Company investor relations (annual/semi-annual reports) 2. Yahoo Finance (prices, basic financials) 3. Financial Modeling Prep (ratios, estimates) 4. Finnhub (real-time quotes, basic financials) 5. Alpha Vantage (FX rates, technical indicators)
Macro Economic Briefing Sources
For country-level economic context (daily/weekly macro overview), use these sources alongside news intelligence:
Best Open-Access Macro Sources
| Source | Domain | Coverage | Frequency | Extraction | Notes |
|---|---|---|---|---|---|
| ING Think | think.ing.com | CZ, PL, HU, SK, BG + EU | Daily | rag-web-browser (11K chars, excellent) | Best free CEE macro source. FX daily, rate decisions, country snaps |
| IMF | imf.org | All countries | Annual (Art. IV) + quarterly (WEO) | rag-web-browser (22K chars) | Article IV concluding statements fully extractable |
| ECB | ecb.europa.eu | Eurozone (SK, BG) + EU | Monthly (rates) + quarterly (projections) | rag-web-browser (7K–85K chars) | Already in Tier 1 |
| EC Press Corner | ec.europa.eu | EU-wide | Daily | REST API | Already in Tier 1 |
Central Banks (direct URL extraction, not via Google News)
| Country | Institution | Best URL | Extraction | Notes |
|---|---|---|---|---|
| CZ | ČNB | cnb.cz/en/monetary-policy/ | rag-web-browser (35K chars) | Cloudflare blocks GNews site: operator — use direct URL |
| PL | NBP | nbp.pl/en/monetary-policy/ | rag-web-browser (1.2K chars — nav only) | JS-rendered; use press release URLs directly |
| HU | MNB | mnb.hu/en/monetary-policy | rag-web-browser (moderate) | FX tables + rate decisions |
| BG | BNB | bnb.bg | Via BTA news articles (11K) | BG joined eurozone Jan 2026 — monetary policy at ECB level |
| SK | NBS | nbs.sk | GNews indexed but noisy (FX sheets) | SK in eurozone — NBS implements ECB policy |
Usage in Morning Briefing
When running morning briefing (v2), add a Market Context section: 1. Check think.ing.com for overnight CEE FX/rates commentary (query: site:think.ing.com Czech OR Poland OR Hungary) 2. Check ecb.europa.eu for any rate decisions or projections (especially around ECB meeting dates) 3. For specific country deep-dives, scrape the central bank URL directly
Morning Note Detail — Reference
Detailed morning note formatting, output schemas, and guidelines. Referenced from SKILL.md — load when producing portfolio morning briefing.
HTML Newsletter Format
Use Design System (see ../design-system/):
- Navy header with brand logo
- Dark title bar with date and "Top Call" highlight
- Collapsible company sections with logos and Portfolio/Competitor badges
- Copper accents for action items and trade ideas
- Separate Tier 1 / Tier 2 sections
- Fonts: Neue Haas Unica W1G (body), PPFDisplay (headings)
- Reference template:
News_Intelligence_Report_2026-03-20.htmlin project root
JSON Output Schema
For downstream processing, output structured JSON:
{
"morning_note": {
"date": "2026-03-20",
"top_call": {
"headline": "...",
"company": "InPost",
"event_type": "earnings",
"take": "...",
"action": "Review PT"
},
"companies": [
{
"name": "InPost",
"event_type": "earnings",
"summary": "...",
"take": "...",
"action": "Review PT",
"source": "bloomberg.com",
"date": "2026-03-19"
}
],
"competitors": [...],
"market_context": "...",
"key_events_today": [...],
"trade_ideas": [
{
"direction": "Long",
"company": "InPost",
"thesis": "...",
"catalyst": "...",
"risk": "..."
}
],
"no_material_news": ["Air Bank", "PPF Real Estate"]
},
"tier1": {
"sources_queried": 8,
"articles_found": 5,
"articles": [
{
"tier": "verified",
"title": "...",
"source": "bloomberg.com",
"author": "...",
"published_date": "2026-03-19T14:17:09Z",
"url": "...",
"text_chars": 7577,
"text_preview": "First 200 chars...",
"discovery_method": "google_news_site",
"extraction_actor": "jamie_tran/bloomberg-article-scraper",
"extraction_cost": 0.02
}
]
},
"tier2": {
"articles_found": 3,
"articles": [
{
"tier": "broad",
"title": "...",
"source": "seekingalpha.com",
"url": "...",
"text_chars": 1200,
"extraction_actor": "apify/rag-web-browser",
"extraction_cost": 0.005,
"quality_warning": null
}
]
},
"total_extraction_cost": 0.15
}Earnings Analysis Template
When a portfolio company reports earnings, include this table:
| Metric | Consensus | Actual | Beat/Miss |
|---|---|---|---|
| Revenue | |||
| EPS | |||
| [Key sector metric] | |||
| FY Guidance |
Our Take: [Is this a beat or miss that matters? Quality of earnings? Guidance trajectory?] Action: [Maintain rating / Review PT / Flag for deep dive]
M&A Event Analysis Template
For M&A events, assess:
- Deal terms (premium to undisturbed price, structure, conditionality)
- Strategic fit for portfolio
- Probability of completion (regulatory, financing, shareholder approval)
- Impact on related portfolio companies
Important Notes
- Be opinionated — notes without a view are useless. If no view can be formed, state "insufficient data to form view, monitoring"
- Lead with the most important thing — Top Call is #1, do not bury the headline
- "No news" is valid — "Nothing material overnight across [N] portfolio companies. Maintaining positioning."
- Distinguish signal from noise — a minor analyst note is not the same as an earnings miss. Use priority classification.
- Time-stamp takes — if writing at 6am, note that pre-market may change by open
- Own mistakes — if yesterday's take was wrong, acknowledge it. Credibility > being right every time.
- Competitor context matters — a competitor's earnings miss can be bullish for portfolio company
- Don't over-extract — for morning note, extract only material articles (typically 3–10 per run). Skip general coverage unless slow news day.
Pipeline Detail — Reference
Detailed pipeline instructions, RSS feeds, headline sources, warnings, and failed paths. Referenced from SKILL.md — load when executing the pipeline.
RSS Discovery
Actor: louvre/rss-news-aggregator
Actor: louvre/rss-news-aggregator
Max 10 feeds per run — split into batches if needed.
14 sources with working RSS feeds:
| Source | RSS URL | Typical Volume |
|---|---|---|
| Bloomberg | https://feeds.bloomberg.com/markets/news.rss | 30 |
| FT | https://www.ft.com/rss/home | 13 |
| WSJ | https://feeds.a.dj.com/rss/RSSMarketsMain.xml | 20 |
| Economist | https://www.economist.com/finance-and-economics/rss.xml | 300 |
| CNBC | https://www.cnbc.com/id/100003114/device/rss/rss.html | 30 |
| Forbes | https://www.forbes.com/business/feed2 | 25 |
| Morningstar | https://www.morningstar.co.uk/uk/news/rss.aspx | 20 |
| MarketWatch | https://www.marketwatch.com/rss/topstories | 10 |
| AFR | https://www.afr.com/rss/feed.xml | 20 |
| SCMP | https://www.scmp.com/rss/91/feed | 50 |
| Nikkei | https://asia.nikkei.com/rss/feed/nar | 50 |
| Euronews | https://www.euronews.com/rss?level=theme&name=business | 50 |
| IntelliNews | https://www.intellinews.com/rss/ | varies |
| Handelsblatt | https://www.handelsblatt.com/contentexport/feed/schlagzeilen | 50 |
| ČTK (ČR) | https://www.ceskenoviny.cz/sluzby/rss/cr.php | 50 |
| ČTK (ekonomika) | https://www.ceskenoviny.cz/sluzby/rss/ekonomika.php | 50 |
No RSS: Reuters, Barron's, IBD, Les Echos, Caixin, Zawya, PAP (WAF), BTA, TASR, MTI (paywall).
curl -s -X POST "https://api.apify.com/v2/acts/louvre~rss-news-aggregator/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rss_feeds":[{"url":"https://feeds.bloomberg.com/markets/news.rss"},{"url":"https://www.ft.com/rss/home"},{"url":"https://feeds.a.dj.com/rss/RSSMarketsMain.xml"},{"url":"https://www.economist.com/finance-and-economics/rss.xml"},{"url":"https://www.cnbc.com/id/100003114/device/rss/rss.html"},{"url":"https://www.forbes.com/business/feed2"},{"url":"https://www.morningstar.co.uk/uk/news/rss.aspx"},{"url":"https://www.marketwatch.com/rss/topstories"},{"url":"https://www.afr.com/rss/feed.xml"},{"url":"https://www.scmp.com/rss/91/feed"}],"raw_data":false}'Batch 2 (remaining 4):
curl -s -X POST "https://api.apify.com/v2/acts/louvre~rss-news-aggregator/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rss_feeds":[{"url":"https://asia.nikkei.com/rss/feed/nar"},{"url":"https://www.euronews.com/rss?level=theme&name=business"},{"url":"https://www.intellinews.com/rss/"},{"url":"https://www.handelsblatt.com/contentexport/feed/schlagzeilen"}],"raw_data":false}'RSS returns general articles — filter client-side by company name/ticker match in title/description.
Headline Discovery
Actor: rodrigo_pacelli/headline-news-scraper
Actor: rodrigo_pacelli/headline-news-scraper
Only 6 sources work (others return 0):
| Source | URL | Volume |
|---|---|---|
| CNBC | https://www.cnbc.com | 19 |
| SCMP | https://www.scmp.com | 39 |
| Nikkei | https://asia.nikkei.com | 60 |
| Caixin | https://www.caixinglobal.com | 7 |
| Zawya | https://www.zawya.com | 50 (tag pages!) |
| Handelsblatt | https://www.handelsblatt.com | 60 |
curl -s -X POST "https://api.apify.com/v2/acts/rodrigo_pacelli~headline-news-scraper/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls":["https://www.cnbc.com","https://www.scmp.com","https://asia.nikkei.com","https://www.caixinglobal.com","https://www.handelsblatt.com"],"includeImages":false,"classifyWithAI":false}'WARNING: Exclude Zawya from headline runs — returns category/tag pages, not article URLs.
No keyword filtering — filter results client-side by company name match.
Non-Article URL Filter Patterns
3. Non-article URL filter (apply to BOTH tiers): Discard URLs matching any of these patterns — they are NOT articles:
- Stock/quote pages:
/markets/companies/,/quote/,/key-metrics/,/stock/ - Sitemaps & feeds:
/sitemap,/rss/,/feed/ - Newsletters & redirects:
/newsletters/,redirectUrl= - Author/profile pages:
/author/,/journalist/,/profile/ - Tag/category listing pages:
/primarykeyword/,/topic/,/tag/(except when part of article slug) - Data pages with no article content: URL contains only ticker symbol and no article slug
Source Quick Reference Table
| # | Source | Discovery Methods | Extractor | Cost/Article | Chars Verified | Language |
|---|---|---|---|---|---|---|
| 1 | Bloomberg | GNews + RSS(30) | jamie_tran | $0.02 | 7,577 (80 fields) | EN |
| 2 | Reuters | GNews only | workhard3000 (RESIDENTIAL proxy!) | $0.025 | 2,632 | EN |
| 3 | Financial Times | GNews + RSS(13) | workhard3000 | $0.025 | 6,960 | EN |
| 4 | WSJ | GNews + RSS(20) | workhard3000 | $0.025 | 4,748 | EN |
| 5 | Economist | RSS(300!) + GNews | workhard3000 | $0.025 | 14,256 | EN |
| 6 | CNBC | RSS(30) + Headlines(19) + GNews | rag-web-browser | $0.005 | 4,865 | EN |
| 7 | Forbes | RSS(25) + GNews | rag-web-browser | $0.005 | 4,969 | EN |
| 8 | Morningstar | RSS(20) + GNews | workhard3000 | $0.025 | 35,256 | EN |
| 9 | Barron's | GNews only | universal-ai | $0.25 | 3,387 | EN |
| 10 | MarketWatch | GNews + RSS(10) | universal-ai | $0.25 | present | EN |
| 11 | IBD | GNews (limited) | rag-web-browser | $0.005 | 6,722 | EN |
| 12 | Les Echos | GNews only | rag-web-browser | $0.005 | 2,832 | FR |
| 13 | AFR | RSS(20) + GNews | rag-web-browser | $0.005 | 1,231 | EN |
| 14 | SCMP | RSS(50) + Headlines(39) + GNews | rag-web-browser | $0.005 | 1,819 | EN |
| 15 | Nikkei | Headlines(60) + RSS(50) + GNews | workhard3000 | $0.025 | 5,723 | EN |
| 16 | Caixin | GNews + Headlines(7) | workhard3000 | $0.025 | 4,166 | EN |
| 17 | Zawya | GNews (headlines=tag pages!) | workhard3000 | $0.025 | 12,681 | EN |
| 18 | Euronews | RSS(50) + GNews | rag-web-browser | $0.005 | 10,917 | EN |
| 19 | IntelliNews | RSS + GNews | rag-web-browser | $0.005 | 10,744 | EN |
| 20 | Handelsblatt | Headlines(60) + RSS(50) + GNews | rag-web-browser | $0.005 | 10,435 | DE |
| Pan-European | ||||||
| 21 | POLITICO Europe | GNews | rag-web-browser | $0.005 | 7,677 | EN |
| 22 | EUobserver | GNews | workhard3000 (autoArchive) | $0.025 | 3,001 | EN |
| 23 | EUbusiness | GNews | rag-web-browser | $0.005 | 4,828 | EN |
| 24 | EU Reporter | GNews | rag-web-browser | $0.005 | 5,921 | EN |
| Institutional | ||||||
| 25 | EC Press Corner | GNews | REST API (presscorner) | free | 9,000+ | EN |
| 26 | ECB | GNews | rag-web-browser | $0.005 | 6,950–85,009 | EN |
| CEE Local | ||||||
| 27 | ČTK / České noviny | RSS(50) + GNews (CZ:cs) | rag-web-browser | $0.005 | 4,596 | CZ |
| 28 | PAP | GNews (PL:pl) | rag-web-browser | $0.005 | 9,232 | PL |
| 29 | BTA | GNews (BG:bg) | rag-web-browser | $0.005 | 10,851 | BG |
| 30 | TASR | GNews (SK:sk) | rag-web-browser | $0.005 | 3,956 | SK |
| 31 | Telex.hu | GNews (HU:hu) | rag-web-browser | $0.005 | 8,216 | HU |
| 32 | HVG.hu | GNews (HU:hu) | rag-web-browser | $0.005 | 4,883 | HU |
| 33 | Világgazdaság | GNews (HU:hu) | rag-web-browser | $0.005 | 9,906 | HU |
Critical Warnings
1. ALWAYS `decodeUrls: true` in Google News — encoded redirect URLs break ALL extractors 2. "InPost" is ambiguous — matches "post-Maduro", "post-ESG". Use "InPost SA" for precision 3. RSS max 10 feeds per run — must split into batches 4. Zawya headline-scraper returns category/tag pages (/primarykeyword/OIL), NOT article URLs — use Google News for Zawya discovery 5. Morningstar domain matters — .co.uk URLs fail with workhard3000. Use .com URLs only 6. WSJ livecoverage pages fail extraction — skip URLs matching wsj.com/livecoverage/ 7. Barron's/MarketWatch cost $0.25/page — use selectively for high-value articles only 8. Les Echos: Use region_language: "FR:fr" for French queries 9. Handelsblatt: Use region_language: "DE:de" for German queries 10. Caixin URLs must be complete — truncated URLs fail extraction 11. Paywall tightening observed — AFR (1,231 chars), SCMP (1,819 chars), Les Echos (2,832 chars) return less than earlier audits
Failed Paths (Do Not Use)
| What | Why |
|---|---|
dadhalfdev/reuters-scraper-per-event | Ignores keyword param, returns random latest news |
rag-web-browser for FT | Returns 16 chars ("Client Challenge") |
rag-web-browser for Economist | Returns 0 chars |
rag-web-browser for Zawya | Returns HTTP 500 |
rag-web-browser for MarketWatch | Returns HTTP 500 |
workhard3000 for Reuters WITHOUT residential proxy | Returns 386 chars — MUST use RESIDENTIAL proxy group (2,632 chars with it) |
rag-web-browser for Reuters WITHOUT residential proxy | Returns 0 chars on ~60% of URLs — MUST use RESIDENTIAL proxy group |
workhard3000 for Forbes | Returns 0 chars |
natasha.lekh Forbes actor | Under maintenance |
janbruinier Morningstar actor | For fund ratings, not news articles |
mscraper IBD actor | $20/mo, US tickers only |
| RSS for Reuters, Barron's, IBD, Les Echos | 403/404/deprecated |
| Headline scraper for 14/33 sources | Returns 0 results |
Output Format Detail
Structure extracted articles as JSON with separate tiers:
{
"company": "InPost",
"ticker": "INPST.AS",
"query_date": "2026-03-19",
"timeframe": "7d",
"tier1": {
"sources_queried": 6,
"articles_found": 2,
"articles": [
{
"tier": "verified",
"title": "InPost Readies AI Shopping Assistant",
"source": "bloomberg.com",
"author": "Konrad Krasuski",
"published_date": "2026-03-19T14:17:09Z",
"url": "https://www.bloomberg.com/news/articles/...",
"text_chars": 7577,
"text_preview": "First 200 chars...",
"discovery_method": "google_news_site",
"extraction_actor": "jamie_tran/bloomberg-article-scraper",
"extraction_cost": 0.02
}
]
},
"tier2": {
"articles_found": 5,
"articles": [
{
"tier": "broad",
"title": "InPost expands parcel locker network in France",
"source": "seekingalpha.com",
"url": "https://seekingalpha.com/news/...",
"text_chars": 1200,
"text_preview": "First 200 chars...",
"discovery_method": "google_news_broad",
"extraction_actor": "apify/rag-web-browser",
"extraction_cost": 0.005,
"quality_warning": null
}
]
},
"total_extraction_cost": 0.15,
"warnings": [],
"failed_extractions": []
}Present TWO separate tables to the user:
## News Intelligence: InPost (INPST.AS) — Last 7 days
#!/usr/bin/env python3
"""Clean article HTML using readability-lxml.
Strips navigation, sidebars, footers, language pickers, and ad blocks.
Tested on all 33 Tier 1 sources — reduces noise by 30-70%.
Requirements: pip install readability-lxml lxml
Usage:
from clean_article import clean_article
result = clean_article(html_string)
# result = {"title": "...", "text": "...", "chars": 1234}
CLI usage:
echo '<html>...</html>' | python3 clean_article.py
python3 clean_article.py < article.html
"""
import re
import sys
from readability import Document
def clean_article(html: str) -> dict:
"""Extract clean article text and title from raw HTML.
Returns dict with 'title', 'text', 'chars' keys.
"""
doc = Document(html)
title = doc.title()
clean_html = doc.summary()
text = re.sub(r"<[^>]+>", " ", clean_html)
text = re.sub(r"\s+", " ", text).strip()
return {"title": title, "text": text, "chars": len(text)}
if __name__ == "__main__":
html = sys.stdin.read()
result = clean_article(html)
print(f"Title: {result['title']}")
print(f"Chars: {result['chars']}")
print()
print(result["text"])
#!/usr/bin/env python3
"""Fetch Apify dataset items and clean article HTML via readability-lxml.
Usage:
python3 extract_and_clean.py <datasetId> [--limit N]
Output: JSON array of cleaned articles to stdout.
For rag-web-browser items (HTML): strips nav/menu/footer via readability.
For workhard3000/bloomberg items (already clean): passes through as-is.
Requirements: pip install readability-lxml lxml
Environment: APIFY_TOKEN must be set.
"""
import json
import os
import re
import sys
import urllib.request
TOKEN = os.environ.get("APIFY_TOKEN", "")
BASE = "https://api.apify.com/v2"
def fetch_items(dataset_id: str, limit: int = 50) -> list:
"""Fetch items from Apify dataset."""
url = f"{BASE}/datasets/{dataset_id}/items?limit={limit}"
headers = {"Authorization": f"Bearer {TOKEN}"}
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req, timeout=60) as resp:
return json.loads(resp.read().decode())
def clean_html(html: str) -> dict:
"""Extract clean article text from HTML using readability-lxml."""
from readability import Document
doc = Document(html)
title = doc.title()
clean = doc.summary()
text = re.sub(r"<[^>]+>", " ", clean)
text = re.sub(r"\s+", " ", text).strip()
return {"title": title, "text": text, "chars": len(text)}
def process_item(item: dict) -> dict:
"""Process a single dataset item. Auto-detects format."""
result = {}
# rag-web-browser items have 'html' and/or 'text' fields + metadata
html = item.get("html", "")
raw_text = item.get("text", "")
metadata = item.get("metadata", {})
# Bloomberg scraper items have 'headline', 'body', etc.
headline = item.get("headline", "")
# workhard3000 items have 'title', 'text', 'byline', etc.
wh_title = item.get("title", "")
wh_text = item.get("text", "")
if html and len(html) > 200:
# rag-web-browser with HTML — clean it
cleaned = clean_html(html)
result = {
"title": cleaned["title"],
"text": cleaned["text"],
"chars": cleaned["chars"],
"url": metadata.get("url", item.get("url", "")),
"source": "rag-web-browser",
"cleaned": True,
}
elif headline:
# Bloomberg scraper — already structured
body = item.get("body", "")
if isinstance(body, list):
# Bloomberg body is structured JSON
body = json.dumps(body)
result = {
"title": headline,
"text": str(body),
"chars": len(str(body)),
"url": item.get("url", ""),
"source": "bloomberg-scraper",
"cleaned": False,
}
elif wh_title and wh_text:
# workhard3000 — already clean text
result = {
"title": wh_title,
"text": wh_text,
"chars": len(wh_text),
"url": item.get("url", ""),
"author": item.get("byline", item.get("author", "")),
"date": item.get("publishedDate", item.get("date", "")),
"source": "workhard3000",
"cleaned": False,
}
elif raw_text and len(raw_text) > 100:
# Fallback: raw text without HTML
result = {
"title": metadata.get("title", "") if metadata else "",
"text": raw_text,
"chars": len(raw_text),
"url": metadata.get("url", item.get("url", "")),
"source": "raw-text",
"cleaned": False,
}
else:
# Empty or unrecognized format
result = {
"title": "",
"text": "",
"chars": 0,
"url": item.get("url", ""),
"source": "unknown",
"cleaned": False,
"error": "No extractable content",
}
# Warn on likely paywall/blocked extraction
if result.get("chars", 0) < 500 and result.get("cleaned"):
result["quality_warning"] = f"Low content ({result['chars']} chars) — likely paywalled or blocked"
return result
MIN_CHARS_WARN = 500
def main():
if len(sys.argv) < 2:
print("Usage: extract_and_clean.py <datasetId> [--limit N]", file=sys.stderr)
sys.exit(1)
dataset_id = sys.argv[1]
limit = 50
if "--limit" in sys.argv:
idx = sys.argv.index("--limit")
limit = int(sys.argv[idx + 1])
if not TOKEN:
print("ERROR: APIFY_TOKEN not set", file=sys.stderr)
sys.exit(1)
items = fetch_items(dataset_id, limit)
results = []
for item in items:
if isinstance(item, dict):
results.append(process_item(item))
# Summary to stderr
total = len(results)
cleaned = sum(1 for r in results if r.get("cleaned"))
passthrough = sum(1 for r in results if not r.get("cleaned") and r.get("chars", 0) > 0)
empty = sum(1 for r in results if r.get("chars", 0) == 0)
low_quality = sum(1 for r in results if r.get("quality_warning"))
print(f"Processed {total} items: {cleaned} cleaned, {passthrough} passthrough, {empty} empty", file=sys.stderr)
if low_quality:
print(f"WARNING: {low_quality} items below {MIN_CHARS_WARN} chars (likely paywalled)", file=sys.stderr)
# Output to stdout
json.dump(results, sys.stdout, indent=2, ensure_ascii=False)
if __name__ == "__main__":
main()
Source Configurations — 33 Verified Financial News Sources + Macro Briefing
Each source includes verified MCPC commands, curl commands, input schemas, run IDs, and output samples. All configs tested 2026-03-19 with real Apify API runs. New sources (21-33) tested 2026-03-20.
Post-Processing: readability-lxml Cleanup
ALL `rag-web-browser` commands below use `outputFormats: ["html"]`. The raw HTML MUST be cleaned via readability-lxml before use — see Step 4c in SKILL.md for the clean_article() function.
This strips navigation, menus, language pickers, sidebars, and footers (30-70% noise reduction). Exceptions: Bloomberg scraper, workhard3000 extractor, and EC Press Corner API return already-clean output — no cleanup needed.
---
1. Bloomberg (bloomberg.com)
Discovery
Guidance:
- Hard paywall — Google News + RSS are the only discovery methods
- ALWAYS set
decodeUrls: true— Bloomberg extractors fail on encoded Google News redirect URLs - Use
"InPost SA"not"InPost"to avoid false positives
Google News:
curl -X POST "https://api.apify.com/v2/acts/data_xplorer~google-news-scraper-fast/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["site:bloomberg.com \"InPost SA\" OR \"INPST\""],"maxArticles":10,"timeframe":"7d","region_language":"US:en","decodeUrls":true,"extractImages":true,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'- Verified: run
TGlLVnklOTKiU4Ert— 30 articles (console) - GNews verified: run
4GxdXYWLAFTbc9H3j— 1 article (console)
Extraction
Primary: `jamie_tran/bloomberg-article-scraper` — $0.02/article, 80 fields, structured body, terminal tickers
Command:
curl -X POST "https://api.apify.com/v2/acts/jamie_tran~bloomberg-article-scraper/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"start_urls":[{"url":"https://www.bloomberg.com/news/articles/2026-03-19/jpmorgan-goldman-offer-hedge-funds-way-to-short-private-credit"}]}'- Verified: run
qQbwWxgm0Ircjfm8h— 7,577 chars, 80 fields (console) - Key fields: headline, authors, publishedAt, terminalTickers, body, byline, contentTags, aiSummary, url
Output sample:
{
"headline": "JPMorgan, Goldman Offer Hedge Funds Way to Short Private Credit",
"byline": "Silas Brown and Nishant Kumar",
"publishedAt": "2026-03-19T14:17:09.116Z",
"terminalTickers": [{"id": "GS:US"}, {"id": "CS:FP"}],
"contentTags": [{"id": "private-credit", "name": "private credit", "type": "Topic"}]
}Fallback 1: `romy/bloomberg-news-scraper` — $0.03/result, ~50% success rate, 38 fields
- Verified: run
KMZxdgHg0YBi45hV4— 7,040 chars (console)
Fallback 2: `workhard3000/news-intelligence-rag-extractor` — $0.025, 14 fields, last resort
- Verified: run
o8GkLCESzmlW5380e— 2,996 chars (console)
---
2. Reuters (reuters.com)
Discovery
Guidance:
- Reuters deprecated ALL public RSS feeds — Google News is the only discovery method
dadhalfdev/reuters-scraper-per-eventIGNORES keyword param — do not use- headline-news-scraper returns 0 for Reuters
Google News:
curl -X POST "https://api.apify.com/v2/acts/data_xplorer~google-news-scraper-fast/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["site:reuters.com \"InPost SA\" OR \"INPST\""],"maxArticles":10,"timeframe":"7d","region_language":"US:en","decodeUrls":true,"extractImages":true,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'Extraction
WARNING (updated 2026-03-24): Reuters blocks rag-web-browser completely — returns 0 chars on ALL URLs, even with RESIDENTIAL proxy. Use workhard3000 as primary extractor.
Primary: `workhard3000/news-intelligence-rag-extractor` with RESIDENTIAL proxy — $0.025
curl -X POST "https://api.apify.com/v2/acts/workhard3000~news-intelligence-rag-extractor/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"articleUrls":["https://www.reuters.com/..."],"autoArchive":true,"maxRetries":3,"requestIntervalMs":2000,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'- Verified: 2026-03-24 — 2,632 chars with RESIDENTIAL proxy
rag-web-browserreturns 0 chars on ALL Reuters URLs (tested 5 URLs, standard + RESIDENTIAL proxy) — do NOT use- Previous
workhard3000test without RESIDENTIAL (2026-03-19) returned only 386 chars — RESIDENTIAL proxy is critical
---
3. Financial Times (ft.com)
Discovery
Guidance:
- RSS (13 articles) + Google News
- headline-news-scraper returns articles but no keyword filtering — general FT front page
- RSS verified: run
TGlLVnklOTKiU4Ert— 13 articles (console)
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` — $0.025/success (ONLY working extractor for FT)
Command:
curl -X POST "https://api.apify.com/v2/acts/workhard3000~news-intelligence-rag-extractor/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"articleUrls":["https://www.ft.com/content/..."],"autoArchive":true,"maxRetries":3,"requestIntervalMs":2000,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'- Verified: run
AlP9aKovUBRxhdJwc— 6,960 chars (console) - rag-web-browser returns 16 chars ("Client Challenge") — FT blocks it
Output sample:
{
"title": "ECB holds interest rates at 2% as energy prices soar",
"byline": "Olaf Storbeck and Ian Smith",
"publishedDate": "2026-03-19T13:15:18.282Z",
"domain": "ft.com",
"text": "The European Central Bank has kept its benchmark interest rate on hold at 2 per cent..."
}---
4. WSJ (wsj.com)
Discovery
- RSS verified: run
TGlLVnklOTKiU4Ert— 20 articles (console)
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` — $0.025/success (ONLY working extractor for WSJ)
- Verified: run
2zXshJwxycAKgN7yK— 4,748 chars (console) - WARNING: byline and publishedDate are null — get from Google News/RSS discovery metadata
- WARNING:
wsj.com/livecoverage/URLs FAIL — skip them
---
5. Economist (economist.com)
Discovery
Guidance:
- Economist has EXCELLENT RSS — 300 articles! Best coverage of all 33 sources
- RSS should be primary, supplemented by Google News for targeted search
- RSS verified: run
TGlLVnklOTKiU4Ert— 300 articles (console)
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` — $0.025/success (ONLY working extractor)
- Verified: run
ckhijvIQcwvwaOdaw— 14,256 chars (console) - Byline always "The Economist" — no individual authors
- rag-web-browser returns 0 chars for Economist
---
6. CNBC (cnbc.com)
Discovery
3 working methods: RSS (30), Headlines (19), Google News.
- RSS verified: run
TGlLVnklOTKiU4Ert— 30 articles - Headlines verified: run
a6JHWQ6LCv8DCum13— 19 articles (console)
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
2QKQRPjZRyJxfggJt— 4,865 chars (console) - Optional: workhard3000 for metadata (byline, date, image) — run
5WBPe82sgy5rUsigG, 2,837 chars
---
7. Forbes (forbes.com)
Discovery
RSS (25 articles) + Google News.
- RSS verified: run
TGlLVnklOTKiU4Ert— 25 articles
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
naBDjdL8RHZK4MEKM— 4,969 chars (console) - workhard3000 returns 0 chars for Forbes — do NOT use
natasha.lekhForbes actor is UNDER MAINTENANCE — do not use
---
8. Morningstar (morningstar.com)
Discovery
RSS (.co.uk, 20 articles) + Google News (.com).
IMPORTANT: morningstar.co.uk URLs fail with workhard3000 — use morningstar.com URLs for extraction.
- RSS verified: run
TGlLVnklOTKiU4Ert— 20 articles
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` — $0.025/success
- Verified: run
uVI3NxwXu9rULA5zY— 35,256 chars (console) janbruinierMorningstar actor is for fund ratings, NOT news — do not use
---
9. Barron's (barrons.com)
Discovery
ONLY Google News — RSS returns 403, headline-scraper returns 0.
Extraction
Primary: `stanvanrooy6/universal-ai-web-scraper` — ~$0.25/page (USE SELECTIVELY)
Command:
curl -X POST "https://api.apify.com/v2/acts/stanvanrooy6~universal-ai-web-scraper/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.barrons.com/articles/..."}],"instructions":"Extract the full article text, title, author name, publication date, and any tags or categories.","proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]},"useWebSearch":true}'- Verified: run
tKoc6e4qWFGhHYG2x— 3,387 chars (console) - Output fields: author, categories, fullArticleText, publicationDate, tags, title
Output sample:
{
"title": "3 Reasons This Drone Stock Soared 520%...",
"author": "Al Root",
"publicationDate": "2026-03-18T10:38:00Z",
"categories": ["daily", "feature"],
"tags": ["Aerospace and Defense", "Drones", "IPO"]
}---
10. MarketWatch (marketwatch.com)
Discovery
Google News (primary) + RSS (10 articles, small volume).
- RSS verified: run
TGlLVnklOTKiU4Ert— 10 articles
Extraction
Primary: `stanvanrooy6/universal-ai-web-scraper` — ~$0.25/page (USE SELECTIVELY)
- Verified: run
E41lckeBGwYoFQMMl— fullArticleText present (console) - rag-web-browser returns HTTP 500 — completely blocked
Cheap fallback (excerpts only): workhard3000 — $0.025, returns 448-878 chars
- Verified: run
FdKa2X4C8IyQYTTck— 559 chars (console)
---
11. IBD / Investor's Business Daily (investors.com)
Discovery
Google News only (very limited for non-US companies). RSS returns 403.
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
a9dwfryRba07Eb0Nh— 6,722 chars (console) - Optional metadata: workhard3000 run
PHQtaoYk0xa1f2QjH— 958 chars (byline, date, image)
---
12. Les Echos (lesechos.fr)
Discovery
ONLY Google News — RSS returns 403. Use French queries with region_language: "FR:fr".
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
K4sLa7tbZ720xwAkq— 2,832 chars (console) - Paywall tightened: was 9,257 chars in audit, now 2,832
- Content in French
- Optional metadata: workhard3000 run
PHQtaoYk0xa1f2QjH— 716 chars (byline, date)
---
13. AFR / Australian Financial Review (afr.com)
Discovery
RSS (20 articles) + Google News. AFR focuses on APAC — limited European coverage.
- RSS verified: run
C8Q7CeLmLwEKbGLLS— 20 articles (console)
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
Mod5b0kwyjdpR7Nea— 1,231 chars (console) - WARNING: Paywall tightened — was 4,399 chars, now only 1,231
---
14. SCMP / South China Morning Post (scmp.com)
Discovery
Excellent discovery: RSS (50) + Headlines (39) + Google News.
- RSS verified: run
C8Q7CeLmLwEKbGLLS— 50 articles - Headlines verified: run
a6JHWQ6LCv8DCum13— 39 articles
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
LYVVUSk197JTJu81z— 1,819 chars (console) - WARNING: Paywall tightened — was 3,014 chars, now 1,819
---
15. Nikkei Asia (asia.nikkei.com)
Discovery
Best headline coverage (60!) + RSS (50, no description) + Google News.
- Headlines verified: run
a6JHWQ6LCv8DCum13— 60 articles (highest!) - RSS verified: run
C8Q7CeLmLwEKbGLLS— 50 articles (title + link only, no description)
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` — $0.025/success (outperforms rag-web-browser for Nikkei)
- Verified: run
XK7gMVH4Ddzk0B7YF— 5,723 chars (console) - Full metadata: byline ("EISAKU NITTA"), publishedDate, image
---
16. Caixin Global (caixinglobal.com)
Discovery
Google News + Headlines (7, very low volume). No RSS.
- Headlines verified: run
a6JHWQ6LCv8DCum13— 7 articles
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` — $0.025/success
- Verified: run
2oYfpd4YhrSQc50Lg— 4,166 chars (console) - Free/commentary = full text; paywalled news = ~885 chars
- IMPORTANT: Use complete URLs — truncated URLs fail
- rag-web-browser fetches wrong page for Caixin — do NOT use
---
17. Zawya (zawya.com)
Discovery
Google News is recommended. Headlines (50 articles) exist but return tag pages, not articles.
WARNING: Headline scraper returns category/tag page URLs (e.g. /primarykeyword/OIL), NOT article URLs. Filter these out or avoid.
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` — $0.025/success
- Verified: run
RzRvX08Xg29SsrXV5— 12,681 chars (console) - rag-web-browser returns HTTP 500 for Zawya — do NOT use
- Full metadata: byline, publishedDate, image
---
18. Euronews (euronews.com)
Discovery
RSS (50 articles, business theme) + Google News. NOT paywalled.
- RSS verified: run
C8Q7CeLmLwEKbGLLS— 50 articles
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
fREgpuCzO6DulRH8w— 10,917 chars (console) - Optional metadata: workhard3000 run
5WBPe82sgy5rUsigG— 8,670 chars (byline: "Denis Loctier", date, image)
---
19. IntelliNews (intellinews.com)
Discovery
RSS (variable volume) + Google News. Niche source, excellent for CEE coverage.
- RSS verified: run
C8Q7CeLmLwEKbGLLS— volume varies (console)
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
eAiUialgv1waTvJNP— 10,744 chars (console) - Optional metadata: workhard3000 run
5WBPe82sgy5rUsigG— 6,496 chars - NOTE: publishedDate is null in workhard3000 — get from RSS/GNews discovery
---
20. Handelsblatt (handelsblatt.com)
Discovery
Excellent: Headlines (60) + RSS (50, full metadata) + Google News. German language.
- Headlines verified: run
a6JHWQ6LCv8DCum13— 60 articles - RSS verified: run
C8Q7CeLmLwEKbGLLS— 50 articles with author + date
Google News — MCPC (German):
curl -s -X POST "https://api.apify.com/v2/acts/data_xplorer~google-news-scraper-fast/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["site:handelsblatt.com \"InPost SA\" OR \"INPST\" OR \"Paketautomaten\""],"maxArticles":10,"timeframe":"7d","region_language":"DE:de","decodeUrls":true,"extractImages":true,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: run
Y79uVeyDxC0dD6ncY— 10,435 chars (console) - Content in German
- Optional metadata: workhard3000 run
PHQtaoYk0xa1f2QjH— 7,737 chars (byline: "Laura de la Motte", date, image)
---
Pan-European Sources — Added 2026-03-20
---
21. POLITICO Europe (politico.eu)
Discovery
- Verified: 2026-03-20, 5 articles — strong EU policy/energy coverage
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
curl -s -X POST "https://api.apify.com/v2/acts/apify~rag-web-browser/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"<POLITICO_ARTICLE_URL>","maxResults":1,"outputFormats":["html"],"requestTimeoutSecs":40,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]},"removeCookieWarnings":true}'- Verified: 2026-03-20 — 7,677 chars, full article text for free articles
- Premium/paywalled articles may return partial content — still useful for headline + lead
---
22. EUobserver (euobserver.com)
Discovery
- Verified: 2026-03-20, 5 articles — investigative/transparency focus
Extraction
Primary: `workhard3000/news-intelligence-rag-extractor` (with autoArchive) — $0.025
curl -s -X POST "https://api.apify.com/v2/acts/workhard3000~news-intelligence-rag-extractor/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"articleUrls":["<EUOBSERVER_URL>"],"autoArchive":true,"maxRetries":3,"requestIntervalMs":2000,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'- Verified: 2026-03-20 — 3,001 chars via archive bypass
rag-web-browserhits "Unlock article" paywall — do NOT use as primary
---
23. EUbusiness (eubusiness.com)
Discovery
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 4,828 chars, open access, clean extraction
---
24. EU Reporter (eureporter.co)
Discovery
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 5,921 chars, open access, full article text
---
Institutional Sources — Added 2026-03-20
---
25. EC Press Corner (ec.europa.eu)
Discovery
Extraction
DO NOT use rag-web-browser — EC Press Corner is an Angular SPA, JS-only render returns 0 chars.
Use REST API directly:
curl -s "https://ec.europa.eu/commission/presscorner/api/documents?reference=IP/26/614&language=en" | python3 -c "
import sys,json
d=json.load(sys.stdin)
html=d.get('docuLanguageResource',{}).get('htmlContent','')
print(f'Chars: {len(html)}')
# Strip HTML tags for plain text
import re
text=re.sub('<[^<]+?>','',html)
print(text[:500])
"- Verified: 2026-03-20 — REST API returns 9K+ chars clean HTML per press release
- Parse
IP_XX_NNNreference IDs from Google News titles to construct API calls - Subdomain pages (energy.ec.europa.eu, research.ec.europa.eu) extract fine with
rag-web-browser(1,936 chars)
---
26. ECB (ecb.europa.eu)
Discovery
- Verified: 2026-03-20, 5 articles — projections, rate decisions, digital euro
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — press releases: 6,950 chars; projection reports: 85,009 chars
- First ~400 chars are nav boilerplate — strip or ignore
- Excellent institutional source for SK and BG (eurozone members)
---
CEE Local Sources — Added 2026-03-20
---
27. ČTK / České noviny (ceskenoviny.cz)
Discovery
- GNews verified: 2026-03-20 — 5 articles (CZ:cs region)
- RSS verified: 2026-03-20 — 50 articles per feed (ekonomika.php, cr.php)
- Search on ceskenoviny.cz does NOT work (JS rendered, returns shell only)
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 4,596 chars, full article text in Czech
---
28. PAP — Polska Agencja Prasowa (pap.pl)
Discovery
- Verified: 2026-03-20 — 5 articles
- PAP web search returns false positives (3-letter string match)
- PAP RSS is blocked by WAF (Incapsula)
- Only Google News
site:pap.plworks reliably
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 9,232 chars, full article text in Polish
---
29. BTA — Bulgarska Telegrafna Agentsia (bta.bg)
Discovery
- Verified: 2026-03-20 — 5 articles
- BTA web search is JS rendered — returns empty results
- BTA has no RSS feeds
- Only Google News
site:bta.bgworks
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 10,851 chars, full article text in Bulgarian
---
30. TASR — Tlačová agentúra Slovenskej republiky (tasr.sk)
Discovery
- Verified: 2026-03-20 — 5 articles
- WARNING: Google News returns generic titles ("Tlačová agentúra Slovenskej republiky") — extraction needed to determine article content
- TASR web search redirects to homepage (SPA)
- TASR has no RSS feeds
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 3,956 chars, article text in Slovak
---
31. Telex.hu (telex.hu) — Hungary
Discovery
- Verified: 2026-03-20 — 2 articles for portfolio-related queries
- Independent outlet, launched by ex-index.hu journalists — high editorial credibility
- Best Hungarian extraction quality among tested sources
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 8,216 chars, excellent clean article body in Hungarian
---
32. HVG.hu (hvg.hu) — Hungary
Discovery
- Verified: 2026-03-20 — 3 articles
- Respected independent weekly (since 1968), strong digital presence
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 4,883 chars, clean article body in Hungarian
---
33. Világgazdaság (vg.hu) — Hungary
Discovery
- Verified: 2026-03-20 — 4 articles (strongest GNews presence among HU sources)
- Hungarian business daily — focuses on economics and finance
Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 9,906 chars, article body in Hungarian
- First ~900 chars contain navigation/ticker noise — article body starts after
---
Macro Briefing Sources (not Tier 1, but used for market context)
---
ING Think (think.ing.com)
Discovery
curl -s -X POST "https://api.apify.com/v2/acts/data_xplorer~google-news-scraper-fast/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["site:think.ing.com Czech OR Poland OR Hungary OR CEE"],"maxArticles":10,"timeframe":"7d","region_language":"US:en","decodeUrls":true,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'Extraction
Primary: `apify/rag-web-browser` — ~$0.005/query
- Verified: 2026-03-20 — 11,319 chars, excellent quality
- Best free open-access source for daily CEE FX, rates, and macro commentary
- Covers CZ, PL, HU, SK, BG + broader EU
---
IMF Country Pages (imf.org)
Extraction
curl -s -X POST "https://api.apify.com/v2/acts/apify~rag-web-browser/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"https://www.imf.org/en/Countries/CZE","maxResults":1,"outputFormats":["html"],"requestTimeoutSecs":40,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]},"removeCookieWarnings":true}'- Verified: 2026-03-20 — 22,250 chars for Article IV concluding statements
- Annual cadence (Article IV) + quarterly (WEO data)
- Country codes: CZE (CZ), POL (PL), HUN (HU), BGR (BG), SVK (SK)
---
ČNB — Czech National Bank (cnb.cz)
Direct URL Extraction
curl -s -X POST "https://api.apify.com/v2/acts/apify~rag-web-browser/runs?waitForFinish=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"https://www.cnb.cz/en/monetary-policy/","maxResults":1,"outputFormats":["html"],"requestTimeoutSecs":40,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]},"removeCookieWarnings":true}'- Verified: 2026-03-20 — 35,367 chars (full bank board decisions listing)
- WARNING: Google News
site:cnb.czis blocked by Cloudflare — use direct URL extraction only - Use keyword query "ČNB" or "Czech National Bank" in broad GNews search instead
Related skills
FAQ
How many sources does it cover?
33 verified Tier 1 sources across Global, Pan-European, Institutional, and CEE Local categories, with broad Google News as a Tier 2 fallback.
How much does a scan cost?
About $0.10 to $0.50 per single company and $1 to $5 per full portfolio scan.