Bluesky Media Downloader: Images & Videos by Keyword avatar

Bluesky Media Downloader: Images & Videos by Keyword

Pricing

from $2.28 / 1,000 stored media files

Go to Apify Store
Bluesky Media Downloader: Images & Videos by Keyword

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

Adriana Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

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 (top vs latest), 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_media filtering), 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 using ffmpeg without re-encoding quality loss.
  • Checksums & technical metadata: Computes sha256 checksums during streaming and extracts video duration, resolution, fps, codec, and audio channels using ffprobe.
  • 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):

FieldTypeDescription
querytextThe input source prefixed with its type, e.g. query:sunset photography or handle:bsky.app
source / sourceValuetextSource type (query, handle, post) and search query or handle
postUri / postUrltextBluesky AT URI (at://did:plc:.../app.bsky.feed.post/...) and public web URL
kindtextimage or video
mediaIndexnumberIndex of the media item within the post (starting at 0)
kvKey / kvUrltextKey name and direct download URL in this run's default key-value store
originalMediaUrltextSource CDN or video playlist URL
altTexttextImage or video accessibility alt text
bytes / sha256number / textFile size in bytes and SHA-256 hash
width / heightnumberPixel dimensions from embed or ffprobe
duration_s / fps / codec / hasAudionumber / text / booleanVideo metadata from ffprobe (null for images)
texttextPost text content
authorHandle / authorDisplayNametextPost creator's handle and display name
likeCount / repostCountnumberEngagement counters at scrape time
createdAttextPost creation timestamp (ISO 8601)
errortextFailure 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 unless includeAdult is set to true.
  • 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 kvUrl records requires your Apify API token if your store is private.

Example runs

  1. Download sunset photography images and videos by keyword
    {
    "queries": ["sunset photography"],
    "sort": "top",
    "maxPostsPerSource": 5,
    "kinds": "all"
    }
  2. Download media from an official Bluesky handle
    {
    "handles": ["bsky.app"],
    "maxPostsPerSource": 10,
    "kinds": "all"
    }
  3. 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

  1. In the Apify Console. Open the actor page and click Start — the queries field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. 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"]}'
  3. 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

queryfoundstatuspostUripostUrlsourcesourceValuekindmediaIndexkvKeykvUrloriginalMediaUrlaltTextbytessha256widthheightduration_sfpscodechasAudiotextauthorHandleauthorDisplayNamelikeCountrepostCountcreatedAterrorscrapedAt
sunset photographytrueOK<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.