# TikTok

> Render a 9:16 film for TikTok, with the post and ad limits, the safe-zone templates and the vawe commands.

Canonical: https://vawe.dev/docs/tiktok

At the end of this page you have a 1080 × 1920 film for a TikTok post or ad. TikTok publishes limits for ads on `ads.tiktok.com` and for posts on `support.tiktok.com`. The two sets differ.

## The limits

The sourced table is in [Video specs by platform](https://vawe.dev/docs/platforms). Read on 2026-10-31 and 2026-11-01:

* In-feed ad: 9:16 at 540 × 960 or more is recommended. 16:9 needs 960 × 540 or more, and 1:1 needs 640 × 640 or more. Up to 10 minutes, 500 MB or less, formats `.mp4`, `.mov`, `.mpeg`, `.3gp` and `.avi`.
* Post: not verified. `support.tiktok.com` answered 503 on 2026-10-31 and 2026-11-01. Search excerpts give 720 × 1280 or more and up to 10 GB, and disagree on length (10 or 60 minutes). Read the TikTok upload screen before you rely on a length.
* TikTok publishes no frame rate and no loudness target on the pages read.

## Safe zone

TikTok publishes safe-zone templates for ads, as downloadable files. The Ads help page says the zone depends on the dimension, the caption length and any added formats. It gives no pixel list. There are files for left-to-right regions, files for Arabic, and files that include anchors. Download the template that fits your ad from the TikTok Ads help page.

For a post, TikTok publishes no pixels. As an estimate, use the Meta numbers for Reels ads on [Instagram Reels](https://vawe.dev/docs/instagram-reels#safe-zone). They are not a TikTok rule.

## Make the film

<Steps>
  <Step>
    ### Start a 9:16 page

    ```bash
    bin/vawe new my-tiktok --request "a 15 second hook with captions" --aspect 9:16 --length 15
    ```

    The page gets `<meta name="aspect" content="9:16">` and `<meta name="duration" content="15">`.
  </Step>

  <Step>
    ### Look at the frame

    ```bash
    bin/vawe still films/my-tiktok/page.html --at 2 --aspect 9:16
    ```

    Compare the PNG in `out/still/` with the TikTok template for ads, or with the estimate above for posts.
  </Step>

  <Step>
    ### Draft, then ship

    ```bash
    bin/vawe dev films/my-tiktok/page.html --aspect 9:16
    bin/vawe ship films/my-tiktok/page.html --aspect 9:16
    bin/vawe ship --status --wait
    ```

    `ship` needs a fresh critique and the owner approval. See [Ship](https://vawe.dev/docs/ship). The final is an `.mp4`, a format on both TikTok lists.
  </Step>
</Steps>

## Many films from one page

To render one film per row of data, read [Batch from data](https://vawe.dev/docs/batch-from-data). `ship` takes `--param key=value` and puts it in the file name.

## Limits

* A final is 60 fps. `ship` has no fps flag. TikTok publishes no frame rate on the pages read.
* The ad page lists a bitrate of 516 kbps or more. `ship` encodes with `-crf 16` and sets no bitrate, so check the bitrate of a final before you upload.
* Loudness: TikTok publishes no target. See [Loudness and the mix](https://vawe.dev/docs/loudness-and-the-mix).

  <Card title="Video specs by platform" href="/docs/platforms">
    All six platforms, with sources.
  </Card>

  <Card title="Vertical social" href="/docs/vertical-social">
    Lay out for 9:16.
  </Card>

  <Card title="Batch from data" href="/docs/batch-from-data">
    One film per row.
  </Card>

{/* sources (vawe 4d9a5acb4):
  ad limits and safe zone text: https://ads.tiktok.com/help/article?aid=6669199281502552069 read 2026-10-31 (formats .mp4 .mov .mpeg .3gp .avi; 10 minutes; 500 MB; 516 kbps)
  post limits: not verified; support.tiktok.com 503 on 2026-10-31 and 2026-11-01; excerpts: creator-tools page (720 x 1280, 10 GB), tiktok.com/creators/creator-portal/en-us/tiktok-content-strategy/creating-videos-longer-than-one-minute (60 minutes)
  14/35/6: Meta Ads Guide Reels video
  --param in ship: bin/vawe ship --help
  encode -crf 16: harness/media/render-page.mjs:580
  */}
