X (Twitter) character limit
280, but not the way you'd count it.
X weights characters. Links always count 23, emoji count 2, Chinese, Japanese and Korean characters count 2, and most Latin text counts 1.
The short answer Β· Updated Nov 1, 2026
Posts on X can contain up to 280 characters, per X's developer documentation. X counts them by weight: every URL counts as 23 characters regardless of length because it's wrapped by t.co, every emoji counts as 2, and Chinese, Japanese and Korean characters count as 2 each, so a post written entirely in Japanese fits 140 characters.
| Content | Counts as | Example |
|---|---|---|
| Latin letters, digits, most punctuation | 1 each | hello = 5 |
| Spaces and line breaks | 1 each | a, two line breaks, b = 4 |
| Any URL | 23 | a 56-character https URL = 23 |
| Any emoji, including skin tones and ZWJ sequences | 2 | π = 2, ππ½ = 2, π¨βπ©βπ§βπ¦ = 2 |
| Chinese, Japanese, Korean characters | 2 each | γγγ«γ‘γ―δΈη = 14 |
| Other symbols outside X's light ranges | 2 each | β¬100 = 5 |
| Attached images | 0 | 4 images add nothing |
From "Counting characters" on docs.x.com and the twitter-text config, read 2026-11-01. Examples computed with our counter, which uses the same weights.
How does X count characters?
X gives every character a weight of 1 or 2 and adds them up; the total must be 280 or less. The open-source twitter-text config that X points to gives weight 1 to four Unicode ranges: code points 0 to 4351 (Latin, Greek, Cyrillic, Hebrew, Arabic and more), and three small punctuation ranges between 8192 and 8247 that include en and em dashes and curly quotes. Everything else weighs 2.
Two rules override that. Every URL counts as 23, whatever its length, because X wraps it with t.co. Every emoji counts as 2, regardless of how many code points it's built from; X's docs say zero-width joiners combine emoji visually without adding to the count. X also normalizes text to Unicode NFC before counting.
A worked example: a tweet with a link and two emoji
Take Shipped: webhooks for every post. Docs: https://socialsforai.com/docs ππ. In JavaScript, .length says 74. X says 68. Here is the math:
The text before the link, Shipped: webhooks for every post. Docs: , is 40 characters of weight 1 = 40. The URL is 29 characters long but counts 23. The space after it is 1. The two emoji count 2 each = 4. Total: 40 + 23 + 1 + 4 = 68 of 280, leaving 212.
The same string on Bluesky is 72 graphemes, because Bluesky counts the URL at its full length and each emoji as 1. Paste either into our X character counter to see the same number.
Do links count toward the X character limit?
Yes, always as 23. A 12-character link and a 200-character link both cost 23, so long tracking URLs are free in length terms and short ones save nothing. They do cost money through the API: X's pricing page lists a post with a URL at $0.200 versus $0.015 without, and our preflight adds an x_link_cost warning when a post contains one. The X API pricing page works through the totals.
One caveat in our counter: it treats only text starting with http:// or https:// as a URL. A bare domain like example.com/pricing is counted at its full length, 19. Whether X treats a bare domain as a link depends on X's own URL detection, so write links with https:// and both counts agree.
Do emoji, accents and CJK count double?
Emoji and CJK do; most accented Latin letters don't. Concrete counts from our counter, which applies X's weights:
- π = 2, ππ½ (with a skin tone) = 2, π¨βπ©βπ§βπ¦ (a 7-code-point family) = 2, πΊπΈ = 2. Complexity doesn't matter.
γγγ«γ‘γ―δΈη(7 Japanese characters) = 14.μλ νμΈμ(5 Korean) = 10.δ½ ε₯½= 4. A post entirely in CJK fits 140 characters.cafΓ©,ΠΡΠΈΠ²Π΅Ρ(Cyrillic) andΩ Ψ±ΨΨ¨Ψ§(Arabic) count 1 per letter: 4, 6 and 5.β¬counts 2, because it sits outside X's weight-1 ranges.β¬100= 5.- Unicode "bold" letters like
ππΌπΉπ±count 2 each = 8, double the plain word. Don't use them on X if space is tight. - A decomposed accent (e plus a combining mark) counts 1 on X after NFC normalization. Our counter normalizes the same way, so it counts 1 too.
What happens if you go over 280 through the API?
With our API, nothing reaches X. Preflight counts the text with X's weights and returns a 422 preflight_failed whose issue reads, for a 283-character post, "Text is 283 characters; X allows 280." with the fix "Shorten it by 3+ characters, or set platform_options.x.text to a shorter version." Send dry_run: true to get the same answer without risk. A Twitter bot that fills templates should dry-run each new template once.
Longer posts exist on X. Its API changelog records that, as of August 20, 2024, longform posts can be created through API v2 with a length of 25k characters. Our API caps X at 280 weighted characters today, so a longer post needs a shorter X version in platform_options.
How do I shorten a post to fit 280?
Work in this order, cheapest first.
- Cut emoji and CJK punctuation first: each one you remove gives back 2.
- Keep one link. A second link costs another 23 and doesn't change the price tier you already hit.
- Drop the link from the X version if cost matters: it saves 23 characters and drops X's fee from $0.200 to $0.015. Moving it to a reply doesn't help, because a reply with a URL is billed at $0.200 too.
- Write a separate X version in
platform_options.x.textand keep the long one for Bluesky and LinkedIn. See crossposting.
Questions
What developers ask
What is the character limit on X (Twitter)?
Posts on X can contain up to 280 characters, per X's developer documentation. Characters are weighted: Latin letters, digits and most punctuation count 1, while emoji and Chinese, Japanese and Korean characters count 2, and every URL counts 23. X's API changelog also records longform posts of up to 25k characters through API v2.
Does a link count against the X character limit?
Yes, always as 23 characters, however long or short the URL is, because X wraps every link with its t.co shortener. Through the API, a link also changes the price: X lists a post with a URL at $0.200 versus $0.015 without one.
Do emoji count as one character on X?
No. Every emoji counts as 2, regardless of complexity, per X's docs. A thumbs-up, a thumbs-up with a skin tone, a flag and a four-person family emoji all count 2, even though the family is 7 code points and 11 JavaScript string units.
Why does my character count differ from X's?
Most counters use string length. JavaScript's .length counts UTF-16 units, so emoji show as 2 to 11 and URLs at their full length, while X counts emoji as 2 and URLs as 23. Our X character counter and our API's preflight both apply X's weights, so they match what X enforces.
How many characters can a tweet in Japanese have?
140. X counts each Chinese, Japanese and Korean character as 2, so 140 Japanese characters weigh 280. In our counter, 140 repetitions of the hiragana γ weigh exactly 280, and a 141st makes it 282, over the limit. Mixed text adds up per character: Latin letters and spaces count 1, Japanese characters and full-width punctuation count 2.
Do images count toward the X character limit?
No. X's docs say media attached to a post counts as 0 characters. Through our API you can attach up to 4 images, at most 5 MB each, with optional alt text, and the full 280 stays available for text. Image URLs in the media array are not part of the text, so they don't count as 23 either.
Get an API key and send your first post in five minutes.