<!-- kernel -->
> Creatomate AI reference — topic page "Reading validation errors"; the index of all pages is https://creatomate.com/llms.txt
<!-- /kernel -->

## Reading validation errors

**Invalid values fail loud and self-describing.** The parser names the element and property and states what it expects:

- `Text-1.x_padding: Expected a number ending with px or vw or vh or vmin or vmax`
- `…: Expected a number between 0 and 100` / `…at least 0`
- `…: Expected one of these values: …` (enum errors list every valid value)
- `…duration: expected a number or the value 'media'` — time properties similarly accept `'end'`
- `Property 'x' does not support keyframes` — you keyframed a structural property
- `Shouldn't be null or undefined` — this property cannot be null. In a stored source, give it a value. As a modification, `null` means "restore automatic" and only works where an automatic state exists: image and video `width`/`height` are nullable (`null` sizes the element by the asset's own proportions), `opacity` and `x_scale` are not.

**Invented NAMES fail silently.** Parsing reads only known properties: an unknown property name is ignored — no error, the render succeeds, nothing changes. The same holds for modifications keyed to nonexistent element or property names, and for misspelled easing names (silent `linear`). The heuristic: **no effect + no error = the name doesn't exist.** Example: `text_shadow` does nothing; the real properties are `shadow_color`, `shadow_blur`, `shadow_x`, `shadow_y`. A real property on the wrong element TYPE is silently inert the same way: `animations` on an audio element (visual-only — fade audio with `audio_fade_in`/`audio_fade_out`) and `fill_color` on an image/video (use `color_overlay`). So the full heuristic: no effect + no error = the name doesn't exist **or doesn't apply to this element type**.

**Where validation happens.** Three surfaces catch problems, all speaking the messages above:
- **Saving a template** (`POST`/`PATCH /v2/templates`) rejects invalid values with a **400** and returns `warnings` for parts it will ignore (unknown keys, and the like). A save that returns 400 changed nothing; fix the values and retry.
- **Creating a render** returns advisory `errors`/`warnings` in the response but still queues (see "Quick start" (https://creatomate.com/llms/quick-start.md)) — so read them.
- **`dry_run: true`** is the explicit pre-flight: validate the effective source (template + modifications) with no render, no credits (see "Quick start" (https://creatomate.com/llms/quick-start.md)). Use it before a real render, especially for raw RenderScript or name-based modifications.

Two gaps remain your job to catch by reading this reference: **invented names still fail silently** (above — validation reports them as warnings on the render path, but never as errors), and **`dry_run` checks validity, not whether it looks right** (that is the visual self-check: "Seeing a render" (https://creatomate.com/llms/seeing-renders.md)) or whether assets and provider keys resolve.
