Specs and limits

Social media caption length limits by platform

Caption limits range from 280 characters on X to 400,000 on Dev.to. The ones people hit most are X at 280, Bluesky at 300, Threads, Pinterest and Mastodon at 500, Instagram and TikTok at 2,200, and LinkedIn at 3,000. When you post to several platforms at once, the shortest limit among them is the one to write for.
Published 4 min read

What is the caption limit on each platform?

Caption or body length per platform from the Socifyr shared constants
PlatformMax charactersIf text is too long
X280Split into a thread
Bluesky300Split into a thread
Threads500Split into a thread
Pinterest500Not rewritten
Mastodon500Not rewritten
Nostr1,000Not rewritten
Discord2,000Truncated to 2,000
Instagram2,200Not rewritten
TikTok2,200Not rewritten
LinkedIn3,000Not rewritten
Telegram4,096 (media captions 1,024)Media captions truncated to 1,024
YouTube5,000 description, 100 titleNot rewritten
Reddit40,000Not rewritten
Slack40,000Not rewritten
Tumblr50,000Not rewritten
Facebook63,206Not rewritten
Hashnode100,000Not rewritten
Dev.to400,000Not rewritten

"Not rewritten" means Socifyr leaves your text as it is and the platform decides what to do with it. If the platform refuses the post, the API returns a plain-language reason such as "The caption is too long for LinkedIn. LinkedIn allows up to 3,000 characters. Shorten the caption and retry." Only the platforms marked thread or truncate change your text on the way out. The "Max characters" column comes from the shared constants Socifyr validates against.

What happens when my text is too long?

  • Thread (X, Bluesky, Threads). Socifyr splits at paragraph boundaries where possible, then sentences, then words, so each part fits the limit and replies to the previous one. The result is one post with a link to the first part. See X posting limits and costs.
  • Truncate (Discord, Telegram media captions). The text is cut at the limit with no warning. A long Discord message arrives clipped at 2,000 characters.
  • Not rewritten (everything else). Socifyr sends your text unchanged. If the platform refuses it, that channel fails while the others succeed, so the overall status becomes partial_failure. Fix the text and call retry.

How do I write one caption for many platforms?

Write for the tightest limit in the set. @socifyr/shared exports getEffectiveCaptionLimit, which returns the minimum caption length across the platforms you pick, so you can check length before sending.

typescript
import { getEffectiveCaptionLimit } from '@socifyr/shared'

getEffectiveCaptionLimit(['instagram', 'linkedin', 'threads']) // 500
getEffectiveCaptionLimit(['instagram', 'linkedin'])            // 2200
getEffectiveCaptionLimit(['x', 'linkedin', 'bluesky'])         // 280

When one caption cannot serve everyone, override it per account with platformOptions and keep a shared default:

typescript
await socifyr.uploads.photos({
  connections: ['instagram-mybrand', 'x-myhandle'],
  medias: ['https://cdn.example.com/banner.jpg'],
  text: 'Default caption for any account without an override',
  platformOptions: {
    'instagram-mybrand': { text: 'Long Instagram caption with context and hashtags #design' },
    'x-myhandle': { text: 'Short version for X. Link in bio.' },
  },
})

More patterns in how to cross-post to multiple platforms with one API call.

Which limits are about the title or description rather than the caption?

YouTube has separate fields. The title is limited to 100 characters and the description to 5,000. Pinterest pin titles are capped at 100 characters in the platform options. For TikTok and Instagram video, the post text is the caption and the limit is 2,200. The Socifyr API accepts up to 25,000 characters in text per request, and the limit of each platform then applies on top of that.

How do I check length before I send?

typescript
import { getEffectiveCaptionLimit, type SupportedPlatform } from '@socifyr/shared'

function fits(text: string, platforms: SupportedPlatform[]): boolean {
  const limit = getEffectiveCaptionLimit(platforms)
  return limit === undefined || text.length <= limit
}

fits(caption, ['x', 'linkedin', 'threads']) // true only if it is 280 characters or fewer

Run the check in the code that generates the caption. If you let an AI model write it, put the limit in the instruction and verify the result, because models routinely overshoot a character count. When it does not fit, either shorten and retry or split the targets into two posts with different text.

What mistakes come up most often?

  • Writing for LinkedIn's 3,000 and then cross-posting to X, which splits it into a long thread nobody wanted.
  • Assuming Discord will reject text that is too long. It truncates instead, so the cut is silent.
  • Forgetting that Telegram media captions are 1,024, not the 4,096 of a text message.
  • Counting only visible characters and ignoring link length on tight platforms.
  • Putting everything in the caption when a first comment would carry the hashtags. The shared constants mark X, Bluesky, Instagram, LinkedIn, Facebook, Threads, Reddit and YouTube as supporting first comments.

Frequently asked questions

What is the Instagram caption limit?

2,200 characters.

What is the character limit for a LinkedIn post through the API?

3,000 characters in Socifyr's constants.

What is the X character limit?

280. Longer text is split into a connected thread automatically.

Which platform has the longest limit?

Dev.to at 400,000 characters, then Hashnode at 100,000 and Facebook at 63,206.

How do I find the limit for a set of platforms?

Call getEffectiveCaptionLimit(platforms) from @socifyr/shared. It returns the minimum across the platforms you pass.

Related pages

Try it with your own accounts

One API key, 18 platforms, and your agent never sees a platform token. The free plan needs no card.