# Dev.to Scraper (`anyxsolutions/dev-to-scraper`) Actor

Scrape DEV (dev.to) articles by tag, top list, member or organization: titles, tags, reactions, comment counts, reading time, authors with GitHub and X handles, the full text in Markdown and plain text, and threaded comments. Paste a dev.to URL, get clean JSON. No login, no API key.

- **URL**: https://apify.com/anyxsolutions/dev-to-scraper.md
- **Developed by:** [Anyx Solutions](https://apify.com/anyxsolutions) (community)
- **Categories:** News, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![banner](https://anyx.solutions/banners/dev-to-scraper.png)

## Dev.to Scraper

**Articles from any DEV tag, top list, member or organization — with reactions, comments, authors and the full text in Markdown — as clean JSON.**

DEV (dev.to) is one of the largest communities of software developers, with millions of articles
on JavaScript, Python, web development, AI, DevOps, careers and every other corner of software.
This Actor reads any tag feed, the week's, month's, year's or all-time top articles, the newest
articles, or every article by a member or organization, and returns each one with its title,
description, tags, publish and edit dates, reading time, reactions, comment count, cover image,
author (with GitHub, X and website links), organization, and the full article body as Markdown,
HTML and plain text. Turn on comments to add every comment and reply, in thread order. Paste a
dev.to URL or a list of tags; there is no login, no API key, and no proxy to configure. Built for
developer-content research, DevRel and community monitoring, technical SEO, and AI and search
datasets.

### ⚡ Quick start

```json
{
  "startUrls": [{ "url": "https://dev.to/t/javascript/top/week" }],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                                                                                           |
| -------------------- | ------- | -------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | no       | —                            | dev.to pages: tag feeds (`dev.to/t/<tag>`, `…/latest`, or `…/top/week`, `month`, `year` or `infinity`), the home feed, `dev.to/latest` or `dev.to/top/<period>`, member or organization profiles (`dev.to/<name>`), and single article URLs. Add URLs, tags, or both. |
| `tags`               | array   | no       | —                            | DEV tags, one per line (for example `webdev` or `python`). Each returns the same articles as its `dev.to/t/<tag>` page.                                                                                                                                               |
| `maxItems`           | integer | no       | —                            | Maximum number of articles per start URL or tag. The input form starts at 5; leave it empty to get every article the listing has.                                                                                                                                     |
| `includeContent`     | boolean | no       | `true`                       | Read each article's full body as Markdown, HTML and plain text. Adds one fast request per article; turn it off for quick listings with titles, stats and descriptions only.                                                                                           |
| `includeComments`    | boolean | no       | `false`                      | Add each article's comments and replies, flattened into one list in thread order with a depth for each. Adds one request per article.                                                                                                                                 |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. DEV needs no proxy; use Apify Proxy (datacenter) only for very large runs.                                                                                                                                                                            |

**Which order do I get?** The same as the page you paste: a tag page gives DEV's relevant feed
for the tag, `…/latest` the newest first, and `…/top/week` (or `month`, `year`, `infinity`) the
most-reacted articles of that period. Profile pages list the member's or organization's articles,
newest first.

### 📤 Output

Each article is one dataset row, with its author and, when it was published under one, its
organization.

#### Fields

| Field                    | Type   | Description                                                                                                                                                                                                           |
| ------------------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                     | number | DEV article ID.                                                                                                                                                                                                       |
| `title`                  | string | Article title.                                                                                                                                                                                                        |
| `description`            | string | The article's summary, as shown in feeds and link previews.                                                                                                                                                           |
| `slug`                   | string | The article's name in its URL.                                                                                                                                                                                        |
| `url`                    | string | The article's page on dev.to.                                                                                                                                                                                         |
| `canonicalUrl`           | string | The article's original home: its dev.to page, or the author's own blog when the article was cross-posted.                                                                                                             |
| `publishedAt`            | string | When the article was published (ISO 8601).                                                                                                                                                                            |
| `editedAt`               | string | When the article was last edited (ISO 8601), or `null` if never.                                                                                                                                                      |
| `readingTimeMinutes`     | number | Estimated reading time in minutes.                                                                                                                                                                                    |
| `language`               | string | Language of the article.                                                                                                                                                                                              |
| `tags`                   | array  | Tag names, up to four.                                                                                                                                                                                                |
| `positiveReactionsCount` | number | Number of positive reactions (likes, unicorns, and the like).                                                                                                                                                         |
| `publicReactionsCount`   | number | Number of public reactions, the count DEV shows on the article.                                                                                                                                                       |
| `commentsCount`          | number | Number of comments.                                                                                                                                                                                                   |
| `coverImage`             | string | Cover image URL.                                                                                                                                                                                                      |
| `socialImage`            | string | Link-preview image URL.                                                                                                                                                                                               |
| `author`                 | object | The writer: `name`, `username`, `url`, `twitter` (X handle), `github` (GitHub handle), `website` and `profileImage`.                                                                                                  |
| `organization`           | object | The organization the article was published under: `name`, `username`, `url` and `profileImage`. `null` for personal articles.                                                                                         |
| `bodyHtml`               | string | Article body as HTML. `null` when `includeContent` is off.                                                                                                                                                            |
| `bodyMarkdown`           | string | Article body as the author wrote it, in Markdown. `null` when `includeContent` is off.                                                                                                                                |
| `bodyText`               | string | Article body as plain text. `null` when `includeContent` is off.                                                                                                                                                      |
| `comments`               | array  | Comments and replies in thread order, each with `id`, `url`, `parentId` (the comment it replies to), `depth` (0 for a top-level comment), `createdAt`, `author` and `bodyText`. `null` when `includeComments` is off. |

<details><summary>Example output</summary>

```json
{
  "id": 4729395,
  "title": "Why Your TypeScript Code Still Crashes in Production",
  "description": "A practical visual guide to the TypeScript mental model. Discover why types vanish at runtime, how structural typing works, and how to write clean, type-safe code that never crashes in production.",
  "slug": "why-your-typescript-code-still-crashes-in-production-2bf4",
  "url": "https://dev.to/smtahosin/why-your-typescript-code-still-crashes-in-production-2bf4",
  "canonicalUrl": "https://dev.to/smtahosin/why-your-typescript-code-still-crashes-in-production-2bf4",
  "publishedAt": "2026-10-06T15:46:16Z",
  "editedAt": "2026-10-10T02:03:55Z",
  "readingTimeMinutes": 7,
  "language": "en",
  "tags": ["typescript", "javascript", "beginners", "discuss"],
  "positiveReactionsCount": 40,
  "publicReactionsCount": 40,
  "commentsCount": 47,
  "coverImage": "https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fiili.io%2FnMqdhbt.png",
  "socialImage": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fiili.io%2FnMqdhbt.png",
  "author": {
    "name": "S M Tahosin",
    "username": "smtahosin",
    "url": "https://dev.to/smtahosin",
    "twitter": null,
    "github": null,
    "website": "https://tahosin.bro.bd",
    "profileImage": "https://media2.dev.to/dynamic/image/width=640,height=640,fit=cover,gravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4126369%2Fe2b7c44b-92cf-47ae-a628-32599bd06777.webp"
  },
  "organization": null,
  "bodyHtml": "<p>You spend an entire afternoon adding types to your projec …",
  "bodyMarkdown": "You spend an entire afternoon adding types to your project. Every variable has an interfac …",
  "bodyText": "You spend an entire afternoon adding types to your project. Every variable has an interfac …",
  "comments": [
    {
      "id": "3gk67",
      "url": "https://dev.to/prodev91/comment/3gk67",
      "parentId": null,
      "depth": 0,
      "createdAt": "2026-10-07T03:17:35Z",
      "author": {
        "name": "Anthony Allen",
        "username": "prodev91",
        "url": "https://dev.to/prodev91",
        "twitter": null,
        "github": null,
        "website": null,
        "profileImage": "https://media2.dev.to/dynamic/image/width=640,height=640,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4166454%2F0bda8da9-5975-4731-b84d-6807c1ce8b28.png"
      },
      "bodyText": "Really good explanation, especially the part about \"unknown\" vs \"any\" and how TypeScript t …"
    },
    {
      "id": "3gl1d",
      "url": "https://dev.to/smtahosin/comment/3gl1d",
      "parentId": "3gk67",
      "depth": 1,
      "createdAt": "2026-10-07T08:42:55Z",
      "author": {
        "name": "S M Tahosin",
        "username": "smtahosin",
        "url": "https://dev.to/smtahosin",
        "twitter": null,
        "github": null,
        "website": "https://tahosin.bro.bd",
        "profileImage": "https://media2.dev.to/dynamic/image/width=640,height=640,fit=cover,gravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4126369%2Fe2b7c44b-92cf-47ae-a628-32599bd06777.webp"
      },
      "bodyText": "Thank you! \"unknown\" vs \"any\" was one of the concepts I really wanted to highlight because …"
    }
  ]
}
```

</details>

### 💡 Use cases

- **Developer-content research** — find the most-read articles on a technology, week by week, and see which topics, formats and tags earn reactions and comments.
- **DevRel and community monitoring** — follow your company's organization page, your product's tag, or your advocates' profiles, and catch every new article and comment.
- **Technical SEO and content marketing** — track cross-posted articles and their canonical URLs, and benchmark your posts against the top of each tag.
- **AI and search datasets** — collect clean, attributed technical articles in Markdown, with code blocks intact, and their discussion threads.

### ❓ FAQ

- **Do I need a DEV account or an API key?** No. The Actor reads only what DEV shows every visitor.
- **Can I search DEV by keyword?** Not directly: DEV does not offer its search for automated access. Use tags instead (`dev.to/t/<keyword>` or the `tags` input), which cover most topics, or scrape the profiles of the members and organizations you follow.
- **Does it work with other Forem communities?** No. Forem's other communities now share DEV's articles under their own addresses, so the Actor reads dev.to itself and takes dev.to URLs only.
- **How far back can I go?** As far as the listing goes. Profile pages hold every article the member or organization has published, and `…/top/infinity` gives a tag's most-reacted articles of all time. Leave `maxItems` empty to get them all.
- **Can I scrape many tags or profiles at once?** Yes. Add one URL or tag per line; `maxItems` applies to each one separately.
- **Why is `organization` empty on most rows?** Most articles are personal. `organization` is filled only when an article was published under a company or community page.
- **Do I need a proxy?** No. It runs without one by default and paces itself when DEV asks it to slow down.

### 🔗 More scrapers by Anyx

- [Medium Scraper](https://apify.com/anyxsolutions/medium-scraper)
- [Substack Scraper](https://apify.com/anyxsolutions/substack-scraper)
- [Hacker News Scraper](https://apify.com/anyxsolutions/hacker-news-scraper)
- [Stack Overflow Scraper](https://apify.com/anyxsolutions/stack-overflow-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [dev.to](https://dev.to/)

# Actor input Schema

## `startUrls` (type: `array`):

dev.to pages: tag feeds (https://dev.to/t/javascript, …/latest, or …/top/week, month, year or infinity), the home feed, https://dev.to/latest or https://dev.to/top/month, member or organization profiles (https://dev.to/devteam), and single article URLs.

## `tags` (type: `array`):

DEV tags to scrape, one per line, for example webdev or python. Each tag returns the same articles as its https://dev.to/t/<tag> page and counts as its own start URL for Maximum articles.

## `maxItems` (type: `integer`):

Maximum number of articles to return per start URL or tag. Leave empty to get every article the listing has; popular tags have tens of thousands.

## `includeContent` (type: `boolean`):

Fetch each article on its own to read its full body as Markdown, HTML and plain text. Adds one fast request per article; turn it off for quicker listings with titles, stats and descriptions only.

## `includeComments` (type: `boolean`):

Add each article's comments, with replies flattened into one list in thread order and a depth for each. Adds one request per article.

## `proxyConfiguration` (type: `object`):

Proxy settings. DEV needs no proxy; use Apify Proxy (datacenter) only for very large runs, to spread requests over more IPs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://dev.to/t/javascript/top/week"
    }
  ],
  "maxItems": 5,
  "includeContent": true,
  "includeComments": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://dev.to/t/javascript/top/week"
        }
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/dev-to-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://dev.to/t/javascript/top/week" }],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/dev-to-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://dev.to/t/javascript/top/week"
    }
  ],
  "maxItems": 5
}' |
apify call anyxsolutions/dev-to-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anyxsolutions/dev-to-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MI4aMWaozUdpjZ2Kg/builds/yODT8UjnnxpEQZNrv/openapi.json
