> ## Documentation Index
> Fetch the complete documentation index at: https://docs.n8negri.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Dynamic data

> How modifications map onto template layers

A `modifications` entry overrides one dynamic layer in a template. The shape of the modification depends on the layer type.

## Text layers

```json theme={null}
{
  "name": "headline",
  "text": "Sale ends tonight",
  "color": "#FF801F"
}
```

Optional fields: `color`, `font_family`, `font_weight`, `font_size`, `align`.

## Image layers

```json theme={null}
{
  "name": "product",
  "image_url": "https://cdn.example.com/sneaker.png"
}
```

Or reference a [Person](/concepts/people):

```json theme={null}
{ "name": "avatar", "person_id": "per_jane123" }
```

Optional fields: `crop`, `tint_color`.

## Shape layers

```json theme={null}
{
  "name": "accent_bar",
  "fill_color": "#0F172A",
  "stroke_color": "#FF801F"
}
```

## Visibility

Hide a layer for a specific render without editing the template:

```json theme={null}
{ "name": "promo_badge", "hidden": true }
```

## Resolution order

When a layer name appears multiple times in `modifications`, the **last** entry wins. Use this to override a default in a programmatic loop.

## Validation

Imtegrate validates `modifications` before queueing the render. Errors come back as `400 invalid_modification` with a per-name reason. Common causes:

* `name` does not match any dynamic layer
* `image_url` is unreachable or not an image
* `color` is not a valid hex / rgb string
* `person_id` belongs to a different organization
