Bluesky API · no app review · no fee

The Bluesky API has no gatekeeper

No developer app, no use-case review, no licence fee - a handle and an app password are the whole credential. The only thing between you and a published post is the AT Protocol itself.

No app reviewNo API feePostsThreadsScheduling

✓ No developer app to register ✓ No review queue ✓ 1,666 new records/hour, the ceiling Bluesky sets

Building an agent instead of an app? The same account works with our Bluesky MCP server.

bash
curl https://api.outstand.so/v1/posts/ \
  -H "Authorization: Bearer $OUTSTAND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "content": "hello from the API 🦋 read more at https://outstand.so", "accounts": ["YOUR_BLUESKY_ACCOUNT_ID"] }'

Links, @mentions and #hashtags become clickable automatically. Add images, or containers[] for a thread.

Nobody gates you - the protocol taxes you instead

With no app to submit, the work is all protocol: authenticate against the user's PDS, resolve their DID, and createRecord with byte-indexed facets for every link, mention and hashtag. Set that against Instagram's app review, where the plumbing is easy and the approval is the wait.

Authenticate against the PDS and resolve the DID
Connect once - we manage the session and DID
Links and hashtags need byte-indexed facets
We compute facets - @handles and #tags just work
Images upload as blobs, then get referenced
Pass a media URL; we upload and embed it
Threads are reply records with root and parent refs
Send containers[]; we set the refs in order
429s once you cross the points budget
We queue and retry under the ceiling

Everything Bluesky supports, through one endpoint

Every content type available on Bluesky via Outstand today.

Text posts

Images (up to 4)

Threads

Link cards

PublishingSchedulingAnalyticsMedia handlingCommentsDirect messages

Plus automatic rich-text facets. Reading or replying to replies is not yet exposed.

Copy, paste, ship

The same accounts array also fans out to X, Threads and LinkedIn - one request, many platforms.

Authenticate against Bluesky directly - no app registration

bash
# No client ID, no client secret, no approved app - a handle and an app
# password from bsky.app/settings/app-passwords are the whole credential.
curl https://bsky.social/xrpc/com.atproto.server.createSession \
  -H "Content-Type: application/json" \
  -d '{ "identifier": "you.bsky.social", "password": "'"$BLUESKY_APP_PASSWORD"'" }'
# → { "did": "did:plc:...", "accessJwt": "...", "refreshJwt": "..." }
# accessJwt lasts ~2 hours; refreshJwt renews it.

Post with images (up to 4)

bash
curl https://api.outstand.so/v1/posts/ \
  -H "Authorization: Bearer $OUTSTAND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "launch day 📸",
    "accounts": ["YOUR_BLUESKY_ACCOUNT_ID"],
    "media": [
      { "url": "https://media.outstand.so/1.jpg", "filename": "1.jpg" },
      { "url": "https://media.outstand.so/2.jpg", "filename": "2.jpg" }
    ]
  }'

Post a thread

bash
curl https://api.outstand.so/v1/posts/ \
  -H "Authorization: Bearer $OUTSTAND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accounts": ["YOUR_BLUESKY_ACCOUNT_ID"],
    "containers": [
      { "content": "a thread on building in the open 🧵" },
      { "content": "1/ share early" },
      { "content": "2/ listen, then ship" }
    ]
  }'

Schedule a post (up to 30 days out)

bash
curl https://api.outstand.so/v1/posts/ \
  -H "Authorization: Bearer $OUTSTAND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "content": "going live Friday ⏰", "accounts": ["YOUR_BLUESKY_ACCOUNT_ID"], "scheduledAt": "2026-07-03T16:00:00Z" }'

Read analytics

bash
curl https://api.outstand.so/v1/posts/{id}/analytics \
  -H "Authorization: Bearer $OUTSTAND_API_KEY"
# → likes, reposts, replies, quotes

Live in three steps

From signup to your first Bluesky post in about five minutes.

1

Connect Bluesky

Your user pastes a handle and an app password from bsky.app/settings/app-passwords. No developer app, no review.

2

Call POST /v1/posts/

Send text and media with accounts: ["YOUR_BLUESKY_ACCOUNT_ID"]. Use containers[] for a thread, or scheduledAt to schedule.

3

We do the atproto work

Session, DID, facets, blob upload, reply refs and retries - returned with the published post URI.

Bluesky API pricing and access

The shortest access section on this site, because there is almost nothing to tell you: Bluesky charges nothing and approves nobody. What is left is rate limits, and they are published.

What Bluesky charges
Nothing. No licence fee, no paid tier, no per-call price for the atproto APIs. The rate limits below are the only ceiling.
App review
None, and no queue to join. atproto registers clients automatically: a client ID is just an https URL serving a public JSON metadata file, with no client secret shared at all. Set against Instagram's app review, that is publishing a file versus waiting on a verdict.
How you authenticate
Two routes. A handle plus an app password posted to com.atproto.server.createSession is the documented quickstart, returning a two-hour access JWT with a refresh JWT behind it. Full atproto OAuth - PKCE, DPoP, public client metadata - is the other. Outstand uses app passwords.
Rate limits
Writes run on a points budget: 5,000 points an hour and 35,000 a day per account, at 3 points per create - so 1,666 new records an hour, 11,666 a day. Separately, 3,000 requests per 5 minutes per IP, and createSession is capped at 30 per 5 minutes.
Media limits
A PDS rejects any blob over 52,428,800 bytes (50 MB); the image embed lexicon caps lower, so Outstand holds images to 2 MB each, 4 per post, and routes video through Bluesky’s video service instead. A post carries images or a video, never both.
Outstand pricing
$19/month including 3,000 posts, then $0.007/post - dropping to $0.005/post at volume. No per-seat fees and no annual lock-in. Full pricing is on the homepage.

So why pay us for Bluesky at all? On its own, you would not - going direct is a weekend of work and costs nothing, and we would rather say so. What you buy is the other 11 platforms, the ones with the audits and the review queues, reached through the request you already wrote for Bluesky.

More than a Bluesky wrapper

One integration that grows with everything you ship next.

One API, 12 platforms

One request publishes to Bluesky and 11 more networks. Same JSON shape everywhere - learn one API, ship them all.

App password, not OAuth

Bluesky has no OAuth app for us to get approved, so there is no managed-credential advantage to buy here. Your user brings their own app password and owns it.

Built for scale

Intelligent rate limiting, automatic token refresh, webhook events and media processing.

Honest pricing

$19/mo includes 3,000 posts, then from $0.007/post. No seats, no annual lock-in.

What you can build

Same endpoints, same data shapes - pick what you ship.

Social schedulers

Let your users queue and auto-publish Bluesky content from your app.

AI agents

Give Claude or GPT a tool to post to Bluesky. MCP server included.

Analytics dashboards

Pull Bluesky reach and engagement alongside every other platform.

Agencies & white-label

Run Bluesky posting for clients under your own brand and app.

Bluesky API FAQ

The questions developers ask before they build.

Does Bluesky have an official API?

Yes - the open AT Protocol. There is no central endpoint, though: every account lives on a PDS, and writes go to that account’s own host.

Is the Bluesky API free?

Yes. No licence fee, no paid tier, no per-call charge. The rate limits are the only ceiling, and they are the same ones any account has.

Do I need approval or an API key to post to Bluesky?

No. No developer app, no use-case form, no review queue. atproto registers OAuth clients from a public JSON file served at your client ID URL, with no client secret at all - and the app-password route needs not even that.

Do I need an app password to post to Bluesky?

For Outstand, yes - created at bsky.app/settings/app-passwords and pasted in. Bluesky has no OAuth app for us to register on your behalf, so unlike every other network we connect there is no managed OAuth shortcut here, and no app review to skip either.

What are the Bluesky API rate limits?

A points budget on writes: 5,000 points an hour and 35,000 a day per account, at 3 points per create - so 1,666 new records an hour at most. Plus 3,000 requests per 5 minutes per IP. Over the line is an HTTP 429, and Outstand queues and retries underneath it.

Can I post images and video to Bluesky via API?

Yes - up to 10 images, or one video, per post. Outstand uploads each as a blob and embeds it in the post record.

Do links, mentions and hashtags become clickable?

Yes. The AT Protocol needs byte-indexed facets for that; Outstand computes them, so @handles and #hashtags just work.

Can I post a thread on Bluesky via API?

Yes. Send a containers[] array - the first is the root post, each one after is a reply with the right root and parent refs.

Can I schedule Bluesky posts via the API?

Yes. Add a scheduledAt ISO-8601 timestamp up to 30 days ahead - no cron or queue on your side.

Can I delete a Bluesky post via the API?

Yes. Bluesky supports deleting records, and Outstand exposes it through DELETE /v1/posts/{id}/remote.

Ship Bluesky posting today

Grab an API key and publish your first Bluesky post in the next five minutes. 3,000 posts included, then $0.007/post.