Mastodon Scraper — Posts, Hashtags & Profiles | Any Instance
Pricing
from $1.50 / 1,000 mastodon scraper — posts, hashtags & profiles | any instances
Mastodon Scraper — Posts, Hashtags & Profiles | Any Instance
Scrape any Mastodon instance: user posts, hashtag timelines, and search results. No login required. Returns post text, engagement, media, link cards, and author profiles. Pay per result.
Pricing
from $1.50 / 1,000 mastodon scraper — posts, hashtags & profiles | any instances
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
Mastodon Scraper — Posts, Hashtags & Profiles | $1.50/1K | Any Instance
For researchers tracking decentralized social media, brand monitors watching open-source/tech communities, and anyone studying the Fediverse.
Pricing: $1.50 per 1,000 posts (PPE, pay per result).
Scrape any Mastodon instance without login. Collect posts from user accounts,
hashtag timelines, and search — all via the official Mastodon REST API with
no proxy required. Returns a clean, flat dataset with engagement metrics, media
URLs, link cards, and parse_confidence so you know every record is valid.
Pricing example
$1.50 per 1,000 posts (PPE, pay per result, no per-run fee). 100 posts = $0.15. 1,000 posts = $1.50. A daily hashtag monitor at 200 posts/day costs ~$9/month.
Sample output
{"instance": "fosstodon.org","account_username": "kev","display_name": "Kev Quirk","post_id": "110512345678901234","content_text": "Just published a new post on why I switched from GitHub to Forgejo.","created_at": "2026-05-21T10:14:00Z","replies": 12,"reblogs": 34,"favourites": 98,"url": "https://fosstodon.org/@kev/110512345678901234","source_mode": "account","media_urls": [],"hashtags": ["foss", "git"],"parse_confidence": 1.0,"scraped_at": "2026-06-05T09:00:00Z"}
What you get
| Field | Description |
|---|---|
instance | Mastodon instance scraped (e.g. mastodon.social) |
account_username | Username of the post author |
display_name | Display name of the author |
followers / following / post_count | Author profile stats |
post_id | Unique numeric post ID |
content_text | Plain-text post content (HTML stripped) |
content_html | Raw HTML content |
created_at | Post timestamp (ISO 8601 UTC) |
edited_at | Timestamp if post was edited, else null |
replies / reblogs / favourites | Engagement counts |
is_reblog | True if this is a boosted/reposted post |
in_reply_to_id | ID of parent post for replies |
url | Direct URL to the post |
media_urls | List of media attachment URLs |
card_url / card_title / card_image_url | Link card preview |
mentions | @usernames mentioned in the post |
hashtags | Hashtags used in the post |
source_mode | How the post was discovered: account, hashtag, or search |
parse_confidence | 0.0–1.0 quality score (1.0 = all fields present) |
Why this Mastodon scraper
- Any instance — not locked to mastodon.social. Works with fosstodon.org, infosec.exchange, hachyderm.io, or any standard Mastodon server.
- Three modes in one actor — account posts, hashtag timelines, and search all in a single run.
- Official API, zero fragility — uses
/api/v1/accounts,/api/v1/timelines/tag, and/api/v2/search. No HTML parsing that breaks on layout changes. - Zero proxy cost — Mastodon public API is open to the web. Buyer pays nothing extra for proxy on top of compute.
- parse_confidence — every record carries a quality score. A drop to < 0.8 means a required field was missing; easy to filter in downstream pipelines.
- Federated posts in hashtag timelines — by default returns posts from
across the Fediverse, not just the local instance (toggle
localOnlyfor local-only mode).
How to use
Scrape a user account
Set instance + usernames:
{"instance": "mastodon.social","usernames": ["Mastodon", "gargron"],"maxPosts": 200}
Scrape a hashtag timeline
{"instance": "mastodon.social","hashtags": ["python", "foss", "ai"],"maxPosts": 100}
Search for posts
{"instance": "fosstodon.org","searchQueries": ["open source LLM"],"maxPosts": 50}
Combine all three in one run
{"instance": "mastodon.social","usernames": ["Mastodon"],"hashtags": ["fediverse"],"searchQueries": ["ActivityPub"],"maxPosts": 100,"includeReplies": false,"includeReposts": false}
Cost estimate
Pricing is $1.50 per 1,000 posts (PPE, pay per result). A typical run of 1,000 posts costs approximately $1.50 in actor charges, plus a small amount of Apify platform compute (usually < $0.05 for this API-based actor).
Frequently asked questions
Do I need a Mastodon account or API key? No. The actor uses the public Mastodon REST API — account posts and hashtag timelines are fully public without authentication. Search may return fewer results on some instances without a token, but that is an instance policy, not a scraper limitation.
Do I need a proxy? No. Mastodon's public API is open to any HTTP client. No proxy cost to you or the buyer.
What formats does output come in? JSON (default), CSV, and Excel via the Apify dataset. Integrates natively with n8n, Make, and Zapier.
What if the actor returns 0 results? The actor logs a warning per failed source and continues. Empty results (e.g. an account with 0 posts, or a hashtag not yet used on that instance) produce 0 records and 0 charges — not an error.
Notes on search
The Mastodon /api/v2/search endpoint is public but may return fewer results
on some instances without authentication. Account and hashtag modes are fully
public and return complete results without any token.
Which Mastodon instances work?
Any server running standard Mastodon software — this covers the vast majority of Fediverse instances. Servers running Akkoma, Pleroma, or Misskey use a compatible API subset; account and hashtag modes work, search behaviour varies.
Integrations
Built for researchers and brand monitors tracking posts, hashtags, and communities across the decentralized Fediverse — the JSON/dataset output drops into the tools you already run, no glue code:
- n8n / Make / Zapier — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: n8n, Make, Zapier.
- Webhooks — fire your own endpoint the moment a run finishes, to push results straight into your pipeline (docs).
- MCP server — expose this actor as a tool to Claude, Cursor, or any MCP client so an AI agent can pull this data mid-conversation (guide).
- API & SDKs — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.
See all Apify integrations.
Legal
Mastodon instances publish their public timelines for open access per the ActivityPub protocol. This actor only accesses public, unauthenticated endpoints identical to what any browser visitor would see. Always review the instance's Terms of Service before large-scale collection.
This actor is not affiliated with Mastodon gGmbH or any specific Mastodon instance.
Fediverse coverage
Tested and working on popular instances including fosstodon.org (FOSS/tech), infosec.exchange (security), hachyderm.io (tech professionals), mas.to (general), mastodon.social (largest), and sigmoid.social (AI/ML). Any server running standard Mastodon, Akkoma, or Pleroma software is supported.
Compared to generic scrapers
| This scraper | Generic Mastodon scraper | |
|---|---|---|
| Any Mastodon instance | ✓ | ✗ (mastodon.social only) |
| Three modes (account/hashtag/search) | ✓ | partial |
| parse_confidence on every record | ✓ | ✗ |
| Zero proxy cost | ✓ | ✓ |
| Official API (no HTML parsing) | ✓ | ✗ |
Use with AI Agents (MCP)
This Mastodon scraper is callable as a tool by AI agents (Claude Desktop, Cursor, VS Code, n8n, or any MCP-compatible client) via Apify's hosted Model Context Protocol server.
{"mcpServers": {"apify": {"command": "npx","args": ["mcp-remote","https://mcp.apify.com/?tools=bovi/mastodon-scraper","--header","Authorization: Bearer <YOUR_APIFY_TOKEN>"]}}}
Usage statistics
This Actor creates a small, content-free summary at the end of each run. It is used only to monitor reliability and improve this Actor. A copy is saved as USAGE_STATS in your own Apify key-value store, so you can see the exact record created for your run.
Set disableUsageStats to true in the input to opt out. Nothing is sent then; your USAGE_STATS record only says that statistics were disabled.
Only these fields are recorded:
- schema version, Actor name and build number;
- UTC start and finish hour (not a precise timestamp);
- run duration, number of results and time to the first result, each as a coarse range;
- whether the result was empty, the end status, and an error type from a fixed list;
- memory setting and counts of charged events;
- names of the input fields you set, never their values;
- the selected option for input fields that offer a fixed list of choices (for example a sort order).
We do not collect input text, search terms, URLs, domains, usernames, email addresses, names, proxy credentials, tokens, scraped records, output items, raw error messages, stack traces, or hashes of any of those values. Records are kept for no longer than 13 months, used only as aggregated operational statistics, and never sold or shared.
Additional fields (Phase 2)
This Actor also records your Apify user ID, whether Apify marks the account as paying, the size range of list inputs, the selected country when the input offers a fixed list of countries, and one category from a fixed Actor taxonomy. We use these fields only for aggregate reliability, repeat-use and cross-Actor analysis; reports suppress any cell with fewer than five distinct users.
The same disableUsageStats: true input flag turns these fields off too. The user ID is removed after 13 months; we do not export, sell, share, or attempt to re-identify this data.
Run-outcome signals (v2)
To learn whether a run did what it was asked to do, the record also holds a few more coarse ranges and yes/no flags. None of them contains content:
- the result limit you asked for (a range, when the input has one) and what share of it was delivered;
- results delivered per input item you listed (a range);
- output quality as ranges: how fully the result fields were filled, the share of rows that look like errors, the share of duplicate rows, and how many different fields appeared. These are counted in memory while results are saved; no result content is kept;
- how the run was started (console, API, schedule, webhook, another Actor);
- how it ended: stopped by you, timed out, reached the requested limit, stopped by the charge limit, and how many times the platform moved the run;
- if this Actor reports it: how many items to process worked or failed (ranges) and one failure reason from a fixed list;
- a short code made from the names of the input fields you set, never their values.
Repeat-run fingerprint (v2)
When your Apify user ID is recorded (see above), the record also holds an 8-character one-way code made from your input (proxy settings left out) and this Actor's name. It only lets us see that the same account ran the same input again soon after an unsatisfying run; we never see the input itself. It is stored only in the database, never published, and reports use it in aggregate with the same five-user minimum. It is the one exception to the statement above that no hashes are collected, and disableUsageStats: true turns it off.