V2 API behavior catalog
This page is a comprehensive per-endpoint behavioral reference for developers migrating from V1 to V2. For each endpoint group it covers: what V1 did, what V2 does, a table of behavioral changes, and links to detailed guides.
For a positive framing of net new capabilities (things you couldn't do at all in V1), see What's New in V2.
1. Edit operations
V1 Endpoints: /lrService/autoTone, /lrService/autoStraighten, /lrService/presets, /lrService/xmp, /lrService/edit
V2 Endpoint: /v2/edit
V1 behavior
V1 Lightroom operations were individual endpoints: one endpoint per operation type. To apply multiple adjustments you made multiple sequential API calls, each returning a job ID to poll. Inputs used inputs[].href + storage discriminant. The options block held adjustment parameters.
V2 behavior
All Lightroom edit operations are unified under /v2/edit. You can combine any number of adjustments — autoTone, autoStraighten, light, color, detail, effects, optics, XMP presets — in a single request. The adjustment parameter names and value ranges are identical to V1; only the envelope changed.
Behavioral changes
/lrService/autoTone, /lrService/autoStraighten, etc./v2/edit for allinputs[0].href + "storage": "external"image.source.urloptions blockautoTone, light, color, etc.)outputs[0].href + "storage": "external"outputs[0].destination.url"type": "image/jpeg""mediaType": "image/jpeg"Guide
2. Composite and layer operations
V1 Endpoints: /pie/psdService/renditionCreate, /pie/psdService/documentCreate, /pie/psdService/documentOperations, layer operations via documentOperations
V2 Endpoint: /v2/create-composite
V1 behavior
V1 used four separate endpoints for what are now unified operations:
renditionCreate— convert PSD to JPEG/PNG/TIFF (format conversion only)documentCreate— create a new blank documentdocumentOperations— modify existing documents: resize, crop, trim, add/edit/delete layerssmartObject— dedicated endpoint for placing or replacing smart object content
Layer operations were specified as an options.layers array within documentOperations. Layer types used camelCase names (layerSection, textLayer, smartObject).
V2 behavior
All three operations are unified under /v2/create-composite. The request structure uses image.source for input, edits for operations, and outputs for results. Layer types use snake_case names. Processing order is strictly top-down through the edits.layers array — layer position is not determined by array index alone.
Behavioral changes
renditionCreate, documentCreate, documentOperations, smartObject)/v2/create-compositeinputs[0].hrefimage.source.urloptionseditsoperation.type required on layer edits"add", "edit", "delete", "move"layerSection, textLayer, etc.)group_layer, text_layer, etc.)edits.layers arrayreferenceLayer for relative positioningprotection arraylocked: booleanprotection: ["position", "transparency", ...]layerSectiongroup_layerisClipped for clipping maskspixelMask.delete to remove a pixel maskpixelMask: { "delete": true } on edit operationsGuide
Layer Operations Overview — then choose a sub-guide:
- Image Layers
- Text Layers
- Adjustment Layers
- Smart Objects
- Advanced Operations
- Document Creation
- Document Operations
- Format Conversion
For the dedicated V1 /psdService/smartObject endpoint: Smart Object Place/Replace Migration
3. Actions and scripts
V1 Endpoints: /pie/psdService/photoshopActions, /pie/psdService/actionJSON, /pie/psdService/productCrop, /pie/psdService/depthBlur
V2 Endpoint: /v2/execute-actions
V1 behavior
V1 had separate endpoints for each action type: photoshopActions for .atn files, actionJSON for inline action commands, and dedicated convenience endpoints for specific operations (product crop, split view, etc.). Convenience endpoints used hidden server-side action files that developers could not inspect or modify.
V2 behavior
All action types are unified under /v2/execute-actions. The options block contains an array of action objects with a type discriminant ("photoshopActions", "actionJSON", "uxp"). UXP scripts (ES6+ JavaScript) are a new option alongside the existing action types. The action files used by V1 convenience APIs are now published and accessible via additionalContents.
data-variant=warning
data-slots=text
/pie/psdService/depthBlur) is not yet supported in V2 — Neural Filters are not available. See Depth Blur Migration for status.Behavioral changes
/v2/execute-actionsinputs[0].hrefimage.source.urloptions[].type requiredinputs[].href with "storage"options[].photoshopAction.source.urloptions.actions arrayoptions[].actionJSON.commands arrayoptions[].type: "uxp" with source.contentadditionalContents (supply action file deps)scriptOutputPattern for dynamic outputsplugin-temp:/ virtual path in scripts/pie/psdService/text (declarative options.layers text edits)/v2/execute-actions (ActionJSON or UXP)Guide
For the dedicated V1 /psdService/text endpoint: Text Layer Operations Migration
4. Manifest generation
V1 Endpoint: /pie/psdService/documentManifest
V2 Endpoint: /v2/generate-manifest
V1 behavior
V1 documentManifest returned a layer tree with basic per-layer information: name, type (camelCase), bounds (height/width/left/top format), a presigned S3 thumbnail URL string, and simple locked boolean. Artboards were indistinguishable from group layers. Smart objects had a flat structure with instanceId, name, path, and MIME-type type. The document block had bitDepth, iccProfileName, name.
V2 behavior
V2 generate-manifest returns a much richer layer tree. Layer type names are renamed to snake_case. Bounds use {left, top, right, bottom} format. Thumbnails return as {mediaType, url} objects pointing to /v2/short-url/ redirects. Artboards are a distinct type: "artboard" with full geometry and preset data. Smart objects expose extracted.url for embedded content download. The document block gains xmp, resolution, globalLightingAngle, and other fields.
Layer type renames
adjustmentLayeradjustment_layerbackgroundLayerbackground_layerfillLayersolid_color_layerlayerlayerlayerSection (group)group_layerlayerSection (artboard)artboardsmartObjectsmart_object_layertextLayertext_layerBehavioral changes
{height, left, top, width}{left, top, right, bottom}{mediaType, url} object (/v2/short-url/ redirect)locked fieldbooleanprotection arrayrotate fieldrotationmask field{enabled, linked, offset.x/y, type}pixelMask; offset.x/y → offset.horizontal/verticallayerSection (same as groups)type: "artboard" with typeAttributes.artboardchildren[]layers[]{instanceId, linked, name, path, type}{isLinked, isValid, smartObjectData, extracted}type stringsmartObjectData.fileInfo.fileType short codeextracted.url on embedded smart objectsbitDepthbitDepthdepthiccProfileNameiccProfileNameiccProfilenamenametitlephotoshopBuilddocument.xmpdocument.resolutioncompositeFrame / referenceFrame per layerlayerSettings block (warp, FXRefPoint)blendRanges in blendOptionsccLibrariesElement on smart objectsoptions.includeXmpoptions.maximumThumbnailDepthoptions.trimToTransparencyFor a complete field-by-field reference, see Manifest Response Migration.
Guide
Manifest Migration · Manifest Response Migration
5. Artboard creation
V1 Endpoint: /pie/psdService/artboardCreate
V2 Endpoint: /v2/create-artboard
V1 behavior
V1 artboardCreate accepted a flat list of input images and created a new PSD with one artboard per image. Images were specified in the top-level inputs[] array alongside output configuration.
V2 behavior
V2 /v2/create-artboard uses a dedicated images[] array where each entry has a source object for the input and id for ordering. Artboard spacing is configurable via artboardSpacing. The request follows the standard V2 envelope with outputs[].
Behavioral changes
inputs[].href + storageimages[].source.urlimages[].id fieldartboardSpacing fieldimages[] is emptyGuide
6. Job status
V1 Endpoints: /pie/psdService/status/{jobId}, /lrService/status/{jobId}
V2 Endpoint: /v2/status/{jobId}
V1 behavior
Each V1 service had its own status endpoint. Photoshop jobs used /pie/psdService/status/{jobId}; Lightroom jobs used /lrService/status/{jobId}. Status responses were service-specific in structure.
V2 behavior
All V2 jobs use a single /v2/status/{jobId} endpoint regardless of which operation created the job. The response includes a status field (pending, running, succeeded, failed), an outputs array with per-output status and destination URLs, and a structured errors array.
Behavioral changes
/v2/status/{jobId}status (consistent)outputs[].destination.urlerrors[] arrayGuide
7. Cross-cutting changes
These changes apply to all V2 endpoints.
Base URLs
https://image.adobe.iohttps://photoshop-api.adobe.ioRequest structure
inputs[0].href + "storage": "external"image.source.url"storage": "external" / "s3" / "azure" / etc.optionsedits (for composite/document ops) or top-level fields (for edit ops)outputs[0].href + storageoutputs[0].destination.url"type": "image/jpeg""mediaType": "image/jpeg"Storage options
"storage": "external"{"url": "..."} in destination"storage": "azure"{"url": "..."} in destination"storage": "dropbox"{"url": "..."} in destination"storage": "adobe"{"creativeCloudPath": "..."} or {"creativeCloudFileId": "..."}{"embedded": "base64"} / {"embedded": "string"} / {"embedded": "json"}{"validityPeriod": N} (seconds, 60–86400)storage field"storage": "s3" (deprecated)data-variant=info
data-slots=text
Output format changes
1–100"low", "medium", "high", "maximum"0–2 (3 levels)"default", or 0–9 (10 levels).psdc)mediaType: "document/vnd.adobe.cpsd+dcxucf"iccProfile: {standard: "..."} or {custom: {...}}Error response structure
V2 errors use a consistent structure across all endpoints:
{
"errors": [
{
"code": "INPUT_EXCEEDS_MAX_SIZE",
"message": "Input file exceeds maximum allowed size of 100MB"
}
]
}
V1 error structures varied by service.
Guide
Output Types Migration · ICC Profile Migration · Storage Solutions
8. Breaking changes checklist
Use this list to audit your codebase for required V2 changes.
Authentication and connectivity
- Update base URL from
image*.adobe.iotophotoshop-api*.adobe.io - Authentication credentials are unchanged — no action needed
Request structure
- Replace
inputs[0].href+"storage"withimage.source.url - Replace
optionsblock withedits(for composite/document) or top-level fields (for edit) - Replace
outputs[0].href+"storage"withoutputs[0].destination.url(orembedded/hosted) - Replace
"type": "image/jpeg"with"mediaType": "image/jpeg"in outputs
Endpoint changes
- All
/lrService/*calls →/v2/edit -
/pie/psdService/renditionCreate→/v2/create-composite -
/pie/psdService/documentCreate→/v2/create-composite -
/pie/psdService/documentOperations→/v2/create-composite -
/pie/psdService/photoshopActions→/v2/execute-actions -
/pie/psdService/actionJSON→/v2/execute-actions -
/pie/psdService/productCrop→/v2/execute-actions(with published action file) -
/pie/psdService/artboardCreate→/v2/create-artboard -
/pie/psdService/documentManifest→/v2/generate-manifest -
/pie/psdService/status/{jobId}→/v2/status/{jobId} -
/lrService/status/{jobId}→/v2/status/{jobId}
Action requests
- Add
options[].typediscriminant ("photoshopActions","actionJSON","uxp") - Move action file reference to
options[].photoshopAction.source.url - Move inline ActionJSON to
options[].actionJSON.commands
Layer operation requests
- Add
operation.typefield to each layer operation ("add","edit","delete","move") - Rename layer types in requests:
layerSection→group_layer,textLayer→text_layer,smartObject→smart_object_layer,fillLayer→solid_color_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 is supported — useinto+referenceLayer) - Replace
locked: truewithprotection: ["all"]
Manifest response parsing
- Update layer type string comparisons (camelCase → snake_case); expect background as
background_layer(notypeAttributeson background entries) - Update bounds parsing: drop
height/width, compute from{left, top, right, bottom} - Update thumbnail parsing: plain string →
{mediaType, url}object - Update
maskfield access →pixelMask;offset.x/y→offset.horizontal/vertical - Update
lockedboolean →protectionarray - Update artboard traversal: children under
layers[]notchildren[] - Update smart object parsing: flat → nested
smartObjectData.fileInfo.* - Update document field names:
bitDepth→depth,iccProfileName→iccProfile,name→title
Output format
- Replace numeric JPEG quality values with string enums (
7→"maximum", etc.) - Update PNG compression range if using values above
2
See also
- What's New in V2 — Net new capabilities framed positively
- Migration Overview — Architectural rationale
- Quick Reference — Endpoint mapping table
- LLM Migration Reference — Consolidated reference for AI-assisted migration