JSON Prompt Generator
Fill in the parts of a shot, get a JSON prompt plus the request body that carries it. The parameter options change per model, and they are the real ones — anything outside them returns 400.
Request parameters
These are validated by the API. Options below are the only values Seedance 2.0 Fast accepts — anything else returns 400 INVALID_PARAM.
A JSON prompt is not a schema — it is still a string
The prompt field is typed as a plain string. JSON prompting works because models read structure well, not because the API parses it. That means {"duration": 10} inside your JSON prompt does nothing at all — duration, aspect ratio and resolution are separate request fields, and they are the only ones the API validates.
JSON prompt
Goes into the prompt field as a string.
Fill in at least one field above.Request body
POST /v1/video/generations
Fill in at least one field above.curl
Set GENACE_API_KEY first.
Fill in at least one field above.What a JSON prompt actually is
A JSON prompt is a formatting convention, not an API feature. You write
your description as a JSON object instead of a sentence, and the model
reads the keys as labelled sections. Nothing parses it — on this API the
prompt field is typed as a plain
string, so a JSON prompt arrives as text that happens to look like JSON.
That distinction has a practical consequence people get wrong constantly:
putting "duration": 10 or
"aspect_ratio": "9:16" inside the
JSON prompt does nothing. Those are separate request fields. The model may
read them as a hint, but the actual clip length and framing come from the
request body, and only the request body is validated.
Why it helps anyway
Two reasons, both about you rather than the model. First, a JSON prompt is
diffable — when a generation comes out wrong you can change one key and
see exactly what changed, instead of rewriting a paragraph and guessing
which clause did it. Second, it is programmatic: an agent building prompts
can set camera_motion without
string-splicing an English sentence.
Leave a key out rather than setting it to an empty string. An empty value is still a value, and models will occasionally treat it as a constraint. The generator above drops empty fields for this reason.
Duration constraints are the usual 400
The parameter that most often rejects a request is duration, because each video model allows a different set of values:
| Model | model | duration_sec |
|---|---|---|
| Seedance 2.0 Fast | seedance-2.0-fast | any integer 3–15s |
| Kling 2.0 Standard | kling-2.0-standard | 5s or 10s only |
| Veo 3 | veo3 | locked at 8s |
Asking Kling for 7 seconds is a
400 INVALID_PARAM, not a rounded-up
7-second clip. Veo 3 is stricter still — 8 seconds is the only value it
takes. See
invalid_param
for the full error shape, or
the cost comparison tool
for what these duration limits do to your bill.