Genace

videos were filtered out because they violated Google's Responsible AI practices — Veo API returned no video

raiMediaFilteredReasons Retry depends on cause

The exact error

1 videos were filtered out because they violated Google's Responsible AI practices. You will not be charged for blocked videos. Try rephrasing the prompt. If you think this was an error, send feedback.

Your Veo job ran to completion, but the video it produced was removed by a safety filter before it reached you. Nothing failed at the HTTP level: the long-running operation reports done, and the explanation is sitting in a field most polling code never reads.

What it means

Veo checks both what you send and what it generates. Google’s Veo docs say generated videos “are passed through safety filters and memorization checking processes that help mitigate privacy, copyright and bias risks”. The Responsible AI page for Veo on Vertex (now branded Gemini Enterprise Agent Platform) adds that “if fewer videos than requested are returned, then some generated output is being blocked for not meeting safety requirements.”

This message is that output-side block. In the forum thread where it was posted, the operation result looked like this: generated_videos=None, rai_media_filtered_count=1, and the sentence above inside rai_media_filtered_reasons. The leading number is the count of filtered videos, so with a request for more than one video you may see a different number. The message itself says you are not charged for blocked videos.

On Vertex the same block has been reported with a different ending: in nodetool issue #5195, a Veo 3.1 shot came back with “videos were filtered out because they violated Vertex AI’s usage guidelines”. Match on the start of the sentence if you handle both platforms.

The practical trap is in client code. Google’s examples read operation.response.generated_videos[0] as soon as operation.done is true. When the output was filtered there is no list to index, so Python code fails with a NoneType error (or undefined in JavaScript) that hides the real reason.

How to confirm it’s this

  • The operation is done and carries no error object.
  • generated_videos is empty or None.
  • rai_media_filtered_count is 1 or more, and rai_media_filtered_reasons contains this sentence. In raw REST responses the same fields appear in camelCase: raiMediaFilteredCount and raiMediaFilteredReasons.

If the reason instead mentions audio, celebrities or likenesses, or a support code, you are looking at a sibling filter; see the related pages below.

Fix

  1. Read the filter fields before touching the video. Using only the fields that appear in Google’s example and in the reported result:

    while not operation.done:
        time.sleep(10)
        operation = client.operations.get(operation)
    
    result = operation.response
    if not result.generated_videos:
        reasons = result.rai_media_filtered_reasons or []
        raise RuntimeError(f"Veo filtered the output: {reasons}")
    
    video = result.generated_videos[0]

    Surface reasons to your logs or to the user. It is the only diagnostic you get.

  2. Review the request against the policy. The Responsible AI page lists the categories the filters look for (violence, sexual, derogatory, toxic and others) and the policies they enforce. If the prompt or input image genuinely touches one of these, change the content itself.

  3. If you believe it is a false positive, report it. The message asks you to send feedback. In the forum thread, the reporter posted there and a forum responder asked for the prompt and pointed to the prompt guidelines. Keep the exact prompt and input so the case can be reproduced.

Do not try to disguise disallowed content to get it past the filter. That is against Google’s usage policies and is not something this page will help with.

Retry or not

Depends, but never in a loop. The message itself tells you to rephrase the prompt, not to resend it, so an unchanged resubmission is not the documented fix. On the other hand, the nodetool #5195 reporter says an ordinary shot description was blocked once and the identical retry passed, and they describe the filter as non-deterministic. That is a community observation. A single identical retry for clearly benign content is defensible; repeated retries are not.

There is also a quota cost to consider. A user in forum thread 175949 reports that filtered Veo requests are not billed but still count against the requests-per-day allowance; on a low daily cap that can burn a large share of a day’s budget. That is a community report, not a documented rule; check your usage page.

For agent code: after at most one retry, return a clear “filtered by safety” status with the reason text, and let a human or a higher-level planner decide whether the content should change. Do not map it to your generic “transient error, retry” path.

When it’s not this

  • Failed to check on video generation status multiple times. Reported in AI Studio with Veo 2 in forum thread 95848. It is a status-check failure in the Studio UI, not a filter reason in the API response. The reporter guessed it might hide a block or capacity problem, but that was not confirmed; a forum responder recommended the Gemini API over AI Studio for stable results.
  • Cannot read properties of undefined (reading 'name'). Reported in js-genai issue #1074 when a stateless function rebuilt a pending operation with new GenerateVideosOperation({ name: operationName }). A js-genai contributor suggested creating the object empty and then setting operation.name = operationName, and the reporter confirmed that resolved it. That is a polling bug in your code, not a filtered video.
  • A 400 or 429 when submitting. Those reject the request up front and never produce an operation to poll.

Error text last verified against the sources below on .

Where these facts come from