TikTok caption and hashtag limits

Last checked · sources listed at the foot of this page

A TikTok caption posted through the Content Posting API is capped at 2,200 UTF-16 runes, and hashtags and mentions count against that same budget. There is no separate hashtag allowance: thirty hashtags simply consume however many runes they spell.

How long can a TikTok caption be?

TikTok’s Direct Post documentation states the limit on the title field as "2200 in UTF-16 runes". That unit is the detail that trips people up, and it is not a synonym for "characters".

A UTF-16 rune is a 16-bit code unit. Latin letters, digits and most punctuation cost one. Most emoji cost two, because they sit outside the Basic Multilingual Plane and are encoded as a surrogate pair. So do many CJK extension characters.

The practical effect: a caption that your text editor reports as 1,180 characters can be over 2,200 runes if it is heavy on emoji. Count in UTF-16, not in glyphs — in JavaScript, that is exactly what String.prototype.length already gives you.

ContentRunes consumedWhy
a, Z, 7, ?, space1Basic Multilingual Plane, single code unit.
é, ü, ñ (precomposed)1Still one code unit in UTF-16.
é written as e + combining accent2Two code points, so two runes, for one visible glyph.
🔥, 😂, 🎯2Outside the BMP — encoded as a surrogate pair.
👨‍👩‍👧 (family, ZWJ sequence)8Three emoji plus two zero-width joiners. One glyph, eight runes.
#fyp4A hashtag is plain text against the same budget.
What one rune of the 2,200 budget actually buys.

Is there a separate limit on the number of hashtags?

Not in the posting API. Hashtags are part of the title string, so the only ceiling is the 2,200 runes they share with the rest of the caption.

That is a documentation fact, not a distribution one: nothing in the API stops you from writing forty hashtags, and nothing in the API promises they help.

What else does the API decide for you, per creator?

The Query Creator Info endpoint returns the posting constraints of the specific account you are about to publish to, and they are not the same for everyone. It is the field worth knowing about:

privacy_level_options differs by account type. A public account is offered PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS and SELF_ONLY. A private account is offered FOLLOWER_OF_CREATOR, MUTUAL_FOLLOW_FRIENDS and SELF_ONLY — there is no public option to choose.

comment_disabled, duet_disabled and stitch_disabled come back as booleans. duet_disabled returns true when the account is private or the creator set Duet to "No one" — so an interaction toggle can be unavailable for a reason that has nothing to do with your app.

max_video_post_duration_sec is returned per creator. There is no single published number for "the maximum length of a TikTok video" through the API: you ask the account, and it tells you.

Why does a caption sometimes post but the video stays private?

That is not a caption problem. TikTok restricts all content posted by unaudited API clients to private viewing mode. Until the client passes TikTok’s audit, every post lands as SELF_ONLY regardless of what the caption or the privacy field says.

Frequently asked

What is the TikTok caption character limit?
2,200 UTF-16 runes for a caption posted through the Content Posting API, with hashtags and mentions counting against the same total.
Do hashtags count toward the TikTok caption limit?
Yes. Hashtags are part of the title string, so they consume the same 2,200 runes as the rest of the caption. There is no separate hashtag budget.
How many characters does an emoji use in a TikTok caption?
Most emoji cost 2 runes, because they are encoded as a UTF-16 surrogate pair. Composite emoji cost more: a family emoji joined with zero-width joiners can cost 8 runes for a single visible glyph.
What is the maximum TikTok video length through the API?
It depends on the account. The Query Creator Info endpoint returns max_video_post_duration_sec for the specific creator you are publishing to, rather than a single fixed value for every account.

Sources

These figures come from another company’s documentation, which can change without notice and which nothing here verifies automatically. That is why every source carries the date it was read. Sources on this page are re-read every quarter.