Last updated: September 2026

X vs Bluesky vs LinkedIn post limits (2026)

X allows 280 characters (25,000 on Premium), weighted so a link costs 23 and most emoji cost 2. Bluesky allows 300 graphemes, and a link counts at full length. LinkedIn allows 3,000 characters counted in UTF-16 code units, so an emoji costs 2. Plain text under 280 characters, with every link counted at full length, fits all three.

The table below covers the limits that decide whether one draft lands everywhere. The figures are the ones OpenTweet checks before it publishes, as of September 2026. Networks change their limits, so check the date.

The limits side by side

SpecXBlueskyLinkedIn
Text limit280 characters, or 25,000 on X Premium300 graphemes, plus a 3,000-byte ceiling3,000 characters
How text is countedWeighted charactersGraphemes (one visible character each)UTF-16 code units
LinksAny URL counts as 23Counts at full length when posted through the APICounts at full length
EmojiMost count as 2 (so do CJK characters)Count as 1 graphemeCount as 2
SpacesCountCountCount
Images per postUp to 4Up to 4Up to 4 from the OpenTweet composer
Image size5MB each2,000,000 bytes each. OpenTweet resizes larger images to fitOpenTweet resizes oversized images before upload
Alt textUp to 1,000 charactersUp to 2,000 characters in the Bluesky appNot listed
Video via OpenTweetYesNo, skipped with a reasonNot yet, skipped with a reason
ThreadsNative threadsReal reply-chain threadsNo threads. A thread becomes one post, parts joined with blank lines
Hashtags and mentionsBecome linksBecome linksPublish as plain text
Account typeYour X accountYour Bluesky accountPersonal profile only

"Not listed" means we do not state a figure for it here. LinkedIn's "see more" fold shows roughly the first 2 or 3 lines of a post; LinkedIn publishes no official number.

What happens to one draft on each network

When you send one draft to all three networks with OpenTweet, each network is checked against its own limit. A draft that is too long for a network is skipped there with a reason and still goes out on the others. Nothing is truncated.

A 250-character post. No link, no emoji.

X
Published
Bluesky
Published
LinkedIn
Published

A 290-character post.

X
Rejected. The API refuses the whole request with 400 validation_failed, unless the account has Premium (25,000)
Bluesky
Nothing publishes while X is a target. On its own it fits, at 290 of 300
LinkedIn
Nothing publishes while X is a target. On its own it fits

240 characters of text, a space, and a 60-character link. 301 characters as typed.

X
Published. The link counts as 23, so it weighs 264
Bluesky
Skipped. The link counts in full, so it is 301 of 300
LinkedIn
Published

A 275-character post that includes 10 simple emoji.

X
Rejected without Premium. Each emoji weighs 2, so it is 285 of 280
Bluesky
Nothing publishes while X is a target. On its own, each emoji is 1 grapheme, so it is 275 of 300
LinkedIn
Nothing publishes while X is a target. On its own, 285 code units of 3,000

A 6-part thread, every part under 280 characters.

X
Published as a 6-post thread
Bluesky
Published as a 6-post reply chain
LinkedIn
Published as one post with the parts joined by blank lines, if the combined text fits in 3,000

A post with a video.

X
Published with the video
Bluesky
Skipped with a reason
LinkedIn
Skipped with a reason

A post with #buildinpublic and an @mention.

X
Published. Both are links
Bluesky
Published. Both are links
LinkedIn
Published. Both show as plain text

A post with four 3MB images.

X
Published with 4 images (each under 5MB)
Bluesky
Published. OpenTweet resizes each image under 2,000,000 bytes first
LinkedIn
Published with 4 images

What a skip looks like

Through the API, every network gets its own entry in results, with a status of published, failed or skipped. A skipped entry carries a skip_reason. This is the 412-character post from the cross-posting docs: fine on LinkedIn and on a Premium X account, too long for Bluesky.

json
{
  "posts": [
    {
      "id": "66f0a1c2e4b0a1c2e4b0a1c2",
      "results": [
        {
          "platform": "x",
          "status": "published",
          "url": "https://x.com/you/status/1834000000000000001"
        },
        {
          "platform": "bluesky",
          "status": "skipped",
          "skip_reason": "This post is 412 characters, over the 300 Bluesky allows."
        },
        {
          "platform": "linkedin",
          "status": "published",
          "url": "https://www.linkedin.com/feed/update/urn:li:share:7300000000000000000/"
        }
      ]
    }
  ]
}

Writing one draft that fits all three

  • Stay at or under 280 characters, counted as typed. Count every link at its full length, because that is how Bluesky counts it. A draft that passes that test also passes X, where the link costs 23, and LinkedIn, which allows 3,000.
  • Count each emoji as 2. X weighs most emoji at 2 and LinkedIn counts them as 2 code units. Bluesky counts them as 1, so emoji only break the other two.
  • Put the point in the first line. LinkedIn folds a post after roughly 2 or 3 lines, and on X and Bluesky the first line is what people read in the feed.
  • Do not rely on hashtags or mentions for LinkedIn. They become links on X and Bluesky but publish as plain text on LinkedIn.
  • Keep video for X. OpenTweet does not post video to Bluesky or LinkedIn yet, so a video post is skipped on both.
  • Need different text per network? Send separate posts. The v1 API takes one shared text per call, so a longer LinkedIn version is a second call with "platforms": ["linkedin"].

Threads are the one real exception

A thread lands as a thread on X and as a reply chain on Bluesky, with each part checked against that network's limit. On LinkedIn the same thread becomes one post, parts joined with blank lines, so a long thread can publish on X and Bluesky and be skipped on LinkedIn once the combined text passes 3,000.

Frequently asked questions

What is the Bluesky character limit compared to X?

Bluesky allows 300 graphemes per post, with a 3,000-byte ceiling underneath. X allows 280 weighted characters, or 25,000 on X Premium. The bigger practical difference is links: X counts any URL as 23, while Bluesky counts a link at its full length when you post through the API. A post with a long link can fit on X and still be too long for Bluesky.

What is the LinkedIn character limit compared to Twitter (X)?

LinkedIn allows 3,000 characters per post, counted in UTF-16 code units, so an emoji costs 2. X allows 280 weighted characters, or 25,000 on Premium. On LinkedIn, only roughly the first 2 or 3 lines show before the "see more" fold. LinkedIn publishes no official number for that.

Do spaces count toward the Bluesky limit?

Yes. Bluesky counts every grapheme, spaces included, up to 300. There is also a 3,000-byte ceiling, which only matters for text made mostly of multi-byte characters.

Can I post a thread to LinkedIn?

LinkedIn has no threads. When a thread targets LinkedIn, OpenTweet publishes it as one post with the parts joined by blank lines. The 3,000-character limit applies to the combined text.

What happens when a post is too long for one network?

OpenTweet skips that network and says why in the result for it (status "skipped" with a skip_reason). The post still goes out on every network it fits. Nothing is truncated.

Can I post video to Bluesky or LinkedIn with OpenTweet?

Not as of September 2026. Video goes to X. A post with video is skipped on Bluesky and LinkedIn with a reason.

One draft, checked against all three limits

OpenTweet posts to X, Bluesky and LinkedIn and tells you per network what went out. From $11.99/mo, with Bluesky and LinkedIn on every plan.

7-day free trial. Cancel anytime.