Create Composite — Complete V1 Migration Reference
This page is the authoritative single-page reference for migrating from all four V1 Photoshop API composite-family endpoints to /v2/create-composite. It consolidates field-level comparisons for document creation, document operations, all layer types, and output formats.
For general concepts and context, see Layer Operations Overview. For individual topic deep dives, use the specific guides listed in that overview.
1. V1 endpoint coverage
All four V1 endpoints (and the informal smartObjectV2 variant) map to the single V2 endpoint:
POST /pie/psdService/documentCreatePOST /v2/create-compositePOST /pie/psdService/documentOperationsPOST /v2/create-compositePOST /pie/psdService/renditionCreatePOST /v2/create-compositePOST /pie/psdService/smartObjectPOST /v2/create-composite2. Request envelope
Input
inputs[].href + "storage": "external"image.source.urlinputs[].href + "storage": "acp"image.source.urlinputs[].href + "storage": "adobe"image.source.creativeCloudPath or .creativeCloudFileIdinputs[].href + "storage": "dropbox"image.source.url + destination.storageType: "dropbox"inputs[].href + "storage": "azure"image.source.url + destination.storageType: "azure"options.document.*image.* (top-level fields)options.layers[]edits.layers[]options.* (doc-level ops)edits.document.*Output
outputs[].hrefoutputs[].destination.urloutputs[].storageoutputs[].destination.storageType (Azure/Dropbox only)outputs[].typeoutputs[].mediaTypeV1 vs V2 envelope example
V1 (documentOperations):
{
"inputs": [{"href": "<SIGNED_GET_URL>", "storage": "external"}],
"options": {
"layers": [
{
"type": "textLayer",
"name": "Title",
"add": {"insertTop": true},
"text": {"content": "Hello"}
}
]
},
"outputs": [{"href": "<SIGNED_POST_URL>", "storage": "external", "type": "image/vnd.adobe.photoshop"}]
}
V2 (/v2/create-composite):
{
"image": {"source": {"url": "<SIGNED_GET_URL>"}},
"edits": {
"layers": [
{
"type": "text_layer",
"name": "Title",
"operation": {"type": "add", "placement": {"type": "top"}},
"text": {"content": "Hello"}
}
]
},
"outputs": [
{"destination": {"url": "<SIGNED_POST_URL>"}, "mediaType": "image/vnd.adobe.photoshop"}
]
}
Layer processing order
data-variant=warning
data-slots=text
placement.type: "above" with referenceLayer: {name: "Layer A"}, then Layer A must appear earlier in the array than Layer B. This is the opposite of V1 where Layer A would have appeared later in the array.3. Document creation parameters
documentCreate options.document.* → V2 image.* (top-level):
options.document.*)image.*)widthwidthheightheightresolution (number, e.g. 72)resolution: {"unit": "density_unit", "value": 72}fill: "white"fill: "white"fill: "transparent"fill: "transparent"fill: "backgroundColor"fill: "background_color"fill: "white" (explicit color)fill: {"solidColor": {"rgb": {"red": 255, "green": 255, "blue": 255}}}mode: "greyscale"mode: "grayscale"mode: "rgb" / "cmyk" / "lab" etc.depth: 8depth: 8pixelScaleFactornameiccProfile: {"type": "standard", "name": "..."}data-variant=warning
data-slots=text
fill changed from string to object for custom colors. V1 accepted "white" as a string shortcut; V2 still accepts "white" and "transparent" as string shortcuts, but solid colors must use the object form. Also note: V1 used "backgroundColor" — V2 uses "background_color".V1 (string):
{ "fill": "white" }
V2 (object form for custom RGB):
{ "fill": {"solidColor": {"rgb": {"red": 255, "green": 255, "blue": 255}}} }
4. Document-level operations
Resize (edits.document.imageSize)
width, heightwidth, heightresolution (number)resolution: {"unit": "density_unit", "value": N}constrainProportionsconstrainProportionsresamplenearest_neighbor, bilinear, bicubic, bicubic_smoother, bicubic_sharperscaleStylesrasterizeTrim (edits.document.trim)
trimType: "transparent_pixels"trimType: "transparent_pixels"data-variant=warning
data-slots=text
canvasSize is not yet supported), Image rotation (V1 image rotation is not yet supported), and Trim by color (V1 color-based trim modes are not supported in V2).5. Layer operation model
Operation specification
V1: Separate sibling objects on each layer entry:
{
"type": "textLayer",
"name": "My Layer",
"add": {"insertTop": true},
"text": {"content": "Hello"}
}
V2: Unified operation object:
{
"type": "text_layer",
"name": "My Layer",
"operation": {"type": "add", "placement": {"type": "top"}},
"text": {"content": "Hello"}
}
Placement type mapping
add.*)operation.placement)insertTop: true{type: "top"}insertBottom: true{type: "bottom"}insertAbove: {name: "LayerName"}{type: "above", referenceLayer: {name: "LayerName"}}insertAbove: {id: 123}{type: "above", referenceLayer: {id: 123}}insertBelow: {name: "LayerName"}{type: "below", referenceLayer: {name: "LayerName"}}insertBelow: {id: 123}{type: "below", referenceLayer: {id: 123}}insertInto: {name: "GroupName"}{type: "into", referenceLayer: {name: "GroupName"}}data-variant=info
data-slots=text
relativeTo in some contexts. V2 uses referenceLayer — these are not the same field name. Update all relative placement references.6. Common layer properties
Lock / protection
locked: trueprotection: ["all"]locked: falseprotection: ["none"]protection: ["transparency"]protection: ["position"]protection: ["composite"]protection: ["artboard_autonest"]Visibility
visibleisVisibleBlend options
blendOptions.opacityopacity (top-level)blendOptions.blendModeblendMode (top-level)Blend mode enum values (all 29 — unchanged between V1 and V2): normal, dissolve, darken, multiply, color_burn, linear_burn, darker_color, lighten, screen, color_dodge, linear_dodge, lighter_color, overlay, soft_light, hard_light, vivid_light, linear_light, pin_light, hard_mix, difference, exclusion, subtract, divide, hue, saturation, color, luminosity, pass_through
Pixel layer bounds / transform
bounds: {left, top, width, height}transform: {offset: {horizontal, vertical}, dimension: {width, height}}bounds.lefttransform.offset.horizontalbounds.toptransform.offset.verticalbounds.widthtransform.dimension.widthbounds.heighttransform.dimension.heightMask fields
mask.clip: trueisClipped: true (top-level on layer)mask.linkedmask.isLinkedmask.enabledmask.isEnabledmask.input: {href, storage}mask.source.urlfillToCanvas (missing feature)
data-variant=warning
data-slots=text
fillToCanvas is not supported in V2. This property, available on pixel and smart object layers in V1, has no equivalent in V2. If your V1 workflows rely on fillToCanvas: true, you must implement equivalent scaling/positioning logic using transform properties instead.7. Per-layer-type reference
7a. Adjustment layers (adjustmentLayer → adjustment_layer)
Type rename: "adjustmentLayer" → "adjustment_layer"
data-variant=warning
data-slots=text
adjustments.type is required in V2 but did not exist in V1. In V1, the adjustment type was inferred from the key name (e.g., the presence of brightnessContrast identified the type). In V2, you must explicitly declare adjustments.type using the snake_case type name.V1:
{"adjustments": {"brightnessContrast": {"brightness": 25}}}
V2:
{"adjustments": {"type": "brightness_contrast", "brightnessContrast": {"brightness": 25}}}
Adjustment type name mapping:
adjustments.typebrightnessContrastbrightness_contrastexposureexposurehueSaturationhue_saturationcolorBalancecolor_balancecurvesgradient_map_custom_stopslevelsField changes within adjustment payloads:
exposure.exposureexposure.exposureValuelocalRange.channelId for per-channel7b. Background layers
data-variant=warning
data-slots=text
backgroundLayer) cannot be created or edited in V2. There is no background_layer type in the V2 create/edit layer type enum (used in edits.layers). If your V1 workflow creates or modifies the document background layer, you must use a regular pixel layer (layer) as a substitute. Manifest responses still return background layers with type: "background_layer"; see Manifest Response Format.7c. Solid color layers (fillLayer → solid_color_layer)
Type rename: "fillLayer" → "solid_color_layer"
fill.solidColor.rgb.redfill.solidColor.rgb.redfill.solidColor.rgb.greenfill.solidColor.rgb.greenfill.solidColor.rgb.bluefill.solidColor.rgb.blueThe RGB field structure inside solidColor is unchanged between V1 and V2.
7d. Pixel layers (layer → layer)
Type name: Unchanged ("layer")
Key changes for pixel layers:
- Bounds: V1
bounds: {left, top, width, height}→ V2transform: {offset: {horizontal, vertical}, dimension: {width, height}} - Mask:
mask.input→mask.source.url;mask.linked→mask.isLinked;mask.enabled→mask.isEnabled - Clipping:
mask.clip: true→isClipped: true(top-level) - fillToCanvas: Not supported in V2
7e. Group layers (layerSection → group_layer)
Type rename: "layerSection" → "group_layer"
Creating a new document with a group layer is not yet supported (upcoming feature). Editing an existing document to add a layer inside a group layer is supported: use operation.placement.type: "into" with referenceLayer pointing to the group (e.g. "referenceLayer": { "name": "Group 1" }). Editing existing group layers (name, visibility, protection, etc.) is also supported. V1 nested children under the layer's children array.
7f. Smart object layers (smartObject → smart_object_layer)
Type rename: "smartObject" → "smart_object_layer"
input: {href, storage}smartObject.smartObjectFile.source: {url}smartObject.linked: truesmartObject.isLinked: truetransformMode: "none"/"custom"/"fit"/"fill"transform.angle, transform.skewtransform.anchorfillToCanvas: truedata-variant=info
data-slots=text
7g. Text layers (textLayer → text_layer)
Type rename: "textLayer" → "text_layer"
data-variant=warning
data-slots=text
to in a character or paragraph style range was interpreted as a length (not an end index). In V2, apply.to is an inclusive end index (0-based). The range field location also changed: V1 uses from and to directly on the array item, while V2 wraps them as apply.from and apply.to.Example: To style the first 5 characters ("Hello" in "Hello World"):
V1: {"from": 0, "to": 5, "fontName": "Arial-BoldMT"} — to: 5 means length 5
V2: {"apply": {"from": 0, "to": 4}, "characterStyle": {"font": {"postScriptName": "Arial-BoldMT"}}} — to: 4 is the index of the last character
Character style field mapping:
from, to (direct on item)apply.from, apply.tofontName: "PostScriptName"characterStyle.font.postScriptNamefontAvailablecharacterStyle.font.isAvailablecharacterStyle: {...}fontColor.rgb, .cmyk, .lab, .graycharacterStyle.capsOptioncharacterStyle.fontAlphacharacterStyle.letterSpacingcharacterStyle.lineHeightcharacterStyle.syntheticBoldcharacterStyle.syntheticItalicParagraph style field mapping:
from, to (direct on item)apply.from, apply.toparagraphStyle: {...}alignmentparagraphStyle.alignmentparagraphStyle.endIndentparagraphStyle.firstLineIndentparagraphStyle.spaceAfterparagraphStyle.spaceBeforeparagraphStyle.startIndentparagraphStyle.writingDirectionText frame:
bounds: {left, top, width, height}text.frame: {type: "area", bounds: {top, left, right, bottom}}right = left + width, bottom = top + heighttext.frame.type: "point" or "area"(0, 0, 4, 4)text.frame.type: "point" with origin: {x, y}Font options:
options.fonts[] — href + storagefontOptions.additionalFonts[] — source.urloptions.globalFontfontOptions.defaultFontPostScriptNameoptions.manageMissingFontsfontOptions.missingFontStrategy"useDefault""use_default""fail""fail"8. Output format reference
JPEG quality
"very_poor" / "poor" / "low""medium""high""maximum""photoshop_max" (recommended default for production)PNG compression
"small""maximum""medium""medium""large""low""none", "very_low", "medium_low", "medium_high", "default", "high", "very_high"TIFF
V1 accepted TIFF output via renditionCreate. TIFF is supported in V2 as an output format.
Storage / destination mapping
outputs[].storage)outputs[].destination)"external" + href{"url": "<presigned URL>"}"acp" + href{"url": "<ACP presigned URL>"}"adobe" + CC path{"creativeCloudPath": "folder/file.ext"} (no leading slash)"adobe" + URN{"creativeCloudFileId": "urn:aaid:..."}"dropbox" + href{"url": "...", "storageType": "dropbox"}"azure" + href{"url": "...", "storageType": "azure"}{"validityPeriod": N} — hosted, Adobe-managed temporary storage{"embedded": "string"/"json"/"base64"} — inline in responseNew output features in V2
iccProfile on output{type: "standard", name: "..."} or {type: "custom", ...} (CMYK supported via custom)cropMode: "bounds_of_layer"layers filterMissing V2 features summary
fillToCanvas (pixel/smart object layers)See also
- Layer Operations Overview — General V2 layer concepts and processing order
- Text Layers — Detailed text layer migration with examples
- Adjustment Layers — All supported adjustment types
- Smart Objects — Smart object layer migration
- Advanced Operations — Masks, groups, blend modes, transforms
- Document Creation — Creating new blank documents
- Document Operations — Crop, resize, trim
- Output Types — JPEG, PNG, TIFF output format details