Crypto News Scraper — 30+ Outlets, SEC/CFTC, Reddit avatar

Crypto News Scraper — 30+ Outlets, SEC/CFTC, Reddit

Pricing

from $0.35 / 1,000 result items

Go to Apify Store
Crypto News Scraper — 30+ Outlets, SEC/CFTC, Reddit

Crypto News Scraper — 30+ Outlets, SEC/CFTC, Reddit

Crypto headlines from CoinDesk, Cointelegraph, Decrypt, The Block, Blockworks, DL News, The Defiant and 20+ more outlets, plus SEC/CFTC releases, project blogs and r/CryptoCurrency, in one deduped JSON feed with coins mentioned. Keyword/coin/category filters, time window, full text where available.

Pricing

from $0.35 / 1,000 result items

Rating

0.0

(0)

Developer

Samat Makatov

Samat Makatov

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

Latest crypto headlines from CoinDesk, Cointelegraph, Decrypt, The Block, Blockworks, DL News, The Defiant, Bitcoin Magazine and 20+ more outlets, plus SEC/CFTC press releases, project blogs (Ethereum Foundation, Solana, Kraken) and, on request, r/CryptoCurrency — normalized into one deduplicated list with publish time, summary, author, categories, image and the coins each story mentions. Filter by keywords, coins, category and time window. Built for trading bots, research agents and alerting pipelines. No API key, no proxy, no browser.

Use cases

  • Trading signal feed — every 15 minutes pull coins: ["BTC","ETH"] from tier-1 outlets and push new ids to your model.
  • Incident monitoring — anyKeywords: "hack* exploit* drained breach" + requireCryptoContext: true across all outlets, alert when anything matches.
  • Regulatory watch — SEC + CFTC press releases + Cointelegraph regulation feed, keyword crypto OR digital asset OR stablecoin.
  • Daily digest / newsletter — last 24 h, maxPerSource: 3, dedupeTitles: true, sorted newest first.
  • Competitor / project tracking — query: "coinbase" (or a token name) with sinceHours: 168, or add the project's own RSS via customFeeds.
  • Full-text corpus for LLMs — includeContent: true on outlets that ship full articles (Bitcoin Magazine, CryptoPotato, The Defiant, Cryptonews...).

Input

FieldTypeDefaultNotes
sourcesarray of ids["coindesk","cointelegraph","decrypt","theblock"]Feed ids from the table below, or group names: all, default, news, tier1, regulators, blogs, community, topics. A list field: Apify refuses any other value before the run (HTTP 400).
customFeedsarray of URLs[]Any extra http(s) RSS 2.0 / Atom URL. Source id becomes custom:<host> (custom:<host>-2 for a second feed on the same host).
querystring—Words that must ALL appear (AND). Whole-word, case-insensitive. * suffix = prefix match, "quotes" = phrase.
anyKeywordsstring—At least ONE must appear (OR).
excludeKeywordsstring—Drop items containing any of these (title, summary and article body).
keywordScopetitleSummary | title | fullTexttitleSummaryWhere query/anyKeywords must appear. fullText also searches the article body when the feed has one. Exactly one of these three values.
requireCryptoContextbooleanfalseKeep only items whose title/summary mention crypto (coins, tokens, stablecoins, DeFi/DEX, wallets, crypto exchanges, on-chain security firms).
coinsarray of text[]Keep items mentioning at least one of these coins: any of the 124 dictionary tickers, or a name from the dictionary (bitcoin, polygon, zcash), any letter case. An unknown value stops the run with a "did you mean" hint and costs only the start event, so a typo never switches the filter off. Corrections ("bitcoin" read as "BTC") are named in the run status.
categoriesstring—Keep items whose feed categories contain any of these words (e.g. markets regulation).
sinceHoursinteger24Time window; 0 = no time filter. Ignored when from is set.
from, toISO date—Explicit window: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ (a time without a zone is UTC). A date-only from is the start of that day, a date-only to its end (23:59:59.999 UTC), so from = to = 2026-09-30 is the whole day. Other formats (30.09.2026) stop the run with an error. Feeds only hold the newest 10–200 items, so old dates return nothing.
limitinteger 1–1000100Max items after filtering, taken from the top of the sorted list.
maxPerSourceinteger0Cap per outlet (0 = no cap).
sortBynewest | oldest | sourcenewestItems without a publish date sort last (newest) or first (oldest).
dedupebooleantrueDrop repeated URLs (tracking params stripped); the source listed first in sources keeps the item.
dedupeTitlesbooleanfalseAlso drop near-identical titles across outlets (keeps newest).
includeContentbooleanfalseAdd content (full text) when the feed provides it.
fieldsarray[]Output only these fields, in the order you list them; id is always kept (first, unless you place it). Letter case and snake_case are read (Title, published_at); an unknown name is left out and named in the run status with a "did you mean"; a list with no known field stops the run. content needs includeContent: true.
timeoutSecsinteger 5–6020Per-feed timeout; slow feeds are skipped and named in the run status, not a failure.

All previous inputs (sources, query, sinceHours, limit) keep their names and meaning.

Reference

Sources

idOutletKindTypical items/feedFull text
coindeskCoinDesknews25no
cointelegraphCointelegraphnews30no
decryptDecryptnews35–55no
theblockThe Blocknews20no
blockworksBlockworks (Atom)news50 (stale, see below)no
dlnewsDL Newsnews40 (stale, see below)yes
thedefiantThe Defiantnews100yes
bitcoinmagazineBitcoin Magazinenews10yes
cryptoslateCryptoSlatenews10yes
cryptobriefingCrypto Briefingnews30no
protosProtosnews10yes
unchainedUnchainednews10yes
cryptopotatoCryptoPotatonews36yes
newsbtcNewsBTCnews10yes
bitcoinistBitcoinistnews8yes
utodayU.Todaynews90no
ambcryptoAMBCrypto — paused (see below)news——
cryptonewsCryptonews.comnews20yes
bitcoincomBitcoin.com Newsnews10no
coingapeCoinGapenews20no
coinjournalCoinJournalnews9yes
cryptodailyCrypto Dailynews200yes
cryptonewszCryptoNewsZnews20yes
watcherguruWatcher.Gurunews10yes
banklessBanklessresearch100no
krakenblogKraken Blogblog10yes
ethereumblogEthereum Foundation Blogblog600+ (whole archive)no
solananewsSolana Newsblog20no
secU.S. SEC press releasesregulator25no
cftcU.S. CFTC press releasesregulator10no
reddit-cryptocurrencyr/CryptoCurrency (Atom) — opt-in (see below)community25no
cointelegraph-bitcoin, -ethereum, -solana, -defi, -nft, -regulation, -aiCointelegraph topic feedsnews30 eachno

Groups: all = every outlet except topic feeds, paused feeds and Reddit · default = coindesk, cointelegraph, decrypt, theblock · news = every news outlet except paused ones · tier1 = coindesk, cointelegraph, decrypt, theblock, thedefiant, cryptoslate, cryptobriefing, bitcoinmagazine, cryptopotato, bitcoincom · regulators = sec, cftc · blogs = bankless, krakenblog, ethereumblog, solananews · community = reddit-cryptocurrency · topics = the 7 Cointelegraph tag feeds.

Paused: ambcrypto. AMBCrypto answered HTTP 403 to every automated request in 25 of 25 runs (25.09–02.10.2026). This actor does not work around blocks (no proxies, no browser disguise), so the feed is paused: it is in no group, and a run that names it fetches nothing from it and says so in its status. The id stays valid, so saved inputs keep working.

Opt-in: reddit-cryptocurrency. Reddit's Data API terms ask automated clients for registered OAuth access, which this actor does not use. The feed is no longer part of all; it is read only when you name it (the id or the community group). Check that your use fits Reddit's terms.

Blocked now and then: krakenblog. Kraken's blog sometimes answers 403 from cloud IPs. Such a 403 is not retried; the run names the feed in its status and SUMMARY and returns the other feeds' items.

Stale feeds (checked 27.09.2026): blockworks last published to its feed on 2026-01-07 and dlnews on 2026-05-07. Both still answer with valid XML, so they are kept as ids and in all/news in case the outlets resume, but they are no longer part of tier1 — a 24 h window over them returns nothing. Any feed whose newest item is more than 30 days old is flagged with a warning in the log and stale: true in SUMMARY.

Coin dictionary (coins filter and coinsMentioned field)

BTC, ETH, SOL, XRP, BNB, DOGE, ADA, TRX, AVAX, LINK, DOT, MATIC, TON, SHIB, LTC, BCH, UNI, AAVE, ARB, OP, SUI, APT, NEAR, ATOM, HYPE, PEPE, WIF, USDT, USDC, DAI, XLM, XMR, FIL, ICP, ENA, ONDO, WLD, TAO, RENDER, AERO, ZEC, ETC, BSV, WBTC, STETH, HBAR, VET, ALGO, KAS, CRO, MNT, IMX, INJ, STX, SEI, TIA, GRT, FET, JUP, PYTH, BONK, FLOKI, TRUMP, WLFI, USDE, PYUSD, FDUSD, USD1, LEO, OKB, BGB, KCS, XDC, QNT, EOS, XTZ, THETA, SAND, MANA, AXS, CRV, LDO, JTO, PENDLE, ENS, STRK, ZK, W, RAY, VIRTUAL, IP, BERA, PI, OM, FLR, NEXO, IOTA, HNT, CFX, EGLD, KAIA, AR, ROSE, CAKE, GALA, DYDX, 1INCH, COMP, SNX, ZRO, EIGEN, MORPHO, S, PENGU, FARTCOIN, SPX, POPCAT, XAUT, PAXG, NEO, XPL, LINEA, MON, PUMP. Each ticker matches its full name and common aliases as whole words (ETH = ethereum / eth / ether; MATIC = polygon / matic / pol token; ZEC = zcash / zec). Longer names win: "Bitcoin Cash" tags BCH only, "Ethereum Classic" ETC only. Tickers that are everyday words (ETC, VET, ALGO, LEO, IOTA, SPX, TRUMP…) match by name only (official trump, $trump, algorand…). The coins input accepts each ticker and each of these names ("zcash" = ZEC, "polygon" = MATIC); nothing else is guessed. For any other asset use query or anyKeywords.

Categories by outlet (examples)

CoinDesk: Markets, Finance, Policy, Tech, News · The Block: Markets, Companies, Policy, Regulation, Exchanges · Cointelegraph: Latest News, Markets, Magazine · Blockworks: Policy, The Breakdown · Decrypt: Coins, Business, Technology. Categories are free-form per outlet; categories does a case-insensitive contains match.

Examples

Hack / exploit alerting across the whole industry (last 6 h)

{ "sources": ["all"], "anyKeywords": "hack* exploit* drained breach \"rug pull\"", "requireCryptoContext": true, "sinceHours": 6, "dedupeTitles": true, "limit": 50 }

BTC + ETH headlines from tier-1 outlets for a trading model

{ "sources": ["tier1"], "coins": ["BTC", "ETH"], "sinceHours": 3, "fields": ["source", "title", "url", "publishedAt", "coinsMentioned"] }

Regulatory watch (SEC, CFTC, Cointelegraph regulation feed)

{ "sources": ["regulators", "cointelegraph-regulation"], "anyKeywords": "crypto stablecoin \"digital asset\" exchange token", "sinceHours": 168 }

Balanced daily digest

{ "sources": ["all"], "sinceHours": 24, "maxPerSource": 3, "dedupeTitles": true, "excludeKeywords": "sponsored \"press release\" giveaway", "limit": 60 }

Full-text corpus about a project, plus its own blog

{ "sources": ["all"], "query": "hyperliquid", "sinceHours": 720, "includeContent": true, "customFeeds": ["https://hyperliquid.substack.com/feed"] }

Output

One item per article:

{
"id": "5b303aa0",
"source": "theblock",
"sourceName": "The Block",
"sourceKind": "news",
"feedUrl": "https://www.theblock.co/rss.xml",
"title": "CryptoQuant says bitcoin must clear resistance at $81,700 to confirm new bull market",
"url": "https://www.theblock.co/news/markets/2026-09-12-cryptoquant-bitcoin-resistance-support-levels-414519",
"summary": "Bitcoin's outlook remains bullish, but it needs to clear a significant range of resistance levels stretching to $88,700, CryptoQuant said.",
"publishedAt": "2026-09-12T21:39:49.000Z",
"author": "Yogita Khatri",
"categories": ["Markets", "News"],
"image": "https://www.tbstat.com/wp/uploads/2026/04/20260410_Bitcoin_News-1200x675.jpg",
"coinsMentioned": ["BTC"],
"fetchedAt": "2026-09-12T23:33:32.292Z"
}
FieldTypeMeaning
idstringStable 8-hex hash of the canonical URL — use it to detect new items between runs.
source, sourceName, sourceKindstringFeed id, display name, news / research / blog / regulator / community.
feedUrlstringThe RSS/Atom URL the item came from.
title, url, summarystringSummary is plain text (HTML stripped), max 1000 chars.
contentstring | nullFull article text, only with includeContent: true and only if the feed ships it.
publishedAtISO string | nullFrom pubDate / published / updated.
authorstring | null
categoriesstring[]Feed categories / tags (max 12).
imagestring | nullFirst media/enclosure image.
coinsMentionedstring[]Tickers from the dictionary found in title + summary.
fetchedAtISO stringRun time.

Every run ends with a status message that says how many items were saved from how many feeds and names every feed that failed, was skipped (paused, or not read before a stop) or is stale, plus every input correction. The key-value store record SUMMARY holds the same as data: per-feed stats (parsed, kept, newestItem, stale, error, notRead), delivered, matched, feedsFailed, feedsNotRead, pausedSources, notes, the applied filters (sinceIso, untilIso) and stoppedBy (limit, timeout or null).

Use it from code / agents

curl -X POST "https://api.apify.com/v2/acts/yadroo~crypto-news/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"sources":["tier1"],"coins":["BTC"],"sinceHours":6}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yadroo/crypto-news').call({ sources: ['all'], anyKeywords: 'hack* exploit*', sinceHours: 12 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yadroo/crypto-news").call(run_input={"sources": ["regulators"], "sinceHours": 168})
items = client.dataset(run["defaultDatasetId"]).list_items().items

MCP: add https://mcp.apify.com to your agent (Claude, Cursor, custom) and call the yadroo/crypto-news tool with the same JSON input.

Pricing

Pay per event: $0.001 per run start + $0.0005 per news item returned. Bronze −10 %, Silver −20 %, Gold and above −30 % on the item price; the start event is the same on every plan; platform usage is included. A default run (4 outlets, last 24 h) returns ~20–40 items ≈ $0.01–0.02. An all-sources 24 h digest is typically 150–300 items ≈ $0.08–0.15. Use limit, maxPerSource and filters to control cost — you only pay for items that pass the filters.

Max cost per run is respected: the run reads how many items your limit pays for, stores exactly that many and ends with "Stopped at your spending limit: N rows delivered." A limit that covers no item reads no feed at all.

Limits & FAQ

  • Freshness — feeds are fetched live on every run; outlets update their RSS within minutes of publishing. Some blogs lag.
  • History — RSS only carries the latest 8–200 items per outlet (see table). For archives use includeContent-free runs on a schedule and store the ids.
  • Errors — a feed that times out, is blocked (401/403/404 are answers and are not retried) or returns non-XML is skipped and named in the run status and SUMMARY; 429 and 5xx answers are retried after the site's Retry-After (or 1.5 s, 3 s). The run fails only if every feed failed.
  • Politeness — different outlets are read in parallel, but the feeds of one host (Cointelegraph serves 8) are read one after another, 1 s apart.
  • Run timeout — near the run's timeout the actor stops starting feeds, saves the items it has and ends with "Stopped before the run timeout" and the feeds it did not read. A normal run takes 5–20 s.
  • Items without a date — a few feeds leave out the publish date on some items; those items are kept by sinceHours/from/to (there is nothing to compare) and carry publishedAt: null.
  • Volume per window — an outlet publishes 5–20 stories a day and far fewer at weekends, so a narrow run (one coin, a few outlets, sinceHours: 24) can legitimately return a handful of rows. Widen sinceHours, add outlets or use sources: ["all"] for a fuller picture.
  • Feeds that stop — outlets sometimes abandon their RSS while still serving it (Blockworks since January 2026, DL News since May 2026). A feed with no item newer than 30 days is named in the run status and has stale: true in SUMMARY; the bundled groups are re-checked when that happens.
  • Feeds that block — AMBCrypto is paused and Reddit is opt-in (see Reference → Sources). A source that adds an anti-bot wall is paused, not fought.
  • Keyword matching — whole words, case-insensitive, in the title and summary by default (keywordScope). A trailing * is a prefix: hack* matches hacked, hackers, hacking, but also hackathon or the auditor Hacken. For tight alerts list the forms (hack hacked hacks hacker hackers hacking). Crypto outlets also publish AI-security, stock and casino stories: requireCryptoContext: true drops the ones that don't mention crypto in the title or summary. Before 18.09 keywords were matched in the article body too, which pulled in stories that used "breach" or "hack" only in passing; use keywordScope: "fullText" for that behaviour.
  • SEC / CFTC feeds — these are general press-release feeds. In a typical week 1–2 of 25 SEC releases mention crypto, and the CFTC feed carries titles only (no summary), so crypto keywords rarely match there. That reflects the source, not a filtering bug. Leave requireCryptoContext off and use keywords such as crypto* token* "digital asset" stablecoin*.
  • Duplicates — the same story is often covered by several outlets; dedupe removes identical URLs, dedupeTitles removes same-title coverage.
  • Language — all bundled feeds are English.
  • Terms — only public RSS/Atom feeds are read; content is used as the publishers expose it (title, summary, link). Respect each outlet's terms when redistributing full text.
  • Roadmap — sentiment scoring per item, more regional outlets, Google News fallback for outlets without RSS.

Made by Yadroo — more data actors for agents: crypto-sentiment · coingecko-markets · defillama-protocols · x402-endpoints · google-news-search · rss-to-json