Mastodon Scraper avatar

Mastodon Scraper

Pricing

from $2.54 / 1,000 dataset rows

Go to Apify Store
Mastodon Scraper

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.

R.L.

Maintained by Community

Actor 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, not id. Mastodon ids are per-instance, so the same post has a different id on every instance that federated a copy — measured, one post was 117477700279537460 through mastodon.world's hashtag timeline and 117477700171571521 through its own host. The instance column says which id-space the id belongs to, and url is the same everywhere.

Boost columns only fill in status mode. is_reblog and reblog_of are 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 modes is_reblog is always false.

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_count is 0, not empty, when a post has no media — so you can filter on it. media_urls is 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:

    Instancepublic-timelinelocal-timelinehashtag
    mastodon.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.social it 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".