Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
DEV.to Scraper icon

DEV.to Scraper

Scrape DEV.to articles by tag, author or sort. Fields: title, URL, tags, reactions, comments, reading time, cover image, full body. $2.00 per 1,000 articles.

177 runs on Apify $0.002 per article ($2 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust tag, username, topDays (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.002 per article = $2 per 1,000

You are charged forWhenPrice
Article returnedCharged per article returned.$0.002

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-06-13, and they are what you are actually charged.

Inputs

FieldWhat it doesType
tagOnly return articles with this DEV.to tag (e.g. "javascript", "react", "webdev"). Leave empty to not filter by tag.string
usernameOnly return articles by this DEV.to author username (e.g. "ben"). Leave empty to not filter by author. Use it with Sort by = Latest and no tag: DEV ignores the author when a tag is set, and ignores Top and Rising for an author, so those inputs are refused before anything is fetched.string
topDaysWhen Sort by = Top, return the highest-reaction articles published within the last this many days (e.g. 7 = top of the past week, 365 = top of the past year). Ignored for Latest/Rising.integer
sortByHow to order/select articles. "top" = most reactions in the last N days (see Top days), "latest" = newest first, "rising" = currently rising. Rising works only with no tag and no author. For an author, use Latest. With a tag, Latest gives DEV's current listing for that tag, not a strict date order.string
minReactionsOnly return articles with at least this many reactions. Leave empty for no minimum. DEV has no such filter, so the run reads its pages and keeps the articles that pass; the rest are not charged. A strict minimum can return fewer articles than Max articles, because a run reads at most 5 pages more than it would without one.integer
minCommentsOnly return articles with at least this many comments. Leave empty for no minimum. Works like Minimum reactions, and the two can be combined.integer
maxItemsMaximum number of articles to return. The actor paginates the API (100 per page) until this many are collected or the results run out.integer
includeBodyFetch the full article body (markdown/HTML) for each result via a second API call per article. Slower and makes more requests.boolean
notionConnectorOptional. Write each article as a page into your Notion when the run finishes. Authorize a Notion connector once in Settings → API & Integrations → MCP connectors, then pick it here. Leave empty to skip (default), results are always saved to the dataset regardless.string
notionParentIdOptional. The Notion data source ID of the database to write into (only used if a Notion connector is set). Leave empty to create the pages privately in your workspace instead.string

What you get

A structured dataset — each result includes fields like:

titleauthortagsreactionscommentsurl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Wikidata Scraper iconDeveloper & Research Tools

Wikidata Scraper

Search Wikidata for people, companies, places, books or films. Get the ID, the name, other names, a description and the Wikipedia link. $0.20 per 1,000.

Ready to run — no setup

Domain Inspector iconDeveloper & Research Tools

Domain Inspector

Check many domains at once. Get DNS, WHOIS registrar and expiry, TLS dates, redirects, security headers, robots and tech. $1.50 per 1,000.

Ready to run — no setup

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

See all Developer & Research Tools →

DEV.to Scraper: articles by tag, author or reaction count, with no API key

Pick a tag, an author, or neither, and get DEV.to articles back as rows: title, summary, tags, reaction count, comment count, reading time, cover image and the link. It reads DEV's own public API, so there is nothing to sign up for.

The article body is off by default. You get the summary DEV shows in a card, and you turn on Include full body when you want the whole post, which costs a second request per article.

InputA tag, an author username, a sort order, or any combination
OutputOne row per article
Ceiling1,000 articles per run
Account neededNone, and no API key
Price$2.00 per 1,000 articles, flat on every plan

📝 What DEV.to Scraper does

It queries DEV's public article listing and pages through it, 100 at a time, until it has the number you asked for or the results run out. Duplicate article ids are dropped.

Three orders are available. Top returns the most-reacted articles published in the last topDays, which is the one to use for finding what actually landed. Latest is newest first. Rising is what DEV currently considers gaining traction, across the whole site.

Filter by tag or by username, or by neither for the site-wide list. Not both at once: DEV reads only the tag when an author is set too, so that input is refused instead of charging you for other people's articles. An author goes with Latest, because DEV lists one author's articles newest first and ignores Top and Rising for them.

📥 What you give it

{
  "tag": "javascript",
  "sortBy": "top",
  "topDays": 7,
  "maxItems": 50,
  "includeBody": false
}
FieldDefaultWhat it is
tagbox starts at javascriptOne DEV tag, like react or webdev. Case does not matter, it is lowercased for you. Leave empty for no tag filter.
usernamenoneOne DEV author username, like ben. Leave empty for no author filter. Use it with sortBy set to latest and no tag; other combinations are refused, since DEV ignores them.
sortBytoptop, latest or rising. rising only works with no tag and no author.
topDays7With top, how far back to look, 1 to 3,650 days. Ignored on the other two orders.
minReactionsnoneKeep only articles with at least this many reactions. DEV has no such filter, so the run reads its pages and keeps the ones that pass. Articles left out are not charged.
minCommentsnoneThe same for comments. Set both and an article has to clear both.
maxItems50Articles to return, up to 1,000.
includeBodyfalseFetch the whole article text as well. One extra request per article, so a big run takes noticeably longer.
notionConnectornoneOptional. Write every article into your own Notion as well as the dataset.
notionParentIdnoneOptional. The Notion data source ID to write into.
proxyConfigurationoffOptional, and off by default because a normal run does not need it.

For an author, set sortBy to latest. DEV lists one author's articles newest first, whatever their age, and ignores the Top window. Left on the default top, the run stops with a free BAD_INPUT row rather than charge you for articles outside the window you asked for.

A strict minimum can return fewer rows than maxItems. The run reads at most five pages more than it would without one, then stops with what passed.

📤 What you get back

A real row from a recent run:

{
  "ok": true,
  "id": 4602684,
  "title": "So You've Got a Technical Interview in 7 days...",
  "description": "So you got head-hunted. A recruiter from a large company wanted to talk to you about a React...",
  "url": "https://dev.to/cathylai/so-youve-got-a-technical-interview-in-7-days-22g5",
  "author": "Cathy Lai",
  "authorUsername": "cathylai",
  "tags": ["react", "career", "javascript"],
  "reactions": 9,
  "comments": 2,
  "readingTimeMinutes": 2,
  "coverImage": null,
  "publishedAt": "2026-09-09T05:18:13Z"
}
FieldWhat it is
idDEV's own article id. Stable, so use it to dedupe across runs.
descriptionThe card summary DEV shows in a listing, not the article.
bodyPresent only when includeBody is on. The article as markdown or HTML. null when that second request did not come back.
tagsEvery tag on the article, not just the one you filtered by.
reactions, comments, readingTimeMinutesCounts as DEV reports them. A missing value arrives as 0 rather than null, so a genuine zero and a missing field look the same.
coverImageThe header image URL, or null when the author set none.
publishedAtA real ISO timestamp, or null when DEV did not give one.
url, authorUsernameEmpty strings rather than null when DEV omits them, which is rare.

🧾 Reading the output

Two kinds of row can land in your dataset.

RowHow to spot itCharged
An articleok: true and an idyes
A diagnosticok: false and an errorCodeno
CodeWhat it means
NO_RESULTSNothing matched that tag, author, order and window, or nothing read met your minimum. Widen topDays, lower the minimum or drop a filter.
BAD_INPUTThe input combines filters DEV ignores together, such as a tag with an author, or a minimum is not a whole number of 0 or more. Nothing was fetched or charged; the row's note says what to change.
NOT_FOUNDDEV answered 404 for the listing asked for. Check the username spelling.
RATE_LIMITEDDEV asked for a slower pace. Re-run with a smaller maxItems.
SERVER_ERRORDEV answered with a server error. Usually passes on its own.
BLOCKEDDEV would not serve the listing this time.
NETWORKDEV could not be reached.

The diagnostic row echoes the tag, username, sortBy and topDays you ran with, which makes it obvious when an empty result is a filter problem rather than an outage.

The default table view hides publishedAt and body. Switch to All fields or export as JSON when you need either.

▶️ How to run it

1. Open DEV.to Scraper and click Try for free. 2. Put a tag into Tag, or an author into Author username, or leave both empty. 3. Pick a Sort by. On top, set Top days to the window you care about. For an author, pick latest. 4. Set Max articles, tick Include full body if you want the text, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$2.00 per 1,000 articles, which is $0.002 each. Flat on every Apify plan, no volume tiers.

You pay per article row delivered. Duplicates are dropped before they reach you, diagnostic rows are not charged, and if nothing matches, no rows are charged. Articles below your minimum are left out and not charged either.

One thing to know before you turn includeBody on: an article whose body request did not come back still arrives as a row, with body set to null, and still counts. Check for nulls if you are relying on the text.

💡 What people use it for

  • Finding what actually resonated in a tag this week, with sortBy on top and topDays at 7.
  • Pulling an author's whole catalogue for a reading list or a newsletter.
  • Watching a niche tag on a schedule with minReactions set, so only what clears your bar arrives.
  • Collecting full article text on a topic with includeBody, for search or summarisation.

🚧 What it does not do

  • No body by default. Turn includeBody on and expect the run to take longer.
  • No comments text. You get the count, not what anybody wrote.
  • No reaction breakdown. One total, not hearts against unicorns against bookmarks.
  • No series, no organisation feeds, no followers, no reading lists.
  • latest with a tag is not sorted by date. DEV ignores the newest-first request when a tag is

set and sends the tag's current listing in its own order. On a busy tag that is roughly the last day of articles. Sort the rows on publishedAt if the order matters. With an author, latest is newest first.

  • No tag and author together, and no Rising for a tag or an author. DEV's listing reads only one

of them, so those inputs are refused, free.

  • A missing count reads as 0. There is no way to tell a genuine zero from a field DEV left out.
  • Nothing older than the window on top. topDays is the whole search space for that order.
  • 1,000 articles per run. For more, narrow by tag and run several times.

🧭 Which content scraper do you need?

If you wantUse
DEV.to articles by tag or authorThis one
Wikipedia search results or article textWikipedia Scraper
Research preprints with abstracts and PDFsarXiv Scraper
Product launches and their upvotesProduct Hunt Scraper
Repository and developer data from GitHubGitHub Scraper

❓ Questions people ask

Do I need a DEV account or an API key? No. The listing API is public.

Why was my author run refused? DEV ignores Top and Rising for an author, and ignores the author when a tag is set too. Clear the tag and set sortBy to latest.

How do I get the article text? Tick Include full body. It adds one request per article.

Can I filter by more than one tag? Not in one run. DEV's listing takes a single tag, so run it once per tag and join the rows on id.

Can I schedule it? Yes. A daily latest run on a tag, deduped on id, keeps a feed current.

Is scraping DEV.to legal? These are public articles served by DEV's own public API. Author names are personal data, which GDPR and similar laws cover, so have a reason for collecting it, and check DEV's terms for reuse of the text. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the tag, username and sort you used. The errorCode on the diagnostic row usually names the problem on its own.