
Instagram Reel Scraper
scrape.ly/store/echofield/instagram-reel-scraperSocial mediaVideos
1 monthly user

Scrape public Mastodon and fediverse data without a login: posts from accounts and hashtags, threads with replies, public timelines, trending posts, hashtags and links, and profiles. Text and HTML, favourites, boosts, replies, media, mentions, tags and author info.
Scrape public Mastodon and fediverse data without an account: posts from any account or hashtag, full threads with replies, public timelines, trending posts, hashtags and news links, and profiles. Works with mastodon.social, fosstodon.org, infosec.exchange and other Mastodon-compatible servers. A few seconds for hundreds of posts.
@user@instance handles or links from any server. If a server hides hashtag feeds from logged-out visitors, the scraper reads the hashtag from a large open instance and says so in the run status.@user@instance) or Mastodon URLs (profiles, posts, hashtag pages, /explore).| Field | What it does |
|---|---|
hashtags | Hashtags to scrape (opensource, #photography). |
accounts | @user@instance handles or profile URLs. A bare username uses the instance below. |
startUrls | Profile, post (with its thread), hashtag, timeline (/public/local, /public) or trends (/explore, /explore/tags, /explore/links) links. |
maxItems | Items to save in total (default 20, 0 = no limit). |
instance | Server for hashtags, timelines, trends, search and bare usernames (default mastodon.social). |
timelines | local and/or federated public timelines. |
trends | statuses, tags and/or links. |
searchAccounts | Profile searches (up to 40 profiles each). |
since, until | Date range for posts (2026-09-01, 7 days). |
includeReplies, includeReblogs, onlyMedia | What kinds of posts to keep. |
languages, minFavourites, minReblogs | Language and engagement filters. |
maxItemsPerInput, includeProfile, includeThreadReplies | Per-input cap, profile rows for accounts, threads for post URLs. |
{
"hashtags": ["opensource"],
"accounts": ["@someone@mastodon.social"],
"startUrls": ["https://fosstodon.org/tags/linux", "https://mastodon.social/explore/links"],
"since": "30 days",
"includeProfile": true,
"maxItems": 500
}
Every row has a type: post, account, tag or link. The Output tab has a view for each type.
| Field | Description |
|---|---|
id, url, uri, instance | Post id on the instance, web link, global ActivityPub id, server read from |
text, contentHtml, spoilerText, language, sensitive | Content |
createdAt, editedAt | Dates (UTC) |
repliesCount, reblogsCount, favouritesCount, quotesCount | Engagement |
authorAcct, authorDisplayName, authorUrl, authorAvatar, authorFollowersCount, ... | Author |
isReply, inReplyToId, isReblog, rebloggedBy, rebloggedAt, threadRole | Context |
tags, mentions, media, mediaUrls, card, poll, quotedPostUrl | Attachments |
acct, displayName, noteText, followersCount, followingCount, statusesCount, fields | Profile rows |
name, title, usesToday, usesLast7Days, accountsLast7Days, history | Trending tag and link rows |
Example post (from a test run; the account details are made up):
{
"type": "post",
"id": "117433450473905580",
"url": "https://mastodon.social/@filmfan/117433450473905580",
"uri": "https://mastodon.social/users/filmfan/statuses/117433450473905580",
"instance": "mastodon.social",
"text": "Another discard from Tuscany.\n\n📷️ Pentax KX\n🎞️ Fuji Superia X-tra 400\n\n#BelieveInFilm #FilmPhotography #35mm",
"language": "en",
"visibility": "public",
"createdAt": "2026-10-13T11:50:49.000Z",
"repliesCount": 1,
"reblogsCount": 9,
"favouritesCount": 92,
"authorAcct": "filmfan@mastodon.social",
"authorDisplayName": "Jane Example",
"authorUrl": "https://mastodon.social/@filmfan",
"authorFollowersCount": 1520,
"isReply": false,
"isReblog": false,
"tags": ["believeinfilm", "filmphotography", "35mm"],
"media": [{"type": "image", "url": "https://files.mastodon.social/media_attachments/files/.../original/919c0782bdd56173.jpg", "description": "A seagull standing on top of a lamp post.", "width": 2225, "height": 3356}],
"application": "Web",
"source": "@filmfan@mastodon.social",
"scrapedAt": "2026-10-16T02:04:06.000Z"
}
Example trending hashtag:
{"type": "tag", "name": "DessertTVShows", "url": "https://mastodon.social/tags/desserttvshows", "instance": "mastodon.social", "usesToday": 2, "usesLast7Days": 502, "accountsLast7Days": 106}
You pay $0.80 per 1,000 items saved ($0.0008 per post, profile, tag or link), plus a small amount of platform usage (compute and datacenter proxy traffic). For example, 1,000 posts cost about $0.80 in item fees plus roughly a cent of usage. Inputs that return nothing cost nothing in item fees.
Is it legal? The scraper only reads public data that each server serves to logged-out visitors through its public API. Respect the privacy expectations of the fediverse and each instance's rules, and handle personal data according to the laws that apply to you.
Do I need an account or a proxy? No account. The default datacenter proxy is enough. The proxy also helps with instance rate limits.
Why did a timeline or hashtag return nothing? Some servers (mastodon.social among them) only show public timelines to logged-in users, and some hide hashtag feeds. The run status says when that happens. For hashtags, the scraper falls back to a large open instance.
How many posts can I get? As many as the server serves. Account and hashtag feeds page back through history, a From date stops the scan once older posts start, and a To date skips straight back to that date on Mastodon servers.
Can I schedule it or use the API? Yes. Schedule daily runs (for example trends or a hashtag with "From date: 1 day") and read results through the API, webhooks or integrations.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
hashtagsarrayOptionalHashtags
Hashtags to scrape, with or without #, for example opensource or #photography. Read from the instance below; if it needs a login for hashtag feeds, a large open instance is used instead.
accountsarrayOptionalAccounts
Accounts whose posts to scrape, as @user@instance (for example @Gargron@mastodon.social) or profile URLs. A bare username is looked up on the instance below.
startUrlsarrayOptionalMastodon URLs
Any Mastodon link: profiles (https://mastodon.social/@Gargron), posts with their replies (https://mastodon.social/@user/1234...), hashtag pages (/tags/linux), timelines (/public/local, /public) or trends (/explore, /explore/tags, /explore/links).
maxItemsintegerOptionaldefault 20Max results
Maximum number of items (posts, profiles, tags or links) to save in total. Use 0 for no limit.
instancestringOptionaldefault "mastodon.social"Instance
Mastodon server used for hashtags, timelines, trends, account search and bare usernames, for example mastodon.social, fosstodon.org or infosec.exchange.
timelinesarrayOptionalPublic timelines
Scrape the instance's public timelines. Many instances (including mastodon.social) only show these to logged-in users; the run then says so.
trendsarrayOptionalTrends
Scrape what is trending on the instance: posts, hashtags (with daily usage) and news links.
searchAccountsarrayOptionalAccount search
Find profiles by name or keyword on the instance (up to 40 per search, the most the public search returns).
Optional. They apply to posts; profiles, tags and links are not filtered.
sincestringOptionalFrom date
Only posts from this date on: 2026-09-01, a full timestamp, or a relative value like 7 days.
untilstringOptionalTo date
Only posts before the end of this date, for example 2026-09-30.
includeRepliesbooleanOptionaldefault falseInclude replies
Keep posts that are replies to other posts. Replies under a post URL are always kept.
includeReblogsbooleanOptionaldefault falseInclude boosts
Keep boosted (reblogged) posts. They are saved as the original post, with who boosted it and when.
onlyMediabooleanOptionaldefault falseOnly posts with media
Keep only posts with images, video or audio.
languagesarrayOptionalLanguages
Keep only posts in these languages, as two-letter codes, for example en, de, ja.
minFavouritesintegerOptionalMinimum favourites
Keep only posts with at least this many favourites.
minReblogsintegerOptionalMinimum boosts
Keep only posts with at least this many boosts.
maxItemsPerInputintegerOptionaldefault 0Max results per input
Cap for each hashtag, account, URL, timeline, trend list or search on its own. 0 means no per-input cap.
includeProfilebooleanOptionaldefault falseSave account profiles
For each account, also save one profile row (bio, links, follower counts).
includeThreadRepliesbooleanOptionaldefault trueInclude thread for post URLs
For post URLs, also save the posts above it and the replies below it.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work well. Each instance allows about 300 requests per 5 minutes per IP; the scraper switches exits when that is used up.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| type | string | null | post, account, tag or link |
| id | string | null | Id on the instance (posts, accounts) or instance + name |
| url | string | null | Web URL |
| uri | string | null | Global ActivityPub id |
| instance | string | null | Instance the item was read from |
| text | string | null | Post text |
| contentHtml | string | null | Post HTML |
| spoilerText | string | null | Content warning |
| sensitive | boolean | null | Marked sensitive |
| language | string | null | Language code |
| visibility | string | null | public or unlisted |
| createdAt | string | null | Created (UTC) |
| editedAt | string | null | Last edited (UTC) |
| repliesCount | number | null | Replies |
| reblogsCount | number | null | Boosts |
| favouritesCount | number | null | Favourites |
| quotesCount | number | null | Quotes |
| authorAcct | string | null | Author handle user@instance |
| authorDisplayName | string | null | Author name |
| authorUrl | string | null | Author profile |
| authorAvatar | string | null | Author avatar |
| authorFollowersCount | number | null | Author followers |
| authorFollowingCount | number | null | Author following |
| authorStatusesCount | number | null | Author posts |
| isReply | boolean | null | Is a reply |
| inReplyToId | string | null | Parent post id |
| isReblog | boolean | null | Came in as a boost |
| rebloggedBy | string | null | Who boosted it |
| rebloggedAt | string | null | When it was boosted |
| tags | array | Hashtags |
| mentions | array | Mentioned accounts |
| media | array | Images, video and audio |
| mediaUrls | array | Media URLs |
| card | object | null | Link preview |
| poll | object | null | Poll |
| quotedPostUrl | string | null | Quoted post |
| threadRole | string | null | main, ancestor or reply (post URLs) |
| acct | string | null | Account handle user@instance |
| username | string | null | Username |
| displayName | string | null | Display name |
| noteText | string | null | Bio |
| avatar | string | null | Avatar URL |
| header | string | null | Header image URL |
| followersCount | number | null | Followers |
| followingCount | number | null | Following |
| statusesCount | number | null | Posts |
| lastStatusAt | string | null | Last post date |
| bot | boolean | null | Bot account |
| fields | array | Profile fields |
| name | string | null | Hashtag name |
| title | string | null | Link title |
| description | string | null | Link description |
| image | string | null | Link image |
| providerName | string | null | Link publisher |
| publishedAt | string | null | Link published (UTC) |
| usesToday | number | null | Uses today (trends) |
| usesLast7Days | number | null | Uses in the last 7 days (trends) |
| accountsLast7Days | number | null | Accounts in the last 7 days (trends) |
| history | array | Daily usage (trends) |
| source | string | null | Input that produced the item |
| scrapedAt | string | null | Scraped (UTC) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One saved Mastodon post, profile, trending tag or link | $0.0008 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/mastodon-scraper').call({
"hashtags": [
"opensource"
],
"accounts": [],
"startUrls": [],
"maxItems": 20,
"instance": "mastodon.social",
"searchAccounts": [],
"languages": [],
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/mastodon-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/mastodon-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Recent posts plus the account's profile data.
What is trending on mastodon.social right now.
Account search by keyword.
Hashtag posts including replies and thread replies.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.