Mastodon Scraper
Pricing
from $2.54 / 1,000 dataset rows
Mastodon Scraper
Scrape public Mastodon data from any instance — public & local timelines, hashtag timelines, and status threads. Read-only public data, no account.
Pricing
from $2.54 / 1,000 dataset rows
Rating
0.0
(0)
Developer
R.L.
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Mastodon Scraper — public & local timelines, hashtags and status threads from any instance
Mastodon Scraper reads public data from any Mastodon instance's API directly — fast, reliable,
no account. Because Mastodon is federated, you point it at an instance (e.g. mastodon.world,
fosstodon.org, mas.to) and it scrapes that instance's public view. Export to JSON,
CSV, Excel, or an API.
Modes
- Public (federated) timeline — everything the instance sees across the fediverse.
- Local timeline — posts from that instance's own members.
- Hashtag timeline — posts tagged with a hashtag.
- Status + replies — one post (from its URL) and, optionally, its reply thread. The host in the URL decides which instance is asked, because a status id only means something on the instance that issued it.
{ "mode": "hashtag", "instance": "mastodon.world", "hashtag": "art", "maxItems": 200 }{ "mode": "public-timeline", "instance": "fosstodon.org" }{ "mode": "status", "statusUrl": "https://mastodon.art/@user/117477700171571521","includeReplies": true }{} // works: defaults to #art on mastodon.world, 100 rows
Each row is a status: instance, id, url, author_handle, content (HTML parsed to clean
text), created_at, favourites_count, reblogs_count, replies_count, tags, media_urls,
media_count, language, visibility, sensitive, spoiler_text and reply metadata
(in_reply_to_id, replies_count).
Joining rows: use
url, notid. Mastodon ids are per-instance, so the same post has a differentidon every instance that federated a copy — measured, one post was117477700279537460throughmastodon.world's hashtag timeline and117477700171571521through its own host. Theinstancecolumn says which id-space theidbelongs to, andurlis the same everywhere.Boost columns only fill in
statusmode.is_reblogandreblog_ofare there for completeness, but Mastodon's public, local and hashtag timelines exclude boosts — measured, 0 of 120 statuses across three hashtags carried one — so in those three modesis_reblogis alwaysfalse.
Good to know
-
No account, no sign-in — on a permissive instance, Mastodon serves public timelines and statuses unauthenticated. Not every instance is permissive; see below.
-
A typo never fails the run. An unknown mode, a missing instance, a hashtag mode with no hashtag or a status mode with no URL finishes SUCCEEDED with a message naming what to fix, and charges nothing — so a mistake is not billed and does not show up as a failed run.
-
Requests go through Apify Proxy, which the proxy input selects (datacenter by default, residential if you choose it). Mastodon rate-limits per IP, so a proxy is what keeps a large run from sharing one bucket.
-
media_countis0, not empty, when a post has no media — so you can filter on it.media_urlsis null in that case, because an empty list and null say the same thing. -
Pick your instance — gating is per mode, not per instance. Instances differ in what they serve anonymously, it differs per timeline, and it tightens over time. Measured 2026-10-21, one request each:
Instance public-timelinelocal-timelinehashtagmastodon.world(default),fosstodon.org,mas.to,hachyderm.io,universeodon.com✅ ✅ ✅ mastodon.social,mastodon.online— — ✅ infosec.exchange,chaos.social— ✅ — mstdn.social— — — A gated timeline answers HTTP 422. The run then finishes SUCCEEDED, charging nothing, with a message that asks the instance which modes it does still serve — so if you picked
mastodon.socialit tells you hashtag mode works there, rather than sending you elsewhere.
What you are charged for
One charge per status row delivered — and nothing else. Platform usage (compute, proxy, data transfer) is absorbed by the Actor rather than added to your bill, and a run that delivers no rows is charged nothing: an instance that gates the timeline, an input typo, a hashtag with no posts and a status that does not exist are all unbilled.
See the Actor's Pricing tab for the current figures, including the one that applies to your Apify plan and any change announced but not yet in effect. This page deliberately does not repeat them, so it cannot disagree with what you are actually billed.
Set Max total charge on a run to bound it. The Actor stops starting new work once that is spent and says so in its status message, rather than letting a short dataset read as "that is all there was".