Dev.to Scraper · Articles, Tags, Authors & Reactions avatar

Dev.to Scraper · Articles, Tags, Authors & Reactions

Pricing

from $0.85 / 1,000 dev.to article record scrapeds

Go to Apify Store
Dev.to Scraper · Articles, Tags, Authors & Reactions

Dev.to Scraper · Articles, Tags, Authors & Reactions

Extract Dev.to articles, tags, authors, organizations, reactions, and top posts without authentication. Returns structured article metrics and metadata.

Pricing

from $0.85 / 1,000 dev.to article record scrapeds

Rating

0.0

(0)

Developer

Tarek Etman

Tarek Etman

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

5 days ago

Last modified

Share

reapX — public sources in, addressable records out

Dev.to Scraper · Articles, Tags, Authors & Reactions

Dev.to Scraper is an automated, high-performance web scraper and data extraction tool for Dev.to (the Forem developer network). Extract Dev.to articles, tutorials, technical blogs, author profiles, organization publications, reactions, comments count, and reading metrics without requiring API keys or authentication.

Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/devto-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me


⬇️ Input

The actor accepts structured JSON input specifying filtering options such as primary tag, multi-tag lists, author usernames, organization handles, publication state (rising, fresh, all), top time windows in days, and maximum result limits.

Input Parameters

ParameterTypeDefaultDescriptionExample
tagString"javascript"Primary Dev.to tag to filter articles."python"
tagsStringnullComma-separated list of tags to filter articles."react, typescript"
usernameStringnullAuthor username to filter articles."ben"
organizationStringnullOrganization slug to filter corporate/org blogs."gde"
topIntegernullTime window in days for top articles (e.g. 7, 30, 365).7
stateStringnullPublication state filter (all, rising, fresh)."rising"
maxArticlesInteger100Maximum number of article records to extract.100

Example Input JSON

{
"tag": "python",
"top": 30,
"state": "rising",
"maxArticles": 100
}
{
"username": "ben",
"maxArticles": 50
}
{
"organization": "gde",
"maxArticles": 50
}

⬆️ Output

The scraper outputs structured article records directly to the default Apify dataset. Every output record contains camelCase attributes, ASCII-normalised article slug values, author handles, organization details, reaction counts, and canonical URLs.

Output Fields Schema

Field NameTypeDescriptionExample
articleIdIntegerUnique Dev.to article numeric identifier.4265440
slugStringASCII-normalised addressable article slug."amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b"
titleStringFull title of the published article."Amazon Bedrock Agents Orchestrating Google ADK over A2A"
descriptionStringShort summary or description snippet of the article."This article explains how to build a cross-cloud currency agent..."
urlStringDirect Dev.to post web URL."https://dev.to/gde/amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b"
pathStringRelative URL path on Dev.to."/gde/amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b"
publishedAtStringISO 8601 publication timestamp."2026-07-29T19:14:47Z"
readablePublishDateStringHuman-readable publish date snippet."Jul 29"
commentsCountIntegerTotal count of comments on the post.5
publicReactionsCountIntegerTotal count of public reactions (likes, hearts, unicorns).42
positiveReactionsCountIntegerCount of positive reactions.42
readingTimeMinutesIntegerEstimated reading time in minutes.9
languageStringPrimary article language code."en"
tagsStringComma-separated list of tags."agents, googleadk, a2aprotocol, aws"
tagListArrayList of tag strings.["agents", "googleadk", "aws"]
coverImageStringHeader cover image URL."https://media2.dev.to/.../cover.png"
socialImageStringSocial preview image URL."https://media2.dev.to/.../social.png"
canonicalUrlStringOriginal canonical URL."https://dev.to/gde/..."
authorUsernameStringUsername of the author."xbill"
authorNameStringDisplay name of the author."xbill"
authorUserIdIntegerDev.to user ID of the author.3490099
authorProfileImageStringAuthor profile avatar image URL."https://media2.dev.to/.../profile.jpg"
authorGithubUsernameStringAuthor's GitHub username handle."xbill9"
organizationSlugStringSlug of publishing organization."gde"
organizationNameStringName of publishing organization."Google Developer Experts"

Sample Output Record JSON

{
"articleId": 4265440,
"slug": "amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b",
"title": "Amazon Bedrock Agents Orchestrating Google ADK over A2A",
"description": "This article explains how to build and test a cross-cloud currency agent. An Amazon Bedrock master...",
"url": "https://dev.to/gde/amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b",
"path": "/gde/amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b",
"publishedAt": "2026-07-29T19:14:47Z",
"publishedTimestamp": "2026-07-29T19:14:47Z",
"readablePublishDate": "Jul 29",
"commentsCount": 0,
"publicReactionsCount": 9,
"positiveReactionsCount": 9,
"readingTimeMinutes": 9,
"language": "en",
"tags": "agents, googleadk, a2aprotocol, aws",
"tagList": [
"agents",
"googleadk",
"a2aprotocol",
"aws"
],
"coverImage": "https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxbill9%2Fbedrock-adk-a2a-currency%2Fmain%2Fdevto-cover-bedrock-master.png",
"socialImage": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxbill9%2Fbedrock-adk-a2a-currency%2Fmain%2Fdevto-cover-bedrock-master.png",
"canonicalUrl": "https://dev.to/gde/amazon-bedrock-agents-orchestrating-google-adk-over-a2a-5c2b",
"createdAt": "2026-07-29T19:14:47Z",
"editedAt": "2026-07-29T19:14:56Z",
"authorUsername": "xbill",
"authorName": "xbill",
"authorUserId": 3490099,
"authorProfileImage": "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%2F3490099%2Fc6a975d0-cd94-485d-82b1-14ed5b344fcf.jpg",
"authorGithubUsername": "xbill9",
"authorTwitterUsername": null,
"authorWebsiteUrl": "https://g.dev/xbill",
"organizationSlug": "gde",
"organizationName": "Google Developer Experts",
"organizationUsername": "gde",
"organizationProfileImage": "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%2Forganization%2Fprofile_image%2F11939%2Fe3080d5b-ecde-42a8-b089-bafecc31fa97.png"
}

How it works

Dev.to Scraper queries the official public REST endpoints of Dev.to (https://dev.to/api/articles) using lightweight HTTP requests with automatic pagination and exponential backoff retry handling.

  1. Parameter Construction: The actor formats requested tag, author, organization, top period, and state filters.
  2. Paginated Retrieval: Requests articles in batches of 50 to maximize speed and throughput.
  3. Data Transformation & Normalization:
    • Re-keys id to articleId so numeric IDs do not interfere with entity page addressing.
    • ASCII-normalises and sanitizes article slug strings to ensure valid, unique entity keys across datasets.
    • Flattens nested author (user) and organization (organization) objects into accessible camelCase fields.
  4. Pay-Per-Event Billing: Charges $0.001 per scraped article record (article-scraped) before pushing items to the dataset, with full budget check protection.

❓ FAQ

Does Dev.to Scraper require an API key?

No. Dev.to public REST endpoints do not require authentication or API keys.

How are article slugs normalized?

Article slugs are converted from unicode to clean ASCII strings, removing invalid non-alphanumeric characters and truncating to a maximum length of 80 characters. This ensures total compatibility with entity page generators and page indexing engines.

How does Pay-Per-Event pricing work?

You only pay for the actual article records returned and stored in your dataset ($0.001 per record). Tiered discounts automatically reduce unit pricing for Bronze, Silver, Gold, Platinum, and Diamond accounts.

Can I filter by specific organizations or companies?

Yes, pass the organization handle (such as gde, aws, forem, or supabase) in the organization input field.

Can I fetch top posts over a specific period?

Yes, pass top set to 7 (last 7 days), 30 (last 30 days), or 365 (last year).


💬 Your feedback

We continuously improve our scrapers based on user feedback. If you discover a bug, request a feature, or need custom data pipelines, please reach out to reapxdev@proton.me or visit reapx.dev.


Disclaimer

Unofficial - not affiliated with Dev.to or Forem. Collects public data only. reapx. Contact reapxdev@proton.me.

🧪 Example input

A real, runnable configuration — this is an actual input this Actor has run with.

{
"tag": "javascript",
"maxArticles": 50
}

📄 Sample output

One real row from a real run of this Actor, unedited.

{
"type_of": "article",
"title": "TypeScript 7 Went Native: What Actually Changes And What Doesn't",
"description": "Everyone's heard by now that TypeScript \"went native.\" And I keep seeing the same wrong conclusion...",
"readable_publish_date": "Aug 3",
"slug": "typescript-7-went-native-what-actually-changes-and-what-doesnt-6b3",
"path": "/nazar-boyko/typescript-7-went-native-what-actually-changes-and-what-doesnt-6b3",
"url": "https://dev.to/nazar-boyko/typescript-7-went-native-what-actually-changes-and-what-doesnt-6b3",
"comments_count": 33,
"public_reactions_count": 68,
"collection_id": null,
"published_timestamp": "2026-08-03T13:11:18Z",
"language": "en",
"subforem_id": 1,
"positive_reactions_count": 68,
"cover_image": "https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fimages.weserv.nl%2F%3Furl%3Dwww.nazarboyko.com%2Fassets%2Fimgs%2Farticles%2Ftypescript-7-native-compiler-what-changes%2Fcover.webp%26w%3D1600%26h%3D672%26fit%3Dcover%26a%3Dtop",
"social_image": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fimages.weserv.nl%2F%3Furl%3Dwww.nazarboyko.com%2Fassets%2Fimgs%2Farticles%2Ftypescript-7-native-compiler-what-changes%2Fcover.webp%26w%3D1600%26h%3D672%26fit%3Dcover%26a%3Dtop",
"canonical_url": "https://dev.to/nazar-boyko/typescript-7-went-native-what-actually-changes-and-what-doesnt-6b3",
"created_at": "2026-08-03T03:21:53Z",
"edited_at": null,
"crossposted_at": null,
"published_at": "2026-08-03T13:11:18Z",
"last_comment_at": "2026-08-03T18:07:51Z",
"reading_time_minutes": 8,
"tag_list": [
"discuss",
"javascript",
"typescript",
"performance"
],
"tags": "discuss, javascript, typescript, performance",
"flare_tag": {
"name": "discuss",
"bg_color_hex": "#71EA8B",
"text_color_hex": "#FFFFFF"
},
"articleId": 4296692,
"authorUsername": "nazar-boyko",
"authorName": "Nazar Boyko",
"authorUserId": 1875383,
"authorProfileImage": "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%2F1875383%2F1b3f5dc9-df1c-4551-9f6e-e3b6234b3d6c.gif",
"authorGithubUsername": null,
"authorTwitterUsername": null,
"authorWebsiteUrl": "http://nazarboyko.com/",
"organizationSlug": null,
"organizationName": null,
"organizationUsername": null,
"organizationProfileImage": null,
"publishedAt": "2026-08-03T13:11:18Z",
"publishedTimestamp": "2026-08-03T13:11:18Z",
"readablePublishDate": "Aug 3",
"commentsCount": 33,
"publicReactionsCount": 68,
"positiveReactionsCount": 68,
"readingTimeMinutes": 8,
"coverImage": "https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fimages.weserv.nl%2F%3Furl%3Dwww.nazarboyko.com%2Fassets%2Fimgs%2Farticles%2Ftypescript-7-native-compiler-what-changes%2Fcover.webp%26w%3D1600%26h%3D672%26fit%3Dcover%26a%3Dtop",
"socialImage": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3

⚠️ Run outcomes and error handling

This Actor reports what happened in the run's status message, and it always keeps whatever it collected. These are the outcomes you can get and what each one means.

OutcomeWhat it means
SuccessRows were returned and you were charged article-scraped at $0.001 per row.
No matchesThe source returned nothing for your filters. Nothing is charged. Widen the date window or drop a filter.

What is guaranteed either way

  • Every row is pushed as it is built, not buffered to the end of the run. Anything that buffers output loses everything to a timeout, a block or a migration; this does not.
  • A field absent from the source is absent from the row. Nothing is inferred, modelled or filled in to make a row look complete.