Modification keys
How to write the keys and values of a render's modifications. Change text, images, colors and QR codes, target one page, and change styles such as color or font size.
modifications is the part of a render request that says what to change. It’s an object of keys and
values. This page explains every kind of key and what each value does.
{
"templateId": "clx8m2k3p0002abcd1234efgh",
"modifications": {
"title": "5 ways to brew better coffee",
"page2@title": "1. Grind just before brewing",
"title.color": "#FF4D4F",
"photo": "https://example.com/images/beans.jpg"
}
}
The same keys work everywhere you render: the API, signed URLs, and the query string of a dynamic URL.
Where the keys come from
A template has two kinds of keys:
- Dynamic fields: layers you turned into an API parameter in the editor and gave a Key, such as
headline. See Choose what changes. - Variables: names in double curly brackets inside a text layer, such as
{{name}}.
To list them, call GET /v1/designs/{id} and read parameters, or open the template’s
Integrations, API & Forms dialog and look at API parameters. The API gives a variable the type
variable, and the API parameters list shows it as Placeholder.
Key forms
| Key | What it changes |
|---|---|
headline |
Every layer whose key is headline, on every page, and every {{headline}} variable in text. |
page2@headline |
The same, but only on page 2. Pages start at 1. |
headline.color |
One style property of the headline layers. |
[email protected] |
One style property, only on page 2. |
- Keys are case-sensitive:
Headlineandheadlineare different keys. - A key you set in the editor can be up to 64 characters. The whole modification key, with
pageN@and.property, can be up to 200 characters. A text value can be up to 20,000 characters. - A
pageN@key for a page the template doesn’t have is a400. - A
pageN@key for a page you left out withincludePagesis skipped.
What a plain value does
A key with no property, such as headline, changes the layer’s main content. What that is depends on the
layer type:
| Layer type | A plain value sets | Example |
|---|---|---|
| Text | The text | "headline": "Summer sale" |
| Image | The image URL | "photo": "https://example.com/beach.jpg" |
| Shape | The fill color | "badge": "#FF4D4F" |
| QR code | What the code holds, such as a link | "qr": "https://example.com/tickets/123" |
| Variable | The text that replaces it | "name": "Jane" |
Image URLs must be public http:// or https:// addresses. See
Images in a render.
Variables in text
A text layer can mix fixed words and variables, such as Hello {{name}}, your order ships {{date}}.
Send "name": "Jane" and "date": "Monday", and the layer shows “Hello Jane, your order ships Monday.”
- Variable names can use letters, digits,
_and-. Spaces inside the brackets are ignored, so{{ name }}works too. - One key can be a layer key and a variable at the same time. A plain value sets both.
pageN@namefills the variable on one page only.
Values
- Text is used as it is.
- Numbers work for number properties. You can also send them as strings, such as
"48"or"48px". - On/off properties take
trueorfalse."true",1and"1"also mean on. Anything else means off. nullas a plain value empties the layer: a text layer shows no text, an image layer no picture. Number properties don’t takenull.
Keys that match nothing
A key that matches no layer and no variable doesn’t stop the render. It comes back in warnings, next
to data, so you can catch typos. (The warning says “placeholder” for a variable.)
{
"data": { "content": "https://cdn.jamframe.com/renders/…" },
"warnings": ["Unknown modification keys (no matching layer or {{placeholder}}): titel"]
}
These mistakes do stop the render, with a 400 VALIDATION_ERROR:
- A property the layer type doesn’t have, such as
photo.fontSizeon an image layer. - A value outside the allowed range or list, such as
"photo.blur": 500or"title.verticalAlign": "center".
Style properties
Add a property to a key to change one style, such as "title.fontSize": 56. Each layer type takes the
properties in its table below, plus the ones every layer takes.
Any layer
| Property | Value |
|---|---|
hidden |
true hides the layer. |
x, y |
The layer’s position on the page, in px. |
width, height |
The layer’s size, in px. |
rotation |
The angle, in degrees. |
blendMode |
How the layer mixes with what’s under it: normal, multiply, screen, overlay, darken, lighten, color-dodge, color-burn, hard-light, soft-light, difference, exclusion, hue, saturation, color or luminosity. |
shadowColor |
A CSS color, such as #00000080. The layer has a shadow when this is set. |
shadowX, shadowY |
How far the shadow moves, in px. |
shadowBlur |
How soft the shadow is, in px, 0 or more. |
A text layer gets the shadow on its letters. Other layers get a shadow that follows their shape.
Text
| Property | Value |
|---|---|
color |
The text color, such as #FF4D4F. |
fontSize |
The size, in px. |
fontFamily |
A font name, as the editor’s font list shows it. |
fontWeight |
A number, such as 400 for regular or 700 for bold. |
italic, underline |
true or false. |
align |
left, center or right. |
lineHeight |
The space between lines, as a multiple of the font size, such as 1.2. |
letterSpacing |
Extra space between letters, in px. |
textTransform |
none, uppercase, lowercase or capitalize. |
shrinkToFit |
true makes long text smaller until it fits its box, instead of being cut off. It never grows past fontSize. Boxes that grow with their text ignore it. |
minFontSize |
The smallest size shrinkToFit may use, in px, above 0. The default is 40% of fontSize, and at least 8. |
backgroundColor |
A color that fills the text box. |
verticalAlign |
Where the text sits in its box: top, middle or bottom. |
textStrokeWidth |
An outline around the letters, in px. 0 means none. |
textStrokeColor |
The outline color. The default is #000000. |
borderWidth |
A border inside the box, in px. 0 means none. |
borderColor |
The border color. |
borderStyle |
solid, dashed or dotted. |
Image
| Property | Value |
|---|---|
opacity |
From 0 (invisible) to 1 (solid). |
borderRadius |
Rounded corners, in px. |
flipX, flipY |
true flips the picture left to right, or top to bottom. |
fit |
contain shows the whole picture. cover fills the frame and crops what doesn’t fit. |
borderWidth, borderColor, borderStyle |
A border inside the box, as for text. |
mask |
A shape that cuts the picture: star, triangle, diamond, circle, pentagon, hexagon, octagon, quarterCircle, roundedRectangle, or none to remove it. |
maskAsset |
The id of an SVG in your brand library, used as the mask. null removes it. Masks never take a URL. |
maskMode |
How an SVG mask works: alpha (the default) shows the picture inside the SVG’s shape. luminance shows it where the SVG is white and hides it where it’s black. |
effect |
A ready-made look: grayscale, sepia, vintage, warm, cool, fade, dramatic, noir, vivid, soft, or none. |
blur |
Blur, in px, from 0 to 100. |
brightness, contrast, saturation, temperature |
From -100 to 100. 0 leaves the picture as it is. They add to the effect. |
vibrance, whites, blacks |
From 0 to 100. |
cropX, cropY |
Where the crop starts, from the left and top, as a share of the picture: 0 to 1. |
cropWidth, cropHeight |
How much of the picture the crop keeps, as a share: more than 0, up to 1. cropX + cropWidth and cropY + cropHeight can be at most 1. |
A layer’s border and shadow follow its mask. A crop stays when you send a new picture. A picture with the
same shape is framed the same way. A picture with another shape is placed by fit.
Shape
| Property | Value |
|---|---|
fill |
The fill color. |
stroke |
The outline color. |
strokeWidth |
The outline width, in px. |
strokeStyle |
solid, dashed or dotted. |
cornerRadius |
Rectangles only: rounded corners, in px, 0 or more. It can’t be more than half the shorter side. |
QR code
| Property | Value |
|---|---|
foreground |
The color of the code’s squares. |
background |
The color behind them. |
borderWidth, borderColor, borderStyle |
A border inside the box, as for text. |
A full example
{
"templateId": "clx8m2k3p0001abcd1234efgh",
"modifications": {
"headline": "Weekend market",
"headline.fontSize": "64px",
"headline.shrinkToFit": true,
"page2@headline": "Saturday 9am to 2pm",
"photo": "https://example.com/images/stalls.jpg",
"photo.effect": "warm",
"photo.mask": "circle",
"badge": "#22C55E",
"ticket_qr": "https://example.com/tickets/2026-11-21",
"city": "Portland",
"sponsor_logo.hidden": true
},
"response": { "format": "png" }
}
Related
- Make a layer into a dynamic field: Choose what changes.
- Send these keys in a render: Render images and PDFs.
- Fill layers with AI instead of fixed values: AI at render time.
Last updated
Still stuck?
Email [email protected] and a real person will reply. Tell us the template you were using and what you expected to happen.