Bluesky API for developers

The Bluesky API,without AT Protocol work

Publish posts, images, video and threads to Bluesky, with alt text, link cards and clickable links. Read likes, reposts and followers. One API key, and the account signs in with its handle.
Webhooksyour-app.com/hooks
post.scheduledpost 1024just now200
post.publishedpost 10192 h ago200
post.approvedpost 10193 h ago200
POST/v1/posts/createapplication/json
01{
02 "content": "New: Alt text on every image",
03 "accounts": ["bluesky"],
04 "media_urls": [
05 {
06 "url": "https://cdn.example.com/alt-text.png",
07 "alt": "The ALT button on an image in the composer"
08 }
09 ],
10 "schedule_at": "2026-10-22T18:00:00Z"
11}
Sending201 Created412 ms
Send
12{
13 "data": {
14 "id": "1024",
15 "status": "scheduled",
16 "app_url": "https://app.omnisocials.com/create-post/1024"
17 }
18}
A request schedules a Bluesky post with an image and its alt text for Thu at 18:00; it appears in the OmniSocials calendar and the webhook post.scheduled fires.
Your coding agent runs the same calls through the CLI

Skip the AT Protocol plumbing

Bluesky has no app review, but posting from your own code still means an OAuth client with DPoP-bound tokens, handle lookups, blob uploads under 2 MB, a separate video service and facets for every link. OmniSocials already built it.
On your own
OAuth clientPDS lookupDPoPToken refreshBlobsVideo jobsThread refsFacetsFirst post
On OmniSocials
Sign inAPI keyPOSTFirst postOAuth, uploads and facets done for you

Every format, one request

Text posts, images, video and threads share one request shape. Add media URLs with their alt text, or a link for a card, and a time. OmniSocials checks the post against Bluesky’s rules before it goes out.
OmniSocials
@omnisocials.bsky.social
New: Alt text on every image
The ALT button on an image in the composer
POST/v1/posts/create
01{
02 "content": "New: Alt text on every image",
03 "accounts": ["bluesky"],
04 "media_urls": [
05 {
06 "url": "https://cdn.example.com/alt-text.png",
07 "alt": "The ALT button on an image in the composer"
08 }
09 ],
10 "schedule_at": "2026-10-22T18:00:00Z"
11}
201 Createdstatus: "scheduled"
Text and link cards
300 characters, counted the way Bluesky counts them. A post without media gets a card for its first link.
content
Images and video
Up to 10 images or one video, each with alt text. Images up to 10 MB are compressed to fit Bluesky’s 2 MB limit.
media_urlsalt
Threads
2 to 25 posts in one request, each with its own media or link card, chained as replies.
bluesky.thread_parts

Whole threads in one request

Connect the account with its handle once. Then put 2 to 25 posts in bluesky.thread_parts: OmniSocials chains them as replies, so they read as one thread, each with its own media or link card.
Connect Bluesky
Enter the handle of your account. A custom domain or another server works too.
username.bsky.social
You sign in on Bluesky next.
POST/v1/posts/createapplication/json
01{
02 "content": { "default": "" },
03 "accounts": ["bluesky"],
04 "schedule_at": "2026-10-25T10:00:00Z",
05 "bluesky": {
06 "thread_parts": [
07 { "text": "One request, the whole thread." },
08 { "text": "The docs: https://docs.omnisocials.com/platforms/bluesky" },
09 {
10 "text": "Each post keeps its own media.",
11 "media_urls": ["https://cdn.example.com/thread.png"]
12 }
13 ]
14 }
15}
201 Created388 msstatus: "scheduled"
Sign in with your handle
The account signs in on Bluesky over OAuth, no app password to make. Custom-domain handles and accounts on other servers work too.
2 to 25 posts
Each post holds up to 10 images or one video, with alt text. If publishing stops halfway, the retry picks up where the thread stopped.
bluesky.thread_parts
Cards, links and tags
Links, mentions and hashtags turn clickable, and a post without media gets a card for its first link.
The Bluesky account connects with its handle, then one request schedules a three-post thread that opens in the OmniSocials composer.

Connect with a handle, post from code

Type the account’s handle in OmniSocials once and sign in on Bluesky. Create an API key, and your code posts and reports for that account.
OmniSocials
Name, icon, social channels and who can open this workspace.
GeneralMembersClientsApproval workflowsAPI
Workspace iconJPG or PNG, up to 2 MB.
Workspace nameOmniSocials
Social channels
The accounts this workspace posts to.
Connected
@omnisocials_
Instagram
@omnisocials_
Threads
OmniSocials
LinkedIn Page
@omnisocials_
X
Add a channel
BlueskyPosts & Threads
FacebookPosts, Stories & Reels
LinkedIn ProfilePosts & Carousels
YouTubeShorts
TikTokVideos & Photo posts
PinterestPins & Carousels
MastodonAny server
Google BusinessUpdates, Events & Offers
TelegramChannels and groups
Coming soonDiscordTumblrWordPressWhopSlack
Danger zone
Delete workspace
Deletes this workspace with its posts, media and settings for good. This cannot be undone.
OmniSocials
Name, icon, social channels and who can open this workspace.
GeneralMembersClientsApproval workflowsAPI
API keys
Keys that can only reach this workspace.
NameKeyLast used
Claude
omsk_live_••••7c2eOct 20, 2026
GET/v1/accounts?platform=bluesky
200 OK88 ms
01{
02 "data": [
03 {
04 "id": "4127_bluesky",
05 "platform": "bluesky",
06 "username": "omnisocials.bsky.social",
07 "display_name": "OmniSocials",
08 "content_types": ["post"],
09 "status": "active"
10 }
11 ],
12 "workspace_name": "OmniSocials"
13}
Authorization: Bearer $OMNISOCIALS_API_KEY
Your handle, over OAuth
No app password to create or paste. Custom-domain handles and self-hosted servers work.
A key per workspace
A key only reaches its own workspace. Each workspace connects one Bluesky account.
What the account can post
The accounts call lists the account with its handle and the formats it takes.
GET /v1/accountscontent_types

“I really like this app. I’ve tried quite a few other tools, but none of them managed to hit the sweet spot of simplicity and pricing the way Omnisocials does.”

Jens Schumacher
Co-founder of Released.so

Read what Bluesky reports

Likes, replies, reposts, quotes and bookmarks per post, summed across a thread, and the account’s followers per day. The API returns the same numbers the app charts.
AnalyticsReports
AllInstagramFacebookTikTokThreadsBlueskyLinkedIn PageX
AddEdit
Last 30 days
Followers
2864.8%
Engagements
42522.1%
Published Posts
716.7%
Posts7Accounts7
Post
Channels
Impressions
Likes
Comments
Shares
Saves
Eng. rate
Post thumbnail
New: Best times to post, worked out from your own posts.
Oct 21, 2026
bluesky
N/A486119N/A
Building on OmniSocials? Start with the API docs.
Oct 20, 2026
bluesky
N/A21456N/A
Post thumbnail
Sidebar update: 1. New Home tab 2. New Drafts tab Save a post as a draft, find it waiting for you under Drafts. Simple.
Oct 20, 2026
bluesky
N/A37574N/A
Post thumbnail
New: Bluesky threads
Oct 19, 2026
bluesky
N/A5291411N/A
Post thumbnail
New in OmniSocials: Notable Days
Oct 19, 2026
bluesky
N/A29365N/A
Sign in with any handle, including custom domains.
Oct 13, 2026
bluesky
N/A33793N/A
Post thumbnail
New: OmniSocials SDKs in 8 languages
Sep 30, 2026
bluesky
N/A416108N/A
GET/v1/analytics/posts/1019
Authorization: Bearer $OMNISOCIALS_API_KEY
200 OK143 ms
01{
02 "data": {
03 "post_id": "1019",
04 "platforms": {
05 "bluesky": {
06 "metrics": {
07 "likes": 48, "comments": 6,
08 "reposts": 11, "quotes": 3,
09 "bookmarks": 9
10 },
11 "thread_parts": 1
12 }
13 }
14 }
15}
Per post and per thread
Likes, replies, reposts, quotes and bookmarks. A thread reports the sum of its posts, and thread_parts says how many.
/analytics/posts/:id
Per account and workspace
A daily snapshot of the account: followers, following and posts. Plus a workspace overview.
/analytics/accounts/analytics/overview
Best times to post
Days and hours worked out from your own Bluesky history, once 15 of your posts are analyzed.
/analytics/best-times
Under the hood

Built for production

Signed webhooks, automatic retries, SDKs in 8 languages and a key per workspace. Create a key and send your first request in minutes.
Webhooks
Signed events for every post
Retries
Failed posts retry on their own
SDKs
One request shape in 8 languages
API keys
One key per workspace
Agents
Your coding agent posts too

Bluesky’s rules, in one place

OmniSocials checks every post against them before it reaches Bluesky, so a post that is too long fails in your request, not at publish time.
Text300 characters, an emoji counts as one
MediaUp to 10 images or one video, not both
ImagesUp to 10 MB, compressed under Bluesky’s 2 MB
VideoUp to 10 minutes and 300 MB
Alt text1,500 characters per image or video
Thread2 to 25 posts, each with its own media
Link cardThe first link of a post without media
Rate limit100 requests a minute per API key
AccountsOne Bluesky account per workspace

Your first thread in three steps

About five minutes from sign-up to a scheduled thread on Bluesky. Then hand the key to your coding agent.
Create an API key
Start your trial, open Settings, API and create a key. It is shown once.
Settings › API
Step 1
Connect your account
Type your handle in OmniSocials once and sign in on Bluesky. Then list it from your code.
GET /v1/accounts
Step 2
Send your first thread
Put the posts in bluesky.thread_parts and add schedule_at, or publish right away with create-and-publish.
POST /v1/posts/create
Step 3

Frequently
Asked Questions

Robert Ligthart
Robert LigthartFounder of OmniSocials
Ask me a question

Robert Ligthart
Still have a question?Ask Robert, the founder
Ask

Ship your Bluesky
integration this week.

From $10 per seat a month, API included. 14-day free trial.
https://docs.omnisocials.com