Bluesky Profile API
Get a profile from its handle, DID or bsky.app link: name, bio, followers, follows and post count.
- 1 credit per call
- Failed calls are free
- Updated
- bluesky.actor.get_profile
{ "display_name": "Bluesky", "handle": "bsky.app", "description": "official Bluesky account (check username👆)\n\nBugs, feature requests, feedback: [email protected]", "did": "did:plc:z72i7hdynmk6r22z27h6tvur", "followers_count": 35154398, "follows_count": 15, "indexed_at": "2025-10-27T21:05:26.152Z", "posts_count": 865}
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| actor | string | yes | The account's handle, such as bsky.app, its DID, or its bsky.app profile link. | bsky.app |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| display_name | string | The account's display name. | Bluesky |
| handle | string | The account's handle. | bsky.app |
| followers_count | integer | Followers, as Bluesky shows them. | 35,154,398 |
| follows_count | integer | How many accounts it follows. | 15 |
| posts_count | integer | How many posts it has made. | 865 |
| description | string | The profile's bio text. | official Bluesky account (check username👆) Bugs, feature reques… |
| did | string | The account's permanent Bluesky ID. | did:plc:z72i7hdynmk6r22z27h6tvur |
| indexed_at | string | When Bluesky last indexed the profile. | 2025-10-27T21:05:26.152Z |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "bluesky.actor.get_profile", "input": { "actor": "bsky.app" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "bluesky.actor.get_profile", "input": { "actor": "bsky.app" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "bluesky.actor.get_profile", "input": { "actor": "bsky.app" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Use Upscrape to look up @bsky.app on Bluesky. How many followers and posts does it have?
More from the Bluesky API
- Bluesky Author Feed API1 credit
- Bluesky Post Thread API1 credit
- Bluesky Actors Search API1 credit
- Bluesky Followers API1 credit
- Bluesky Follows API1 credit
- Bluesky Post Likes API1 credit
- Bluesky Repost Users API1 credit
- Bluesky Trending Topics API1 credit
- Bluesky Feed Generators API1 credit
- Bluesky Feed Posts API1 credit
- Bluesky Resolve Handle API1 credit
The same data from other platforms
Bluesky Profile API FAQ
The short answers. The docs have the long ones.
How much does the Bluesky Profile API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send actor. The input fields below list every option with its type and limits.
Do I need a Bluesky login?
No. It reads public Bluesky data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds bluesky.actor.get_profile, checks its price and runs it with the same credits as the REST API.
Your first Bluesky call is free.
Up to 100 free credits to start, no card needed.