Bluesky API

Bluesky API for posting and scheduling without rebuilding the AT Protocol stack

A Bluesky API with blob uploads, link cards, and scheduling handled for you, so you do not have to own the AT Protocol stack.

Built for products building open social, developer community, and text-first distribution. Add Bluesky publishing with one API for scheduling, media, status, and reporting workflows.

Last updated: July 2026

One API key. No per-account fees. 15 platforms.

API key authScheduled publishing15 platforms
Quick start
API request
1await fetch("https://api.bundle.social/api/v1/post", {2  method: "POST",3  headers: {4    "x-api-key": process.env.BUNDLE_SOCIAL_API_KEY,5    "Content-Type": "application/json"6  },7  body: JSON.stringify({8    teamId: "team_123",9    title: "Bluesky campaign",10    postDate: "2026-05-14T10:00:00.000Z",11    status: "SCHEDULED",12    socialAccountTypes: ["BLUESKY"],13    data: {14      BLUESKY: { text: "Scheduled from bundle.social." }15    }16  })17});
Official APIs500k+ connected accountsDirect engineer support

Building directly on Bluesky AT Protocol

AT Protocol is open, but production apps still need auth, media handling, retries, account mapping, and reports.
Bluesky is usually one channel in a broader publishing plan, not a product surface on its own.
Protocol flexibility does not remove the need for scheduling, approvals, and client-ready reporting.

What bundle.social handles

Publish to Bluesky from the same workflow you use for your other networks.
Use shared media and post history workflows instead of inventing a one-off Bluesky dashboard.
Keep Bluesky reporting close to your other social analytics when metrics are available.

Bluesky publishing without owning the whole AT Protocol stack

Bluesky is open, but production publishing still needs auth, media, status, scheduling, and campaign context. bundle.social gives open social a practical workflow layer.

Workflow

How it works

Connect accounts once, then create and schedule posts with channel-specific fields from one API.

01

Create an API key

Generate an organization API key in the dashboard and use it with the x-api-key header.

02

Connect accounts

Connect each social account once. bundle.social keeps the account mapping ready for future posts.

03

We write the AT Protocol record

Bluesky posts are records written to the user's PDS, with images uploaded as blobs and link cards built as embeds. You send one request; bundle.social uploads the blobs, builds the embed, and confirms the record write.

Product architecture

Build social media workflows without rebuilding every platform

Bluesky API for open social and text-first distribution

Developer-first products, open social platforms, and the brand teams they serve integrate Bluesky for text posts, images, alt text, link cards, post history, and comments where supported. It is not a conventional posting API with one central host: posts are records written to the personal data server the user chose, which may be operated by someone other than Bluesky.

bundle.social does that protocol work and exposes Bluesky through the same post endpoint as every other channel. Your backend can schedule posts, upload images, attach link cards, and track delivery status without implementing record writes and blob uploads directly.

AT Protocol is a different model, not a different endpoint

Most social APIs accept a payload and return a post ID. Bluesky asks you to write a record into a repository hosted on the user's Personal Data Server, which may not be operated by Bluesky at all. Images are content-addressed blobs uploaded separately and then referenced. Link previews are embeds you assemble yourself. Nothing about this is harder than a container flow, but none of it maps onto a conventional post-and-forget integration.

The practical consequence is that a Bluesky failure can originate in a place no other platform has: the user's own PDS. If that server is down, slow, or rejecting writes, publishing fails for that user and works for everyone else, and no amount of correctness on your side changes it.

Confirm the record write before reporting success

Because publishing is a write followed by propagation, an integration that reports success on request acceptance can be wrong. The blob upload can succeed while the record write fails, leaving orphaned media and no post. Propagation delays can make a successful write briefly invisible, which looks like a failure to a user refreshing their profile.

bundle.social confirms the record write rather than the request, and separates an invalid record or upload from a PDS outage. The first needs the payload changed, the second needs a retry once the user's server recovers.

Where Bluesky fits next to X and Mastodon

Bluesky occupies the same content slot as X and Mastodon (short text, optional images, link cards), which makes it cheap to add to an existing text-first workflow and easy to get wrong by treating it as identical. The 300-character cap is stricter than X Premium's 25,000 and matches free-tier X, so copy written for one usually fits the other. The link card difference is the trap: text that renders with a rich preview on X renders bare on Bluesky unless the embed is built.

Capabilities

Bluesky API workflows for open social teams

Text posts, media references, account mapping, scheduling, post history, and reporting context for Bluesky campaigns.

Bluesky-specific payload fields

Control the fields that matter on Bluesky: captions, media types, privacy settings, and more, using the same post endpoint as every other channel.

API key authentication

Use one bundle.social API key for server-to-server requests. Your users still connect social accounts once through the hosted OAuth flow; bundle.social handles token storage and refresh.

Scheduling built in

Set a postDate to schedule Bluesky content in advance, or create drafts and queue posts through the dashboard.

Media library integration

Upload Bluesky-compatible media once and reference the same upload ID across multiple posts or campaigns.

Post status and retry tracking

Track Bluesky posts through scheduled, processing, posted, retrying, and error states from the API or the shared dashboard.

Cross-platform publishing

Add other channels to the same post payload when Bluesky is part of a multi-platform campaign. No separate API calls needed.

Platform specifics

Bluesky API constraints worth knowing before you build

Bluesky is not a REST posting API with a token. It is a protocol where posts are records written to a server the user chooses.

Posts are records, media are blobs

Publishing means writing a record to the user's repository, and images must first be uploaded as blobs and then referenced by the record. bundle.social requests the atproto and transition:generic scopes and handles both steps, so one request produces a complete post.

300 characters, and it counts graphemes

Bluesky caps posts at 300 characters. Because the count is grapheme-based upstream, emoji and combining characters can consume the budget differently than a naive string length suggests. bundle.social validates before the write.

Up to 4 images and 8 tags

A post accepts up to 4 uploads and up to 8 tags of 64 characters each. Link fields are capped at 2,048 characters.

Link cards are built, not inferred

Bluesky does not generate a preview card from a URL in the text. The card is an embed you construct: title, description, and a thumbnail uploaded as its own blob. A post with a bare link and no embed renders as plain text.

Developer example

Schedule a Bluesky post

Examples use bundle.social's public API shape: API key authentication, a post date, selected social account types, and platform-specific data.

TypeScript
API request
1await fetch("https://api.bundle.social/api/v1/post", {2  method: "POST",3  headers: {4    "x-api-key": process.env.BUNDLE_SOCIAL_API_KEY,5    "Content-Type": "application/json"6  },7  body: JSON.stringify({8    teamId: "team_123",9    title: "Bluesky campaign",10    postDate: "2026-05-14T10:00:00.000Z",11    status: "SCHEDULED",12    socialAccountTypes: ["BLUESKY"],13    data: {14      BLUESKY: { text: "Scheduled from bundle.social." }15    }16  })17});

Supported content

Text postsImagesLinksAlt textPost historyComments where supported

Honest limitations

  • Bluesky and AT Protocol behavior can evolve quickly, so implementation details may shift.
  • Federated or protocol-specific features may not map to every mainstream social workflow.
  • Analytics availability depends on what the platform and connected account expose.

Guarantees

Developer-first infrastructure

Visible post status

Track scheduled, processing, posted, retrying, and error states per post.

Verbose errors

When native APIs fail, we return human-readable error messages and actionable recovery steps.

Flat pricing

No per-post counting. Predictable pricing for teams managing many users, workspaces, and connected accounts.

Same-day support

Direct access to the engineers building the API. We respond to technical issues the same day, sometimes the same hour.

Resources

Technical guides & documentation

FAQ

Questions developers ask before building

What does publishing to Bluesky mean at the protocol level?

Writing a record into the user's repository on their Personal Data Server, with images uploaded separately as content-addressed blobs and then referenced by the record. bundle.social requests the atproto and transition:generic scopes and handles both steps behind one call.

How is the 300-character limit counted?

Grapheme-based upstream, so emoji and combining characters can consume the budget differently than a naive string length suggests. A post also accepts up to 4 images and up to 8 tags of 64 characters each, with link fields up to 2,048.

How do we build a link card?

As an embed you construct: title, description, and a thumbnail uploaded as its own blob. Bluesky does not infer a card from a URL in the post text, so a bare link renders as plain text.

Does this replace Bluesky AT Protocol?

No. bundle.social calls Bluesky AT Protocol for you and absorbs the work around it: token storage and refresh, media handling, scheduling, status transitions, and turning platform errors into a cause and a next action.

Are Bluesky analytics available through the API?

Yes, for the metrics the connected account and Bluesky AT Protocol actually expose. Availability depends on account type and granted permissions, so treat analytics as best-effort and delivery status as guaranteed.