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

Scrape Bluesky posts by keyword, hashtag or date, plus profiles, reply threads, custom feeds, lists, followers and likers. Text, author, likes, reposts, images, video, links and hashtags. No login needed.
Scrape Bluesky posts by keyword, hashtag or date range, and pull complete profiles, reply threads, custom feeds, lists, followers and likers. Every post comes with its text, author, like, repost, reply and quote counts, images, video, link cards, hashtags and mentions. No login, no account and no API key needed, and it costs $0.50 per 1,000 results.
from:, mentions:, domain: and #hashtags.artificial intelligence, #photography, from:bsky.app), or paste Bluesky URLs or handles into "Profiles, posts, feeds or lists".| Field | What it does |
|---|---|
searchQueries | Search terms, phrases, hashtags or Bluesky search operators |
startUrls | Profile, post, custom feed, list, hashtag or search URLs, or plain handles like bsky.app |
maxItems | Maximum number of items saved in total (default 20) |
maxItemsPerInput | Cap per input (0 = no cap) |
sort | latest (every match, newest first) or top |
since / until | Date range: 2026-10-01, an ISO timestamp, or relative like 7 days |
language | Two-letter language code, for example en |
minLikes / minReposts | Engagement thresholds |
includeProfile, scrapeProfilePosts, profilePostsFilter, includeReposts | What to take from profiles |
scrapeFollowers / scrapeFollowing | Save a profile's followers or followed accounts |
includeReplies, replyDepth, scrapeQuotes, scrapeLikers, scrapeReposters | What to take from post URLs |
{
"searchQueries": ["artificial intelligence", "#photography"],
"startUrls": ["https://bsky.app/profile/bsky.app"],
"maxItems": 500,
"sort": "latest",
"since": "2026-10-01",
"language": "en",
"minLikes": 5
}
Every item has a type field: post or profile. Profiles from follower, following, liker or reposter lists also have relation and relationOf.
| Field | Description |
|---|---|
url, uri, postId | Post link on bsky.app, AT Protocol URI and post ID |
text, createdAt, langs | Post text, creation time (UTC) and language tags |
authorHandle, authorDisplayName, authorDid, authorAvatar, authorUrl, authorVerified | Author |
likeCount, repostCount, replyCount, quoteCount, bookmarkCount | Engagement |
isReply, replyToUrl, threadRootUrl, threadDepth | Reply and thread position |
isRepost, repostedBy, repostedAt, isPinned | Repost and pin info for profile feeds |
hashtags, links, mentions | Parsed rich-text facets |
images, imageUrls, video, externalLink, quotedPost | Media and embeds |
handle, displayName, description, followersCount, followsCount, postsCount, avatar, banner | Profile items |
source, sourceInput, scrapedAt | Where the item came from |
Example items (sample data):
[
{
"type": "post",
"url": "https://bsky.app/profile/sample-photo.bsky.social/post/3mxsample2v2t",
"uri": "at://did:plc:sample000000000000000001/app.bsky.feed.post/3mxsample2v2t",
"postId": "3mxsample2v2t",
"text": "Morning fog over the valley today #photography #landscape",
"createdAt": "2026-10-14T07:12:44.315Z",
"langs": ["en"],
"authorHandle": "sample-photo.bsky.social",
"authorDisplayName": "Sample Photo Studio",
"authorDid": "did:plc:sample000000000000000001",
"authorUrl": "https://bsky.app/profile/sample-photo.bsky.social",
"authorVerified": false,
"likeCount": 214,
"repostCount": 18,
"replyCount": 9,
"quoteCount": 2,
"bookmarkCount": 5,
"isReply": false,
"isQuote": false,
"isRepost": false,
"hashtags": ["photography", "landscape"],
"links": [],
"mentions": [],
"images": [
{
"url": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:sample000000000000000001/bafkreisample",
"thumbnail": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:sample000000000000000001/bafkreisample",
"alt": "Fog in a valley at sunrise",
"width": 2000,
"height": 1333
}
],
"video": null,
"externalLink": null,
"quotedPost": null,
"source": "search",
"sourceInput": "#photography",
"scrapedAt": "2026-10-14T18:51:45.849Z"
},
{
"type": "profile",
"url": "https://bsky.app/profile/sample-photo.bsky.social",
"handle": "sample-photo.bsky.social",
"displayName": "Sample Photo Studio",
"did": "did:plc:sample000000000000000001",
"description": "Landscape photography. Prints in the shop.",
"followersCount": 12840,
"followsCount": 311,
"postsCount": 1975,
"verified": false,
"createdAt": "2023-07-02T10:15:00.000Z",
"source": "profile",
"sourceInput": "sample-photo.bsky.social"
}
]
You pay $0.50 per 1,000 results ($0.0005 per saved post or profile), plus a small amount of platform usage (compute and datacenter proxy traffic, typically well under a cent for 1,000 posts). For example, 1,000 posts cost about $0.50, and 10,000 posts about $5. Nothing is charged for inputs that return nothing.
Is it legal to scrape Bluesky? The actor reads only public data from Bluesky's open public API, the same data anyone sees without logging in. Make sure your use of personal data complies with laws such as GDPR and with Bluesky's terms.
Do I need a Bluesky account, login or proxy? No. No account, cookies or API key. Datacenter proxies are used by default and work well.
How many results can I get? Latest search pages back through time without a fixed cap, so large keyword jobs (10,000+ posts) work. Top sort returns up to 100 posts per search term. Profiles, feeds, followers and threads return everything Bluesky serves publicly.
Why is a field empty?
Fields such as displayName, langs or images are optional on Bluesky; when the author did not set them, the field is null or an empty list.
Can I schedule it or use it through the API? Yes. Schedule runs to monitor keywords daily, and start runs and fetch results through the API or integrations.
Can I search by user, mention or website?
Yes: use from:handle, mentions:handle or domain:example.com in a search term, alone or together with keywords.
from:, mentions:, to:, domain:, lang:, since:, until: and #tags are passed to Bluesky as text.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.
searchQueriesarrayOptionalSearch terms
Words, phrases or hashtags to search Bluesky posts for. Bluesky search syntax works too: "exact phrase", #hashtag, from:handle, mentions:handle, domain:example.com, lang:en.
startUrlsarrayOptionalProfiles, posts, feeds or lists
Bluesky URLs or handles. Profiles (https://bsky.app/profile/bsky.app, @bsky.app or did:plc:...) give the profile and its posts; post URLs give the post and its reply thread; custom feed URLs (.../feed/...) and list URLs (.../lists/...) give their posts; hashtag and search URLs work too.
maxItemsintegerOptionaldefault 20Max results
Maximum number of items (posts and profiles) to save in total. Each saved item is one result.
maxItemsPerInputintegerOptionaldefault 0Max results per input
Cap per search term, profile, post or feed, so one input does not use up the whole limit. 0 means no per-input cap.
sortenumOptionaldefault "latest"Search sort
Latest returns every matching post, newest first. Top returns Bluesky's most popular matches (up to 100 per search term).
sincestringOptionalPosted after
Only posts created on or after this date (YYYY-MM-DD, ISO timestamp, or relative like '7 days'). Works for search, profiles, feeds and threads.
untilstringOptionalPosted before
Only posts created on or before this date (the whole day is included).
languagestringOptionalLanguage
Two-letter language code (en, de, ja, pt...). Keeps only posts tagged with this language. Leave empty for all languages.
minLikesintegerOptionaldefault 0Min likes
Only posts with at least this many likes.
minRepostsintegerOptionaldefault 0Min reposts
Only posts with at least this many reposts.
excludeRepliesbooleanOptionaldefault falseExclude replies
Skip posts that are replies (thread replies of a post URL are still saved when 'Include replies' is on).
includeProfilebooleanOptionaldefault trueSave profile details
Save one profile item (bio, follower, following and post counts, avatar, banner) for every profile input.
scrapeProfilePostsbooleanOptionaldefault trueSave profile posts
Save the posts from each profile's feed, newest first.
profilePostsFilterenumOptionaldefault "posts_no_replies"Profile posts to include
Which posts to take from a profile.
includeRepostsbooleanOptionaldefault falseInclude reposts
Also save posts the profile reposted (marked with isRepost and repostedBy).
scrapeFollowersbooleanOptionaldefault falseSave followers
Save each profile's followers as profile items (relation: follower). Counts toward the result limit.
scrapeFollowingbooleanOptionaldefault falseSave following
Save the accounts each profile follows as profile items (relation: following).
includeRepliesbooleanOptionaldefault trueInclude replies
For post URLs, also save the reply thread (each reply has threadDepth).
replyDepthintegerOptionaldefault 6Reply depth
How many levels of nested replies to load for post URLs.
scrapeQuotesbooleanOptionaldefault falseSave quote posts
For post URLs, also save posts that quote it.
scrapeLikersbooleanOptionaldefault falseSave likers
For post URLs, save the accounts that liked it as profile items (relation: liker).
scrapeRepostersbooleanOptionaldefault falseSave reposters
For post URLs, save the accounts that reposted it as profile items (relation: reposter).
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies are the default and work well for Bluesky's public API.
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 | Item type: post or profile |
| url | string | null | Bluesky URL of the post or profile |
| uri | string | null | AT Protocol URI |
| text | string | null | Post text |
| createdAt | string | null | When the post was created (UTC) |
| authorHandle | string | null | Author handle |
| authorDisplayName | string | null | Author display name |
| authorDid | string | null | Author DID |
| authorAvatar | string | null | Author avatar URL |
| authorUrl | string | null | Author profile URL |
| likeCount | integer | null | Likes |
| repostCount | integer | null | Reposts |
| replyCount | integer | null | Replies |
| quoteCount | integer | null | Quotes |
| bookmarkCount | integer | null | Bookmarks |
| isReply | boolean | null | Post is a reply |
| isRepost | boolean | null | Saved as a repost from a profile feed |
| isQuote | boolean | null | Post quotes another post |
| hashtags | array | Hashtags |
| links | array | Links in the post |
| mentions | array | Mentioned accounts {handle, did} |
| images | array | Images {url, thumbnail, alt, width, height} |
| imageUrls | array | Full-size image URLs |
| video | object | null | Video {playlistUrl, thumbnail, alt, width, height} |
| externalLink | object | null | Link card {url, title, description, thumbnail} |
| quotedPost | object | null | Quoted post |
| langs | array | Language tags |
| handle | string | null | Profile handle |
| displayName | string | null | Profile display name |
| did | string | null | Profile DID |
| description | string | null | Profile bio |
| followersCount | integer | null | Followers |
| followsCount | integer | null | Following |
| postsCount | integer | null | Posts |
| relation | string | null | For follower/following/liker/reposter lists: the relation |
| relationOf | string | null | The profile or post the relation belongs to |
| threadDepth | integer | null | Reply depth in a thread (0 = the post itself) |
| source | string | null | Input type: search, profile, post, feed, list |
| sourceInput | string | null | The input that produced this item |
| scrapedAt | string | null | When the item was scraped |
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 Bluesky post or profile | $0.0005 |
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/bluesky-scraper').call({
"searchQueries": [
"artificial intelligence"
],
"startUrls": [
"https://bsky.app/profile/bsky.app"
],
"maxItems": 20,
"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/bluesky-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/bluesky-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.
Newest Bluesky posts matching a keyword.
Profile details and recent posts.
Most popular matching posts.
Follower profiles of one account.
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.