Character Limits on Social Platforms in 2026: What Actually Gets Counted
Current character limits for X, Bluesky, LinkedIn, Instagram, Threads, Mastodon, and TikTok — and how each counts emoji, URLs, and multibyte characters differently.
Every social platform enforces a character limit. What counts as “a character” varies between them in ways that matter more than you’d think — especially if you write in a language with complex scripts, use emoji, or paste links.
Here’s where the limits stand in 2026 and what each platform is actually measuring.
The headline numbers
| Platform | Post limit | URL handling | Emoji counting |
|---|---|---|---|
| X (Twitter) | 280 (free), 25,000 (Premium) | Shortened to 23 chars | 2 code points = 2 “weight” |
| Bluesky | 300 | Not shortened | Grapheme clusters |
| 3,000 | Not shortened | UTF-16 code units | |
| 2,200 (caption) | Not shortened | UTF-16 code units | |
| Threads | 500 | Not shortened | Grapheme clusters |
| Mastodon | 500 (default, server-configurable) | Not shortened | UTF-16 code units (varies by server) |
| TikTok | 2,200 (caption) | Not shortened | UTF-16 code units |
| 63,206 | Not shortened | UTF-16 code units |
These numbers shift — platforms raise limits, premium tiers change — but the structure of “what counts” is more stable.
The four ways platforms count characters
1. UTF-16 code units
This is what JavaScript’s String.prototype.length returns. Characters in the Basic Multilingual Plane (the first ~65k Unicode code points, covering most living languages) count as 1. Characters outside it — including most emoji, many ancient scripts, and mathematical symbols — count as 2.
"hello".length // 5
"👋".length // 2
"Привет".length // 6
"你好".length // 2
Instagram, LinkedIn, Mastodon (default server config), and TikTok all use UTF-16 code units. A post with a wave emoji burns 2 of your characters even though visually it’s one character.
2. Grapheme clusters
A grapheme is what a human perceives as a single visible character. 👨👩👧👦 (family emoji) is a grapheme consisting of four emoji joined by zero-width joiners. A grapheme-counting platform treats it as 1 character. A UTF-16 counting platform treats it as 11 (each emoji takes 2, plus the joiners).
Bluesky and Threads use grapheme clusters. This is the most user-friendly approach: what you see is what’s counted.
3. “Weighted” characters (X / Twitter)
Twitter, since around 2018, uses a hybrid scheme. Most Basic Latin and some common extended ranges (Latin-1, some CJK) count as 1. Other characters count as 2. The rationale was to give Latin-alphabet writers the same effective space as CJK writers, but it produces its own complications.
A tweet in Russian, Arabic, or Hebrew uses characters that count as 2 each. A tweet using mostly emoji burns through the 280 limit very fast. A tweet in English with a couple of em-dashes counts those em-dashes as 2 each.
The weight table is published by Twitter as part of their twitter-text library. Use their reference implementation if you’re building a counter that needs to match Twitter’s backend exactly.
4. URL substitution
Twitter is the prominent platform that automatically shortens URLs. Any URL you paste is replaced by a t.co link that counts as 23 characters regardless of the length of the original URL. A 200-character URL and a 20-character URL both take 23 characters from your limit.
Bluesky, Threads, and Mastodon don’t do this. A 200-character URL eats 200 characters of your post.
The UTF-8 byte angle
Some platforms, particularly older ones and smaller Mastodon servers, count by UTF-8 bytes rather than any character unit. UTF-8 byte counts:
- ASCII (most English letters, digits, punctuation): 1 byte
- Latin with accents, Greek, Cyrillic: 2 bytes
- CJK, most emoji: 3 bytes
- Other emoji, some historic scripts: 4 bytes
A post in Japanese is 3× the byte count of an equivalent-length English post. On a platform that enforces byte limits, this matters.
Our Character Counter shows all three metrics side-by-side: code points, grapheme clusters, and UTF-8 bytes. If you’re targeting a platform whose counting method you don’t know, all three at once resolves the ambiguity.
The practical differences
Emoji-heavy posts
An 8-emoji string on Bluesky takes 8 characters. On Instagram, it takes 16. On Twitter, it takes 16 “weight” units (close to Instagram’s count for most emoji).
Posts with many URLs
Three URLs in a single tweet cost 69 characters (3 × 23), regardless of URL length. The same three URLs on Bluesky cost whatever the URLs actually are — a few hundred characters for typical links, leaving no room for the rest of the post.
Cross-posting identical content
A post that fits in 500 characters on Threads (grapheme clusters) might not fit in 500 characters on a Mastodon instance that counts UTF-16 code units — if the post includes emoji or combining characters. It’s a subtle gotcha when using cross-posting tools.
Writing in non-Latin scripts
Writing in Russian, Arabic, Hindi, or Thai burns characters faster on Twitter (2-weight) than on Bluesky (1 grapheme) for the same visible content. This effectively shortens the Twitter allowance for those languages.
A concrete example
Consider this string:
Excited to announce 🎉 our new product! Check it out: https://example.com/blog/our-new-product
On each platform, this is:
- Twitter: 52 (text, up to URL) + 1 (emoji weight) + 23 (t.co URL) + 1 (space before URL) = 77 weight units
- Bluesky: ~75 grapheme clusters (emoji = 1)
- Instagram: ~76 UTF-16 units (emoji = 2, URL counted literally — wait, plus the rest)
- Mastodon: Similar to Instagram, depending on server config
If you’re planning a cross-platform post and trying to hit the tightest limit, start with Twitter’s rules. Anything that fits Twitter’s counter will usually fit everywhere else, with margin.
What changed in recent years
- X Premium raised the effective limit to 25,000 characters, but the free tier remains at 280. Most external tools assume 280.
- Threads launched in 2023 with a 500-character limit and grapheme counting.
- Bluesky adopted grapheme counting from launch.
- Mastodon’s per-instance configurability makes “Mastodon’s character limit” ambiguous — most public instances stick to 500 UTF-16 units, but some raise it.
- LinkedIn quietly raised post limits from 1,300 to 3,000 in 2023.
Tools for cross-platform workflow
Our Social Media Character Counter tracks limits for all the platforms listed above in a single counter, so you can see at a glance whether a draft fits everywhere.
For Twitter specifically, if you’re embedding a link and want to preview what the link card will look like, the Twitter Card Preview renders what X will show for a given URL’s Open Graph metadata.
The meta-takeaway
Character limits aren’t really about characters — they’re about visible complexity, server storage, and a platform’s decisions about fairness across languages and writing systems. When you hit a limit unexpectedly, the fix usually isn’t to trim words; it’s to understand which of the four counting methods the platform uses and shape your text to that.
For anything important that must land within a specific platform’s limit, test with that platform’s own counter (or one that matches it). Third-party counters that use “characters” as if it were a single well-defined concept will quietly disagree with the platform that actually publishes your post.
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.