Better Fetch

Bluesky Scraper

Retrieve public Bluesky profile metadata, author posts, or one post through Bluesky's unauthenticated AT Protocol AppView API and return normalized JSON.

Socialv0.1.0~1 credit/runSource on GitHub

Workspace

Configure

Inputs stay here while results become exportable artifacts.

Start from an example

Operation to run. Inferred as post when post_url is supplied; otherwise profile.

Bluesky handle, DID, or public profile URL for profile and posts modes.

Public bsky.app post URL or at:// post URI for post mode.

Maximum author posts to return.

Sign in and run
~1 credit/run10 runs/minute

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.

modepostcountpostsprofilesource_url

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.

actorstring

Bluesky handle, DID, or public profile URL for profile and posts modes.

post_urlstring

Public bsky.app post URL or at:// post URI for post mode.

max_resultsintegerdefault: 10

Maximum author posts to return.

Output

modestringrequired

Resolved operation mode

postobject

Normalized individual post

post.cidstring

AT Protocol content id

post.uristring

AT Protocol post URI

post.urlstring

Public bsky.app post URL

post.textstring

Post text

post.image_altstring

First image alternative text

post.image_urlstring

First full-size image URL

post.languagesstring

Comma-separated language codes

post.author_didstring

Author decentralized identifier

post.created_atstring

Post creation timestamp

post.indexed_atstring

AppView indexed timestamp

post.like_countinteger

Like count

post.author_namestring

Author display name

post.quote_countinteger

Quote count

post.reply_countinteger

Reply count

post.repost_countinteger

Repost count

post.author_avatarstring

Author avatar URL

post.author_handlestring

Author handle

post.image_thumbnailstring

First image thumbnail URL

countintegerrequired

Number of profiles or posts returned

postsobject[]

Normalized author posts

profileobject

Normalized public profile

profile.didstring

Decentralized identifier

profile.avatarstring

Avatar URL

profile.bannerstring

Banner URL

profile.handlestring

Bluesky handle

profile.created_atstring

Account creation timestamp

profile.indexed_atstring

Last indexed timestamp

profile.descriptionstring

Profile bio

profile.posts_countinteger

Post count

profile.display_namestring

Visible display name

profile.follows_countinteger

Following count

profile.followers_countinteger

Follower count

source_urlstringrequired

Public 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

Social listening

Monitor public Bluesky accounts and posts for product, brand, and topic mentions.

Creator research

Inspect public profile and engagement metadata for creator discovery and analysis.

Agent context

Give an agent clean Bluesky posts without teaching it AT Protocol response shapes.

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"}'