{ "openapi": "3.0.3", "info": { "title": "Adobe Lightroom API", "description": "This is the API reference documentation for Firefly's Lightroom API.", "license": { "name": "Adobe Creative API License", "url": "https://www.adobe.com/content/dam/cc/en/legal/terms/enterprise/pdfs/PSLT-AdobeCreativeAPI-WW-2024v2.pdf" }, "version": "1.0" }, "servers": [ { "url": "https://image.adobe.io", "description": "Adobe Lightroom Production Server.", "variables": {} } ], "security": [ { "AccessToken": [], "X-Api-Key": [] } ], "paths": { "/lrService/autoStraighten": { "post": { "summary": "Auto-straighten", "description": "Auto-straighten an image by applying the Auto Upright transformation.", "operationId": "autoStraightenImage", "x-ffs-async-job": "true", "x-ffs-job-status-fetcher": "lrJobStatus", "requestBody": { "description": "Request body for the auto straighten operation.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AutoStraightenImageRequest" }, "examples": { "default": { "summary": "Example request", "value": { "inputs": { "href": "https://storage.example.com/source-image.jpg", "storage": "external" }, "options": { "uprightMode": "auto", "constrainCrop": true }, "outputs": [ { "href": "https://storage.example.com/output-image.jpg", "storage": "external", "type": "image/jpeg" } ] } } } } }, "required": true }, "responses": { "202": { "$ref": "#/components/responses/JobAccepted" }, "400": { "$ref": "#/components/responses/InputValidationErrorResponse" }, "402": { "$ref": "#/components/responses/TrialLimitExceededErrorResponse" }, "403": { "$ref": "#/components/responses/JobErrorForbidden" }, "404": { "$ref": "#/components/responses/JobErrorNotFound" }, "409": { "$ref": "#/components/responses/JobErrorUnableToUpload" }, "410": { "$ref": "#/components/responses/JobErrorAssetLinkInvalid" } }, "deprecated": true } }, "/lrService/autoTone": { "post": { "summary": "Auto-tone", "description": "Automatically correct exposure, contrast, sharpness, and saturation on an image.", "operationId": "applyAutoTone", "x-ffs-async-job": "true", "x-ffs-job-status-fetcher": "lrJobStatus", "requestBody": { "description": "Request body for the auto tone operation.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApplyAutoToneRequest" }, "examples": { "default": { "summary": "Example request", "value": { "inputs": { "href": "https://storage.example.com/source-image.jpg", "storage": "external" }, "outputs": [ { "href": "https://storage.example.com/output-image.jpg", "storage": "external", "type": "image/jpeg" } ] } } } } }, "required": true }, "responses": { "202": { "$ref": "#/components/responses/JobAccepted" }, "400": { "$ref": "#/components/responses/InputValidationErrorResponse" }, "402": { "$ref": "#/components/responses/TrialLimitExceededErrorResponse" }, "403": { "$ref": "#/components/responses/JobErrorForbidden" }, "404": { "$ref": "#/components/responses/JobErrorNotFound" }, "409": { "$ref": "#/components/responses/JobErrorUnableToUpload" }, "410": { "$ref": "#/components/responses/JobErrorAssetLinkInvalid" } }, "deprecated": true } }, "/lrService/edit": { "post": { "summary": "Apply Lightroom edits", "description": "Apply one or more Lightroom edits (exposure, contrast, sharpness, saturation) to an image.", "operationId": "applyEdits", "x-ffs-async-job": "true", "x-ffs-job-status-fetcher": "lrJobStatus", "requestBody": { "description": "Request body for the edit operation.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApplyEditsRequest" }, "examples": { "default": { "summary": "Example request", "value": { "inputs": { "source": { "href": "https://storage.example.com/source-image.jpg", "storage": "external" } }, "options": { "Exposure": 0.5, "Contrast": 10 }, "outputs": [ { "href": "https://storage.example.com/output-image.jpg", "storage": "external", "type": "image/jpeg" } ] } } } } }, "required": true }, "responses": { "202": { "$ref": "#/components/responses/JobAccepted" }, "400": { "$ref": "#/components/responses/InputValidationErrorResponse" }, "402": { "$ref": "#/components/responses/TrialLimitExceededErrorResponse" }, "403": { "$ref": "#/components/responses/JobErrorForbidden" }, "404": { "$ref": "#/components/responses/JobErrorNotFound" }, "409": { "$ref": "#/components/responses/JobErrorUnableToUpload" }, "410": { "$ref": "#/components/responses/JobErrorAssetLinkInvalid" } }, "deprecated": true } }, "/lrService/presets": { "post": { "summary": "Apply Lightroom presets", "description": "Apply one or more XMP Lightroom presets to the given image, by using the given preset XMP file(s).", "operationId": "applyPreset", "x-ffs-async-job": "true", "x-ffs-job-status-fetcher": "lrJobStatus", "requestBody": { "description": "Request body for the presets operation.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApplyPresetRequest" }, "examples": { "default": { "summary": "Example request", "value": { "inputs": { "source": { "href": "https://storage.example.com/source-image.jpg", "storage": "external" }, "presets": [ { "href": "https://storage.example.com/preset.xmp", "storage": "external" } ] }, "outputs": [ { "href": "https://storage.example.com/output-image.jpg", "storage": "external", "type": "image/jpeg" } ] } } } } }, "required": true }, "responses": { "202": { "$ref": "#/components/responses/JobAccepted" }, "400": { "$ref": "#/components/responses/InputValidationErrorResponse" }, "402": { "$ref": "#/components/responses/TrialLimitExceededErrorResponse" }, "403": { "$ref": "#/components/responses/JobErrorForbidden" }, "404": { "$ref": "#/components/responses/JobErrorNotFound" }, "409": { "$ref": "#/components/responses/JobErrorUnableToUpload" }, "410": { "$ref": "#/components/responses/JobErrorAssetLinkInvalid" } }, "deprecated": true } }, "/lrService/xmp": { "post": { "summary": "Add XMP to image", "description": "Apply XMP-based Lightroom preset to an image. XMP content is passed inline to the API.", "operationId": "applyPresetFromXmpContent", "x-ffs-async-job": "true", "x-ffs-job-status-fetcher": "lrJobStatus", "requestBody": { "description": "Request body for the XMP operation.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApplyPresetFromXmpContentRequest" }, "examples": { "default": { "summary": "Example request", "value": { "inputs": { "source": { "href": "https://storage.example.com/source-image.jpg", "storage": "external" } }, "options": { "xmp": "{your_xmp_content}" }, "outputs": [ { "href": "https://storage.example.com/output-image.jpg", "storage": "external", "type": "image/jpeg" } ] } } } } }, "required": true }, "responses": { "202": { "$ref": "#/components/responses/JobAccepted" }, "400": { "$ref": "#/components/responses/InputValidationErrorResponse" }, "402": { "$ref": "#/components/responses/TrialLimitExceededErrorResponse" }, "403": { "$ref": "#/components/responses/JobErrorForbidden" }, "404": { "$ref": "#/components/responses/JobErrorNotFound" }, "409": { "$ref": "#/components/responses/JobErrorUnableToUpload" }, "410": { "$ref": "#/components/responses/JobErrorAssetLinkInvalid" } }, "deprecated": true } }, "/lrService/status/{jobId}": { "get": { "summary": "Get status", "description": "Get job status of a Lightroom job.", "operationId": "lrJobStatus", "x-ffs-status-fetcher": "true", "x-ffs-job-name": "LrAsyncJob", "parameters": [ { "name": "jobId", "in": "path", "description": "Identifier of the job to get status for.", "required": true, "schema": { "type": "string" } } ], "responses": { "202": { "description": "Job Status", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LrJobApiResponse" }, "examples": { "jobSucceeded": { "summary": "Job succeeded", "value": { "jobId": "ff7b0f8e-47f3-4d8f-9a8b-7a9f9b2f4c42", "created": "2024-01-15T10:30:00.000Z", "modified": "2024-01-15T10:30:05.000Z", "outputs": [ { "input": "/path/to/source.jpg", "status": "succeeded", "_links": { "self": { "href": "https://storage.example.com/result.jpg", "storage": "external" } } } ], "_links": { "self": { "href": "https://image.adobe.io/lrService/status/ff7b0f8e-47f3-4d8f-9a8b-7a9f9b2f4c42" } } } } } } } } }, "deprecated": true } } }, "components": { "securitySchemes": { "AccessToken": { "type": "http", "scheme": "bearer", "description": "The Adobe-generated access token, S2S format." }, "X-Api-Key": { "type": "apiKey", "name": "x-api-key", "in": "header", "description": "The client ID for authentication." } }, "schemas": { "JobError": { "title": "JobError", "type": "object", "properties": { "type": { "type": "string", "description": "Type of the error." }, "code": { "type": "string", "description": "The error code." }, "title": { "type": "string", "description": "Description of the error." }, "details": { "type": "array", "items": { "$ref": "#/components/schemas/ErrorDetails" }, "description": "Details of the error returned." } }, "description": "Any errors reported for the requested output." }, "InputValidationError": { "title": "InputValidationError", "type": "object", "properties": { "type": { "type": "string", "description": "Type of the error." }, "code": { "type": "string", "description": "The error code." }, "title": { "type": "string", "description": "Description of the error." }, "details": { "type": "array", "items": { "$ref": "#/components/schemas/InputValidationErrorDetails" }, "description": "Details of the error returned." } }, "description": "Any errors reported for the requested output." }, "TrialLimitExceededError": { "title": "TrialLimitExceededError", "type": "object", "properties": { "type": { "type": "string", "description": "Type of the error." }, "code": { "type": "string", "description": "The error code." }, "title": { "type": "string", "description": "Description of the error." }, "details": { "type": "string", "description": "Details of the error returned.", "default": "You have exceeded the limit for the free trial. To subscribe and get more API calls, check out our pricing page at https://developer.adobe.com/photoshop/api/pricing/" } }, "description": "Any errors reported for the requested output." }, "InputValidationErrorDetails": { "title": "InputValidationErrorDetails", "type": "object", "properties": { "allowedValues": { "type": "string", "description": "Comma-separated list of allowed values for the input parameter.", "default": "adobe, external, dropbox, azure" }, "reason": { "type": "string", "description": "Reason for the error." } }, "description": "Details of the input validation error returned." }, "StorageDetails": { "title": "StorageDetails", "type": "object", "required": [ "href", "storage" ], "properties": { "href": { "type": "string", "description": "Pre-signed GET URL for the source asset." }, "storage": { "$ref": "#/components/schemas/StorageType" } }, "description": "File on Adobe's cloud or an external service (like AWS S3, Azure, Dropbox)." }, "JobStatusLink": { "title": "Job Status Link", "type": "object", "properties": { "self": { "$ref": "#/components/schemas/SelfLink" } } }, "JobStatusLinkResponse": { "title": "JobStatusLinkResponse", "type": "object", "properties": { "_links": { "$ref": "#/components/schemas/JobStatusLink" } } }, "LrOutputDetails": { "title": "LrOutputDetails", "type": "object", "required": [ "href", "storage", "type" ], "properties": { "href": { "type": "string", "description": "Pre-signed POST URL to the output file." }, "storage": { "$ref": "#/components/schemas/StorageType" }, "type": { "$ref": "#/components/schemas/ImageFormatType" }, "overwrite": { "type": "boolean", "default": true, "description": "Determines if the output file should be overwritten if it already exists. This flag is used only for Adobe cloud storage." }, "quality": { "maximum": 12, "minimum": 1, "type": "integer", "default": 12, "description": "Quality of the JPEG outputs (will be ignored for other output types). Ranges from 1 to 12, with 12 as the highest quality." } } }, "ImageFormatType": { "title": "ImageFormatType", "enum": [ "image/jpeg", "image/png", "image/x-adobe-dng", "application/rdf+xml" ], "type": "string", "description": "Desired output image format." }, "LrJobApiResponse": { "title": "Lightroom Job Status Response", "type": "object", "properties": { "jobId": { "type": "string", "description": "The job's ID requested." }, "created": { "type": "string", "description": "Created timestamp of the job." }, "modified": { "type": "string", "description": "Modified timestamp of the job." }, "outputs": { "type": "array", "items": { "$ref": "#/components/schemas/JobOutputDetails" }, "description": "Output parameters for the job." }, "_links": { "$ref": "#/components/schemas/JobStatusLink" } } }, "AutoStraightenImageRequest": { "title": "AutoStraightenImageRequest", "type": "object", "required": [ "inputs", "outputs" ], "properties": { "inputs": { "$ref": "#/components/schemas/StorageDetails" }, "options": { "$ref": "#/components/schemas/AutoStraightOptions" }, "outputs": { "type": "array", "items": { "$ref": "#/components/schemas/LrOutputDetails" }, "description": "Only a single output is supported currently." } } }, "ApplyAutoToneRequest": { "title": "ApplyAutoToneRequest", "type": "object", "required": [ "inputs", "outputs" ], "properties": { "inputs": { "$ref": "#/components/schemas/StorageDetails" }, "outputs": { "type": "array", "items": { "$ref": "#/components/schemas/LrOutputDetails" }, "description": "Only a single output is supported currently." } } }, "ApplyEditsRequest": { "title": "ApplyEditsRequest", "type": "object", "required": [ "inputs", "options", "outputs" ], "properties": { "inputs": { "type": "object", "description": "A hash describing an input image to edit. The input object will be one of 'external', 'azure', or 'dropbox'.", "required": [ "source" ], "properties": { "source": { "$ref": "#/components/schemas/StorageDetails" } } }, "options": { "$ref": "#/components/schemas/EditOptions" }, "outputs": { "type": "array", "items": { "$ref": "#/components/schemas/LrOutputDetails" }, "description": "Edit photo output parameters." } } }, "ApplyPresetRequest": { "title": "ApplyPresetRequest", "type": "object", "required": [ "inputs", "outputs" ], "properties": { "inputs": { "$ref": "#/components/schemas/ApplyPresetInput" }, "outputs": { "type": "array", "items": { "$ref": "#/components/schemas/LrOutputDetails" }, "description": "Apply preset output parameters." } } }, "ApplyPresetFromXmpContentRequest": { "title": "ApplyPresetFromXmpContentRequest", "type": "object", "required": [ "inputs", "options", "outputs" ], "properties": { "inputs": { "$ref": "#/components/schemas/ApplyPresetXmpInput" }, "options": { "$ref": "#/components/schemas/ApplyPresetXmpOptions" }, "outputs": { "type": "array", "items": { "$ref": "#/components/schemas/LrOutputDetails" }, "description": "Apply preset XMP output parameters." } } }, "ApplyPresetXmpInput": { "title": "ApplyPresetXmpInput", "type": "object", "required": [ "source" ], "properties": { "source": { "$ref": "#/components/schemas/StorageDetails" } } }, "ErrorDetails": { "title": "ErrorDetails", "type": "object", "properties": { "name": { "type": "string", "description": "Parameter name." }, "reason": { "type": "string", "description": "Reason for the error." } }, "description": "Details of the error returned." }, "ApplyPresetInput": { "title": "ApplyPresetInput", "type": "object", "required": [ "source", "presets" ], "properties": { "source": { "$ref": "#/components/schemas/StorageDetails" }, "presets": { "type": "array", "items": { "$ref": "#/components/schemas/StorageDetails" }, "description": "An array describing the list of presets to apply. The preset objects will be one of 'external', 'azure', or 'dropbox'." } } }, "Links": { "title": "Links", "type": "object", "properties": { "self": { "$ref": "#/components/schemas/StorageDetails" } } }, "AutoStraightOptions": { "title": "AutoStraightOptions", "required": [ "uprightMode" ], "type": "object", "properties": { "uprightMode": { "$ref": "#/components/schemas/UprightMode" }, "constrainCrop": { "type": "boolean", "description": "If the straightened image should be constrained and cropped to remove all blank edges around an image.", "default": true } } }, "EditOptions": { "title": "EditOptions", "type": "object", "properties": { "Contrast": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Saturation": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "VignetteAmount": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Vibrance": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Highlights": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Shadows": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Whites": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Blacks": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Clarity": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Dehaze": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Texture": { "maximum": 100.0, "minimum": -100.0, "type": "integer", "format": "int32" }, "Sharpness": { "maximum": 150.0, "minimum": 0.0, "type": "integer", "format": "int32" }, "ColorNoiseReduction": { "maximum": 100.0, "minimum": 0.0, "type": "integer", "format": "int32" }, "NoiseReduction": { "maximum": 100.0, "minimum": 0.0, "type": "integer", "format": "int32" }, "SharpenDetail": { "maximum": 100.0, "minimum": 0.0, "type": "integer", "format": "int32" }, "SharpenEdgeMasking": { "maximum": 10.0, "minimum": 0.0, "type": "integer", "format": "int32" }, "Exposure": { "maximum": 5.0, "minimum": -5.0, "type": "number" }, "SharpenRadius": { "maximum": 3.0, "minimum": 0.5, "type": "number" }, "WhiteBalance": { "$ref": "#/components/schemas/WhiteBalance" } } }, "ApplyPresetXmpOptions": { "title": "ApplyPresetXmpOptions", "description": "Options for applying a preset XMP to an image.", "type": "object", "required": [ "xmp" ], "properties": { "xmp": { "type": "string", "description": "The XMP to apply." }, "orientation": { "maximum": 8.0, "minimum": 1.0, "type": "number", "description": "The combination of flip and/or rotate to apply." } } }, "JobOutputDetails": { "title": "JobOutputDetails", "type": "object", "properties": { "input": { "type": "string", "description": "The original input file path." }, "status": { "$ref": "#/components/schemas/JobStatus" }, "_links": { "$ref": "#/components/schemas/Links" }, "details": { "type": "string", "description": "Description of the exact error that is reported by the requested job. Will appear in the response only if there is an error." } } }, "SelfLink": { "title": "SelfLink", "type": "object", "description": "Self link for the job status.", "properties": { "href": { "type": "string", "description": "Job Status URL." } } }, "JobStatus": { "title": "JobStatus", "enum": [ "pending", "running", "succeeded", "failed" ], "type": "string", "description": "Status of the job." }, "StorageType": { "title": "StorageType", "enum": [ "external", "azure", "dropbox" ], "type": "string", "description": "Storage location." }, "UprightMode": { "title": "UprightMode", "enum": [ "auto", "full", "level", "vertical" ], "type": "string", "description": "The upright mode to use. If you have the options block, then this is a required field. If options block is not specified, then the appropriate upright mode will automatically be selected." }, "WhiteBalance": { "title": "WhiteBalance", "description": "White balance settings.", "enum": [ "As Shot", "Auto", "Cloudy", "Custom", "Daylight", "Flash", "Fluorescent", "Shade", "Tungsten" ], "type": "string" } }, "responses": { "JobAccepted": { "description": "Accepted", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobStatusLinkResponse" }, "examples": { "jobAccepted": { "summary": "Job accepted", "value": { "_links": { "self": { "href": "https://image.adobe.io/lrService/status/ff7b0f8e-47f3-4d8f-9a8b-7a9f9b2f4c42" } } } } } } } }, "InputValidationErrorResponse": { "description": "Input Validation Error", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/InputValidationError" }, "examples": { "invalidStorage": { "summary": "Invalid input", "value": { "type": "validation_error", "code": "invalid_input", "title": "Input Validation Error", "details": [ { "allowedValues": "adobe, external, dropbox, azure", "reason": "Invalid storage type provided." } ] } } } } } }, "TrialLimitExceededErrorResponse": { "description": "Trial Limit Exceeded Error", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TrialLimitExceededError" }, "examples": { "limitExceeded": { "summary": "Trial limit exceeded", "value": { "type": "trial_limit_exceeded", "code": "limit_exceeded", "title": "Trial Limit Exceeded Error", "details": "You have exceeded the limit for the free trial." } } } } } }, "JobErrorForbidden": { "description": "Forbidden", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobError" }, "examples": { "forbidden": { "summary": "Forbidden", "value": { "type": "error", "code": "forbidden", "title": "Forbidden", "details": [ { "name": "request", "reason": "Access denied for this resource." } ] } } } } } }, "JobErrorNotFound": { "description": "Requested Resource Was Not Found", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobError" }, "examples": { "notFound": { "summary": "Resource not found", "value": { "type": "error", "code": "not_found", "title": "Requested Resource Was Not Found", "details": [ { "name": "resource", "reason": "The requested resource was not found." } ] } } } } } }, "JobErrorUnableToUpload": { "description": "Unable To Upload Asset", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobError" }, "examples": { "unableToUpload": { "summary": "Unable to upload asset", "value": { "type": "error", "code": "upload_failed", "title": "Unable To Upload Asset", "details": [ { "name": "output", "reason": "Unable to upload the output asset." } ] } } } } } }, "JobErrorAssetLinkInvalid": { "description": "Asset Link Invalid", "headers": {}, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobError" }, "examples": { "assetLinkInvalid": { "summary": "Asset link invalid", "value": { "type": "error", "code": "invalid_asset_link", "title": "Asset Link Invalid", "details": [ { "name": "href", "reason": "The provided asset link is invalid or expired." } ] } } } } } } } } }