Skip to main content
Text Tools

Social Media Character Limits 2026: What Each Platform Counts

Post limits for X, Bluesky, LinkedIn, Instagram, Threads, Mastodon, TikTok and Facebook in 2026, plus the four different units they use to count them.

By 8 min read
Two hands holding a phone, with social reaction icons - hearts, thumbs-up and smiling faces - floating above the screen

Every social platform publishes a character limit, and almost none of them tells you what a character is. That gap is where cross-posting breaks: the same draft passes one composer and gets rejected by the next, with no visible difference between them.

Here is where the limits stand in 2026, followed by the four different things platforms mean when they say "character".

The numbers

PlatformPost limitCounting unitDocumented?URL cost
X (Twitter)280 free, 25,000 PremiumWeighted unitsYes, as configFlat 23
Bluesky300 graphemes and 3,000 bytesGrapheme clustersYes, in the lexiconActual length
Mastodon500 defaultUTF-16 code unitsYes, via issue trackerFlat 23
TikTok2,200 via APIUTF-16 runesYes, in API referenceActual length
Threads500, plus a 10,000 attachmentNot statedNoActual length
LinkedIn3,000Not statedNoActual length
Instagram2,200 captionNot statedNoActual length
Facebook63,206Not statedNoActual length

The fourth column is the part nobody prints. Four platforms out of eight say anywhere, in writing, what they are counting. The other four publish a number and leave you to find the unit by hitting it. LinkedIn states its 3,000 in a help article and stops there7; Instagram's 2,200 turns up in Meta's ad-creative reference, alongside a cap of 30 hashtags per post9.

Two rows also contradict the usual round-up. Mastodon bills every link at a flat 23 characters, exactly like X does5, so link shorteners buy you nothing on either. And Bluesky enforces two ceilings on the same field simultaneously2, which is the one that catches people writing in Japanese.

Facebook's number deserves a footnote of its own. 63,206 is not the output of any capacity calculation: hex FACE is 64,206, and an engineer subtracted 1,00010.

One string, five prices

Take this post, which is 21 characters by any reasonable human reading:

Ship it 🚀 привет 世界 👨‍👩‍👧‍👦

Eight ASCII characters, a rocket, a Russian word, two Han characters, and the four-person family emoji. Now measure it.

Horizontal bar chart comparing five measurements of the same string: 21 grapheme clusters, 27 Unicode code points, 32 UTF-16 code units, 34 weighted units on X, and 58 UTF-8 bytes
The spread is nearly threefold, and no character was added or removed between the first bar and the last.

Twenty-one on Bluesky. Fifty-eight on a byte-capped server. The text never changed.

The four units

Grapheme clusters

A grapheme is what a person would point at and call one character. Bluesky counts these, and says so in its lexicon2, which makes it the one platform whose counter is guaranteed to agree with your eyes. Threads behaves the same way in practice but does not document it.

UTF-16 code units

This is what JavaScript's String.prototype.length hands back, which is why so many platforms landed on it: it was the default in the language their composer was written in.

"hello".length     // 5
"привет".length    // 6
"世界".length      // 2
"🚀".length        // 2

Anything in the Basic Multilingual Plane counts as 1. Anything outside it, which is most emoji, counts as 2.

Two platforms confirm they use it. Mastodon's own issue tracker records the behaviour6, and TikTok's API reference is unusually direct, capping the title field at "2200 in UTF-16 runes"8. Instagram, LinkedIn and Facebook are widely assumed to do the same, and behave that way in practice, but none of the three documents a unit anywhere we could find. If you are near the limit on those three, measure rather than assume.

Weighted units, which is X and only X

X is the one worth reading carefully, because the received wisdom about it is wrong.

The scheme is published as a config file1. Default weight is 200, the scale is 100, so the default cost is 2 units. Four ranges are exempt and cost 1:

  • U+0000 to U+10FF
  • U+2000 to U+200D
  • U+2010 to U+201F
  • U+2032 to U+2037

That first range is much wider than people assume. It runs to U+10FF, which means Greek, Cyrillic, Hebrew, Arabic, Devanagari, Thai and Georgian are all inside it. Writing a tweet in Russian does not cost double. Neither does an em dash, which sits at U+2014, inside the third exempt range.

What does cost double is everything above U+10FF: CJK, emoji, and most historic scripts. So the popular claim has it backwards. Chinese and Japanese pay the 2x penalty; Russian and Arabic do not.

UTF-8 bytes

Bytes are usually invisible until they are not. ASCII is 1 byte, Cyrillic and Greek are 2, CJK and most emoji are 3, and the rest of the emoji block is 4.

Bluesky is where this stops being trivia. Its lexicon sets maxGraphemes: 300 and maxLength: 3000 on the same text field2. For English you will hit 300 graphemes long before 3,000 bytes. Write 300 graphemes of Japanese at 3 bytes each and you are at 900, still fine. Write 300 emoji and you are at 1,200. The byte ceiling is generous, but it is real, and nothing in the UI mentions it.

Why one emoji can cost 25

The family emoji is the clearest example of the whole problem, because it is not one character in any technical sense. It is four people welded together by three invisible zero-width joiners.

Diagram decomposing the family emoji into seven code points, four person emoji at U+1F468, U+1F469, U+1F467 and U+1F466 separated by three zero-width joiners at U+200D, with the resulting count under five different measurement methods
The joiners are the trap. They render as nothing at all and still cost 3 bytes each.

One grapheme. Seven code points. Eleven UTF-16 units. Twenty-five bytes. On X it costs 11 weighted units, because the four people are billed at 2 each and the three joiners fall inside the exempt punctuation range at 1 each.

Paste eight of those into a Bluesky draft and you have used 8 of 300. Paste the same eight into a Mastodon post and you have used 88 of 500.

X substitutes every URL with a t.co link billed at exactly 23 characters1. A twenty-character link and a two-hundred-character link cost the same. Mastodon does the same thing at the same number5, and goes further: mentioning @[email protected] bills you for alice and throws the domain away.

Everywhere else, a URL costs what it weighs. Three UTM-laden campaign links will take 400 characters off a 500-character Threads post and leave you a sentence.

Our Character Counter shows code points, graphemes and UTF-8 bytes side by side, which is the fastest way to work out which unit a platform is using when it will not tell you. If you want to see how a link will actually render once posted, the Twitter Card Preview pulls the Open Graph metadata X will use for the card.

Where the published limit is not the real limit

Four places the headline number misleads:

Bluesky publishes 300 and enforces 3,000 bytes underneath it2.

Threads publishes 5003, but since September 2025 you can attach up to 10,000 further characters to the same post4. The post is still 500. The thing under it is not.

TikTok documents 2,200 for API posts8 while the in-app composer has been widely reported at 4,000 since 2023. We could not find a TikTok document stating 4,000, so treat the API number as the one you can rely on and the app number as observed behaviour.

Mastodon's 500 is a default, not a setting. Vanilla Mastodon hardcodes it; running a different number means patching the source or running a fork, which is why "Mastodon's limit" varies across the fediverse without any admin having flipped a switch.

What to do about it

If you cross-post, compose to X's rules first. Weighted units plus flat-rate URLs is the tightest and strangest combination in the table, and anything that clears it will clear the rest with room. The exception is Japanese and Chinese, where X is the most expensive platform by a wide margin and Bluesky's grapheme counting is the cheapest.

If you are building a counter rather than using one, take the reference implementation. X publishes the weight table as machine-readable config1, and a counter that approximates it will disagree with the backend on exactly the posts that sit near the limit, which are the only posts where anyone checks.

For a single draft, Social Media Character Counter tracks every platform above at once. And if you want the general version of this problem, counting units rather than counting posts, what actually counts as a word covers the same ambiguity for word counters, while Base64 explained covers what happens to those bytes when they have to survive a text-only channel.

Sources

Every number in this article traces to a source below. Where a claim could not be sourced, it was cut rather than softened.

  1. Primary sourceX (Twitter)

    The 280-unit ceiling, the flat 23-character URL substitution, and the exact code point ranges that cost 1 weighted unit instead of 2.

  2. Primary sourceBluesky (AT Protocol)

    Bluesky enforces two ceilings at once on the same field, maxGraphemes 300 and maxLength 3000 bytes.

  3. Primary sourceMeta

    Threads posts are capped at 500 characters, stated in the launch announcement.

  4. Primary sourceMeta

    The 10,000-character text attachment that sits alongside the unchanged 500-character post body.

  5. Primary sourceMastodon

    Mastodon's 500-character default, its flat 23-character cost for any link, and the rule that a mention bills only the username and not the domain.

  6. Primary sourceMastodon

    Mastodon counts UTF-16 code units rather than grapheme clusters, which is why emoji cost more there than on Bluesky.

  7. Primary sourceLinkedIn Help

    LinkedIn's 3,000-character ceiling on a post.

  8. Primary sourceTikTok for Developers

    TikTok's API caps the title field at 2,200 in UTF-16 runes, one of the few places a platform names its counting unit in writing.

  9. Primary sourceMeta for Developers

    The 2,200-character Instagram caption limit and the cap of 30 hashtags per message.

  10. ReportingTechCrunch

    Facebook's 63,206-character ceiling and the hexadecimal joke behind that specific number.

Topics

  • Social Media
  • Character Count
  • Twitter
  • Linkedin
  • Bluesky

Tools mentioned in this article

Get new tools by email

New tools and the occasional deep-dive, about once a month. No spam, no sharing your address, unsubscribe in one click.

Related articles

Article title card. Four grey bars standing in for lines of text above a progress bar filled part way in amber, with the line: a score, not a verdict
Text Tools

Flesch-Kincaid Explained: What the Score Means and How to Use It

How the two Flesch formulas are computed, why two syllable counters give different grades for the same text, and what Google actually does with readability.

Wooden letter tiles on a bright orange surface, a few arranged to spell HELLO and the rest scattered in a loose pile
Text Tools

What Counts as a Word? Why Counters Disagree on One Text

Paste one sentence into three word counters and get three numbers. Here is the algorithm behind each, which one your deadline actually uses, and where they break.