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.
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
| Platform | Post limit | Counting unit | Documented? | URL cost |
|---|---|---|---|---|
| X (Twitter) | 280 free, 25,000 Premium | Weighted units | Yes, as config | Flat 23 |
| Bluesky | 300 graphemes and 3,000 bytes | Grapheme clusters | Yes, in the lexicon | Actual length |
| Mastodon | 500 default | UTF-16 code units | Yes, via issue tracker | Flat 23 |
| TikTok | 2,200 via API | UTF-16 runes | Yes, in API reference | Actual length |
| Threads | 500, plus a 10,000 attachment | Not stated | No | Actual length |
| 3,000 | Not stated | No | Actual length | |
| 2,200 caption | Not stated | No | Actual length | |
| 63,206 | Not stated | No | Actual 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.
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+0000toU+10FFU+2000toU+200DU+2010toU+201FU+2032toU+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.
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.
Links, and the two platforms that lie about them helpfully
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.
- 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.
- Primary sourceBluesky (AT Protocol)
Bluesky enforces two ceilings at once on the same field, maxGraphemes 300 and maxLength 3000 bytes.
- Primary sourceMeta
Threads posts are capped at 500 characters, stated in the launch announcement.
- Primary sourceMeta
The 10,000-character text attachment that sits alongside the unchanged 500-character post body.
- 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.
- Primary sourceMastodon
Mastodon counts UTF-16 code units rather than grapheme clusters, which is why emoji cost more there than on Bluesky.
- Primary sourceLinkedIn Help
LinkedIn's 3,000-character ceiling on a post.
- 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.
- Primary sourceMeta for Developers
The 2,200-character Instagram caption limit and the cap of 30 hashtags per message.
- ReportingTechCrunch
Facebook's 63,206-character ceiling and the hexadecimal joke behind that specific number.
Topics
- Social Media
- Character Count
- Bluesky
Tools mentioned in this article
- Character Counter - Count characters with platform-specific limits for Twitter, Instagram and more.
- Social Media Character Counter - Check character counts against limits for Twitter, Instagram, LinkedIn, Facebook, YouTube, and TikTok.
- Twitter Card Preview - Preview how your page looks when shared on Twitter/X with meta tag generation.
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.