# TikTok posting errors: what each code means and what to do

Canonical: https://status200uploads.com/platforms/tiktok/errors

Checked on 26 October 2026.

A TikTok post through Status 200 Uploads can be refused by us before anything is sent, or by TikTok itself. Our refusals carry a fixed code, such as REFRESH_TOKEN_EXPIRED or photo_format_not_supported, with a sentence saying what to do. TikTok's own refusals carry TikTok's code, such as spam_risk_too_many_posts, and its message shows in History. This page lists both, with whether sending the same request again can work.

## How to read an error

Every refusal is JSON with error.code and error.message. Switch on the code, not on the HTTP status alone: several codes share a status, and the message is a sentence for a person. The API reference lists the codes under their status.

One code it does not list yet: HTTP 500 FUNCTION_ERROR, our answer when something fails inside the TikTok step itself. It can come after TikTok already had the post, so look in History or on the TikTok profile before you send it again. Under an Idempotency-Key, the same request sent again replays this answer instead of posting a second time.

A TikTok post that left us gets a row in History, also when TikTok refuses it, so you can read what went wrong later. A photo we refuse before sending it (one of the photo codes below) leaves no failed post behind: nothing reached TikTok.

TikTok finishes a post after it answers. A post that TikTok accepted and then refused is written into History with TikTok's reason, and a post that TikTok already has cannot be sent again from History: publish it again as a new post instead.

## The connection to your TikTok account

TikTok signs your account out of apps after a while or when you remove access. These answers come from the TikTok step, so the post shows in History as failed.

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 401 | `REFRESH_TOKEN_EXPIRED` | TikTok ended the sign-in we hold for this profile. | Connect TikTok again under Connections, then publish the post again. | never: No. The same request cannot work: change it first. | API answer, History, AI app |
| 401 | `NO_TOKEN` | This profile has no TikTok sign-in stored. | Connect TikTok under Connections. | never: No. The same request cannot work: change it first. | API answer, History, AI app |
| 401 | `TOKEN_REFRESH_FAILED` | We could not renew the TikTok sign-in just now. | Publish it again a little later; if it fails again, connect TikTok again under Connections. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer, History |

## Photos TikTok would not take

TikTok takes JPEG and WebP photos up to 1080 × 1920 pixels. We send a JPEG copy of a PNG or GIF and a smaller copy of a larger JPEG, and say so in the answer. When neither is possible we refuse the photo before anything is sent, and the answer names the photo by its place in the post (error.photo, counting from 1).

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 422 | `photo_format_not_supported` | The photo is HEIC, AVIF, BMP or TIFF. | Save it as a JPEG and post again. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 422 | `photo_too_large_to_resize` | The JPEG is larger than TikTok takes and too large for us to make a smaller copy. | Save it smaller, for example 1080 × 1350 pixels, and post again. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 422 | `photo_too_large_to_convert` | The PNG or GIF is too large for us to make a JPEG copy of it. | Save it as a JPEG of at most 1080 × 1920 pixels and post again. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 422 | `photo_conversion_failed` | Making the JPEG copy failed. | Save the photo as a JPEG yourself and post again. | never: No. The same request cannot work: change it first. | API answer, AI app |

## Videos and their files

TikTok videos can be up to 4 GB through us. TikTok needs the file's exact size before the upload starts.

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 413 | `MEDIA_TOO_LARGE` | The file is larger than TikTok takes through us. Nothing was sent. | Use a smaller file: videos up to 4 GB. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 400 | `video_size_unknown` | The video is given by web address and its server does not say how large the file is. | Import it into your media library first (POST /api/v2/media) and post it by its mediaID. | never: No. The same request cannot work: change it first. | API answer, AI app |

## Sending the post to TikTok

These answers come after we started sending. The outcome may not be known, so a retry is safe only with the same Idempotency-Key: a TikTok post cannot be deleted by Status 200 Uploads once it is out.

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 400 | `no_publish_id` | TikTok did not confirm the upload with its publish id. | Send the same request once more, with the same Idempotency-Key. | resend_once_with_key: Once, with the same Idempotency-Key. | API answer, History |
| 502 | `upload_worker_failed` | Our upload of the video to TikTok stopped before it finished. | Send the same request once more, with the same Idempotency-Key. | resend_once_with_key: Once, with the same Idempotency-Key. | API answer, History |
| 202 | `still_publishing` | TikTok accepted the post and its upload was still going when we answered. It is not a failure. | Do not send it again. Read the post back (GET /api/v2/posts/{id}) until TikTok is done. | not_a_failure: No: it was accepted and goes out on its own. | API answer, History |

## Codes any post can get

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 401 | `unauthorized` | No API key, or a key that is not active. | Send Authorization: Bearer with an active rl_ key from the API page. | never: No. The same request cannot work: change it first. | API answer |
| 403 | `account_not_found` | The accountId is not one of your profiles. The answer lists yours. | Use a profile id or "@name" from the list. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 404 | `media_not_found` | The mediaID is not in your library: never imported, deleted, or removed after 7 days. | Import or upload the file again and use the new id. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 409 | `media_processing` | The file is still importing. | Wait the Retry-After seconds and send the same request. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer, AI app |
| 429 | `rate_limited` | Less than 20 seconds since your last post to the same network. | Wait the Retry-After seconds and send the same request. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer, AI app |
| 429 | `daily_limit_reached` | Your plan's posts for today are used up. | Post after resets_at, or move to a larger plan. | after_reset: Not before the time in resets_at. | API answer, AI app |
| 429 | `monthly_limit_reached` | The Free plan's posts for this month are used up. | Post after resets_at, or move to a paid plan. | after_reset: Not before the time in resets_at. | API answer, AI app |
| 422 | `idempotency_key_reused` | The Idempotency-Key was already used with another body. | Use a new key for a new post. | never: No. The same request cannot work: change it first. | API answer |
| 500 | `server_error` | Our side failed. | Send it once more with the same Idempotency-Key; without one, check History first. | resend_once_with_key: Once, with the same Idempotency-Key. | API answer, AI app |
| 502 | `upstream_unavailable` | The request never left. Nothing was posted. | Send the same request again after a short wait. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer |

## TikTok's own errors

When TikTok refuses a post as we send it, the answer carries TikTok's own HTTP status and code in error.code, and History shows TikTok's message. When TikTok refuses a post after accepting it, its reason is written into History. The codes below are TikTok's; what they mean comes from TikTok's developer documentation, read on 15 October 2026.

### spam_risk_too_many_posts

As the post is sent. The account reached TikTok's daily limit of posts made through apps. TikTok says the limit varies by creator, typically around 15 posts a day per account, shared by every app the account uses. [T9, T2] Post again the next day, or post from the TikTok app.

### spam_risk_user_banned_from_posting

As the post is sent. TikTok does not let this account post right now. [T2] Check the account in the TikTok app. Sending again will not help.

### privacy_level_option_mismatch

As the post is sent. The privacy level is not one TikTok offers this account: a private account cannot post to everyone, for example. [T2, T3] Pick one of the levels the account's posting options list.

### reached_active_user_cap

As the post is sent. TikTok's daily cap on the number of accounts one app may post for was reached. [T2, T9] Post again later.

### rate_limit_exceeded

As the post is sent. Too many requests in TikTok's one-minute window for this account. [T2, T16] Wait a minute and send it again.

### access_token_invalid

As the post is sent. TikTok no longer accepts the sign-in we hold. [T2, T15] Connect TikTok again under Connections.

### picture_size_check_failed

After TikTok accepted the post. TikTok refused the size of a photo. History shows it in our words, with the code in brackets. [T8, T4] Publish it again as a new post; we now send a smaller copy of a larger JPEG. If TikTok refuses it again, save the photo as a JPEG of 1080 × 1350 or 1080 × 1920 pixels.

### file_format_check_failed

After TikTok accepted the post. TikTok could not read the file's format. TikTok takes MP4, WebM and MOV videos. [T8, T4] Export the video as MP4 (H.264) and publish it as a new post.

### duration_check_failed

After TikTok accepted the post. The video is longer than this account may post. TikTok sets the longest length per account. [T8, T3] Shorten the video, or check the longest length in the account's posting options.

### frame_rate_check_failed

After TikTok accepted the post. The frame rate is outside what TikTok takes, 23 to 60 frames a second. [T8, T4] Export the video at 30 frames a second and publish it as a new post.

### spam_risk_text

After TikTok accepted the post. TikTok refused the post because of its text. [T8] Change the caption before posting again. TikTok says not to retry the same post.

### auth_removed

After TikTok accepted the post. The account removed access while the post was being processed. [T8] Connect TikTok again, then publish it as a new post.

## Questions

### What does REFRESH_TOKEN_EXPIRED mean on a TikTok post?

TikTok ended the sign-in we hold for that profile, so we can no longer post for it. Connect TikTok again under Connections, then publish the post again. The failed post stays in History with the reason.

### Should I send a TikTok post again after still_publishing?

No. still_publishing is a 202: TikTok accepted the post and was still uploading it when we answered. Sending it again could make a second post. Read it back with GET /api/v2/posts/{id} until TikTok is done.

### Why can I not retry a failed TikTok post from History?

When TikTok already has a post (it gave it a publish id) and then refused it, a retry would send the same upload twice, so History does not offer one. Fix what the reason says and publish it again as a new post.

### What does spam_risk_too_many_posts mean?

It is TikTok's own limit on posts made through apps. TikTok says the limit varies by creator, typically around 15 posts a day per account, and that it is shared by every app the account uses. Post again the next day.

### What does picture_size_check_failed mean in History?

TikTok accepted the photo post and then refused the size of a photo. TikTok takes photos up to 1080 × 1920 pixels. We now send a smaller copy of a larger JPEG, so publish it again as a new post; if TikTok refuses it again, save the photo as a JPEG of 1080 × 1350 or 1080 × 1920 pixels.

### Is it safe to send a TikTok post again after upload_worker_failed or no_publish_id?

Once, with the same Idempotency-Key. With the key, an answer we kept is replayed instead of posting twice, and a failure is sent afresh. Without a key, check History first: a TikTok post cannot be deleted by Status 200 Uploads once it is out.

## More on TikTok

- [TikTok](https://status200uploads.com/platforms/tiktok)
- [TikTok API guide](https://status200uploads.com/platforms/tiktok/api-guide)

## Related

- [Instagram](https://status200uploads.com/platforms/instagram)
- [YouTube](https://status200uploads.com/platforms/youtube)
- [REST API](https://status200uploads.com/integrations/rest-api)
- [Python](https://status200uploads.com/integrations/python)
- [n8n](https://status200uploads.com/integrations/n8n)
- [AI agents (MCP)](https://status200uploads.com/integrations/mcp)
- [TikTok photo rules in the API reference](https://status200uploads.com/docs/api#tiktok-photos)
- [Every error code in the API reference](https://status200uploads.com/docs/api)
- [File limits of every network](https://status200uploads.com/docs/file-limits)

## Sources

Sources read on 15 October 2026.

- T2. [Content Posting API: Direct Post reference](https://developers.tiktok.com/doc/content-posting-api-reference-direct-post) (last updated August 24, 2026)
- T3. [Content Posting API: Query Creator Info](https://developers.tiktok.com/doc/content-posting-api-reference-query-creator-info) (last updated August 4, 2026)
- T4. [Content Posting API: Media Transfer Guide](https://developers.tiktok.com/doc/content-posting-api-media-transfer-guide) (last updated August 4, 2026)
- T8. [Content Posting API: Get Post Status](https://developers.tiktok.com/doc/content-posting-api-reference-get-video-status) (last updated August 4, 2026)
- T9. [Content Sharing Guidelines](https://developers.tiktok.com/doc/content-sharing-guidelines) (last updated August 4, 2026)
- T15. [API v2 error handling](https://developers.tiktok.com/doc/tiktok-api-v2-error-handling) (last updated August 4, 2026)
- T16. [API v2 rate limits](https://developers.tiktok.com/doc/tiktok-api-v2-rate-limit) (last updated August 4, 2026)
