TikTok photo post limits: 20 MB per image, 1080p max, JPEG or WebP
TikTok's media guide caps photo-post images at 1080p and 20 MB each, in WebP or JPEG. Set Sume image output and video stills to match before you upload.

For TikTok photo posts through the API, each image must be WebP or JPEG, at most 1080p, and at most 20 MB. AI image models usually return far more pixels than that, so ask Sume for the right shape up front instead of resizing later.
Sume's image route can output jpeg or webp and take a 9:16 aspect ratio, and video inspect can pull JPEG stills from a clip with a pixel cap. Neither sets a file-size target, so you verify the 20 MB limit yourself.
What are the image limits?
From TikTok's Media Transfer Guide:
| Item | Limit |
|---|---|
| Formats | WebP, JPEG |
| Resolution | Maximum 1080p |
| File size | Maximum 20 MB per image |
What does 1080p mean for a vertical image?
The page says only "maximum 1080p" and does not spell out which edge it measures. The cautious reading is a long edge of 1080 or less is certainly fine, and 1080x1920 is the common vertical 1080p frame. If an upload is refused, test with a smaller long edge before assuming something else is wrong.
Photos also differ from videos in how they get to TikTok. The upload guide says photos support only URL-based uploads from a verified domain, so the file has to sit on a domain you control.
How do I request the right size from Sume?
On Image 1.0, aspect_ratio accepts per-model native values and output_format accepts png, jpeg, jpg or webp. Choose jpeg or webp, never png, for TikTok. image_size takes WIDTHxHEIGHT only on models that accept custom pixels (GPT, Seedream, Flux, Qwen, Recraft); on GPT both edges must be multiples of 16, so 1080 itself is not valid there.
For stills from a video, ask video inspect for explicit timestamps as JPEG with a pixel cap. max_edge is the long-edge clamp, 64 to 2160, so 1080 stays inside the TikTok cap:
curl -X POST https://api.sume.com/v1/video-inspect \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: tiktok-stills-001" \
-d '{
"video_url": "https://media.sume.com/artifacts/artf_demo/clip.mp4",
"frames": { "at": [1, 4, 7], "format": "jpeg", "max_edge": 1080 }
}'What does Sume not check for you?
Neither route reports a file size or promises one under 20 MB. A JPEG at 1080 on the long edge is normally well below that, but measure the downloaded file before you send it. Sume also does not re-host the result on your verified domain: download the media.sume.com artifact and put it where TikTok can pull from.
Video inspect stills are unbilled with default probing; only the optional transcript is billed.
Pre-upload checklist
Before you queue a photo post:
- Format is JPEG or WebP.
- Long edge is 1080 or less.
- Each file is under 20 MB when measured.
- The files are served from a domain you have verified with TikTok.
Sources
Related posts
More in Integrations
- TikTok publish webhooks vs Sume run webhooks: wire both safely
TikTok sends webhooks for failed, complete, inbox, public and removed posts. Sume signs its own run webhook separately. Keep two receivers and verify Sume's.
- Val Town free 1-minute timeout: a Sume webhook receiver val
Val Town's free plan stops a val at 1 minute and runs crons every 15 minutes at best. Submit Sume jobs async, then take the result by webhook or a slow cron.
- Vercel Workflow createWebhook is token-only: verify Sume first
createWebhook trusts only the URL token. For a Sume callback, verify the sume-v1 signature in your own route, then resume a hook with resumeHook.
- VS Code mcp.json: servers or mcpServers key for Sume's hosted MCP?
VS Code's .vscode/mcp.json uses a top-level servers key; the portable .mcp.json uses mcpServers. Put Sume's entry under the key that matches its file.
Written by Sume