Bluesky Scraper
Retrieve public Bluesky profile metadata, author posts, or one post through Bluesky's unauthenticated AT Protocol AppView API and return normalized JSON.
Workspace
Configure
Inputs stay here while results become exportable artifacts.
Start from an example
Results
Preview, inspect, copy, or export the complete output.
Your result will become an artifact
Run the tool to inspect structured rows, raw JSON, execution details, and downloadable JSON, CSV, and Markdown files.
Overview
Bluesky Scraper reads the public AT Protocol AppView API without a Bluesky login. It normalizes account metadata, public author feeds, engagement counts, post text, languages, and images into stable fields for agent workflows.
Last validated: Jul 15, 2026
Input
mode"profile" | "posts" | "post"Operation to run. Inferred as post when post_url is supplied; otherwise profile.
actorstringBluesky handle, DID, or public profile URL for profile and posts modes.
post_urlstringPublic bsky.app post URL or at:// post URI for post mode.
max_resultsintegerdefault: 10Maximum author posts to return.
Output
modestringrequiredResolved operation mode
postobjectNormalized individual post
post.cidstringAT Protocol content id
post.uristringAT Protocol post URI
post.urlstringPublic bsky.app post URL
post.textstringPost text
post.image_altstringFirst image alternative text
post.image_urlstringFirst full-size image URL
post.languagesstringComma-separated language codes
post.author_didstringAuthor decentralized identifier
post.created_atstringPost creation timestamp
post.indexed_atstringAppView indexed timestamp
post.like_countintegerLike count
post.author_namestringAuthor display name
post.quote_countintegerQuote count
post.reply_countintegerReply count
post.repost_countintegerRepost count
post.author_avatarstringAuthor avatar URL
post.author_handlestringAuthor handle
post.image_thumbnailstringFirst image thumbnail URL
countintegerrequiredNumber of profiles or posts returned
postsobject[]Normalized author posts
profileobjectNormalized public profile
profile.didstringDecentralized identifier
profile.avatarstringAvatar URL
profile.bannerstringBanner URL
profile.handlestringBluesky handle
profile.created_atstringAccount creation timestamp
profile.indexed_atstringLast indexed timestamp
profile.descriptionstringProfile bio
profile.posts_countintegerPost count
profile.display_namestringVisible display name
profile.follows_countintegerFollowing count
profile.followers_countintegerFollower count
source_urlstringrequiredPublic Bluesky AppView endpoint fetched
Examples
bluesky-profile
{
"mode": "profile",
"actor": "bsky.app"
}bluesky-posts
{
"mode": "posts",
"actor": "bsky.app",
"max_results": 3
}bluesky-post
{
"mode": "post",
"post_url": "https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l"
}Use cases
FAQ
Does this require a Bluesky login?
No. The tool uses Bluesky's public unauthenticated AppView endpoints and only returns public data.
Can it read a single post URL?
Yes. Pass a public bsky.app post URL or an at:// post URI in post mode.
Are replies included in author feeds?
No. Author-feed mode defaults to original posts and excludes replies so monitoring results stay focused.
Use it anywhere
MCP (Claude, ChatGPT, Codex)
# After connecting https://betterfetch.co/api/mcp, ask your AI to:
1. Call search_tools for "Bluesky Scraper"
2. Call run_tool with:
name: "bluesky_scraper"
input: {"mode":"profile","actor":"bsky.app"}REST
curl -sS -X POST "https://betterfetch.co/api/tools/bluesky_scraper/run" \
-H "Authorization: Bearer bf_your_key_here" \
-H "Content-Type: application/json" \
-d '{"input": {"mode":"profile","actor":"bsky.app"}}'Run locally
git clone https://github.com/better-fetch/tools/tree/main/tools/bluesky-scraper && cd bluesky-scraper && npm i
BETTER_FETCH_API_KEY=bf_your_key_here npx bf-tool run --input '{"mode":"profile","actor":"bsky.app"}'