Mastodon Scraper
Pricing
from $3.00 / 1,000 results
Mastodon Scraper
Scrape any Mastodon instance like public timeline, hashtag streams, user profiles, account search, and trending tags. Pure HTTP, no login required, works against mastodon.social, mas.to, hachyderm.io, fosstodon.org, and every other federated instance.
Pricing
from $3.00 / 1,000 results
Rating
5.0
(17)
Developer
Crawler Bros
Maintained by CommunityActor stats
17
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape any Mastodon instance — single statuses by URL, full thread context, status / account search, hashtag streams, hashtag info, user profiles, follower/following lists, public timelines, trending content, and instance metadata. Pure HTTP, no login, no cookies, no proxy required. Works against mastodon.social, mas.to, hachyderm.io, fosstodon.org, infosec.exchange, and every other federated instance.
Mastodon's public REST API is permissive — every instance exposes the same documented endpoints, so this single actor covers the entire Fediverse.
What you get
For each record returned:
Status records (recordType=status)
| Field | Description |
|---|---|
id | Mastodon status ID (per instance) |
url | Public URL of the status |
createdAt | ISO 8601 timestamp |
language | ISO 639-1 language code |
visibility | public / unlisted / private / direct |
content | Original HTML content |
contentText | Plain-text version of content (HTML stripped, entities decoded) |
spoilerText | Content-warning text |
sensitive | true if marked sensitive |
inReplyToId | Status ID this is replying to |
editedAt | ISO 8601 timestamp of the last edit |
repliesCount | Reply count |
reblogsCount | Reblog (boost) count |
favouritesCount | Favourite count |
quotesCount | Quote-post count (Mastodon 4.4+) |
isReblog | true if this status reblogs another |
reblogOfId | ID of the reblogged status (when isReblog=true) |
mediaAttachments | Array of {type, url, previewUrl, description} |
mentions | Array of mentioned handles |
tags | Array of hashtags used (lowercase) |
account | Author profile (full Account object — see below) |
instance | Source instance domain |
scrapedAt | ISO 8601 UTC timestamp of extraction |
Account records (recordType=account)
| Field | Description |
|---|---|
id | Mastodon account ID |
username | Handle on this instance |
acct | Federated handle (user@otherinstance.tld for remote users) |
displayName | Display name |
url | Profile URL |
note | Profile bio (plain text) |
avatar | Avatar image URL |
header | Header image URL |
followersCount | Follower count |
followingCount | Following count |
statusesCount | Total status count |
bot | true if marked as a bot |
locked | true if profile is locked |
discoverable | false if hidden from discovery |
createdAt | Account creation timestamp |
lastStatusAt | Last activity timestamp |
Tag records (recordType=tag)
| Field | Description |
|---|---|
name | Hashtag name (lowercase) |
url | Public hashtag URL |
usesToday | Uses in the past 24h |
accountsToday | Distinct accounts using it in the past 24h |
history | Array of {day, uses, accounts} for the past 7 days |
Empty fields are dropped from every record at every depth — the dataset never contains nulls or empty values.
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | Enum | statusByUrl | statusByUrl / statusContext / statusSearch / hashtag / hashtagInfo / profile / accountSearch / followers / following / publicTimeline / trending / instanceMetadata |
instancePopular | Enum | — | Pick a popular instance from a curated dropdown (overrides instance when set) |
instance | String | mastodon.social | Custom instance domain |
statusUrl | String | sample | Status URL (mode=statusByUrl / statusContext) |
includeContext | Boolean | false | Include thread context with mode=statusByUrl |
hashtag | String | python | Hashtag (without #). Used by mode=hashtag / hashtagInfo |
username | String | — | User handle (Gargron or user@otherinstance.tld). Used by mode=profile / followers / following |
searchQuery | String | — | Free-text query (mode=accountSearch / statusSearch) |
timelineScope | Enum | federated | local / federated / remote. Used by mode=publicTimeline |
trendingType | Enum | tags | tags / statuses / links. Used by mode=trending |
language | Enum | — | ISO 639-1 language filter (curated dropdown of 40 codes). Empty = no filter |
excludeReplies | Boolean | false | Drop reply statuses |
excludeReblogs | Boolean | false | Drop reblogs (boosts) |
mediaOnly | Boolean | false | Only emit statuses with at least one media attachment |
minFavourites | Integer | — | Drop statuses with fewer favourites than this |
minReblogs | Integer | — | Drop statuses with fewer reblogs than this |
maxItems | Integer | 40 | Hard cap on emitted records (1-5000) |
Modes overview
statusByUrl— paste a status URL (e.g.https://mastodon.social/@Gargron/110423915824138798). Returns the single status. ToggleincludeContext=trueto also pull ancestors + descendants.statusContext— full reply thread for the given status URL.statusSearch—q=search across statuses; instance-dependent (many instances throttle for unauthenticated requests — trymas.to,fosstodon.org).followers/following— paginated follower / following lists for a user.hashtagInfo—/api/v1/tags/{tag}returns 7-day usage history +usesToday/accountsToday.instanceMetadata—/api/v2/instancereturns server version, rules, languages, contact email, active-monthly-user count.
Example input — hashtag stream
{"mode": "hashtag","instance": "mastodon.social","hashtag": "python","maxItems": 50}
Example input — user profile
{"mode": "profile","instance": "mastodon.social","username": "Gargron","maxItems": 100}
Example input — federated profile (cross-instance)
{"mode": "profile","instance": "mastodon.social","username": "rss@oisaur.com","maxItems": 50}
Example input — instance public timeline (local)
{"mode": "publicTimeline","instance": "fosstodon.org","timelineScope": "local","maxItems": 100}
Example input — account search
{"mode": "accountSearch","instance": "mastodon.social","searchQuery": "rust","maxItems": 25}
Example input — trending tags
{"mode": "trending","instance": "mastodon.social","trendingType": "tags"}
Example output
{"recordType": "status","id": "111234567890123456","url": "https://mastodon.social/@username/111234567890123456","createdAt": "2026-04-15T14:32:00.000Z","language": "en","visibility": "public","content": "<p>Hello <a href=\"...\">#Mastodon</a>!</p>","contentText": "Hello #Mastodon!","repliesCount": 12,"reblogsCount": 47,"favouritesCount": 230,"tags": ["mastodon"],"mentions": [],"mediaAttachments": [{ "type": "image", "url": "https://files.mastodon.social/.../photo.jpg", "description": "Hello banner" }],"account": {"id": "1","username": "Gargron","acct": "Gargron","displayName": "Eugen Rochko","url": "https://mastodon.social/@Gargron","followersCount": 379745,"statusesCount": 81294,"createdAt": "2016-03-16T14:34:26.392Z"},"instance": "mastodon.social","scrapedAt": "2026-05-06T05:07:30Z"}
Use cases
- OSINT / intelligence research — Mastodon hosts journalist + dissident + academic communities; track conversations on specific tags or accounts.
- Brand monitoring — Pull every public mention of your brand handle or hashtag across the Fediverse.
- Trend analysis — Use
mode=trendingto surface what's heating up on a given instance. - Academic research — Snapshot public-discourse data for sociological / linguistic studies.
- Cross-platform social listening — Pair with our Bluesky / Twitter / Reddit scrapers for full coverage of post-X social media.
- Content discovery — Surface high-engagement posts in a niche hashtag for content curation.
FAQ
Do I need a Mastodon account or login?
No. Every endpoint this actor uses is fully public — t.me/s/-style. The actor authenticates as nobody and works straight from datacenter IPs.
Some instances return "This method requires an authenticated user" — what's going on?
A few large instances (notably mastodon.social and infosec.exchange) lock down their public timeline and remote feed for anti-spam reasons. The actor surfaces a clear status message in that case. Workarounds:
- Use
mode=hashtag,mode=profile, ormode=accountSearchinstead — those still work everywhere. - Switch
instanceto a more permissive instance likemas.to,hachyderm.io, orfosstodon.org.
How does federation work for mode=profile?
Pass either a local handle (Gargron) or a federated handle (user@otherinstance.tld). The actor uses the configured instance's account-lookup endpoint, which transparently resolves remote users by federation.
What's the difference between local, federated, and remote timelines?
local— only posts from accounts on the configuredinstance.federated— everything the instance currently sees (its own posts + every remote post that has reached it via federation).remote— federated minus local (i.e. only remote posts).
How are reblogs (boosts) handled?
A reblog is emitted as one record with isReblog=true and reblogOfId pointing at the original. The content, mediaAttachments, mentions, tags, repliesCount, etc. are all sourced from the underlying post (so the record is meaningful even though it was emitted via the booster). Use excludeReblogs=true to drop these.
How current is the data? Live — every run hits the configured instance at request time. Schedule the actor on the Apify platform for hourly / daily refreshes.
Do I need a proxy? No. Mastodon instances are happy to serve datacenter IPs. The actor sets a polite User-Agent and makes a small number of requests (3-30 per run typically).
What about NSFW / sensitive content?
The actor returns sensitive: true and spoilerText for every flagged status. It does not filter sensitive content by default — handle this in your downstream pipeline.
Limitations
- Status full-text search (
q=...&type=statuses) is an authenticated endpoint on every instance — this actor cannot search status text by keyword. Usemode=hashtagto find topical content instead. - Some large instances (e.g.
mastodon.social) have removed public-timeline access; the actor surfaces a clear status message and suggests an alternative instance. - Mastodon timeline endpoints page at most 40 statuses per request; very large
maxItemswill issue many requests with a polite delay. - Federated
accthandles only resolve correctly when the configured instance has previously seen the remote user (federation is eventually-consistent).