Bluesky Media Downloader: Images & Videos by Keyword
Pricing
from $2.28 / 1,000 stored media files
Bluesky Media Downloader: Images & Videos by Keyword
Bluesky video downloader and image downloader: download all photos and videos from a Bluesky profile (up to your post cap), download Bluesky images by keyword in full resolution, or save Bluesky videos as MP4 from a post URL. Good for digital art. Bulk download via API or n8n, SHA-256 checksums.
Pricing
from $2.28 / 1,000 stored media files
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Downloads Bluesky images and videos into your run's default key-value store by keyword, profile handle, or post URL. Full resolution photos, remuxed MP4 videos, SHA-256 checksums, and ffprobe technical metadata for every file. No login or cookies required.
Who it's for
- Social media managers & creators: Archive posts, high-resolution imagery, and video clips from specific Bluesky accounts or topics.
- Researchers & ML engineers: Curate clean datasets of images and videos filtered by keywords, engagement (
topvslatest), and date ranges (since). - Automation workflows: Streamlined integration with n8n, Make, or custom pipelines using Apify's key-value store URLs and structured JSON metadata.
Why this one
- Three ways to search: Query by keyword search, track profile handles (with
posts_with_mediafiltering), or download exact posts via URL. - Full-resolution originals: Downloads high-resolution images from Bluesky's CDN (
cdn.bsky.app), preserving full image dimensions and alt text. - Native MP4 videos: Bluesky serves video as HLS (
playlist.m3u8); this actor automatically remuxes streams into MP4 files usingffmpegwithout re-encoding quality loss. - Checksums & technical metadata: Computes
sha256checksums during streaming and extracts video duration, resolution, fps, codec, and audio channels usingffprobe. - Fair pay-per-event billing: Only successfully stored files are billed (
file+megabyte). Misses, NSFW/adult-content label skips, duplicates, and over-cap files are never charged.
What you get
One row per stored file by default (or nested when unexpanded):
| Field | Type | Description |
|---|---|---|
query | text | The input source prefixed with its type, e.g. query:sunset photography or handle:bsky.app |
source / sourceValue | text | Source type (query, handle, post) and search query or handle |
postUri / postUrl | text | Bluesky AT URI (at://did:plc:.../app.bsky.feed.post/...) and public web URL |
kind | text | image or video |
mediaIndex | number | Index of the media item within the post (starting at 0) |
kvKey / kvUrl | text | Key name and direct download URL in this run's default key-value store |
originalMediaUrl | text | Source CDN or video playlist URL |
altText | text | Image or video accessibility alt text |
bytes / sha256 | number / text | File size in bytes and SHA-256 hash |
width / height | number | Pixel dimensions from embed or ffprobe |
duration_s / fps / codec / hasAudio | number / text / boolean | Video metadata from ffprobe (null for images) |
text | text | Post text content |
authorHandle / authorDisplayName | text | Post creator's handle and display name |
likeCount / repostCount | number | Engagement counters at scrape time |
createdAt | text | Post creation timestamp (ISO 8601) |
error | text | Failure explanation if storage failed (null on success) |
Scope and limits
- Public content only: Only public Bluesky posts can be downloaded; private or blocked accounts are not accessible.
- Content moderation labels: Respects Bluesky moderation labels (
porn,sexual,nudity,graphic-media), skipping adult content by default unlessincludeAdultis set totrue. - Deduplication: Posts with identical URIs within the same run are processed and billed only once by default.
- Key-value store access: Downloaded media files are stored in the run's default Key-Value Store. Accessing
kvUrlrecords requires your Apify API token if your store is private.
Example runs
- Download sunset photography images and videos by keyword
{"queries": ["sunset photography"],"sort": "top","maxPostsPerSource": 5,"kinds": "all"}
- Download media from an official Bluesky handle
{"handles": ["bsky.app"],"maxPostsPerSource": 10,"kinds": "all"}
- Download images and video from a specific post URL
{"posts": ["https://bsky.app/profile/bsky.app/post/3mv3shqdfuc2e"],"kinds": "all"}
Use-case variant candidate: none
How to use
- In the Apify Console. Open the actor page and click Start — the
queriesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~bluesky-media-downloader/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"queries":["sunset photography"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"queries": ["sunset photography"]}
One search term per line, as you would search on Bluesky. Keywords are one of three ways in: use this field, or fill Bluesky handles or Post URLs below. At least one of the three is needed. Accepted formats: sunset photography, digital art, astrophotography.
Output
| query | found | status | postUri | postUrl | source | sourceValue | kind | mediaIndex | kvKey | kvUrl | originalMediaUrl | altText | bytes | sha256 | width | height | duration_s | fps | codec | hasAudio | text | authorHandle | authorDisplayName | likeCount | repostCount | createdAt | error | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sunset photography | true | OK | <size (bytes)> | <duration (s)> | 1970-01-01T00:00:00.000Z |
Pricing
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~bluesky-media-downloader/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"queries":["sunset photography"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~bluesky-media-downloader/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"queries":["sunset photography"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~bluesky-media-downloader/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"queries":["{{source}}"]}, mapping the row's source into the queries array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Bluesky Video Downloader: Save Media by Keyword" — the agent will find and run this actor.