A Bluesky post is text with up to four images or one video. Send thread to publish several posts,
each a reply to the one before. Bluesky publishes synchronously, so the response
is the finished post. Bluesky's API is free: nothing is billed per post.
Links, @mentions, and #hashtags in text become links on Bluesky. A mention
of a handle that doesn't exist stays plain text.
Body
platform"bluesky"RequiredaccountIduuidRequired- A connected Bluesky account in your organization.
profileIduuid- Optional, because accountId names its profile. If you pass both, they must agree.
textstringRequired- Up to 300 characters, counted as a reader sees them (an emoji is one), and 3,000 bytes. Links count at full length. Send
""for an images-only post. imagesobject[]- Up to 4, each
{ content_type, base64, altText }withimage/jpeg,image/png, orimage/webp. Images over 2 MB are resized to fit, and the response lists them inresizedImages.altTextis optional but recommended. videoobject- One MP4, never with
images:{ content_type: "video/mp4", base64, altText }or{ url, altText }for a public HTTPS URL, up to 100 MB. Bluesky processes it before the post is created, which can take a minute. Bluesky limits videos per account per day and needs a verified email first; past that, this returns422 upload_limit_exceededwith Bluesky's reason. langsstring[]- Up to 3 language tags, such as
enorpt-BR, which Bluesky uses for feeds and translation. threadobject[]- Up to 24 further posts, each
{ text, images, video }with the same rules, published in order as replies.
201 when every post is live. providerId is the post's AT URI.
A thread that fails part-way returns 207 with status: "partial", exactly as
for X.