Last updated: September 2026

Can you post to X and Bluesky at the same time?

Yes. A browser extension, a scheduler or a single API call can publish one draft as a native post on X and on Bluesky together. The catch is that the two networks count characters, links and images differently, so a post can fit one and not the other.

Below: the three routes and what each costs you, the limits that differ, and the one call that does it from code.

Three ways to do it

Browser extension

Good: Posts from the page you are already on. Usually free or cheap, and nothing runs on a server.

Tradeoff: Your browser has to be open when the post goes out, so there is no real scheduling, and it only covers you, not a script or an agent.

Scheduler

Good: One draft, both networks ticked, a time picked. Runs whether your laptop is open or not, and shows you what went where.

Tradeoff: A subscription. Check that it connects Bluesky over OAuth rather than asking for an App Password, and that it reports per network.

API

Good: One HTTP call from a script, a cron job or an AI agent. A platforms array picks the networks and the response tells you the outcome on each.

Tradeoff: You write a few lines of code, and your code should handle a post that lands on one network and is skipped on the other.

The question to ask any tool

What happens when the post fits X and not Bluesky? A good answer is that it posts where it fits and tells you where it did not. A bad answer is silence, a truncated post, or the whole send failing.

Where the limits differ

As of September 2026. The text rows are the ones that bite: X gives a link a flat 23 characters, Bluesky counts it in full when it arrives through the API. Paste a draft into the Bluesky character counter to see where it lands before you send it.

Limit
X
Bluesky
Text length
280 weighted, 25,000 on Premium
300 graphemes, plus a 3,000-byte ceiling
A link
Always counts 23
Full length via the API
Emoji and CJK
Most count 2
One grapheme each
Images
Up to 4, 5MB each
Up to 4, 2,000,000 bytes each
Alt text
Up to 1,000
Up to 2,000 in the app
Video via OpenTweet
Yes
No
Threads
Real reply chain
Real reply chain

OpenTweet makes links and mentions clickable on Bluesky but does not attach link cards, does not shorten links and does not split long text. A post over 300 graphemes is skipped on Bluesky with the reason recorded and still publishes on X. More on the link rule in does a link count toward the Bluesky limit, and on images in the Bluesky image size limit.

The one call that does it

One bearer key, one endpoint, a platforms array. Each network is delivered through its own API, so what lands on Bluesky is a Bluesky post.

bash
curl -X POST https://opentweet.io/api/v1/posts \
  -H "Authorization: Bearer ot_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Now posting to X and Bluesky from one draft.",
    "platforms": ["x", "bluesky"],
    "publish_now": true
  }'

Swap publish_now for scheduled_date to schedule it. The response carries a results array with one entry per network, so a post that published on X and was skipped on Bluesky says so. The full reference is in one endpoint for X and Bluesky. The same tools are on the hosted MCP server at https://mcp.opentweet.io/mcp if an AI agent is doing the posting.

Threads stay threads

Send "is_thread": true, put the first post in text and the replies in a thread_tweets array. The thread publishes as a real reply chain on X and a real reply chain on Bluesky. Nobody on Bluesky sees one long post or a link to an X thread.

bash
curl -X POST https://opentweet.io/api/v1/posts \
  -H "Authorization: Bearer ot_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "What we shipped this week, a thread.",
    "is_thread": true,
    "thread_tweets": [
      "1. Cross-posting to Bluesky.",
      "2. Per-network results in the API."
    ],
    "platforms": ["x", "bluesky"],
    "scheduled_date": "2026-09-20T15:00:00Z"
  }'

Every post in the thread must fit both networks. Keep each one under 280 weighted characters and 300 graphemes and it goes out intact on both. If you post from the dashboard instead, the cross-posting how-to walks through connecting your handle.

7-day free trial. Cancel anytime.

Frequently asked questions

Can you post to X and Bluesky at the same time?

Yes. A tool that holds a connection to each network can publish one draft as a native post on both, at the same moment or at a scheduled time. It is two real posts, one per network, not a link from one to the other.

What app posts to X and Bluesky at once?

Any scheduler that connects both accounts. In OpenTweet you tick X and Bluesky on a draft, or send platforms: ["x","bluesky"] to the API, and each network gets its own post with its own result. Plans start at $11.99 a month, Bluesky is on every plan, and there is a 7-day trial.

What happens if my post is too long for Bluesky?

In OpenTweet it is skipped on Bluesky with the reason recorded and still posts on X. Bluesky allows 300 graphemes, X allows 280 weighted characters or 25,000 on Premium, so a long Premium post fits X and not Bluesky. OpenTweet does not auto-split or truncate it for you.

Do threads stay threads on both networks?

Yes. A thread publishes as a real reply chain on X and a real reply chain on Bluesky, each post replying to the one before it on its own network. Every post in the thread has to fit the limit of each network it goes to.

Do links look the same on both?

Not quite. X counts every URL as 23 characters. Bluesky counts a link at its full length when it is sent through the API, and OpenTweet makes it clickable but does not attach a link card or shorten it. A long URL can push a post over the Bluesky limit that fits on X.

Post to X and Bluesky from one draft

Deepest on X, Bluesky on every plan. From $11.99 a month.

7-day free trial. Cancel anytime.