AI Video

JSON Prompts for AI Video (Veo 3 & Sora 2): Format & Examples

A "JSON prompt" for AI video is a plain-text prompt written as a structured object — subject, action, camera, lens, lighting, style and more — instead of one long sentence. It is genuinely useful for consistency and iteration. But there is one thing every honest guide has to say up front: neither Google Veo nor OpenAI Sora documents a JSON prompt schema. Both makers' official guides recommend natural-language prose; the JSON pattern is a community convention that works only because the models happily read well-organised JSON as text. This guide gives you the schema table, two copy-paste examples for Veo 3 and Sora 2, and a clear line between what the model parses and what it just reads.

JSON prompt schema for Veo 3 and Sora 2 with copy-paste examples

What a JSON prompt for AI video actually is

It is an ordinary prompt written as a structured object rather than a run-on sentence. Instead of "a chef plating dessert in a warm kitchen, shot on a slow dolly-in with soft window light," you write the same information as named fields:

{
  "subject": "a chef plating a dessert",
  "action": "places a final berry, then wipes the rim",
  "camera": "slow dolly-in, eye level",
  "lighting": "soft window light, warm"
}

The model does not receive a parsed data structure — it receives that block as text. Video models like Veo and Sora are generous about formatting, so a tidy JSON string reads to them much like a well-punctuated paragraph. The value is on your side of the wire: named fields force you to specify each dimension of the shot, and they make a prompt easy to diff, template and reuse. If you are choosing a model first, our best text-to-video models of 2026 guide covers the field; this article is about the prompt format.

Do Veo 3 and Sora 2 officially support JSON prompts?

No — and this is the single most important fact to get right. Every primary source from the two makers uses natural-language prose and none documents a JSON prompt schema:

So where does JSON prompting come from? It is a community and vendor-blog convention. Templates with fields like version, global_style, continuity and a scenes array circulate on sites such as imagine.art and tenten — and even those sources concede there is "no secret JSON schema the model was trained to parse." The JSON works because the model tolerates it as well-organised text, full stop.

Don't conflate this with structured output. Gemini API "structured output" (responseSchema / JSON Schema) constrains a model's text output — see the Gemini docs. That is a completely different feature and is not evidence that Veo parses JSON prompt input. Verified July 2026.

Why structure beats a plain sentence anyway

The benefit is discipline and repeatability, not parsing. A structured prompt buys you three concrete things a sentence does not:

None of this requires the model to understand JSON as data. You get the same generation whether you feed it the JSON or the equivalent prose; the JSON just keeps you organised. That is the honest case for the pattern — and it is a good one.

The JSON prompt schema: a field-by-field table

Here is a synthesised schema that maps community field names to what the official prose guides actually list. Use it as a checklist; every field is optional and consumed as text. The right-hand column shows where each concept appears in Google's and OpenAI's own prose framework.

FieldWhat it controlsExample valueMaps to (official prose)
subjectWho / what is on screen"a lone cyclist"Subject
actionWhat happens, in beats"pedals uphill, then coasts"Action
cameraShot type & movement"low-angle tracking shot"Cinematography (framing, motion)
lensFocal length & depth of field"35mm, shallow focus"Cinematography (lens/focus)
lightingLight quality & direction"golden-hour backlight"Style & lighting
styleOverall look / medium"35mm film, muted palette"Style
contextSetting / environment"coastal road at dawn"Context
moodEmotional tone"calm, contemplative"Style & Ambiance
audioAmbient sound / dialogue"wind, distant gulls"Audio / dialogue
durationClip lengthsee note →API parameter, not prose
aspect_ratioFrame shapesee note →API parameter, not prose

The last two rows are flagged for a reason, covered in its own section below: duration and aspect ratio are governed by API parameters, not by anything you write in the prompt. The prose-vs-JSON mapping above is drawn from Google Cloud's cinematography-plus-subject-plus-action-plus-context-plus-style formula.

Copy-paste JSON example: Veo 3

A ready-to-use object for a single Veo shot. Paste it as your prompt text. Remember the model reads it as a string — you can equally flatten it into a sentence and get comparable results.

{
  "subject": "a vintage red convertible",
  "action": "drives along a cliffside road, hair and scarf catching the wind",
  "camera": "aerial tracking shot, slowly pulling back to reveal the coastline",
  "lens": "wide angle, deep focus",
  "lighting": "warm golden-hour sun, long shadows",
  "style": "cinematic, 35mm film grain, saturated color",
  "context": "winding coastal highway above a turquoise sea",
  "mood": "free, exhilarating",
  "audio": "engine hum, wind, faint surf below"
}

To iterate the community way, copy the object and change one field — swap lens to "85mm, shallow focus" for a tighter, more intimate look while everything else stays fixed. Set the clip length and 16:9/9:16 frame as generation parameters, not inside this block.

Copy-paste JSON example: Sora 2

The same pattern, organised around Sora's optional storyboard breakdown. OpenAI's guide frames a good prompt like a storyboard beat sheet; this object simply names those beats. Feed it as the prompt string and set model, size and seconds separately in code.

{
  "scene": "a rain-slicked Tokyo alley at night, neon signs reflecting in puddles",
  "subject": "a woman in a translucent raincoat holding a paper umbrella",
  "cinematography": "medium shot, eye level, slow push-in; shallow depth of field",
  "actions": [
    "she steps forward and glances over her shoulder",
    "tilts the umbrella, revealing her face"
  ],
  "lighting": "magenta and cyan neon, wet specular highlights",
  "dialogue": "none",
  "background_sound": "steady rain, distant traffic, a passing train"
}

The field names here (scene, cinematography, actions, dialogue, background_sound) mirror the optional structure in OpenAI's Sora 2 Prompting Guide — but remember the guide presents that structure as prose, and calls it a framework for consistency, not a required schema. Once you have a look you like, hold every field fixed and change one action beat at a time. Costs for generating these clips are volatile and per-second; our Sora 2 cost breakdown has the current numbers.

Your JSONnamed fields Serializedto a text string Model reads itas prompt TEXT Video out duration · size · aspect ratiotravel as separate API parameters
A JSON video prompt is never parsed as data — it is serialized to a string and read as prompt text. Technical controls ride alongside as API parameters. Source: OpenAI Sora 2 & Google Veo prompt guides, July 2026.

What belongs in API parameters, not the prompt

Duration, aspect ratio and model choice are controls, not description — put them where the model reads them. This is where a lot of JSON templates mislead:

You can still keep a duration key in your JSON as documentation for your own team, but understand it does nothing at the model — the API parameter governs the output. Writing "8 seconds" into a prompt string is not how you get an 8-second clip.

Build your own 'veo3 json prompt generator'

A "generator" is just a template — you can reproduce one in a few lines. Most online generators take your inputs, drop them into an object with popular field names, and hand back the string. There is no hidden schema being unlocked. Here is the whole idea:

def video_prompt(subject, action, camera, lens, lighting, style, context, mood, audio):
    import json
    return json.dumps({
        "subject": subject, "action": action,
        "camera": camera, "lens": lens,
        "lighting": lighting, "style": style,
        "context": context, "mood": mood, "audio": audio,
    }, indent=2)   # the model reads this string as text

If you want an LLM to draft the fields for you from a one-line brief, that is a legitimate use — and it is the kind of text task a gateway is good at. DataLLM Lab serves chat and text-to-image models on one OpenAI-compatible key, so you can generate the prompt object (and even storyboard frames with an image model) from the same endpoint. It does not serve Veo or Sora themselves — for the video generation step you call each maker's own API. For the image side, see the best AI image APIs of 2026.

Draft your video prompts on one API key

DataLLM Lab gives you chat models to write and refine structured prompts, plus text-to-image models (Gemini image, GPT Image) to storyboard frames — all on one OpenAI-compatible key. Video models like Veo and Sora are not on the gateway; use them via their own APIs.

FAQ

Do Veo 3 and Sora 2 officially support JSON prompts?

No. Google DeepMind's Veo guide, Google Cloud's Veo 3.1 guide and OpenAI's Sora 2 guide all use prose and none documents a JSON schema. JSON prompting is a community convention — the JSON is read as prompt text, not parsed against a documented field schema.

Why use a JSON prompt instead of a plain sentence?

For coverage, diffability and reuse — not because the model parses it. Named fields force you to specify each dimension and let you change one variable at a time (e.g. "same shot, switch to 85mm"), which OpenAI's guide also encourages in prose.

What fields go in a video JSON prompt?

subject, action, camera, lens, lighting, style, context, mood and audio — mirroring Google's cinematography + subject + action + context + style & ambiance formula. Duration, resolution and aspect ratio belong in API parameters.

Does a veo3 json prompt generator do anything special?

No. It templates your inputs into an object with popular field names and returns it as text. There is no secret schema Veo parses — even the blogs promoting JSON prompting say so. You can build your own generator in a few lines.

Should duration and resolution go inside the JSON prompt?

Practically no. In Sora, model, size and seconds are separate API parameters. Veo documents fixed durations (commonly 4/6/8s) and 16:9 or 9:16 aspect ratios as generation parameters. A duration key in JSON is documentation only — the API parameter governs the output.

Is JSON structured output the same as a JSON prompt for video?

No. Gemini API "structured output" (responseSchema) constrains a model's text output and is unrelated to Veo prompt formatting. A JSON video prompt is just an input string that happens to be JSON-shaped.

Can I run Veo or Sora through DataLLM Lab?

Not today. DataLLM Lab serves chat and text-to-image models (Gemini image, GPT Image) on one OpenAI-compatible key, but not text-to-video models like Veo or Sora. Use each maker's own API for the video step.

Written by
Kevin Fan

Founder of DataLLM Lab, the unified LLM gateway. Kevin tests models the boring way — same prompts, real costs, unedited outputs — and writes up what the runs actually show.

One API for every model

One API, every model.

Get a single API key for Claude Opus 4.7, GPT-5.4, and 300+ more — with automatic price comparison and routing to the best model for every request.