---
title: Label AI content so your ad runs on TikTok, Meta and Google
description: Find which shots in your ad are AI-generated, add an AI label in the video and the file name, and set each platform's own AI disclosure.
---
Label the AI content in an ad, also called AI disclosure or an AIGC label, so the platform and the viewer know what was generated. Your agent lists every generated shot, voice and image in the ad, adds a label in the video where you want one, and puts a tag in the file name. You set each platform's own AI toggle or checkbox when you upload.

This is ordinary ad work for a real product. The agent prepares the video and the list. You set the disclosure in the ad platform and you switch the ad on. The agent never publishes an ad. This page is not legal advice, and it makes no claim about what a platform will approve.

Use invideo for this when your ad mixes generated and real footage: the notebook records which model made each take, so the agent can list them instead of guessing.

## Quickest path

Set up your agent first with [invideo for AI agents](/agents). Then give it this prompt with the timeline URL.

```text
For this ad <edit-url>, list every clip that a model generated or
changed: video, voice, music and images, with the model and the timecode.
Add a small "Made with AI" label for the whole ad, add "_ai" to the export
file name, and tell me which platform settings I need to set.
```

Replace `<edit-url>` with the URL of the ad's timeline, from the editor's address bar or from `invideo edit new`. In a chat app and in a terminal the steps are the same. In a terminal, the agent also saves the list to a file you name.

## What you need

The agent needs the ad and your house rule.

- The timeline URL of the ad.
- Where it runs: TikTok, Meta (Facebook and Instagram), Google and YouTube.
- Your house rule for the label: the words, where it sits, and whether it shows for the whole ad or only on generated shots.
- Whether the ad is about social issues, elections or politics. Those ads have stricter rules on every platform.

## What each platform asks

Each platform has its own rule and its own switch. The rules change, so read the platform's page on the day you upload. The summaries below put each page in words.

### TikTok

TikTok asks advertisers to disclose an ad whose image, video or audio is completely made by AI or significantly changed by AI. You switch on "This ad contains AI-generated content" in TikTok Ads Manager when you create the ad. After you submit, you cannot change the toggle unless you change the video or image. Spark Ads are handled differently. Read <a href="https://ads.tiktok.com/help/article/add-disclaimers-to-ads" target="_blank">How to add disclaimers to ads in TikTok Ads Manager</a>.

### Meta

Meta labels ad images that were made or clearly edited with Meta's own generative AI tools with "AI info". Ads about social issues, elections or politics must disclose content that was digitally created or altered, including with tools outside Meta. Read <a href="https://www.meta.com/help/artificial-intelligence/355108217670024/" target="_blank">How AI-generated images in ads are identified and labelled on Meta</a>.

### Google and YouTube

Google asks election advertisers to disclose synthetic content that shows real or realistic people or events in a way that did not happen. They tick "Altered or synthetic content" in the campaign settings. For some formats Google adds the label itself; for others the advertiser adds a clear one in the ad. Read <a href="https://support.google.com/adspolicy/answer/15142358" target="_blank">Disclosure requirements for synthetic content</a>. For a video posted to a YouTube channel, YouTube asks creators to disclose realistic altered or synthetic content at upload. Read <a href="https://support.google.com/youtube/answer/14328491" target="_blank">Disclosing use of GenAI content</a>.

## Steps

The agent finds what was generated, labels it, and hands you the list for the platform settings.

<Steps>
<Step title="List what was generated">
The agent runs `read` on the project. Each thread is named after the model that made it unless someone renamed it, and each sequence shows who made it. It reads the timeline with `get_timeline` and matches each clip to its sequence. It sees a list of clips with model, kind and timecode.
</Step>
<Step title="Tell you what needs a disclosure">
The agent groups the list: generated people and voices, generated scenes, generated music, and real footage. It tells you which platform rules above may apply. You decide. It sees your answer in the chat.
</Step>
<Step title="Branch before you label">
The agent creates a branch with `timeline_history` action `create_branch`, named `ai-label`. It sees the branch URL, and makes every later edit there. The unlabeled cut stays on main.
</Step>
<Step title="Add the label in the video">
The agent adds the label with `add_text` on the top video track, for the whole ad or for each generated shot. It styles it with `set_text_style` so it stays readable on a phone, and places it inside the platform's safe zone. It sees a new text clip id.
</Step>
<Step title="Add a credits slide if your rule asks for one">
The agent adds a short end slide with `add_text` that names the models used, one per line. It sees the slide on the timeline.
</Step>
<Step title="Check, then export">
The agent calls `capture` on each labeled shot, runs `check_timeline`, then runs `export`. It sees an export card with status `completed`.
</Step>
<Step title="Tag the file and hand over the list">
A terminal agent saves the file and renames it to end in `_ai`, like `w44_c2_hookB_9x16_v1_ai.mp4`. Then the agent gives you the list for the platform settings. You see the tagged file and the list.
</Step>
</Steps>

The terminal version:

```bash
invideo agent register <project-url> --name <name>
export INVIDEO_AS=<name>
invideo project show <project-url>
invideo edit show <edit-url> --json
invideo branch new <edit-url> --name ai-label --token <state_token>
invideo edit show <branch-url> --json
invideo edit change <branch-url> --timeline T1 \
  --token <state_token> --operations @label.json
invideo edit capture <branch-url> --at 0.5,6,12 --out ./frames
invideo edit check <branch-url>
invideo edit export <branch-url> --format video --quality 1080 --json
invideo status <card-url> --wait
invideo notebook show <card-url> --out ./out
mv ./out/export.mp4 ./out/w44_c2_hookB_9x16_v1_ai.mp4
```

Where the values come from: `<project-url>` and `<edit-url>` are the URLs you give the agent, or what `invideo project new` and `invideo edit new` return. `<name>` is the name you choose in `invideo agent register`. `<state_token>` comes from `invideo edit show <edit-url>`, and on the branch from `invideo edit show <branch-url>`; the main token is stale there. `<branch-url>` is the `.branch_url` that `invideo branch new` returns. `<card-url>` is `.sequences[0]` of what the export returns. `invideo status` waits and does not download; `invideo notebook show` saves the file as `./out/export.mp4`.

The file `./label.json` holds the label as a bare list of operations, over the whole ad. `end_f` is the ad's last frame, from `get_timeline`. `V3` is the Titles track of a new timeline. On the MCP path, the same list goes in the `operations` field of `edit_timeline`.

```json
[
  { "op": "add_text", "track": "V3", "start_f": 0, "end_f": 450,
    "text": "Made with AI",
    "style": { "font_size": 34, "color": "#ffffff", "shadow": true } }
]
```

## Cost and time

Edits and exports are free. Generation and transcripts cost credits. Paid stock costs a small credit charge, or one of your workspace's iStock licenses. Your agent runs a dry run first and tells you the price before it spends anything.

- Costs credits: nothing on this page, unless you generate new shots.
- Free: reading the notebook, the branch, the label, the credits slide, `capture` and `export`.

Labeling one ad takes a few minutes. See [Credits](/account/credits) for prices.

## If something goes wrong

Most problems come from a clip with no clear source, or a label in the wrong place.

| Symptom | Fix |
| --- | --- |
| `get_model` or `generate` refuses the model as not found | Models retire. Run `find_models` with the job in words, use the best match, and tell the person which model you used. |
| Exit code 6, or `status` is `held` | A safety review, not a refusal. Wait, then run `invideo status <url> --wait` again. Do not resend. If it ends `failed`, change the input the review flagged. |
| A clip has no thread or model | It was uploaded. Ask the person where it came from. Do not guess. |
| A thread was renamed and hides its model | `read` the sequence URL. Tell the person what you found and what you could not. |
| The label sits under the platform buttons | Move it with `set_position` inside the safe zone, and capture again. |
| The label is unreadable on a phone | Raise `font_size` and add `shadow` or `background_color` with `set_text_style`. |
| The saved file is called `./out/export.mp4` | `notebook show` always saves `./out/export.mp4`. Rename the file to end in `_ai`. |
| CLI exit 3 on the branch | The token is from main. Run `invideo edit show <branch-url>` and use its `state_token`. |
| A refusal with `code` `failed` | Try once more. If it fails again, file `report_bug` and tell the person. |
| Avoid: telling the person an ad is compliant | Instead: give the list and the platform pages. The person and their legal team decide. |
| Avoid: setting the platform toggle | Instead: the person sets it in the ad platform. The agent has no access there. |

## Prompts to try

Each prompt is a real variation of this job.

```text
Label only the shots with a generated person, at the top left, for the
length of each shot. Leave the real product shots unlabeled.
```

```text
Make a list of every model used in all my October ads, by file name, so
the compliance team can check them.
```

```text
Add a 2 second end slide that says "Visuals created with AI" and names the
video and voice models, then export the 9:16 and 16:9 versions.
```

## When to use something else

invideo does not set disclosures inside TikTok Ads Manager, Meta Ads Manager or Google Ads, and does not judge whether an ad meets a law or a policy. For political or issue ads, or ads in a regulated field like health or finance, ask your legal or compliance team. For Content Credentials (C2PA) in the file itself, use a tool that writes C2PA data, like Adobe Content Authenticity.

## Related

- [Make a UGC ad from product photos with an AI actor](/how-to/marketing/ugc-ad-with-ai-actor)
- [Make performance ads for Meta, TikTok and YouTube, named and iterated from results](/how-to/marketing/performance-ads)
- [Resize one master ad for every placement, with safe zones](/how-to/marketing/every-placement-from-one-master)
- [Make a brand ad film from a brief, with generated shots and your real product](/how-to/marketing/brand-ad-film)
- [Commercial use of stock, music and generated media](/account/commercial-use)