TL;DR, Quick Answer
7 min readX wraps every URL posted to the platform in a t.co link and gives you no way to opt out. X's developer documentation states that a wrapped URL counts as 23 characters toward the 280-character post limit, no matter how long the original address is. X's consumer help page about t.co confirms the wrapping but publishes no character figure at all.
What is a t.co link?
X creates a t.co link every time an account posts a URL, swapping the address you typed for a short one on the t.co domain that redirects readers to your destination. X's help center calls this its link service and applies it to posts and Direct Messages alike. The address sitting in your composer is not the address that ships.
How many characters does a t.co link use?
X's developer documentation puts the number at 23. The Counting Characters page at docs.x.com states, word for word, "All URLs are wrapped with t.co shortener and count as 23 characters, regardless of the original length." I checked that page on 10 September 2026. It sits under Fundamentals in the current X API documentation, not in an archived v1 section.
The same page sets the ceiling those 23 characters eat into: "Posts on X can contain up to 280 characters."
X backs the number in code too. The configuration file in twitter-text, X's own open source parsing library that the docs page tells developers to use, sets "transformedURLLength": 23 in both config/v2.json and config/v3.json, alongside "maxWeightedTweetLength": 280.
Almost every article on this term repeats 23 with no source behind it. The number holds up. X still publishes it, and it has not moved.
Does X's help center publish the 23-character figure?
No. X's consumer help page about t.co, titled "About X's link service (http://t.co)", never mentions 23 or any other count. Its closest line gives a reason instead of a number. X writes there, "Shortened links allow you to share long URLs in a post while maintaining the maximum number of characters for your message." Anyone reading only the help center walks away without the figure, which is how a number this widely repeated came to look unsourced. Go to the developer docs for the count and to the help center for the policy.
Can you turn off t.co link wrapping?
You cannot. X answers this directly on the t.co help page under the heading "Can I opt out of link shortening when I post links on X?" with "Because of the reasons listed above, X will shorten URLs you post on X. You cannot opt out of link shortening." Shortening the address yourself first does not dodge it either, because X wraps the short link and charges the same 23. Post the clean canonical URL and let X do the wrapping.

Why does X wrap every URL in t.co?
X gives three reasons on that same page. Shortening stops long URLs from eating the message. The service counts clicks, which X calls "an important quality signal in determining how relevant and interesting each post is when compared to similar posts." And X checks every wrapped URL against a list of potentially dangerous sites, so a reader hitting a flagged destination sees a warning screen first.
The middle reason carries more weight than the character math. Your link's click count feeds into how far X pushes the post, which makes the wrap a ranking input and not only a formatting step.
Does the t.co count change on X Premium?
X publishes no separate t.co figure for any Premium tier. The Counting Characters page gives 280 as the post ceiling and says nothing about subscriptions. X's Premium help page moves the ceiling instead: "Longer posts allow subscribers to post up to 25,000 characters." Neither page states a URL cost other than 23.
Treat 23 as fixed and the ceiling as the part that moves. A free account budgets against 280. Any paid Premium tier budgets against 25,000, and the same 23 comes off the top for each link either way. For the rest of what shifts with a subscription, the rundown of X Premium features covers the tiers.

How do you budget characters around a t.co link?
Subtract 23 for every URL before you write a word of copy. The formula:
characters left = 280 - (23 x number of URLs) - weighted length of your text
AdaptlyPost
Start 7-Day FREE Trial
All-platform analytics
Social Inbox
AI-powered assistant
Work an example. You want two links, and you have already written 90 characters of copy:
280 - (23 x 2) - 90 = 144
That leaves 144 characters of headroom. Trimming the URL yourself buys none of it back, which the table makes plain.
| URL as typed | Length as typed | Counted toward the limit |
|---|---|---|
| https://x.com | 13 | 23 |
| https://example.com/blog/post | 29 | 23 |
| https://example.com/2026/09/a-long-descriptive-slug | 51 | 23 |
A 13-character address costs 23. Anything shorter than 23 characters actively loses you room, so there is no length argument for a tidy URL. Use the canonical one.
Two more rules from the same page are worth keeping in mind. Emoji count as 2 characters each, and attached media "counts as 0 characters" through official clients. A composer showing a different total from the one X accepts is measuring code points instead of weighted length. Other networks handle this nothing like X does, which is why the Threads character limit and Bluesky's byte offsets for links do not carry across.
What happens to your tracking parameters inside a t.co link?
They survive. X wraps the whole URL, query string included, and the t.co redirect delivers the reader to the exact address you posted, so UTM tags reach your analytics intact. What you lose is the visible destination. Readers see t.co in the raw post text and your domain only in the link card preview.
Plan around that. Put the brand name in the copy instead of trusting the URL to carry it, and read performance from your own analytics and X's click data, not from what the address bar shows. If you compare that traffic against impressions, the click-through rate breakdown sorts out which denominator to use.
Scheduling changes none of this. X wraps links at publish time whichever client sends the post, so a queued post and a hand-typed post get identical treatment. Queueing X posts in bulk through an X post scheduler handles the timing while the 23-character rule stays X's to enforce. The queueing mechanics are in the walkthrough on how to schedule tweets.
Frequently asked questions
Is a t.co link safe to click?
X checks every wrapped URL against a list of potentially dangerous sites and shows a warning screen before forwarding you when the destination is flagged. X lists that check as one of three reasons it runs the service. The check is not a guarantee, and X's own help page warns that anyone holding a t.co link can reach the destination behind it, so treat a shortened link from a stranger the way you would treat any unknown link.
Do t.co links expire?
X publishes no expiry policy for t.co links. The help center describes the service only as the wrapper applied to links posted on X and to links sent in Direct Messages, with no mention of a lifespan. Since X owns the redirect, keep the canonical URL somewhere you control instead of treating a t.co address as a permanent reference.
Can I use t.co to shorten links for my own site?
No. X's help page is explicit: "The link service at http://t.co is only used on links posted on X and is not available as a general shortening service on other apps or sites." You can keep using bit.ly or another shortener for links you share elsewhere, and X confirms that their tracking metrics "will continue to work as they did previously."
Does a pre-shortened link count as fewer than 23 characters?
No. X wraps every valid URL it detects, including one that is already short, and charges 23 either way. The docs page applies the number "regardless of the original length." Shortening before you post costs your reader an extra redirect hop and gains you nothing on the counter.
Why does my post get rejected when my character counter says I am under the limit?
That counter is measuring raw characters instead of X's weighted length. X counts emoji and CJK characters as 2, other Unicode at a default weight of 2, and every URL at 23. X tells developers to use the twitter-text library, which applies those weights, so any counter built on plain string length will disagree with the platform the moment a post holds a link or an emoji.
Do t.co links count against the 25,000-character limit on Premium?
X does not publish a separate figure for Premium posts. The Counting Characters page gives 23 for URLs with no tier caveat, and the Premium help page raises the post ceiling to 25,000 characters without touching the URL rule. Budget 23 per link inside a long post until X publishes something different.
Does t.co wrapping apply to Direct Messages as well as posts?
X's help center describes t.co as its link service and applies it to posts and Direct Messages alike. A URL you paste into a DM gets the same t.co swap as one typed into a public post. The wrapping behavior does not change based on where you send the link.
AdaptlyPost
Start 7-Day FREE Trial
All-platform analytics
Social Inbox
AI-powered assistant
What counts as zero characters in an X post?
Attached media counts as 0 characters through official clients, according to X's Counting Characters page. Images, video, and other attachments you add directly do not touch the 280-character budget. The 23-character URL charge is separate and applies even when a post also carries media.
How many characters does an emoji cost on X?
X's Counting Characters page counts each emoji as 2 characters toward the 280-character limit. Two emoji next to two t.co links already account for 50 characters before you write a word. This weighting is why a plain character count in some composers does not match what X accepts.
Does a t.co link's click count affect how X ranks your post?
X folds click counts on a t.co link into how it judges relevance, calling clicks "an important quality signal in determining how relevant and interesting each post is when compared to similar posts." That signal feeds into how far X pushes the post, so the wrap doubles as a ranking input, not just a formatting rule. The character cost is the visible part, the ranking effect carries more weight.
Was This Article Helpful?
Let us know what you think!
See us more often in Google
One click marks AdaptlyPost as a preferred source, so our articles sit higher in your Top Stories, AI Mode, and AI Overviews.
Before you go...
AdaptlyPost
Schedule your content across all platforms
Manage all your social media accounts in one place with AdaptlyPost.
All-platform analytics
Social Inbox
AI-powered assistant
Related Glossary Terms


Every Twitter API media_category Value and What It Permits
The twitter api media_category parameter has eight values, decides the size and duration caps X enforces, and fails at Post time when you pick the wrong one.


The X Authenticity Rule: Can I Post the Same Content to Multiple Accounts?
Can I post the same content to multiple accounts? X bans identical posts from accounts one person runs, permits localized versions, and caps you at ten.


What Instagram's content_publishing_limit Endpoint Returns
Instagram's content_publishing_limit endpoint returns quota_usage plus a config block holding quota_total 50 and quota_duration 86400 seconds.
Related Articles


What the instagram_business_content_publish Scope Actually Grants
The instagram_business_content_publish scope lets an app create organic Instagram posts, and it depends on instagram_business_basic on every call.


Every Limit the Instagram Reels API Puts on Your Video
The Instagram Reels API caps a reel at 15 minutes and 300 MB and rejects anything but MOV or MP4. Every documented spec, plus the error each violation returns.


The Instagram Resumable Upload Session and the rupload Host
An Instagram resumable upload starts with upload_type=resumable on /media, then a POST to rupload.facebook.com carrying offset and file_size headers.

