Every number here was checked on 3 November 2026 against the platform’s own documentation or API reference. We left out any platform and field where we could not find an official figure, rather than repeat what other cheat sheets say. Limits change, and so does what counts as a “character”, which differs more than you might expect.
Posts and captions
| Platform and field | Limit | How it counts | Source |
|---|---|---|---|
| X post | 280 | Weighted: emoji and CJK count as 2, each URL as 23 | X developer docs |
| X longer post (paid plans) | 25,000 | Paid subscribers only | X help center |
| Threads post | 500 | Emoji count as their UTF-8 byte length | Threads API docs |
| Mastodon post | 500 | Default. Each URL counts as 23, and only the username part of a remote mention counts | Mastodon docs |
| Instagram caption | 2,200 | Also 30 hashtags and 20 @ tags at most | Instagram Graph API reference |
| LinkedIn post | 3,000 | LinkedIn help | |
| LinkedIn article | 125,000 | LinkedIn help | |
| TikTok video caption | 2,200 | UTF-16 code units, per the API | TikTok Content Posting API |
| Pinterest Pin title | 100 | Pinterest API schema | |
| Pinterest Pin description | 800 | Pinterest API schema | |
| Pinterest alt text | 500 | Pinterest API schema |
The Pinterest description figure surprises some people, as many third party lists still say 500. The current API schema says 800. API limits can differ from what a given app’s interface allows, so if a form rejects what the API permits, trust the form you’re using.
Mastodon’s 500 is a default. Servers can differ, so check yours.
Video, chat and ads
| Platform and field | Limit | How it counts | Source |
|---|---|---|---|
| YouTube title | 100 | Characters. < and > not allowed | YouTube help, Data API |
| YouTube description | 5,000 | Help says characters, API says bytes | YouTube help, Data API |
| YouTube tags | 500 total | Commas count. A tag with spaces counts as if quoted | YouTube Data API |
| Discord message | 2,000 | For the API’s content field | Discord developer docs |
| Telegram message | 4,096 | After entities are parsed | Telegram Bot API |
| Telegram media caption | 1,024 | After entities are parsed | Telegram Bot API |
| Google Ads text ad headline | 30 | Double-width languages count 2 per character | Google Ads help |
| Google Ads text ad description | 90 | Same | Google Ads help |
| Google Ads display path | 15 each | Two optional fields | Google Ads help |
YouTube’s two figures disagree by unit. Plain English text gives the same number either way. In a language that needs more bytes per character, stay well under 5,000 if you upload through the API. Google Ads’ page describes text ads, and it notes that responsive search ads are the format it now encourages.
What we left out, and why
Facebook posts, X bios, Instagram bios, Reddit titles, WhatsApp messages and Bluesky posts don’t appear because we couldn’t confirm a figure in a current official page. Numbers for these are widely repeated, and you’ll find them elsewhere, but we can’t vouch for them. For these, test in the app before you depend on a figure.
Google title tags and meta descriptions have no limit at all, according to Google. Display is cut to fit the screen. See how to write title tags and meta descriptions.
Why “character” means different things
The same text gives different counts depending on who is counting. We measured these strings:
| Text | What you see | UTF-16 units | Code points | UTF-8 bytes |
|---|---|---|---|---|
é as e plus combining accent | 1 | 2 | 2 | 3 |
| 😀 | 1 | 2 | 1 | 4 |
| 🇳🇵 flag | 1 | 4 | 2 | 8 |
| 👨👩👧👦 family | 1 | 11 | 7 | 25 |
| 日本 | 2 | 2 | 2 | 6 |
So that one family emoji costs:
- On X, 2. Its docs say all emoji count as 2, however they are built.
- On Threads, 25, since its docs say emoji are counted by UTF-8 bytes.
- In a TikTok caption, 11 by the API’s definition.
- In JavaScript’s
.length, 11, which is why many simple counters overstate emoji.
X’s weighted system has other effects. Text in Chinese, Japanese or Korean counts double, so the practical limit is 140 of those characters. A long URL costs exactly 23 no matter its length, and a short one costs 23 as well, so link shorteners save nothing there. Also, X normalizes text to Unicode NFC before counting. Its open-source twitter-text library is the reliable way to count if you’re building software that posts.
Using our counters
Our Character Counter counts characters as you see them, so 👨👩👧👦 is one, and it shows the UTF-8 byte size as well. It has live meters for several limits in this article using the platform’s own counting rules where it can, including X’s weighting and Mastodon’s link rule, plus an SMS panel that shows the encoding and number of segments, and warns about characters that force UCS-2. You can also set a limit of your own.
Meters are estimates of rules that are not ours to control. Our Threads meter, for one, counts an emoji as 2, which will read low for the many-byte emoji described above. Our Bluesky meter uses a figure we couldn’t confirm in official documentation, which is why it doesn’t appear in the tables here. The platform’s own compose box decides in the end. To measure drafts in words rather than characters, use the Word Counter, and read how word counters count to see why different tools disagree.
How SMS length works
SMS has its own rules, and they can change what you pay. A single SMS carries 140 bytes of payload, and the encoding decides how many characters fit in it.
GSM-7 uses 7 bits per character, so 1,120 bits ÷ 7 = 160 characters. It covers basic Latin letters, digits, common punctuation, some accented letters and a few Greek capitals.
UCS-2 uses 16 bits per character, so 1,120 ÷ 16 = 70 characters. It’s used if any character in the message is outside GSM-7.
Longer messages are split into segments and rejoined by the phone. Each segment gives up 6 bytes for a User Data Header that says how to reassemble it, so fewer characters fit.
| Encoding | Single message | Per segment in a long message |
|---|---|---|
| GSM-7 | 160 | 153 |
| UCS-2 | 70 | 67 |
So 161 GSM-7 characters are 2 segments. 306 characters are also 2, and 307 are 3. Carriers and providers usually charge per segment. Twilio’s documentation also notes slightly lower figures for toll-free messages to the US and Canada: 152 and 66 per segment. It caps concatenated messages at 1,600 GSM-7 characters.
The two traps
One character can change the encoding of the whole message. Twilio documents this, and it’s the most expensive mistake in SMS. A single emoji or a curly apostrophe drops your capacity from 160 to 70. Compare these two messages, which look identical:
Your code is 4821. It's valid for 10 minutes. (straight ', GSM-7)
Your code is 4821. It’s valid for 10 minutes. (curly ’, UCS-2)
Both are 45 characters and fit in one segment. Add enough text to reach 71 characters, though, and the curly version becomes two segments while the straight version stays at one. At volume, that doubles your bill. Word processors and phone keyboards insert curly quotes automatically, so clean copy before you paste it into a bulk sender. Twilio’s Smart Encoding exists for this reason: it replaces such characters with straight versions.
Some GSM-7 characters count double. The extension table needs an escape character first, so these each take 2 of your 160:
^ { } \ [ ] ~ | €
A message of 159 letters and a € has 160 characters and 161 units, so it’s two segments.
Writing SMS that fits
- Keep transactional messages under 160 GSM-7 characters, and check that each one really is GSM-7.
- Replace
’with',“ ”with",…with..., and–with-in templates. - Remember variables. A template that fits with “Ann” may not fit with “Bartholomew”, and a non-Latin name can flip the whole message to UCS-2.
- If you send to languages that need UCS-2, budget for 70 and 67 from the start.
- Send a test to a real phone and check your provider’s segment count before a big campaign.