Bluesky Post Quotes Scraper
Pricing
from $1.00 / 1,000 results
Bluesky Post Quotes Scraper
Collect public quote posts that reference selected Bluesky posts. Export quote text, authors, dates, engagement and media with source post references.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
ScrapingMonkey
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 hours ago
Last modified
Categories
Share
Collect the public quote posts that reference selected Bluesky publications. Bluesky Post Quotes Scraper returns each quoting publication as its own row, including text, author, dates, engagement, media and a reference to your original source post.
Use source post links to review reactions, compare discussion themes or build an archive of quoted responses for further analysis.
| At a glance | Details |
|---|---|
| 📥 Input | Add canonical https://bsky.app/profile/handle/post/record-key URLs or at:// post URIs. One source post per item. |
| 📤 Output | One unique quoting publication |
| 📄 Pagination | Up to 30 source items per requested page |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 HTTP requests concurrently; up to 5 attempts for temporary failures |
| 💾 Delivery | One Apify dataset view with individual result rows, flattened object columns and complete nested JSON |
What the Bluesky post quotes scraper collects 💬
The Actor paginates quote publications associated with each source post. These are content records: you receive the quote’s own text and author, not just a list of accounts or an aggregate quote count.
Data can include:
- Quote publication URI, content identifier, URL, text and dates
- Quote author identity, biography, avatar and available verification fields
- Visible likes, replies, reposts, quotes and bookmarks when supplied
- Images, video playlist links, external previews and embedded quote references
- Languages, hashtags, mentions, outbound links and reply references
- Original source post URI and URL on every row
How to collect quote posts from Bluesky 🚀
- Enter one or more supported inputs.
- Choose a mode if available and set the page count for each input.
- Start the Actor.
- Open the Quotes dataset view and review individual result rows.
- Export the dataset or retrieve it from your application.
{"inputList": ["https://bsky.app/profile/bsky.app/post/3msqpuobiwk2t"],"pagesPerPost": 1}
pagesPerPost counts quote-result pages separately for each source post. Each page requests up to 30 quoting publications. The limit is a page budget, not an exact number of quotes.
Bluesky quote posts output fields 📦
| Field | Type | Meaning |
|---|---|---|
input | string | Original submitted input, retained on success and failure. |
status | string | success or failed. |
uri | string or null | Stable AT publication URI. |
cid | string or null | Content identifier for this version of the post. |
post_url | string or null | Canonical URL of the returned publication. |
text | string or null | Publication text. |
created_at | string or null | Creation or publication time returned by the source. |
indexed_at | string or null | Time the source indexed the record. |
like_count | integer or null | Visible likes on the returned publication. |
repost_count | integer or null | Visible repost count. |
reply_count | integer or null | Visible reply count; replies themselves are not expanded. |
quote_count | integer or null | Visible quote count. |
bookmark_count | integer or null | Bookmark count only when exposed. |
author | object or null | Author profile fields. |
languages | array or null | Language tags supplied in the post record. |
hashtags | array or null | Hashtags extracted from record tags and facets. |
mentioned_dids | array or null | Mentioned account identifiers from text facets. |
links | array or null | Link targets from text facets. |
reply_parent_uri | string or null | Direct parent publication URI when this is a reply. |
reply_root_uri | string or null | Root publication URI when this is a reply. |
labels | array or null | Source label values. |
images | array or null | Ordered image metadata: fullsize and thumbnail URLs, alt text and dimensions. |
video | object or null | Video playlist URL, thumbnail, content identifier, alt text and dimensions. |
external | object or null | External link preview URL, title, description and thumbnail. |
quote | object or null | Embedded quoted-record reference, availability and exposed content. |
is_pinned | boolean or null | Whether the feed response marks this entry as pinned. |
is_repost | boolean or null | Whether the feed entry is a repost. |
reposted_at | string or null | Feed-entry repost time when supplied. |
reposted_by | object or null | Reposting profile when supplied by a feed entry. |
source_post_uri | string or null | URI of the original post submitted for likes, reposts or quotes. |
source_post_url | string or null | Canonical URL of the original submitted post. |
Nested objects keep the following fields. They appear as flattened columns in the single Store view; arrays stay together in their parent row:
author:did,handle,display_name,profile_url,description,avatar_url,banner_url,pronouns,created_at,indexed_at,followers_count,following_count,posts_count,verified_status,trusted_verifier_status,labels.images[]:fullsize_url,thumbnail_url,alt,width,height.video:playlist_url,thumbnail_url,cid,alt,width,height.external:url,title,description,thumbnail_url.quote:uri,cid,post_url,text,created_at,author,available.quote.author:did,handle,display_name,profile_url,description,avatar_url,banner_url,pronouns,created_at,indexed_at,followers_count,following_count,posts_count,verified_status,trusted_verifier_status,labels.reposted_by:did,handle,display_name,profile_url,description,avatar_url,banner_url,pronouns,created_at,indexed_at,followers_count,following_count,posts_count,verified_status,trusted_verifier_status,labels.
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","uri": "at://did:plc:zumr3uag72qr54sbnrj6mw2g/app.bsky.feed.post/3mv5fbkb7l22k","cid": "bafyreibko3cczraxyh4d3sim2t7sbikh6btn2mgckami4qetgla2uj3z34","post_url": "https://bsky.app/profile/did:plc:zumr3uag72qr54sbnrj6mw2g/post/3mv5fbkb7l22k","text": "Ooohhh thank you for this feature","created_at": "2026-09-10T06:09:20.601Z","indexed_at": "2026-09-10T06:09:24.361Z","author": {"did": "did:plc:zumr3uag72qr54sbnrj6mw2g","handle": "alonehoneyjar.bsky.social","profile_url": "https://bsky.app/profile/did:plc:zumr3uag72qr54sbnrj6mw2g","labels": [],"verified_status": null,"trusted_verifier_status": null,"display_name": "Honey 🍯🐝","description": null,"avatar_url": "https://cdn.bsky.app/img/avatar/plain/did:plc:zumr3uag72qr54sbnrj6mw2g/bafkreibjhcxgiesaebd2xc55rrzicg2targk4ywtgmxusi76w52vr4eofy","banner_url": null,"pronouns": null,"created_at": "2023-10-18T11:20:06.028Z","indexed_at": null,"followers_count": null,"following_count": null,"posts_count": null},"languages": ["en"],"hashtags": [],"mentioned_dids": [],"links": [],"labels": [],"reply_parent_uri": null,"reply_root_uri": null,"is_pinned": false,"is_repost": false,"reposted_at": null,"reposted_by": null,"images": [{"fullsize_url": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:zumr3uag72qr54sbnrj6mw2g/bafkreicqjngt4bh2xbv3nvw5j2qns5xmzoxges2m6q6i3ntxwvajdp25sq","thumbnail_url": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:zumr3uag72qr54sbnrj6mw2g/bafkreicqjngt4bh2xbv3nvw5j2qns5xmzoxges2m6q6i3ntxwvajdp25sq","alt": "","width": 230,"height": 176}],"video": null,"external": null,"quote": {"uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3msqpuobiwk2t","cid": "bafyreia5giteuhei7im66w7yn3pldm7h7npkmuy73fvakrpsjsz5oejdgu","post_url": "https://bsky.app/profile/did:plc:z72i7hdynmk6r22z27h6tvur/post/3msqpuobiwk2t","available": true,"text": "v1.130 is live!\n\nWant to follow someone for their posts but not their reposts? Now you can — turn on \"Hide reposts in feeds\" for any account you follow.","created_at": "2026-08-10T18:23:59.962Z","author": {"did": "did:plc:z72i7hdynmk6r22z27h6tvur","handle": "bsky.app","profile_url": "https://bsky.app/profile/did:plc:z72i7hdynmk6r22z27h6tvur","labels": [],"verified_status": "none","trusted_verifier_status": "valid","display_name": "Bluesky","description": null,"avatar_url": "https://cdn.bsky.app/img/avatar/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreihwihm6kpd6zuwhhlro75p5qks5qtrcu55jp3gddbfjsieiv7wuka","banner_url": null,"pronouns": null,"created_at": "2023-04-12T04:53:57.057Z","indexed_at": null,"followers_count": null,"following_count": null,"posts_count": null}},"like_count": 0,"repost_count": 0,"reply_count": 1,"quote_count": 0,"bookmark_count": 0}
Complete failed dataset item:
{"input": " ","status": "failed","uri": null,"cid": null,"post_url": null,"text": null,"created_at": null,"indexed_at": null,"like_count": null,"repost_count": null,"reply_count": null,"quote_count": null,"bookmark_count": null,"author": null,"languages": null,"hashtags": null,"mentioned_dids": null,"links": null,"reply_parent_uri": null,"reply_root_uri": null,"labels": null,"images": null,"video": null,"external": null,"quote": null,"is_pinned": null,"is_repost": null,"reposted_at": null,"reposted_by": null,"source_post_uri": null,"source_post_url": 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 ⚙️
| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
inputList | array of strings | Yes | None | Add canonical https://bsky.app/profile/handle/post/record-key URLs or at:// post URIs. One source post per item. |
pagesPerPost | integer | No | 1 | Number 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. |
Enter canonical https://bsky.app/profile/ACCOUNT/post/RECORD_KEY URLs or matching at://ACCOUNT/app.bsky.feed.post/RECORD_KEY URIs. A profile link, search query or post record key alone is not accepted.
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 quote posts use cases 🎯
Reaction and narrative research
Collect quote text around a public announcement and review themes in your own analysis. Preserve authors and canonical links for checking context.
Campaign discussion archives
Save quote publications with dates and visible engagement to a database. Compare successive snapshots without losing which original post produced each record.
Content classification pipelines
Send quote text, language tags, media references and source links to your own classification or reporting workflow. The Actor collects records and does not assign sentiment labels.
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
successis 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
failedrow. - 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 quote posts 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.
This Actor collects quote posts that the source exposes for the selected publication. It does not collect the complete reply tree, recursively follow quotes of quotes, or search every textual mention of the original post. Media URLs are returned without file downloads.
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 ❓
Is a quote row an account or a publication?
A publication. Every row has the quoting post’s text, author, URL and available metrics, plus the original source post reference.
Does it also collect all comments?
No. Reply-tree extraction is a separate capability and is not included in this Actor.
Are quotes of quotes followed automatically?
No. Only the quotes returned for the submitted source posts are collected. Submit another source post explicitly if you need its quote list.
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.
Support, responsible use, and related actors 🛟
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.