# Content policy (/policy/content)



What RiffAds refuses to make, and what you must do with what it makes.

## One check on every path [#one-check-on-every-path]

REST, MCP, the CLI, the app and workflow runs all run the same check. Refused on one, refused on all. The check runs before anything is charged, so a refusal carries `credits_charged: 0`.

## What is checked [#what-is-checked]

| Input                                                           | When                                     |
| --------------------------------------------------------------- | ---------------------------------------- |
| Script                                                          | On submit                                |
| Free text fields (prompt, brief, lyrics, headline, instruction) | On submit                                |
| Uploaded images                                                 | When the upload is finalized, before use |
| Import URLs                                                     | Before anything is fetched               |

Text is matched against a fixed rule list. A model pass can sit on top for wording the list misses.

| Category                        | Result            |
| ------------------------------- | ----------------- |
| Sexual content involving minors | Refused           |
| Explicit sexual content         | Refused           |
| Credible violence and threats   | Refused           |
| Illicit goods                   | Refused           |
| Hate                            | Refused           |
| Self harm                       | Warning, job runs |
| Impersonation                   | Warning, job runs |

<Callout type="warn" title="Video and audio are not scanned">
  Uploads return `content_checked: false` for video and audio. Nothing reads their contents. Don't tell your users they were reviewed.
</Callout>

## What a refusal looks like [#what-a-refusal-looks-like]

```json title="Response: 422"
{
  "error": {
    "ok": false,
    "code": "moderation_blocked",
    "message": "This request was refused by our content policy. Change the wording or the input; sending it again unchanged will be refused again.",
    "retryable": false,
    "credits_charged": 0
  }
}
```

* One sentence. No category, no internal id. There is nothing to reverse engineer.
* A refused file names its `ast_` id. That file can never be used. Upload a different one.
* An upload still being scanned returns `input_not_ready`. That one is retryable.

## Resending fails [#resending-fails]

The rule list gives the same answer to the same words, forever. Repeats get blocked:

| Refused by    | Refusals | Then                     | For          |
| ------------- | -------- | ------------------------ | ------------ |
| The rule list | 2        | Refused without checking | 30 days      |
| A model       | 3        | Paused                   | about 1 hour |

A blocked request returns `request_blocked` (429, not retryable, `blocked_reason: "moderation_blocked"`). Change the script or the inputs. Blocks never cross workspaces.

If checks are down, agent submits return `moderation_unavailable` (503, retryable). Reads still work.

Think a refusal is wrong? There is no appeal button. Change the wording. A different request gets a fresh check.

## Everything is AI made [#everything-is-ai-made]

Every file RiffAds returns is AI generated or AI edited. Video, images, voice, music, scripts. That stays true with your own script or your own uploads.

**The file carries no label.** No watermark, no visible mark, no C2PA data. Some models may add hidden marks. RiffAds does not add, check or promise them.

<Callout type="error" title="Labeling is your job">
  RiffAds never publishes anything. You choose where the file goes, so the duty to disclose goes with you. No API, MCP or CLI response tells your agent to label. Build it into your process.
</Callout>

Label where law, a regulator or a platform requires it:

* **EU AI Act.** Transparency rules apply from 2 August 2026. Realistic content that looks like real people, places or events must be disclosed.
* Laws on deepfakes, synthetic media, political ads, and use of a person's name, image or voice.
* Advertising and consumer law, including fake reviews, testimonials and endorsements.
* Ad policies of every platform you run on.

Use a label people notice: "AI generated" or "Made with AI", or the platform's own AI label. To burn one in, use the `text_overlay` capability. [Capabilities](/capabilities). Not legal advice.

## Actors are not real people [#actors-are-not-real-people]

* Library actors are AI. They never used, tested or recommended anything. Don't present one as a real customer, reviewer or expert.
* Making an actor from a real person's photo, or cloning a real voice? &#x2A;*Get their written consent first.** Never anyone under 18. Keep a copy.
* RiffAds does not verify who is in a photo or voice sample. Impersonation wording is a warning, not a block. The job runs. The duty is yours.

## Review before you publish [#review-before-you-publish]

Nobody at RiffAds watches output. Expect sometimes:

* Wrong, missing or mispronounced words.
* Lips out of sync. Odd faces, hands or text.
* False product details or claims, including in AI-written scripts.
* Accidental likeness to a real person or brand.

The check runs on inputs, not on the finished file. Watch, listen, read. Make sure every claim is true.

Full rules: [AI Disclosure](https://riffads.com/ai-disclosure) and [Acceptable Use Policy](https://riffads.com/acceptable-use). [Legal](/policy/legal).
