Skip to content
curl-x
blueskyhow-tolinks

How to Copy a Bluesky Post Link

Copy a Bluesky post link on iPhone, Android, or desktop and get the correct bsky.app URL. Learn handles vs DIDs, then paste the link into curl-x.

Share:

Want to try it now? Paste a post link from any supported platform to download its media instantly.

Open Downloader

To copy a Bluesky post link, open the post in the Bluesky app, tap the menu on the post, and choose Share > Copy link. Your clipboard should contain a URL shaped like bsky.app/profile/HANDLE/post/RKEY—not a profile page or your home feed. Paste that exact link into a downloader like curl-x to save the video, photos, or GIF attached to the post.

This guide is for anyone who needs the correct Bluesky post URL before downloading media—on iPhone, Android, or desktop—and who keeps getting "post not found" because the wrong link, or only part of one, landed on the clipboard.

TL;DR: Bluesky's Share > Copy link button gives you the reliable URL. A working link looks like https://bsky.app/profile/user.bsky.social/post/3mq5yidyc3c2g—a handle (or a did:plc: identifier), then /post/, then a record key. Profile pages, your home feed, and search results are not valid paste targets. Public posts need no login, so any correctly copied link should work in curl-x right away.

In this guide

  1. Open the specific post you want—not your home feed or a profile grid
  2. Tap the (more) icon on the post
  3. Tap Share, then Copy link

A working link looks like this:

https://bsky.app/profile/user.bsky.social/post/3mq5yidyc3c2g

Paste it into curl-x and it lists whatever media the post contains—video, one photo, up to four photos, or a GIF—ready to download. If you only needed the checklist, you can stop here; the sections below cover handles vs. DIDs, per-device steps, and why some copied links fail.

For the full save workflow once you have the link, see curl-x now supports Bluesky.

What a valid Bluesky post URL looks like

A Bluesky post link has three parts: the bsky.app domain, a /profile/ segment naming the poster, and a /post/ segment naming the specific post.

PartExampleMeaning
Domainbsky.appAlways this—Bluesky has no separate short-link domain
Actoruser.bsky.social or did:plc:abc123…The poster's handle or permanent DID
Record key3mq5yidyc3c2gA short, case-sensitive ID unique to that post

Put together: bsky.app/profile/ACTOR/post/RKEY. curl-x's own post pages mirror this shape at curl-x.com/bluesky/ACTOR/RKEY, which is what makes copy-pasting between the two so direct—swap bsky.app/profile for curl-x.com/bluesky and drop /post.

Link typeExample patternValid for downloaders?
Standard postbsky.app/profile/user.bsky.social/post/3mq5yidyc3c2gYes
Custom-domain handlebsky.app/profile/name.example.com/post/3mq5yidyc3c2gYes
DID formbsky.app/profile/did:plc:abc123.../post/3mq5yidyc3c2gYes
Profile pagebsky.app/profile/user.bsky.socialNo
Feed, list, or starter packNo
Search results pageNo

Any tracking characters a share sheet appends after a question mark are harmless—curl-x strips the query string before parsing the URL, the same way it handles Instagram's igsh parameter (see how to copy an Instagram post or Story link).

Handles vs. DIDs: both point to the same post

Bluesky runs on the AT Protocol, where every account has a permanent identifier called a DID (did:plc: followed by a base32 string) and, usually, a human-readable handle (user.bsky.social or a custom domain). Both resolve to the exact same account, and curl-x accepts either one in the actor segment of a post URL.

  • Handle links are what you'll copy most often—readable, and what shows in the app's UI: bsky.app/profile/user.bsky.social/post/3mq5yidyc3c2g
  • DID links sometimes come from embed codes, API responses, or share sheets on third-party Bluesky clients: bsky.app/profile/did:plc:z72i7hdynmk6r22z27h6tvur/post/3mq5yidyc3c2g
  • Custom-domain handles work identically—someone who verified name.example.com as their handle produces bsky.app/profile/name.example.com/post/3mq5yidyc3c2g, and curl-x parses it the same as any .bsky.social handle

There's a catch worth knowing: a handle can change if someone updates their custom domain, but the DID never changes. If a link with a handle stops resolving months later, that's usually why—the account is still there, just under a new handle. The AT Protocol's own documentation covers identity resolution in more depth at atproto.com.

How to copy a Bluesky post link on iPhone

  1. Open the Bluesky app and find the post
  2. Tap the icon in the post's top-right corner
  3. Tap Share
  4. Tap Copy link
  5. Switch to Safari, open curl-x, paste the link, and start the download

Tip: If Bluesky opened a link inside an in-app browser instead of the native app, tap the menu there for a Copy Link or Open in Safari option—iOS in-app browsers occasionally block file downloads even when the URL is correct.

How to copy a Bluesky post link on Android

  1. Open the post in the Bluesky app
  2. Tap (three dots) on the post
  3. Tap Share, then Copy link from the system share sheet

Some Android layouts list Copy link directly in the menu without a separate Share step—either path lands the same URL on your clipboard. If the share sheet only shows apps to send to (Messages, Gmail, and so on), scroll it horizontally or check for a Copy icon near the top.

Bluesky's web app at bsky.app makes this the simplest platform to copy from, since the browser's own address bar already shows the URL:

StepAction
1Open the post in a browser tab at bsky.app, not the home feed
2Confirm the address bar shows /profile/HANDLE/post/RKEY
3Select the URL and press Ctrl+C (Windows/Linux) or Cmd+C (Mac)—or use the post's menu and click Copy link

If clicking a post from your timeline only changes the right-hand panel instead of the URL, click the post's timestamp or text specifically—that's what navigates to the single-post view and updates the address bar.

No login required—Bluesky posts are public by default

Unlike some platforms, most Bluesky posts are visible to anyone, logged in or not, because the AT Protocol stores public posts as openly readable data. That has two practical effects for copying links:

  • You can verify a link works by opening it in a private or incognito browser window. If the post loads without signing in, curl-x can read it too.
  • curl-x needs no Bluesky account or API key to extract media—it reads the same public post data the app itself displays, through Bluesky's public AppView API.

The exception is accounts set to require login for viewing, or posts from blocked or deactivated accounts—those return "not found" from Bluesky's public API to everyone, curl-x included.

A properly shaped URL can still fail to extract when the underlying post is unreachable, not because the link string is wrong.

1. You copied a profile, not a post

bsky.app/profile/user.bsky.social has no /post/RKEY segment. Open one specific post and copy again.

2. The post was deleted

Deleted posts return "not found" from Bluesky's API immediately—no URL fix recovers them.

3. The account is blocked or deactivated

If the poster's account no longer resolves publicly, neither the app nor a downloader can reach anything they posted.

4. It's a quote post, and the media is on the quoted post

curl-x extracts media attached directly to the post you link. If a video or photo lives on the post being quoted rather than the quote itself, copy the quoted post's link instead.

5. It's a self-hosted (federated) account

Bluesky is a federated network; a small share of accounts host their own data server rather than Bluesky's. Photos usually still work, but video from these accounts can be inconsistent.

  1. Does the URL contain /profile/ and /post/? If not, recopy from the post itself, not the profile or feed.
  2. Is there a record key after /post/? An empty or truncated path fails.
  3. Can you open the same link in a private browser window? If it loads without logging in, it's public and extractable.
  4. Did you copy from the post's menu, not a preview card in a message? Preview cards sometimes carry a wrapper link instead of the direct post URL.
  5. Is the post a quote post? If so, confirm the media you want is on the linked post, not the one it's quoting.

If all five check out and curl-x still errors, wait a minute and retry—Bluesky's public API occasionally rate-limits bursts of automated requests.

Once the Bluesky post URL is on your clipboard:

  1. Open curl-x in Safari, Chrome, or Firefox
  2. Paste the link into the input field and start extraction
  3. curl-x lists what it found—a video, a GIF, or every photo in a multi-image post (Bluesky allows up to four)—and hands back the original uploaded file, not a compressed preview
  4. Tap Download on each item and save through your browser's normal download flow

curl-x also gives every Bluesky post a dedicated page at curl-x.com/bluesky/ACTOR/RKEY, so command-line users can skip the web UI entirely:

curl -OJ https://www.curl-x.com/bluesky/user.bsky.social/3mq5yidyc3c2g

That command streams the media file straight back—no HTML, no browser tab. The same trick works across curl-x's other platforms; see how to copy a tweet link, how to copy a Threads post link, how to copy a Reddit post link, how to copy a TikTok video link, and how to copy a Facebook video or Reel link for the equivalent steps on each. If you specifically want Bluesky video, how to download a Bluesky video from a share link and how to download Bluesky videos go deeper on that workflow.

Only save public media you have permission to reuse. Downloading a post for personal, offline viewing is different from reposting it—check the original poster's wishes and Bluesky's terms before you republish anything.

FAQ: copying Bluesky post links

How do I copy a Bluesky post link on iPhone?

Open the post, tap in the corner, tap Share, then Copy link. The URL should read bsky.app/profile/HANDLE/post/RKEY. Paste it into Safari at curl-x to download the attached video or photos.

What does a valid Bluesky post URL look like?

https://bsky.app/profile/user.bsky.social/post/3mq5yidyc3c2g—a handle or DID after /profile/, then /post/ followed by a short record key. Profile-only links or feed URLs without /post/ will not extract media.

Yes. A handle like user.bsky.social and a DID like did:plc:abc123… both identify the same account, and both resolve the same post. curl-x accepts either form in the actor segment of the URL without any extra steps.

No. Most Bluesky posts are public under the AT Protocol, so a link works for anyone, logged in or not. Test it by opening the URL in a private browser window—if it loads, curl-x can read it too.

Why does my Bluesky link say "post not found" in a downloader?

The usual causes are: the post was deleted, the account is blocked or deactivated, you copied a profile link instead of a post link, or the media is on a quoted post rather than the one you linked. Recopy the specific post's link and try again.

Can I copy a link to just one photo in a multi-image Bluesky post?

No—Bluesky posts with multiple photos (up to four) share a single post URL. Paste that one link into curl-x and each photo appears as its own downloadable file.

No. Every Bluesky post link uses the full bsky.app/profile/…/post/… format—there's no separate short-domain to resolve first, which makes copied links simpler to verify at a glance.

Bottom line: a correctly copied Bluesky link always has /profile/ACTOR/post/RKEY in the path, works for handles, custom domains, and DIDs alike, and needs no login since public posts are open by design. Copy it with Share > Copy link in the app or straight from the address bar on desktop, then paste it into curl-x to pull the original video, photos, or GIF as real files.

Ready to download from any platform?

Try curl-x — free, fast, and no login required.

Download Now
Share: