X Post Character Counter: How X Really Counts Characters (280 Explained)
You type a post, X says you're 12 characters over, and you can't see why. A typical X post character counter just counts letters. X doesn't: it weights characters, shortens links and skips some text completely. Here is how X really counts, the limits for free and Premium accounts, and how to check a post before you publish.
The limits at a glance
| Account / format | Limit |
|---|---|
| Standard post (free account) | 280 characters (weighted, see below) |
| X Premium long post | Up to 25,000 characters |
| Display name | 50 characters |
| Bio | 160 characters |
| Username (@handle) | Up to 15 characters, letters, numbers and underscores |
| Direct Message | 10,000 characters |
| X Article (long-form) | Separate editor for long-form writing, available to Premium subscribers |
The 280 limit is the one almost everybody hits. On Premium, timelines show only the first part of a long post with a "Show more" link, so the first 280 characters still decide whether people expand it. If what you're writing is really an essay, an X Article is the better format. You can draft it in Markdown with a free long-form X Article editor and paste it in when it's ready.
How X counts characters (the part counters get wrong)
X uses a weighted count. The rules come from X's open-source twitter-text library, which the apps use:
- Most Latin letters, digits and punctuation count as 1. This includes accented letters like é and ü.
- CJK characters count as 2. Chinese, Japanese and Korean characters each use two of your 280 "slots", so a CJK-only post fits about 140 characters.
- Emoji count as 2, and that includes complex emoji built from several code points (skin tones, families, flags). A naive counter can show 7 for a family emoji. X counts it as 2.
- Every link counts as 23 characters, however long or short it is, because X wraps it in a t.co link. A 120-character UTM-tagged URL costs 23, and a 10-character link also costs 23.
- Media doesn't count. Images, GIFs, videos and polls don't use any characters.
- @mentions at the start of a reply don't count when the app adds them automatically. Mentions you type into the text yourself do count.
- Line breaks count as 1 each. A post with lots of short lines uses more than it looks.
Run a URL-heavy post through a plain letter counter and it may say 260. If one of the URLs is short, X can say 270. If the post has several emoji or Japanese text, X can say 300+. That gap is why you want a counter that follows X's rules.
Check a post before you publish
The quickest check is the X composer: the ring fills as you type and turns red after the limit. That's fine for a single post, but awkward when you draft in a doc or a spreadsheet, prepare posts for a client, or want to see the reply and media fields together.
The free Twitter character counter on Recently Followed shows a live "x / 280" count while you write and a post-card preview of how the post will look. It also has optional "reply to tweet ID" and media URL fields, so you can draft the whole post in one place. It can publish the post too, if you paste an account cookie or auth_token. That step is optional, so only do it if you trust the service, because an auth_token gives full access to your account. For counting and previewing, you don't need to log in.
Five ways to fit a post into 280
- Move the link. If the post is about the link, keep it. If the link is just a "source", put it in the first reply to save 23 characters and make the post itself cleaner.
- Cut filler openers. "I just wanted to share that..." uses 31 characters. Start with the point.
- Use numerals and symbols: "3" not "three", "&" not "and", "w/" not "with". Careful with fancy symbols: many of them, like arrows and stars, count as 2 under X's weighting.
- Swap emoji for words where it matters. Three decorative emoji cost 6.
- Turn it into a thread. If you're cutting meaning, not just words, split it. Number the posts (1/4, 2/4...) so readers know there's more.
Character limits for replies and quotes
Replies and quote posts have the same 280 limit as normal posts. When you quote a post, the quoted post's URL doesn't count against your text. In replies, the @handles that X adds automatically don't count either, so you get the full 280 for your answer.
For developers: counting in code
If you build a scheduler, a bot or a CMS integration, don't count with len() or .length. Use the official twitter-text library (available for JavaScript, Java, Ruby and Objective-C, with community ports for Python). Its parseTweet function returns weightedLength, valid and the valid range, using the same config the apps use. That keeps your validation in line with X's when you publish through the API.
import twitter from "twitter-text";
const r = twitter.parseTweet("Launch day 🚀 https://example.com/really/long/url?utm_source=x");
console.log(r.weightedLength, r.valid); // the emoji counts as 2, the URL as 23
FAQ
Is the limit 280 for everyone? It's 280 for standard posts. X Premium subscribers can post up to 25,000 characters, but only the first part shows in timelines before "Show more".
Do hashtags count? Yes, the # and every letter count like normal text.
Why does my Japanese post hit the limit at 140? CJK characters count as 2 each under X's weighting.
Do spaces count? Yes, spaces and line breaks count as 1 each.
Does an image take characters? No. Media, polls and the auto-added reply mentions are free.
A good X post character counter should follow X's own rules: weighted characters, links at 23 and free media. Check your drafts against those rules and you'll stop getting surprise "over limit" errors right before you post.
Updated October 2026.