Mastodon Scraper - Hashtags, Accounts and Timelines avatar

Mastodon Scraper - Hashtags, Accounts and Timelines

Pricing

from $1.44 / 1,000 posts

Go to Apify Store
Mastodon Scraper - Hashtags, Accounts and Timelines

Mastodon Scraper - Hashtags, Accounts and Timelines

Scrape public Mastodon posts by hashtag, account or server timeline, with no login. Each row holds the text, author, follower count, replies, boosts, favourites, media links, language and hashtags. A server only holds the posts that reached it. $1.50 per 1,000 posts.

Pricing

from $1.44 / 1,000 posts

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

4 days ago

Last modified

Share

Point it at any Mastodon server and pull public posts by hashtag, account or timeline: the text with the HTML stripped out, who posted it, their follower count, replies, boosts and favourites, any media links, the language and the hashtags.

The thing to understand before you plan anything: a Mastodon server only holds the posts that reached it. Ask two servers for the same hashtag and you get two different sets, neither of them complete. There is no central index to ask instead, so if coverage matters, run it against two or three servers and merge.

InputA server host, plus a hashtag or a handle
OutputOne row per post: text, author, follower count, replies, boosts, favourites, media links, language, hashtags and link
Ceiling2,000 posts per run
Account neededNone, and no login anywhere
Price$1.50 per 1,000 posts on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 3,300

🔍 What Mastodon Scraper does

One server per run, in one of three modes.

Hashtag reads that server's timeline for a tag. Put opensource or #opensource in query; either works.

Account reads one account's posts. Mastodon for a local account, or user@otherserver.social for someone elsewhere, which the server you asked resolves for you.

Public reads the server's own timeline. With local off you get the federated view, everything that server has seen. With local on you get only posts written there, which is the better one for watching a single community.

One caveat on that last mode: large servers, mastodon.social among them, require a login for their public timeline. Ask anyway and you get a NOT_SERVED row and nothing else. Hashtag and account modes still work on those servers.

📋 What data you get from each Mastodon post

What you getField
The post's id and its public web addressid, url
The text, with HTML removedtext
Handle, display name and follower count of the posterauthor, authorName, authorFollowers
When it was postedcreatedAt
Replies, boosts and favouritesrepliesCount, reblogsCount, favouritesCount
The languagelanguage
Attached images and videomediaUrls
Hashtagstags

▶️ How to scrape Mastodon posts

  1. Open Mastodon Scraper and click Try for free.
  2. Type the server into Instance, without https://.
  3. Pick a Mode, then fill Query with the hashtag or handle.
  4. Set Max posts, then click Start.
  5. Download the dataset as JSON, CSV, Excel or XML.

💰 How much does it cost to scrape Mastodon posts?

$1.50 per 1,000 posts on the Free plan, and the same in all three modes. Paid plans pay a little less: $1.48 on Starter, $1.46 on Scale and $1.44 on Business. On the free plan, the $5 Apify gives you each month covers about 3,300 posts.

You pay per post row. Diagnostic rows are free, and a hashtag or timeline that turns up empty costs you nothing.

📥 What you give it

{
"instance": "fosstodon.org",
"mode": "hashtag",
"query": "opensource",
"maxItems": 200
}
FieldDefaultWhat it is
instancemastodon.socialThe server host, without https://: fosstodon.org, mas.to, infosec.exchange.
modehashtaghashtag, account or public.
querynoneThe hashtag or the handle. Leading # and @ are stripped for you. Ignored in public mode, required in the other two. The form shows opensource as an example, so an API call has to send its own.
localfalsePublic mode only. On means posts written on that server, off means everything it has federated.
maxItems1001 to 2,000. Paging is automatic, forty at a time.
notionConnectornoneOptional. Writes every delivered post into your Notion. Authorise a connector once under Settings, API and Integrations, MCP connectors, then pick it here.
notionParentIdnoneOptional. The Notion data source id to write into. Empty creates the pages privately in your workspace.
proxyConfigurationoffOptional network setting. Off is right for a normal run.

📤 What you get back

A real row from a real run:

{
"ok": true,
"id": "117267800308722144",
"text": "Linuxiac: Navidrome 0.64 Music Server & Streamer Adds Experimental Jellyfin Music API Support\nhttps://linuxiac.com/navidrome-0-64-adds-experimental-jellyfin-music-api-support/\n#linux #opensource #tech",
"author": "kiltedtux",
"authorName": "FuzzyFeeds",
"authorFollowers": 26,
"createdAt": "2026-09-14T05:43:48.744Z",
"repliesCount": 0,
"reblogsCount": 0,
"favouritesCount": 0,
"language": "en",
"mediaUrls": [],
"tags": ["linux", "opensource", "tech"],
"url": "https://mastodon.social/@kiltedtux/117267800308722144"
}
FieldHow to read it
textLinks and hashtags stay as text; entities are decoded.
author, authorNameOn a boosted post, both belong to the person who passed it on, not the original poster.
repliesCount, reblogsCount, favouritesCountThe numbers that server knows about, which are lower than the true totals across the network. 0 also means absent.
tagsHashtags Mastodon parsed out of the post.

Boosted posts are the one thing to watch. The row credits the account that passed the post on, and its engagement numbers come from that wrapper rather than from the original, so those counts read low. Filter them out by comparing author with the handle you asked for.

🧾 Reading the output

Posts carry ok: true. Anything with ok: false carries an errorCode and is not charged.

CodeWhat it means
BAD_INPUTAn unknown mode, or a hashtag or account run with no query.
NOT_FOUNDThat server does not know the account. Check the handle, and add @server for a remote one.
NO_RESULTSThe timeline exists and is empty as far as this server is concerned.
NOT_SERVEDThis post was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
NETWORKThe host was unreachable, or the name was misspelt.
TIME_LIMITThe run got close to its time limit and stopped on its own. The posts delivered before that are complete and charged. Give the run more time, or ask for fewer posts, 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 post came back, it ends as failed, with a TIME_LIMIT row saying so.

The Console's Overview table shows author, text, favourites, boosts, date and URL, and renders diagnostic rows as blank lines. Download the dataset for the tags, media and follower counts.

💡 What people use it for

  • Watching a brand or project name as a hashtag across two or three servers and merging on id.
  • Archiving an account's public posts before a server shuts down, which happens often enough to matter.
  • Building a plain-text corpus from a niche server's local timeline, with local switched on.
  • Finding who in a community actually gets boosted, by sorting a tag pull on reblogsCount.

🚧 What it does not do

  • No replies and no threads. You get the post, not the conversation under it.
  • One server per run. Covering the network means several runs and a merge on your side.
  • No search across servers. Mastodon has no central index, and neither does this.
  • Public timelines are often gated. Expect NOT_SERVED on the largest servers in public mode.
  • No private, followers-only or direct posts, and no login that could reach them.
  • A failure partway through a long run loses that run's posts. You get the diagnostic row instead. Smaller maxItems values survive a shaky server better.
  • Counts are one server's view, always at or below the real total.
  • Rows are a snapshot. Posts get edited, deleted and defederated.
  • It is not an official Mastodon tool. Dami's Studio is independent and is not affiliated with or endorsed by Mastodon, or by any other company named on this page.

🧭 Which social scraper do you need?

If you wantUse
Posts from a Mastodon server by hashtag, account or timelineThis one
Posts from Bluesky accounts or a Bluesky searchBluesky Scraper
Posts from a Lemmy instance by feed, community or keywordLemmy Scraper

❓ Questions people ask

Do I need a Mastodon account to scrape posts?

No. Hashtag and account timelines are public on almost every server. Only the public timeline of a big server asks for a login, and you get a NOT_SERVED row there instead of posts.

Which Mastodon server should I use?

The one closest to the topic. A niche server's local timeline is richer for its subject than a giant server's federated firehose.

Why did the same hashtag give me different posts yesterday?

Because the server's view changes as posts federate in. That is Mastodon working as designed, not a gap here.

Can I read someone on another server?

Yes. Use user@theirserver.social in account mode and the server you asked will resolve it.

How do I drop boosts?

Keep only rows where author matches the handle you asked for.

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/mastodon-scraper. Either way the run happens on your Apify account at the same price.

These are public posts on public timelines. They are still written by identifiable people, so GDPR and similar laws apply and you want a reason for collecting them. 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 server, the mode, the query and the run ID. The errorCode on the diagnostic row usually names the problem by itself.