Scrape Mastodon and Bluesky profiles, posts and hashtag timelines through the platforms' official public APIs. One normalized schema across both networks. No login required.
What to scrape, one entry per line. The platform is detected automatically.
Mastodon: @user@instance, #hashtag@instance, a profile URL (https://mastodon.social/@Gargron), or a post permalink. Works on any Mastodon instance, not just mastodon.social.
Bluesky: a handle (bsky.app, alice.bsky.social), a did:plc:..., a profile or post URL (https://bsky.app/profile/bsky.app), or an at:// URI. People search: bsky:actors:climate.
Not supported: Bluesky keyword/hashtag search. Bluesky refuses unauthenticated search requests from datacenter IPs and this Actor never asks for your password. Use a Mastodon hashtag target instead.
Type:string[]
Default:
[
"@astraedus@mastodon.social",
"@Gargron@mastodon.social",
"#opensource@mastodon.social",
"bsky.app"
]
What to collect
mode
Optional
both (default) returns a profile row for every account target plus post rows for everything. profiles returns account rows only - for a hashtag target, that means the accounts posting under it. posts returns post rows only.
Type:string
Default:both
Options:
bothprofilesposts
Max posts per target
maxPostsPerTarget
Optional
Upper bound on post rows collected for each target. Pagination stops as soon as this is reached, so a lower number is a cheaper, faster run. Raise it for a full backfill.
Type:integer
Minimum:1
Maximum:10000
Default:20
Only posts since
since
Optional
Optional ISO date (2026-01-01) or timestamp. Posts older than this are skipped and pagination stops early once the feed passes the cut-off. Leave empty for no date limit.
Type:string
Include replies
includeReplies
Optional
Include posts that are replies to someone else. Off by default, because most users want original posts.
Type:boolean
Default:false
Include boosts / reposts
includeReposts
Optional
Include content the account boosted (Mastodon) or reposted (Bluesky) rather than wrote. Such rows are flagged with isRepost: true and credited to the original author.
Type:boolean
Default:false
Include media
resolveMedia
Optional
Populate the media array with image, video and link-card URLs plus their alt text. Turn off for a smaller, text-only dataset.
Type:boolean
Default:true
Include raw API response
includeRaw
Optional
Attach the untouched API object to every row as raw. Useful when you need a field this Actor does not normalize; makes the dataset several times larger.
Type:boolean
Default:false
Default Mastodon instance
defaultMastodonInstance
Optional
Instance used for targets written without one, such as a bare #hashtag.
Type:string
Default:mastodon.social
Max concurrent targets
maxConcurrency
Optional
How many targets to work on at once. Requests to any single server are paced regardless, to stay well inside published rate limits.