Skip to content
postpeg

Bluesky API

Post and schedule on Bluesky through one API

postpeg publishes to Bluesky alongside nine other networks from a single request. Posts go up to 300 characters with up to 4 images, and can be scheduled up to a year ahead.

  • Publish
  • Schedule
  • Bluesky112/300

    Scheduled posts now retry on their own when a network has a bad minute. Changelog: https://example.com/changelog

    Ready

The example below, checked against Bluesky’s rules

Bluesky is a natural pair with X and Threads: the same short post can go to all three at once, and postpeg checks each network’s own limit before sending, so one long post doesn’t quietly fail on the strictest network.

What you can do on Bluesky

  • Publish. Publish to Bluesky now with POST /v1/posts, alone or in the same request as any of the other networks. More on the Posting API.
  • Schedule. Schedule up to a year ahead with scheduled_at, and cancel with DELETE /v1/posts/{id} any time before it goes out. More on the Scheduling API.

Not available on Bluesky: analytics and comments and direct messages. The coverage table shows what each network supports.

Bluesky’s rules, checked before sending

A Bluesky post can have up to 300 characters, counted as people see them (an emoji is one). Media is optional: up to 4 images. postpeg runs these checks on every request, so a post that won’t fit Bluesky is refused with a 400 before anything is published, on any network.

Bluesky limits as postpeg checks them
Max text300 characters
MediaOptional
Images4
VideosNone
Images and video togetherNone
Required optionsNone
Connects withApp password

Connecting Bluesky accounts

Bluesky connects differently from the other nine: instead of an OAuth screen, the owner creates an app password in Bluesky (Settings → Privacy and security → App passwords) and you send it with their handle to POST /v1/accounts/bluesky. It’s never their real password.

curl https://api.postpeg.com/v1/accounts/bluesky \
  -H "Authorization: Bearer $POSTPEG_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "profile_id": "prof_mfz0b7q2k9x4c1v8n3m6a0s5d2",
    "handle": "acmecoffee.bsky.social",
    "app_password": "abcd-efgh-ijkl-mnop"
  }'

The account comes straight back as active, ready to post to.

If Bluesky ever expires a login, the account turns reconnect_required so you can ask its owner to connect again. More in Profiles and accounts.

Example: a scheduled Bluesky post

One request, with an Idempotency-Key so a retry on your side never posts twice. To post to Bluesky and other networks together, add more ids to account_ids.

curl https://api.postpeg.com/v1/posts \
  -H "Authorization: Bearer $POSTPEG_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: bluesky-example-2026-10-01" \
  -d '{
    "account_ids": [
      "acc_mfz21c8w3e6r0t4y2u9i5o1p7a"
    ],
    "content": "Scheduled posts now retry on their own when a network has a bad minute. Changelog: https://example.com/changelog",
    "media": [],
    "scheduled_at": "2026-10-01T09:00:00Z",
    "platform_options": {}
  }'
Response · 201 Created
{
  "id": "post_mfz2k3v8q1w5e9r4t7y0u2i6o3",
  "content": "Scheduled posts now retry on their own when a network has a bad minute. Changelog: https://example.com/changelog",
  "media": [],
  "platform_options": {},
  "status": "scheduled",
  "scheduled_at": "2026-10-01T09:00:00.000Z",
  "targets": [
    {
      "account_id": "acc_mfz21c8w3e6r0t4y2u9i5o1p7a",
      "platform": "bluesky",
      "status": "pending",
      "platform_post_id": null,
      "url": null,
      "error": null,
      "attempts": 0,
      "published_at": null
    }
  ],
  "created_at": "2026-09-24T14:02:11.418Z"
}

From 09:00 the target moves through queued and publishing to published with the live url, or to failed with the reason in error. Temporary failures are retried, up to 5 attempts with growing waits. See Publishing for every status.

Questions

How do I schedule a Bluesky post?
Add scheduled_at (ISO 8601, up to a year ahead) to POST /v1/posts. The post waits as scheduled and goes out within a minute of that time. DELETE /v1/posts/{id} cancels it any time before.
What happens if a post breaks Bluesky’s rules?
postpeg checks the text (up to 300 characters), the media before anything is sent. A post that doesn’t fit comes back as a 400 with every problem listed in issues, and nothing is published on any network.
Which Bluesky features does postpeg support?
Publishing, scheduling. Analytics and comments and direct messages are not available on Bluesky; asking for them returns a 400 naming the feature.
Can I post video to Bluesky through postpeg?
Not today. Bluesky posts through postpeg take text and up to 4 images. A video for a Bluesky account is refused with a 400 before anything is sent.
What does a Bluesky app password look like?
Four groups of four lowercase letters or digits, like abcd-efgh-ijkl-mnop. postpeg refuses anything else, so an account password can’t be sent by mistake.

The same request publishes to all ten networks. Often paired with Bluesky:

Or see all 10: X, Instagram, Facebook, LinkedIn, TikTok, YouTube, Threads, Pinterest and Google Business, in the platform reference.

Send your first post in a few minutes

The 7-day trial has every feature and 3 connected accounts, with no card. The quickstart takes you from a key to a published post.