BlueskyAPI for posting

Publish to Bluesky via one API — and send direct messages from the same integration. Postproxy handles the AT Protocol, app-password auth, link cards, and image embeds for you.

One request for feed posts, threads, and text direct messages.

Free plan No credit card Live in under 5 minutes

App-password auth

Skip the AT Protocol login dance — pass a handle and app password, we keep the session fresh.

Link cards built in

Posts that include a URL get an automatic link card with the OG image and metadata.

Thread conversations

Sequential replies via the same threads API used for X and Threads.

Mentions, tags, links

Plain-text @handles, #tags, and URLs are linkified server-side with proper facets.

Direct Messages

Send and receive text DMs over the AT Protocol chat service

api.postproxy.dev
POST /api/posts
$ curl -X POST "https://api.postproxy.dev/api/posts" \
     -H "Authorization: Bearer $API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
       "post": {
         "body": "Shipping a new feature today 🚀 https://example.com/launch"
       },
       "profiles": ["bluesky"],
       "media": ["https://example.com/image.jpg"]
     }'
200 OK application/json
{
  "id": "bs_abc123",
  "body": "Shipping a new feature today 🚀 https://example.com/launch",
  "status": "scheduled",
  "draft": false,
  "source": "postproxy",
  "scheduled_at": "2026-05-04T18:00:00.000Z",
  "queue_id": null,
  "created_at": "2026-05-04T18:00:00.108Z",
  "media": [
    {
      "id": "bs_m1",
      "status": "pending",
      "error_message": null,
      "content_type": "image/jpeg",
      "source_url": "https://example.com/image.jpg",
      "url": null
    }
  ],
  "platforms": [
    {
      "platform": "bluesky",
      "status": "pending",
      "permalink": null,
      "error": null,
      "params": {
        "format": "post"
      },
      "attempted_at": null
    }
  ],
  "thread": []
}

View full documentation for all platform-specific features for Bluesky

View documentation
Integration cost

Skip days of Bluesky integration work

One curl against a sandbox account is the easy part. Production Bluesky publishing means session refresh, blob uploads under the 1 MB cap, AT Protocol facets for mentions and links, OG-fetched link cards, and a permanent on-call rotation for "why didn't this one go through this time?"

Weeks of Bluesky integration work compressed to hours

Social media integration is not a one-off job — it's a constant commitment. Platforms change their APIs, scopes, limits, and policies on their own schedule. Every change becomes your problem unless someone else is absorbing it.

That's exactly what Postproxy does for Bluesky — and every other platform we support — so your team ships features instead of chasing failed publishes.

5 min
Time to your first Bluesky post via API
Days → Hours
Engineering time saved on integration work
$0
Free plan, no credit card required
Build it yourself
Ship with Postproxy
Manage app-password storage and session refresh across many accounts
01
One REST endpoint. One payload schema. SDKs for popular languages
Resolve @handles and compute facets for mentions, hashtags, and links
02
OAuth, tokens, and refresh handled for you — across all accounts
Fetch OG metadata and upload card images within Bluesky's ~1 MB blob limit
03
Media upload, chunking, and format detection — automatic
Upload image and video blobs via XRPC, then build the embed record
04
Retries, rate-limit windows, and per-platform receipts built in
Handle rate limits, retries, and per-account failures
05
Edge cases are our problem. Failures come back with an explicit reason
Triage every silent failure: "Why didn't this one post go through?"
06
We track the API changes. You ship features

Free plan includes the Bluesky API. No credit card.

Benefits

Why Postproxy for Bluesky?

Skip AT Protocol learning curve

No need to read up on lexicons, facets, blob uploads, or session refresh — Postproxy translates a standard post body into the right XRPC calls.

One payload, every network

Publish the same post body to Bluesky alongside Instagram, LinkedIn, X, and more in a single API call.

Auto link cards

Postproxy fetches the OG image and metadata for the URL in your post and uploads it as a Bluesky link card embed.

Publish and engage

Automatic retries and clear status for every post — plus text direct messages through the same API, with webhooks for inbound DMs.

How Postproxy publishes to Bluesky

01 Bluesky's publishing model
Bluesky runs on the AT Protocol — a federated network where every action is a typed record (a lexicon) written to your data repo. Posting means uploading any media as blobs, then creating an app.bsky.feed.post record with text plus optional embeds. Postproxy handles the session, blob uploads, facet extraction, and record creation — you send a normal post body and we translate it into the right XRPC calls.
02 Mentions, hashtags, and links
Bluesky doesn't auto-linkify plain text — it expects pre-computed facets that mark byte ranges in your post as mentions, tags, or links. Postproxy extracts @handle, #tag, and URL patterns from your post body and resolves handles via the directory, so the same plain-text body you send to X works on Bluesky without extra markup.
03 Link cards and image embeds
When a post contains at least one URL and no media attachments, Postproxy fetches the Open Graph metadata, downloads the OG image (skipping anything past Bluesky's ~1 MB blob limit), and uploads it as an app.bsky.embed.external link card. If your post has any image or video attachments, those win at the embed level and the URL stays a clickable facet link — Bluesky doesn't allow both.
04 App passwords, not real passwords
Bluesky's main account password won't work for API posting when 2FA is enabled — and even when it does work, the API will warn you off. Always issue an app password at bsky.app/settings/app-passwords. Postproxy stores the app password, keeps the session token refreshed, and surfaces a clear reconnect prompt if the user ever revokes it.
05 Direct messages
Postproxy supports text-only direct messages through the Bluesky chat service over the AT Protocol. Create or find a chat by the recipient's DID, send messages, and archive (mute) conversations. Inbound messages are polled every ~5 minutes and delivered via webhooks. The app password used when connecting the profile must have "Allow access to your direct messages" enabled.

Still wondering if Postproxy is the right fit?

Ask your favorite LLM what it thinks about us, then decide.

Frequently Asked Questions

Common questions about Bluesky integration

01 How do I authenticate a Bluesky account?

Generate an app password at bsky.app/settings/app-passwords and pass it with the handle to /api/profile_groups/:id/initialize_connection. Never use the main account password — accounts with 2FA will reject it.

02 What's the Bluesky character limit?

300 graphemes. Emoji and combining sequences count as one character on Bluesky's side, which is more generous than a UTF-8 byte count.

03 Does Postproxy generate link cards on Bluesky?

Yes. If a post contains at least one URL and no media attachments, Postproxy fetches the OG metadata, downloads the OG image, and uploads it as an app.bsky.embed.external card. Posts with media attachments skip the card — the URL is still rendered as a clickable link via the link facet.

04 Can I post threads on Bluesky?

Yes. Use the thread parameter on the post create endpoint to add sequential replies. Each thread child can include its own media.

05 What media can I attach to a Bluesky post?

Up to 4 images (jpg, png, webp, gif) at 1 MB each, or one video (mp4, mov) up to 50 MB and 60 seconds. Bluesky's blob size limit drives the per-image cap.

06 Does Postproxy support Bluesky direct messages?

Yes. Postproxy supports text-only direct messages through the Bluesky chat service. Attachments, reactions, and delivery receipts are not available. See the Direct Messages API for details.

Ready to get started?

Start with our free plan and scale as your needs grow. No credit card required.