Send a video provider's own controls — a negative prompt, prompt enhancement — through provider.options.
Use this guide when you need a video control that only one provider has — a negative prompt, prompt enhancement, a person-generation policy. By the end you will have sent one through provider.options.
Submitting
POST /v1/videosstarts a real video job and is billed in DA when the clip is delivered.
Provider options are the provider's own parameters, under its own names. Which ones a model takes is its allowed_passthrough_parameters on GET /v1/videos/models — google/veo-3.1 lists negativePrompt and enhancePrompt among them. Their values are in that provider's documentation. The common controls (duration, resolution, aspect_ratio) need no provider option.
Options are keyed by provider. Only the options of the provider that serves the job are sent; the others are left out.
curl https://opendunes.com/v1/videos \
-H "Authorization: Bearer $OPENDUNES_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "google/veo-3.1-lite",
"prompt": "A short cinematic product shot of a white orchid blooming",
"duration": 4,
"resolution": "720p",
"aspect_ratio": "16:9",
"provider": {
"options": {
"google-vertex": {
"parameters": { "negativePrompt": "blurry, low quality" }
}
}
}
}'The provider object travels to the model as you send it. The answer is 202, with the job's id, its polling_url and its status.
If your app can fall back to another video model, keep the common request apart from one model's options, so the fallback sends only what every model takes:
{
"model": "bytedance/seedance-2.5",
"prompt": "A short cinematic product shot of a white orchid blooming",
"duration": 5
}An option the provider does not take is refused by it, and its words come back: remove the option or correct it. Then poll GET /v1/videos/{id} until completed and fetch the clip from /content — see Generate and Download a Video from Text.