Genace

allow_adult for personGeneration is currently not supported. — Veo API image-to-video treated as text-to-video

HTTP 400 INVALID_ARGUMENT Do not retry as-is

The exact error

400 INVALID_ARGUMENT: allow_adult for personGeneration is currently not supported.

What it means

Veo decided your request was text-to-video, and text-to-video does not accept allow_adult.

Google’s Veo docs list which personGeneration value each mode accepts. Text-to-video and video extension take "allow_all" only. Image-to-video, interpolation (first and last frame) and reference images take "allow_adult" only. So allow_adult is valid, but only when the request really is image-based.

The confusing part is that most people who hit this believe they sent an image. In Google AI Developers Forum thread 181139, a developer using veo-3.1-generate-preview through the Gemini API with google-genai 2.22.0 got this error on their image-to-video path. They asked whether allow_adult needed a project allowlist. A forum moderator answered that it does not. The moderator explained that the error appears when the request is evaluated as text-to-video “because an input image was not supplied or recognized in the request payload.”

In other words, the image was missing or in a place Veo did not look, so the request fell back to text-to-video, and the allow_adult value no longer fit.

How to confirm it’s this

  • The response is HTTP 400 INVALID_ARGUMENT with the message above. The developer in the thread quoted it with the 400 INVALID_ARGUMENT: prefix shown at the top of this page.
  • Log the exact request body or SDK arguments at the moment of the call. Check that the image is present and not empty. In the thread, the developer had two code paths, one of which never passed a first frame.
  • For REST calls, Google’s Veo examples place the starting image inside the instance, as instances[0].image with an inlineData object that holds mimeType and data. An image placed anywhere else may not be recognized.

Fix

Pass the image in the place the SDK expects it. The moderator in thread 181139 gave this Python pattern for the Gemini API:

from google import genai
from google.genai import types

client = genai.Client()
image = types.Image.from_file(location="path/to/first_frame.png")
operation = client.models.generate_videos(
    model="veo-3.1-generate-preview",
    source=types.GenerateVideosSource(
        prompt="A person walking down a city street at sunset.",
        image=image,
    ),
    config=types.GenerateVideosConfig(
        aspect_ratio="16:9",
        person_generation="allow_adult",
    ),
)

Google’s Veo page also shows a second shape, with image= passed directly to generate_videos next to prompt=. Either way, the image has to be a real image object, not None and not an empty string.

Then match the value to the mode:

  1. Image-to-video, interpolation or reference images: send allow_adult.
  2. Text-to-video with no image: send allow_all, or omit the parameter, as the moderator suggested.
  3. Video extension: the docs list allow_all only, so do not reuse an allow_adult config for extension calls.

If your code builds one config object and reuses it across modes, choose personGeneration per call instead.

Retry or not

No. The service rejects the combination of mode and value, and an identical request gets the same 400. The moderator’s answer names a specific cause, a missing or unrecognized image, and that does not change between attempts. Fix the payload or the value, then send a new request. An agent should not spend retries or backoff time on this error.

When it’s not this

  • allow_all for personGeneration is currently not supported. This is the mirror image. It applies to image-based modes, and Google’s docs say that in EU, UK, CH and MENA locations allow_adult is the only allowed value. If you are in one of those regions, your text-to-video calls sit between both rules. Read that page before changing values back and forth.
  • An image that arrives but cannot be decoded. In forum thread 128760, a Veo 3.1 REST call with an image got a separate 400, Unable to process input image. That message points at the image data, not at personGeneration.
  • A project allowlist. The moderator said none is needed for allow_adult with veo-3.1-generate-preview. Allowlist errors, such as the one for frame interpolation, use a different status and name the feature.

Error text last verified against the sources below on .

Where these facts come from