Bluesky posting API for social media agents, no ATProto records
Blotato's Bluesky posting API publishes a post or a thread from plain text and media URLs. You never build an AT Protocol record.
Bluesky's own API is open and free. Its record-and-facet post model is not shaped like the other eight platforms, and that is the gap this page closes.
- REST
POST https://backend.blotato.com/v2/posts- Auth
blotato-api-key: YOUR_API_KEY- MCP
https://mcp.blotato.com/mcp
Updated September 2026. API access is included on every paid plan and excluded from the free trial.
What the Bluesky posting API does in Blotato
POST /v2/posts with targetType bluesky needs no extra target fields. 300 characters per post, up to 4 images, or 1 video whose URL ends in .mp4, .webm, or .mov, since Blotato recognizes video by the extension. Threads go in content.additionalPosts. Analytics come back through GET /analytics, as on the other analytics platforms.
Threads in one request
The first post is content.text. Each additionalPosts entry is the next reply, chained for you.
Four images or one video
Recommended image sizes are 1080 by 1080, 1200 by 627, or 627 by 1200. One video per post in MP4, WebM, or MOV.
Post analytics
GET /analytics ranks your Bluesky posts by views, reach, likes, or comments. GET /posts/:id/analytics returns one post over time.
Scheduling into the calendar
scheduledTime queues the post. useNextFreeSlot takes the next open Bluesky slot in your calendar.
Where Bluesky's post model differs, and why you will not notice
Bluesky runs on AT Protocol. A post is a record in your repository, links and mentions are facets you would normally construct by byte offset, and images are embeds. Through Blotato you send text and media URLs in the same envelope you use for X and Threads, and the record is built on our side.
POST https://backend.blotato.com/v2/posts
{
"post": {
"accountId": "98432",
"content": {
"text": "Shipped: our agent now polls post status instead of trusting the 200.",
"mediaUrls": ["https://cdn.example.com/status-log.png"],
"platform": "bluesky",
"additionalPosts": [
{ "text": "Write-up on what that caught in week one.", "mediaUrls": [] }
]
},
"target": { "targetType": "bluesky" }
}
}
Response: { "postSubmissionId": "uuid" }, a receipt. Poll GET /posts/:postSubmissionId for published or failed.
Every field: help.blotato.com/api/llm. Bluesky's own reference: the Bluesky API docs.
Why Bluesky builders use Blotato when the AT Protocol API is free
- Free is not the cost. A ninth post shape is. For a Bluesky-only integration the flat price buys little, and it is fair to say so. The trade shows up at the second platform, when every network has its own auth, its own upload, and its own record format.
- One session, held for you. You connect Bluesky through the login flow once. Blotato holds the session and the media upload, so an agent never manages a Bluesky credential.
- The thread envelope is shared with X and Threads. The same additionalPosts array publishes on all three. Change targetType and post the same thread three times.
Bluesky, first request to published
- Connect Bluesky. Sign in to Blotato and connect the Bluesky account.
- Generate an API key. Generate the key from the API tab in Settings. The trial excludes the API, so the key starts the paid Starter plan right away.
- Fetch the accountId. GET /users/me/accounts?platform=bluesky.
- POST and poll. Send the request above and poll GET /posts/:postSubmissionId until it reads published. If a video URL lacks an .mp4, .webm, or .mov extension, Blotato will not treat it as video, so fix the URL before you post.
From an agent instead of code, the Bluesky tools are on the MCP server at https://mcp.blotato.com/mcp.
Setup per client is on the Bluesky MCP server page, and the walkthrough of
posting to Bluesky from Claude shows the prompt-to-post flow. A prompt like
"Post this to Bluesky with the screenshot attached, then add a reply linking the write-up." calls the same endpoint this page documents.
Bluesky posting limits and price
Blotato publishes no Bluesky-specific daily cap in its posting limits, so Bluesky's own rate limits are the ceiling.
| Bluesky limit | Value through Blotato |
|---|---|
| Blotato daily cap | none; Bluesky's limits apply |
| Text | 300 characters |
| Images | up to 4; 1080 by 1080, 1200 by 627 or 627 by 1200 recommended |
| Video | 1 per post, MP4, WebM or MOV; the URL must end in the extension |
Bluesky charges nothing for its API. What it does cost to run a Bluesky integration yourself, rate limits included, is the subject of the Bluesky API pricing guide.
On Bluesky, this API covers publishing, scheduling and analytics. Comments, DMs and DM automation are Instagram and Facebook only. Caps are listed at help.blotato.com/settings/social-accounts.
MCP tools that reach Bluesky
The tool names an agent calls on the MCP server for this platform, verbatim from the server's tool list. The REST endpoint behind each one is in the API reference.
blotato_list_accountsblotato_create_postblotato_get_post_statusblotato_list_postsblotato_list_schedulesblotato_get_scheduleblotato_update_scheduleblotato_delete_scheduleblotato_create_presigned_upload_urlblotato_list_top_postsblotato_get_post_analytics
Bluesky posting API FAQs
01 Is there a Bluesky API for posting?
02 Do I need to build AT Protocol records to post to Bluesky through Blotato?
03 Can I post a thread to Bluesky in one API call?
04 Why pay for an API when Bluesky's is free?
Same key, eight more platforms
Bluesky is one targetType on the same endpoint. The social media API page has the comparison table of every platform's required fields and caps.
Blotato Your AI Agent still can't post to social media.
Point Claude, ChatGPT, n8n, or your own agent at Blotato's MCP and that's fixed: 9 platforms behind one key, flat $29/mo.
Connect your agentFlat pricing. Cancel anytime.