DEV.to Scraper - Articles by Tag, Author or Top
Pricing
from $1.94 / 1,000 articles
DEV.to Scraper - Articles by Tag, Author or Top
Scrape DEV.to articles by tag, author or top reactions. Each row has the title, summary, author, tags, reactions, comments, reading time, cover image and link, plus the full article text when you switch it on. $2.00 per 1,000 articles.
Pricing
from $1.94 / 1,000 articles
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape DEV.to articles by tag, author or reactions: pick a tag, an author, or neither, and get one row per article with the title, summary, tags, reaction and comment counts, reading time, cover image and the link. Nothing to sign up for, and no API key.
The article body is off by default. You get the summary DEV shows in a card, and you switch on Include full body when you want the whole post, which costs a second request per article.
| Input | A tag, an author username, a sort order, or any combination DEV accepts |
| Output | One row per article: title, summary, author, tags, reactions, comments, reading time, cover image, link. The full text on request |
| Ceiling | 1,000 articles per run |
| Account needed | None, and no API key |
| Price | $2.00 per 1,000 articles on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 2,500 |
🔍 What DEV.to Scraper does
It pages through DEV's article listing, 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 data you get from each DEV.to article
| What you get | Field |
|---|---|
| A stable id, the title and the link | id, title, url |
| The card summary DEV shows in a listing | description |
| Who wrote it | author, authorUsername |
| Every tag on the article | tags |
| Reactions, comments and reading time | reactions, comments, readingTimeMinutes |
| Cover image and publication time | coverImage, publishedAt |
| The whole article, when you switch it on | body |
▶️ How to scrape DEV.to articles
- Open DEV.to Scraper and click Try for free.
- Put a tag into Tag, or an author into Author username, or leave both empty.
- Pick a Sort by. On
top, set Top days to the window you care about. For an author, picklatest. - Set Max articles, tick Include full body if you want the text, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost to scrape DEV.to articles?
$2.00 per 1,000 articles, which is $0.002 each on the Free plan. Paid plans pay a little less: $1.98 on Starter, $1.96 on Scale and $1.94 on Business. On the free plan, the $5 Apify gives you each month covers about 2,500 articles.
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 you give it
{"tag": "javascript","sortBy": "top","topDays": 7,"maxItems": 50,"includeBody": false}
| Field | Default | What it is |
|---|---|---|
tag | box starts at javascript | One DEV tag, like react or webdev. Case does not matter, it is lowercased for you. Leave empty for no tag filter. |
username | none | One 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. |
sortBy | top | top, latest or rising. rising only works with no tag and no author. |
topDays | 7 | With top, how far back to look, 1 to 3,650 days. Ignored on the other two orders. |
minReactions | none | Keep 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. |
minComments | none | The same for comments. Set both and an article has to clear both. |
maxItems | 50 | Articles to return, up to 1,000. |
includeBody | false | Fetch the whole article text as well. One extra request per article, so a big run takes noticeably longer. |
notionConnector | none | Optional. Write every article into your own Notion as well as the dataset. |
notionParentId | none | Optional. The Notion data source ID to write into. |
proxyConfiguration | off | Optional, 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 run in September 2026:
{"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"}
| Field | How to read it |
|---|---|
id | DEV's own article id. Stable, so use it to dedupe across runs. |
description | The card summary DEV shows in a listing, not the article. |
body | Present only when includeBody is on. The article as markdown or HTML. null when that second request did not come back. |
tags | Every tag on the article, not just the one you filtered by. |
reactions, comments, readingTimeMinutes | Counts as DEV reports them. A missing value arrives as 0 rather than null, so a genuine zero and a missing field look the same. |
coverImage | The header image URL, or null when the author set none. |
publishedAt | A real ISO timestamp, or null when DEV did not give one. |
url, authorUsername | Empty strings rather than null when DEV omits them, which is rare. |
🧾 Reading the output
Two kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| An article | ok: true and an id | yes |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your articles.
| Code | What it means |
|---|---|
NO_RESULTS | Nothing matched that tag, author, order and window, or nothing read met your minimum. Widen topDays, lower the minimum or drop a filter. |
BAD_INPUT | The 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_FOUND | DEV answered 404 for the listing asked for. Check the username spelling. |
RATE_LIMITED | DEV asked for a slower pace. Re-run with a smaller maxItems. |
SERVER_ERROR | DEV answered with a server error. Usually passes on its own. |
NOT_SERVED | This article was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
NETWORK | DEV could not be reached. |
TIME_LIMIT | The run got close to its time limit and stopped on its own. The articles delivered before that are charged as usual. Give the run more time, or ask for fewer articles, to get the rest. |
A run that ends on one of these rows still finishes as succeeded, except one: when the time limit
stopped the run before any article came back, it ends as failed, with a TIME_LIMIT row saying so.
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.
💡 What people use it for
- Finding what actually resonated in a tag this week, with
sortByontopandtopDaysat 7. - Pulling an author's whole catalogue for a reading list or a newsletter.
- Watching a niche tag on a schedule with
minReactionsset, so only what clears your bar arrives. Dedupe onidand each run adds only what is new.
🚧 What it does not do
- No body by default. Turn
includeBodyon 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.
latestwith 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 onpublishedAtif the order matters. With an author,latestis 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.topDaysis the whole search space for that order. - 1,000 articles per run. For more, narrow by tag and run several times.
- It is not an official DEV tool. Dami's Studio is independent and is not affiliated with or endorsed by DEV, or by any other company named on this page.
🧭 Which developer scraper do you need?
| If you want | Use |
|---|---|
| Articles from DEV.to by tag or author, with the full text on request | This one |
| Hacker News stories, Ask and Show HN posts, and comments | Hacker News Scraper |
| Stack Overflow questions with the body and the accepted answer | Stack Overflow Scraper |
| Repositories and developer profiles from a GitHub search | GitHub Scraper |
| npm and PyPI package details and download counts | npm + PyPI Package Scraper |
| Product launches and their upvotes | Product Hunt Scraper |
| Research preprints with full abstracts and PDF links | arXiv Scraper |
❓ Questions people ask
Do I need a DEV account or an API key?
No. Everything it reads is public.
Why was my DEV 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 full article text?
Tick Include full body. It adds one request per article.
Can I filter by more than one DEV 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 call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code for
Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/devto-scraper. Either way the run
happens on your Apify account at the same price.
Is it legal to scrape DEV.to?
These are public articles. Author names are personal data, which GDPR and similar laws cover, so have a reason for collecting them, and check DEV's terms for reuse of the text. Apify's write-up on the legality of web scraping 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.