Bluesky Post Likes Scraper avatar

Bluesky Post Likes Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Bluesky Post Likes Scraper

Bluesky Post Likes Scraper

Collect the public accounts that liked Bluesky posts. Export paginated profile rows with handles, biographies, avatars, available like dates and source post links.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

ScrapingMonkey

ScrapingMonkey

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Find the public accounts that liked selected Bluesky posts and export one account per result. Bluesky Post Likes Scraper returns handles, names, biographies, avatar links and available like timestamps with the source post attached to every row.

Use post links you already have to build an engagement audience dataset for campaign reviews, community research or comparisons between announcements.

At a glanceDetails
📥 InputAdd canonical https://bsky.app/profile/handle/post/record-key URLs or at:// post URIs. One post per item.
📤 OutputOne unique account that liked a source post
📄 PaginationUp to 30 source items per requested page
🔐 Login requiredNo
⚡ ProcessingUp to 5 HTTP requests concurrently; up to 5 attempts for temporary failures
💾 DeliveryOne Apify dataset view with individual result rows, flattened object columns and complete nested JSON

What the Bluesky post likes scraper collects ❤️

The Actor paginates the public list of accounts that liked a source post. It collects the identities behind visible likes, making the output useful when a single engagement count is not enough.

Data can include:

  • Liker DID, handle, display name and profile URL
  • Biography, avatar, profile verification and other fields exposed in the like response
  • Like creation time and indexing time when supplied
  • Source post URI and canonical URL for joining rows to your post inventory

How to collect post likes from Bluesky 🚀

  1. Enter one or more supported inputs.
  2. Choose a mode if available and set the page count for each input.
  3. Start the Actor.
  4. Open the Likes dataset view and review individual result rows.
  5. Export the dataset or retrieve it from your application.
{
"inputList": [
"https://bsky.app/profile/bsky.app/post/3msqpuobiwk2t"
],
"pagesPerPost": 1
}

pagesPerPost counts like-list pages independently for each submitted post. Each page requests up to 30 likes. One success row represents one distinct liking account for that source post.

Bluesky post likes output fields 📦

FieldTypeMeaning
inputstringOriginal submitted input, retained on success and failure.
statusstringsuccess or failed.
didstring or nullStable Bluesky account identifier.
handlestring or nullCurrent complete account handle.
display_namestring or nullDisplay name returned by the source.
profile_urlstring or nullCanonical account profile URL.
descriptionstring or nullPublic biography or collection description, according to row type.
avatar_urlstring or nullProfile or feed avatar URL.
banner_urlstring or nullProfile banner URL when exposed.
pronounsstring or nullProfile pronouns when exposed.
created_atstring or nullCreation or publication time returned by the source.
indexed_atstring or nullTime the source indexed the record.
followers_countinteger or nullProfile follower count when present in this response.
following_countinteger or nullProfile following count when present in this response.
posts_countinteger or nullProfile post count when present in this response.
verified_statusstring or nullSource verification state, when supplied.
trusted_verifier_statusstring or nullSource trusted-verifier state, when supplied.
labelsarray or nullSource label values.
source_post_uristring or nullURI of the original post submitted for likes, reposts or quotes.
source_post_urlstring or nullCanonical URL of the original submitted post.
liked_atstring or nullLike creation time when supplied.
like_indexed_atstring or nullLike indexing time when supplied.

The successful examples below use normalized public response data. Values are snapshots rather than promises of current content or counts; every top-level output key is included.

Complete representative successful result:

{
"input": "https://bsky.app/profile/bsky.app/post/3msqpuobiwk2t",
"status": "success",
"source_post_uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3msqpuobiwk2t",
"source_post_url": "https://bsky.app/profile/did:plc:z72i7hdynmk6r22z27h6tvur/post/3msqpuobiwk2t",
"did": "did:plc:b72ji7mqn7brlc3ycrp653zq",
"handle": "frenziedstars.neocities.org",
"profile_url": "https://bsky.app/profile/did:plc:b72ji7mqn7brlc3ycrp653zq",
"labels": [],
"verified_status": null,
"trusted_verifier_status": null,
"display_name": "Micah",
"description": "★ he/they ★ queer ★\n\n🔞 18+ ONLY 🔞\n\nmostly at https://blorbo.social/@frenziedstars and https://frenziedstars.neocities.org/",
"avatar_url": "https://cdn.bsky.app/img/avatar/plain/did:plc:b72ji7mqn7brlc3ycrp653zq/bafkreid3othuku6frujkmr4npgmirju7ybd2xxo5azyrqntk4lxldourei",
"banner_url": null,
"pronouns": "he/they",
"created_at": "2023-12-14T00:58:07.218Z",
"indexed_at": "2026-07-17T16:51:30.064Z",
"followers_count": null,
"following_count": null,
"posts_count": null,
"liked_at": "2026-09-11T07:08:30.266Z",
"like_indexed_at": "2026-09-11T07:08:30.266Z"
}

Complete failed dataset item:

{
"input": " ",
"status": "failed",
"did": null,
"handle": null,
"display_name": null,
"profile_url": null,
"description": null,
"avatar_url": null,
"banner_url": null,
"pronouns": null,
"created_at": null,
"indexed_at": null,
"followers_count": null,
"following_count": null,
"posts_count": null,
"verified_status": null,
"trusted_verifier_status": null,
"labels": null,
"source_post_uri": null,
"source_post_url": null,
"liked_at": null,
"like_indexed_at": null
}

Each failed row preserves input, uses status: failed, and sets every other top-level field to null. The reason is written to the run log. Successful rows may contain null optional fields or empty arrays when the source does not supply a value. The dataset is not split into separate tables for media, authors, modes or failures.

Input and pagination settings ⚙️

ParameterTypeRequiredDefaultRules
inputListarray of stringsYesNoneAdd canonical https://bsky.app/profile/handle/post/record-key URLs or at:// post URIs. One post per item.
pagesPerPostintegerNo1Number of result pages to attempt per input. Each page requests up to 30 items; actual public rows can be fewer. Bootstrap requests do not count as pages. Stops when the cursor ends or repeats. Minimum 1.

Use canonical HTTPS post URLs such as https://bsky.app/profile/bsky.app/post/3msqpuobiwk2t, or an at://ACCOUNT/app.bsky.feed.post/RECORD_KEY URI. Profile links, plain handles, short record keys and links to other record types are invalid.

For supported website URLs, use the exact https://bsky.app host and canonical path without a query string or fragment. URLs from other hosts and unsupported record types are rejected. Handles are normalized; duplicate normalized inputs in the same mode are processed once. Different source inputs retain their own results, while repeated record identifiers within one input’s pagination are removed.

The first result request counts as page 1; resolving a handle or validating source metadata does not consume a result page. Pagination stops at the requested page count, a missing cursor or a repeated cursor. A short, empty or fully filtered page can still continue when it includes a usable next cursor. No exact result total is guaranteed.

Bluesky post likes use cases 🎯

Announcement audience research

Collect liking accounts from a public announcement and review their biographies and profile links. Keep the source post reference when adding the records to a research sheet.

Campaign response comparisons

Submit several post URLs and compare the returned audiences using DIDs. Likes on separate posts remain separate source-to-account records.

Repeated engagement snapshots

Schedule later runs to refresh the visible liker list. Compare saved snapshots yourself; the Actor does not label accounts as new or lost automatically.

Pricing and saved-result behavior 💰

See the Actor’s Pricing tab for the active charging model and current rate. Store settings are separate from this local implementation, so this README does not state an unverified fixed price or runtime.

Under dataset-item pricing:

  • Every unique record saved as success is one result for that source input. Nested author, media or profile fields do not become separate rows.
  • An invalid or unavailable input, an exhausted temporary failure, or an input with no publicly available results within its page budget can save one failed row.
  • Automatic retry attempts do not create extra dataset rows by themselves.
  • A normal empty continuation after earlier successes creates no extra result row.
  • More requested pages can produce more saved rows. Check the active listing for how saved failed rows are billed; they are not assumed to be free.

The final total depends on source availability, duplicate removal and the chosen page budget. Start with a small run and check its actual usage before selecting a larger budget.

Bluesky post likes API 🔌

Replace $ACTOR_ID with the identifier from this Actor’s API tab and $APIFY_TOKEN with your Apify token.

curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"inputList":["https://bsky.app/profile/bsky.app/post/3msqpuobiwk2t"],"pagesPerPost":1}'

Retrieve the default dataset through the Apify API or download JSON, CSV, Excel, XML and other formats available in the Console. Schedules, completion webhooks and Apify integrations can connect results to Google Sheets, Make, Zapier, n8n, cloud storage or your own backend. These are platform connection options, not integrations preconfigured by this Actor.

Reliability, retries, and public-data limits ⚠️

The Actor uses pure HTTP collection with up to five requests concurrently. It does not launch a browser. Invalid syntax and confirmed missing, removed or inaccessible targets stop without unnecessary retries. Temporary network and proxy failures, timeouts, blocks, malformed responses, throttling and server errors are retried up to five total attempts.

Earlier successful pages remain saved if a later page fails. If no publicly available rows are found before the source ends or the selected page budget is reached, one failed row records that input; this does not mean the underlying account or collection necessarily does not exist. A later empty page after successes is normal exhaustion. A later request that exhausts retries can append a failed row while preserving earlier results.

Bluesky controls public availability and returned fields. Objects restricted from unauthenticated viewing are excluded; a restricted target produces a failed row. Deleted, suspended, unavailable or otherwise restricted records may be missing. Optional counts are not inferred from an incomplete sample, and media links may change or expire.

A post’s visible like count may exceed the number of public accounts returned within your page budget. Deleted, restricted or changing records can also create differences. Profile fields come from the like response and are not separately enriched.

Three consecutive result pages were verified for every paginated mode in HTTP runs of the packaged Actor on September 11, 2026. These checks demonstrate working continuation on the tested sources and do not guarantee future source availability.

One invalid string inside an otherwise valid input list does not stop other inputs. A configuration that fails the input schema logs an input warning and exits without starting requests: for example, a list containing a number instead of a string, an unsupported mode or an invalid page-count type. Infrastructure failures such as startup errors, unavailable dataset storage or an unrecoverable result-save error can still stop the whole run. Result-save failures are not retried as fresh scraping requests.

Frequently asked questions ❓

Does it return a like count or the people who liked?

It returns the public accounts that liked the post, with one account per row. It is useful for audience analysis beyond the aggregate count.

Can I get the time of each like?

The output includes liked_at and like_indexed_at when Bluesky supplies those values. Missing values are null.

Will the number of rows equal the post’s like count?

Not necessarily. Your page budget, unavailable accounts, source changes and deduplication can all reduce the returned total.

Does it require Bluesky login or cookies?

No Bluesky login, password, session cookie or account token is accepted or required. The Actor uses HTTP requests used by the public website and respects restrictions on unauthenticated access.

What happens to invalid or unavailable inputs?

Invalid individual inputs are saved as failed rows without an HTTP request. Confirmed missing, removed or restricted targets also become failed rows without unnecessary retries. Temporary failures are retried up to five total attempts. Other inputs and already saved pages remain available.

Can I export results or automate collection?

Yes. Use the Apify dataset to download JSON, CSV, Excel, XML or other supported formats, or retrieve records through its API. Apify schedules and webhooks can connect repeated runs to your own workflow.

For a reproducible problem, open an issue in the Actor’s Issues tab. Include the run ID, approximate time, mode if relevant, page count, safe public input, expected result and actual result. Do not share access tokens, proxy credentials or other secrets.

Use public data responsibly and follow applicable privacy, copyright, contractual and platform requirements before storing, combining or redistributing collected information.