Threads and Bluesky Character Limits: 500, 300, What Counts
Threads allows 500 characters plus a 10,000-character attachment. Bluesky allows 300 graphemes. How each counts emoji, links and non-Latin text.
A Threads post holds 500 characters. A Bluesky post holds 300. X still holds 280. Those three numbers are easy to find. What is harder to find is what each platform means by "a character", and that is the part that decides whether your post fits.
The X counter on this site already has to deal with this, because X does not count the way a text editor does. This month I went through the same exercise for Bluesky and Threads. Bluesky publishes its rule. Threads mostly does not. TikTok publishes numbers for its developer API and none that I could find for the app itself, so I give the API figures and say where they stop.
The limits at a glance
| Platform | Field | Limit | How it is counted |
|---|---|---|---|
| Threads | Post | 500 characters | Emoji count as their UTF-8 bytes, per the API docs; at most 5 links |
| Threads | Text attachment | 10,000 characters | Not documented in detail |
| Bluesky | Post | 300 graphemes | Published in the post schema; also capped at 3,000 bytes. The app counts long links in shortened form |
| X | Post | 280 characters | Weighted: emoji and CJK count 2, any link counts 23 |
| TikTok | Video caption, posted through the API | 2,200 | UTF-16 units, per the developer docs |
| TikTok | Photo post description, posted through the API | 4,000 | UTF-16 units; the photo title is capped at 90 |
| TikTok | Caption typed in the app | Unconfirmed | No official figure found |
Checked on 12 October 2026, and the Threads and Bluesky rows again on 19 October 2026. Sources are at the bottom.
One string, five different counts
"Character" sounds like a single idea. In software it is at least four, and the platforms picked different ones. I ran a handful of strings through each counting method:
| Text | UTF-16 units | Code points | Graphemes | UTF-8 bytes | X weight |
|---|---|---|---|---|---|
hello |
5 | 5 | 5 | 5 | 5 |
café |
4 | 4 | 4 | 5 | 4 |
字数 |
2 | 2 | 2 | 6 | 4 |
| 🙂 | 2 | 1 | 1 | 4 | 2 |
| 👍🏽 | 4 | 2 | 1 | 8 | 2 |
| 🇬🇧 | 4 | 2 | 1 | 8 | 2 |
| 👨👩👧👦 | 11 | 7 | 1 | 25 | 2 |
| A 40-character link | 40 | 40 | 40 | 40 | 23 |
A quick key:
- UTF-16 units are what JavaScript's
lengthreturns, and what many simple counters report. - Code points are individual Unicode values. The family emoji is seven of them: four people and three invisible joiners.
- Graphemes are what a person would call one character. One emoji is one grapheme, however it is built.
- UTF-8 bytes are the storage size.
- X weight is X's own rule, which our X character counter implements.
For plain English, every column agrees. The moment you add an emoji, an accent or a non-Latin script, they split. A family emoji is 1, 2, 7, 11 or 25 depending on who is counting.
Bluesky: 300 graphemes, and a byte cap behind it
Bluesky is the easy one to be sure about, because the rule is in a public file. The post schema sets two limits on the text of a post: at most 300 graphemes, and at most 3,000 bytes.
Two consequences follow.
Emoji are cheap. Each emoji is one grapheme, however elaborate. On X the same emoji costs 2, so an emoji-heavy post that is over the line there can still have room to spare on Bluesky.
Chinese, Japanese and Korean writers get more than double the room they have on X. X weights each CJK character as 2, so 280 becomes 140 characters. Bluesky counts each as one grapheme, so you get the full 300, and at 3 bytes each that is only 900 bytes, far under the cap.
The byte cap only bites in odd corners. By the schema's arithmetic, 300 family emoji would be 7,500 bytes, so only 120 of them fit. I worked that out from the published limits and did not post 120 family emoji to prove it.
Links are cheaper than they look in the official app. Its code is open source, and before the composer counts a post it shortens every link whose path is longer than 15 characters to the host, the first 13 characters of the path and "...". The post that gets sent carries the short form as its visible text, with the full address kept in the link. So a 120-character URL costs about 30 graphemes, not 120. Third-party apps and scripts that post through the API do not have to do this, and there the full URL counts.
Threads: 500, plus 10,000 in an attachment
The 500-character limit on a Threads post has held since launch. What changed is what you can hang underneath it. In September 2025 Meta announced text attachments: a block of up to 10,000 characters attached to a post, which readers expand to read. TechCrunch's report noted that it is free and supports basic formatting, which sets it apart from long posts on X, where the 25,000-character option needs a paid tier.
So a Threads post is two fields now:
- The post itself: 500 characters. This is what shows in the feed, so it still has to do the work of a headline.
- The attachment: up to 10,000 characters. By my measurement of ordinary English prose (about 6.1 characters per word, counting the space), that is somewhere around 1,600 words. A short article.
Threads' developer documentation has one rule that matters here: emoji are counted as their UTF-8 bytes. A plain smiley is 4 bytes, so it costs 4 of the 500, and a family emoji costs 25. The same page caps a post at 5 links. That is the rule for posts sent through the API, and I have not found the app's composer documented separately, so if an emoji-heavy post is close to the limit, trust the composer's counter.
TikTok: official numbers for the API, none for the app
You will find 2,200 characters quoted for TikTok captions in some places and 4,000 in others. I went looking for a TikTok help page or announcement that states the figure for a caption typed in the app, and I did not find one I could link to. Every source I found was a third party quoting another third party.
What TikTok does publish is the limit for posts sent through its Content Posting API, which is the route scheduling tools use:
- Video caption: 2,200, in the direct post reference.
- Photo post: 90 for the title and 4,000 for the description, in the photo post reference.
TikTok's docs give the unit as "UTF-16 runes". I read that as the UTF-16 units in the first column of the table above, which would make an emoji cost 2 or more, but the docs do not spell it out.
Both of the numbers people quote are in there, one for video and one for photo posts. That may be why the two keep circulating. That is my reading, and TikTok does not say so.
So if you post through a scheduler, 2,200 for a video caption is a documented limit. If you type the caption in the app, I cannot tell you the app enforces the same number, and the counter in the app is the thing to trust.
TikTok is still not on this site's character limits table. Every row there is a limit you meet in the app, with a source, and for TikTok I only have the API figure.
How many words is that?
Using the same 6.1 characters per word:
| Limit | Roughly, in English words |
|---|---|
| X post, 280 | 45 |
| Bluesky post, 300 | 50 |
| Threads post, 500 | 80 |
| Threads attachment, 10,000 | 1,600 |
These are averages over ordinary prose. A post full of short words fits more, and one with a hashtag pile fits fewer.
Writing one post for all three
If you cross-post, the tightest rule wins, and the tightest rule is usually X's.
- Write to 280 on X's scale. Anything that fits there fits Bluesky and Threads too, apart from odd cases such as a very long link or a run of emoji.
- Treat every emoji as 2, and as 4 on Threads. X charges 2. Threads charges an emoji's UTF-8 bytes, which is 4 for most single emoji, so an emoji-heavy post can fit X and still run over on Threads.
- Budget 23 for a link. X charges 23 for any link, however long or short.
- Put the long version on Threads. If the post grew out of something longer, the attachment is the place for it.
For checking, the Bluesky and Threads Character Counter shows graphemes and bytes for Bluesky and characters for Threads side by side. The X character counter applies X's weighting, links included. The general Character Counter reports UTF-16 units, the first column in the table above. For plain English text that matches every platform here. With emoji it will read a little higher than Bluesky's own counter, which means it errs on the safe side.
Sources
- Bluesky, app.bsky.feed.post schema: 300 graphemes and 3,000 bytes for post text
- Bluesky, social-app source code: link shortening before the composer counts a post (
toShortUrlinsrc/lib/strings/url-helpers.ts) - Meta, Threads API: posts: 500 characters, emoji counted as UTF-8 bytes, at most 5 links
- Meta, Attach text to your Threads posts, September 2025: the 10,000-character attachment
- TechCrunch, 4 September 2025: launch details
- X Developer Platform, Counting characters: weighting rules and the 23-character link
- TikTok for Developers, Content Posting API reference for direct posts and photo posts: 2,200 for a video caption, 90 and 4,000 for a photo title and description
- The comparison table is my own test, run with the code behind this site's counters on 12 October 2026.
相关工具
Twitter/X Character Counter
Write to X's weighted 280 first. It is usually the tightest of the three limits.
打开工具 →