Develop — API-Referenz

Every adjustment, masks, crop, looks and presets, copy and paste, snapshots and the undo history, the RAW decode and its steps, and the camera looks the app learns.

Die API-Referenz ist auf Englisch: Sie wird aus dem eigenen OpenAPI-Dokument der App erzeugt.

Every adjustment, masks, crop, looks and presets, copy and paste, snapshots and the undo history, the RAW decode and its steps, and the camera looks the app learns.

66 operations. Generated from the application's own OpenAPI document.

GET /api/auto-crop/learning

Auto crop learning

curl -X GET http://127.0.0.1:9100/api/auto-crop/learning \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The base model in use, the crops kept as examples, how the suggestions matched the latest of them, and a new base model reading them
  • 400 — The library could not be opened

DELETE /api/auto-crop/learning/outcome

Dismiss auto crop learning outcome

curl -X DELETE http://127.0.0.1:9100/api/auto-crop/learning/outcome \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The info bar no longer says how the last new base model went
  • 400 — The library could not be opened

POST /api/auto-crop/learning/pause

Pause auto crop learning

curl -X POST http://127.0.0.1:9100/api/auto-crop/learning/pause \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — A new base model reads no more examples until resumed, also after a restart
  • 400 — The library could not be opened

POST /api/auto-crop/learning/resume

Resume auto crop learning

curl -X POST http://127.0.0.1:9100/api/auto-crop/learning/resume \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — A new base model goes on reading the examples
  • 400 — The library could not be opened

GET /api/camera-looks

Camera looks

curl -X GET http://127.0.0.1:9100/api/camera-looks \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Looks learned from your pictures for cameras photosuite has no profile for, the ones refused and why, and what is being learned now (#446)

POST /api/camera-looks/forget

Forget camera look

Body

FieldTypeRequiredDescription
makestringyes
modelstringyes
stylestring
curl -X POST http://127.0.0.1:9100/api/camera-looks/forget \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"make":"text","model":"text"}'

Responses

  • 200 — The learned look is gone; RAWs of the body render without it until it is learned again
  • 404 — No look was learned for that body

POST /api/camera-looks/learn

Learn camera look

Body

FieldTypeRequiredDescription
makestringyes
modelstringyes
stylestring
curl -X POST http://127.0.0.1:9100/api/camera-looks/learn \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"make":"text","model":"text"}'

Responses

  • 200 — Queued: the body's look is learned again from its pictures in the open folder; the result comes as camera_look_learned or camera_look_refused
  • 400 — No folder is open

GET /api/crop/tool

Crop tool

curl -X GET http://127.0.0.1:9100/api/crop/tool \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Crop tool state

PUT /api/crop/tool

Crop tool

Body

FieldTypeRequiredDescription
activebooleanOpen the crop tool, or close it. Closing applies what is there unless `apply` says otherwise.
applybooleanWhat closing the tool does: `true` (the default) crops the image, `false` puts the tool away and leaves the picture whole — the Cancel button. Ignored while opening.
aspect"free" | "square" | "3x2" | "4x3" | "16x9" | "5x4"The aspect: free, square, 3x2, 4x3, 16x9, 5x4
grid"none" | "thirds" | "golden" | "diagonals" | "triangles" | "spiral" | "fine"The grid: none, thirds, golden, diagonals, triangles, spiral, fine
portraitbooleanSwap width and height of the locked ratio.
resetbooleanThe toolbar's Reset: the rectangle back to the whole frame.
show_framebooleanShow the whole frame with the crop drawn on it, rather than the cropped region.
straightenbooleanArm the straighten gesture — a drag on the picture sets the angle.
suggestionnumberPut auto-crop suggestion n (from 0) in the rectangle — the toolbar's ‹ ›. `GET /api/crop/tool` says how many there are.
curl -X PUT http://127.0.0.1:9100/api/crop/tool \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"active":true,"apply":true,"aspect":"free"}'

Responses

  • 200 — Crop tool updated
  • 400 — Unknown aspect or grid name

GET /api/decode-source

Decode source

curl -X GET http://127.0.0.1:9100/api/decode-source \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Current decode-source policy

PUT /api/decode-source

RAW decode

Body

FieldTypeRequiredDescription
source"embedded-jpeg" | "native-raw"yesThe decode source: embedded-jpeg, native-raw
curl -X PUT http://127.0.0.1:9100/api/decode-source \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"source":"embedded-jpeg"}'

Responses

  • 200 — Decode-source policy changed
  • 400 — Invalid decode source

GET /api/develop/looks

Looks

curl -X GET http://127.0.0.1:9100/api/develop/looks \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Saved looks

POST /api/develop/looks

Save look

Body

FieldTypeRequiredDescription
namestringyes
curl -X POST http://127.0.0.1:9100/api/develop/looks \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"text"}'

Responses

  • 200 — The current picture's masks saved as the look; a look of that name gets its next version, and every picture in the folder that has it follows
  • 400 — Empty name, or the picture has no masks

DELETE /api/develop/looks/{name}

Delete look

ParameterInTypeDescription
namepathstringLook name
curl -X DELETE http://127.0.0.1:9100/api/develop/looks/<name> \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Look deleted; pictures keep the masks they have
  • 404 — No look of that name

POST /api/develop/looks/apply

Look

Body

FieldTypeRequiredDescription
namestringyes
curl -X POST http://127.0.0.1:9100/api/develop/looks/apply \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"text"}'

Responses

  • 200 — The look's masks put on the current picture, after its own, following the look
  • 400 — The picture already has the look
  • 404 — No look of that name

GET /api/develop/presets

Presets

curl -X GET http://127.0.0.1:9100/api/develop/presets \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Saved develop presets

POST /api/develop/presets

Save preset

Body

FieldTypeRequiredDescription
groupstringThe group to list it under (#633); `""` for none. Left out: the group a preset by that name already has, else none.
namestringyes
valuesany
curl -X POST http://127.0.0.1:9100/api/develop/presets \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"text"}'

Responses

  • 200 — Saved under the name: the values given, or the picture on screen's develop
  • 400 — Empty name, or no values given and no adjustments on the picture

DELETE /api/develop/presets/{name}

Delete preset

ParameterInTypeDescription
namepathstringPreset name
curl -X DELETE http://127.0.0.1:9100/api/develop/presets/<name> \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Preset deleted
  • 404 — Unknown preset

PUT /api/develop/presets/{name}/group

Move preset to group

ParameterInTypeDescription
namepathstringPreset name

Body

FieldTypeRequiredDescription
groupstringyesThe group to list the preset under; `""` for none.
curl -X PUT http://127.0.0.1:9100/api/develop/presets/<name>/group \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"group":"text"}'

Responses

  • 200 — Preset moved
  • 404 — Unknown preset

POST /api/develop/presets/apply

Preset

Body

FieldTypeRequiredDescription
namestringyes
curl -X POST http://127.0.0.1:9100/api/develop/presets/apply \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"text"}'

Responses

  • 200 — Preset applied to the current image
  • 404 — Unknown preset

GET /api/develop/tools

Develop tools

curl -X GET http://127.0.0.1:9100/api/develop/tools \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Which develop tools are armed

PUT /api/develop/tools

Develop tool

Body

FieldTypeRequiredDescription
before_afterboolean
brushboolean
brush_eraseboolean
brush_feathernumber
brush_flownumber
brush_sizenumber
mask_edgeboolean
mask_graphboolean
mask_overlayboolean
solo_sectionsboolean
spotboolean
spot_feathernumber
spot_healboolean
spot_opacitynumber
spot_sizenumber
curl -X PUT http://127.0.0.1:9100/api/develop/tools \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"before_after":true,"brush":true,"brush_erase":true}'

Responses

  • 200 — Tools updated

GET /api/images/{id}/develop

Develop settings of a picture

ParameterInTypeDescription
idpathnumberImage index
curl -X GET http://127.0.0.1:9100/api/images/<id>/develop \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Full develop adjustment state for the image
  • 404 — No image at that index

POST /api/images/{id}/develop

Set develop of a picture

ParameterInTypeDescription
idpathnumberImage index

Body

FieldTypeRequiredDescription
ai_denoisenumberAI noise reduction (0-100): how much of the learned denoiser's picture is used, run before exposure and tone
blacksnumberBlack point (-100..+100)
bwbooleanBlack & white mode (HSL luminance zones become the B&W mix)
ca_amountnumberManual lateral CA correction (-100..+100)
cg_balancenumberColor grade: shadow/highlight balance (-100..+100)
cg_blendnumberColor grade: range overlap width (-100..+100)
cg_global_huenumberColor grade: global hue, every tone (0-360)
cg_global_lumnumberColor grade: global luminance (-100..+100)
cg_global_satnumberColor grade: global saturation (0-100)
cg_high_huenumberColor grade: highlight hue (0-360)
cg_high_lumnumberColor grade: highlight luminance (-100..+100)
cg_high_satnumberColor grade: highlight saturation (0-100)
cg_mid_huenumberColor grade: midtone hue (0-360)
cg_mid_lumnumberColor grade: midtone luminance (-100..+100)
cg_mid_satnumberColor grade: midtone saturation (0-100)
cg_shadow_huenumberColor grade: shadow hue (0-360)
cg_shadow_lumnumberColor grade: shadow luminance (-100..+100)
cg_shadow_satnumberColor grade: shadow saturation (0-100)
claritynumberClarity: midtone local contrast (-100..+100)
contrastnumberContrast (-100..+100)
defringe_greennumberGreen defringe (0-100)
defringe_purplenumberPurple defringe (0-100)
dehazenumberDehaze (-100..+100)
distortionnumberManual distortion correction (-100..+100)
exposure_evnumberExposure in EV stops (-4..+4)
exposure_protectbooleanExposure + brightens without clipping what was not clipped: the top rolls off towards white instead of past it
grain_amountnumberFilm grain amount (0-100)
grain_roughnessnumberFilm grain roughness (-100..+100)
grain_sizenumberFilm grain size (0-100)
highlightsnumberHighlight recovery (-100..+100)
hsl_hue_bluenumberHSL hue shift, blue zone
hsl_hue_cyannumberHSL hue shift, cyan zone
hsl_hue_greennumberHSL hue shift, green zone
hsl_hue_magentanumberHSL hue shift, magenta zone
hsl_hue_orangenumberHSL hue shift, orange zone
hsl_hue_purplenumberHSL hue shift, purple zone
hsl_hue_rednumberHSL hue shift, red zone
hsl_hue_yellownumberHSL hue shift, yellow zone
hsl_lum_bluenumberHSL luminance, blue zone
hsl_lum_cyannumberHSL luminance, cyan zone
hsl_lum_greennumberHSL luminance, green zone
hsl_lum_magentanumberHSL luminance, magenta zone
hsl_lum_orangenumberHSL luminance, orange zone
hsl_lum_purplenumberHSL luminance, purple zone
hsl_lum_rednumberHSL luminance, red zone
hsl_lum_yellownumberHSL luminance, yellow zone
hsl_sat_bluenumberHSL saturation, blue zone
hsl_sat_cyannumberHSL saturation, cyan zone
hsl_sat_greennumberHSL saturation, green zone
hsl_sat_magentanumberHSL saturation, magenta zone
hsl_sat_orangenumberHSL saturation, orange zone
hsl_sat_purplenumberHSL saturation, purple zone
hsl_sat_rednumberHSL saturation, red zone
hsl_sat_yellownumberHSL saturation, yellow zone
keynumberHigh key (+: the tones past a threshold go to white, the dark ones stay) or low key (−: to black, the light ones stay), -100..+100
lens_mode"as-shot" | "all" | "off"The lens mode: as-shot, all, off
lens_vignettenumberLens vignette vs auto correction (-100 off .. +100 double)
liftnumberLift: brightens from the shadows up through the midtones, the top untouched (-100..+100)
masksobject[]Local adjustments (linear/radial gradient masks); empty array clears
nr_colornumberColor noise reduction (0-100)
nr_color_smoothnessnumberColour NR smoothness (0-100); 50 is neutral
nr_lum_detailnumberLuminance NR detail (0-100); 50 is neutral
nr_luminancenumberLuminance noise reduction (0-100)
off"light" | "color" | "presence" | "detail" | "curve" | "mixer" | "grading" | "transform" | "lens" | "effects" | "spots" | "masks"[]
pcv_amountnumberPost-crop vignette amount (-100..+100)
pcv_feathernumberVignette feather offset (-45..+50)
pcv_highlightsnumberVignette highlights: how much of the highlights a darkening vignette leaves bright (0-100)
pcv_midpointnumberVignette midpoint offset (-50..+50)
pcv_roundnessnumberVignette roundness (-100..+100)
pcv_style"highlight-priority" | "color-priority" | "paint-overlay"The vignette style: highlight-priority, color-priority, paint-overlay
profilestringThe profile the picture is drawn with (#820): `default` (Settings → Camera profiles), `photosuite`, an Adobe DCP by the name Lightroom gives it (`Adobe Standard v2`) or one with an Adobe Raw look over it (`Adobe Standard v2 + Adobe Color`), or a creative look at an amount in percent (`Adobe Standard + Vintage 01 @ 63`, #609). `GET /api/images/current/profiles` lists the picture's.
saturationnumberSaturation (-100..+100)
shadowsnumberShadow lift (-100..+100)
sharpen_amountnumberSharpening vs default capture sharpening (-100 off .. +100 double)
sharpen_detailnumberSharpening detail (0-100): high-pass kept in flat areas; 25 is neutral
sharpen_maskingnumberSharpening edge masking (0-100)
sharpen_radiusnumberSharpening radius in pixels (0.5-3.0); 1.0 is neutral
spotsobject[]Blemishes removed by copying from elsewhere in the frame; empty array clears
tc_darksnumberTone curve: darks region (-100..+100)
tc_highlight_splitnumberTone curve: where lights give way to highlights, from 75 % (-25..+15)
tc_highlightsnumberTone curve: highlights region (-100..+100)
tc_lightsnumberTone curve: lights region (-100..+100)
tc_midtone_splitnumberTone curve: where darks give way to lights, from 50 % (-30..+30)
tc_pointsnumber[][]Freeform point curve, composite ([[x,y],..] in 0..1; empty array clears)
tc_points_bnumber[][]Freeform point curve, blue channel
tc_points_gnumber[][]Freeform point curve, green channel
tc_points_rnumber[][]Freeform point curve, red channel
tc_shadow_splitnumberTone curve: where shadows give way to darks, from 25 % (-15..+25)
tc_shadowsnumberTone curve: shadows region (-100..+100)
texturenumberTexture: fine local contrast (-100..+100)
tf_aspectnumberPerspective: aspect (-100 taller .. +100 wider)
tf_horizontalnumberPerspective: horizontal keystone (-100..+100)
tf_offset_xnumberPerspective: frame offset X (-100..+100 of half the frame)
tf_offset_ynumberPerspective: frame offset Y (-100..+100 of half the frame)
tf_scalenumberPerspective: scale in percent; 100 is untouched
tf_verticalnumberPerspective: vertical keystone (-100..+100)
vibrancenumberVibrance (-100..+100)
wb_temp_shiftnumberWhite balance temperature shift in Kelvin
wb_tint_shiftnumberWhite balance tint shift (-150..+150)
whitesnumberWhite point (-100..+100)
curl -X POST http://127.0.0.1:9100/api/images/<id>/develop \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ai_denoise":0,"blacks":0,"bw":true}'

Responses

  • 200 — Adjustments updated for the image (partial update)
  • 404 — No image at that index

POST /api/images/current/auto-crop

Auto crop

curl -X POST http://127.0.0.1:9100/api/images/current/auto-crop \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Auto-crop applied, or detection started (the crop lands when it has finished)
  • 400 — Nobody found to crop to, or no images loaded

POST /api/images/current/auto-level

Auto straighten

curl -X POST http://127.0.0.1:9100/api/images/current/auto-level \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Levelled
  • 400 — No straight edge to go by, or no images loaded

POST /api/images/current/constrain-crop

Fit crop to perspective

curl -X POST http://127.0.0.1:9100/api/images/current/constrain-crop \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Crop fitted inside the perspective correction
  • 400 — Nothing to fit, or no images loaded

GET /api/images/current/crop

Crop

curl -X GET http://127.0.0.1:9100/api/images/current/crop \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The crop on the current image

POST /api/images/current/crop

Set crop

Body

FieldTypeRequiredDescription
anglenumber
bottomnumberyes
leftnumberyes
rightnumberyes
topnumberyes
curl -X POST http://127.0.0.1:9100/api/images/current/crop \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"top":0,"left":0,"bottom":0,"right":0}'

Responses

  • 200 — Crop set
  • 400 — Invalid crop values

DELETE /api/images/current/crop

Remove crop

curl -X DELETE http://127.0.0.1:9100/api/images/current/crop \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Crop cleared
  • 400 — No images loaded

GET /api/images/current/develop

Develop settings

curl -X GET http://127.0.0.1:9100/api/images/current/develop \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Full develop adjustment state
  • 400 — No images loaded

POST /api/images/current/develop

Set develop

Body

FieldTypeRequiredDescription
ai_denoisenumberAI noise reduction (0-100): how much of the learned denoiser's picture is used, run before exposure and tone
blacksnumberBlack point (-100..+100)
bwbooleanBlack & white mode (HSL luminance zones become the B&W mix)
ca_amountnumberManual lateral CA correction (-100..+100)
cg_balancenumberColor grade: shadow/highlight balance (-100..+100)
cg_blendnumberColor grade: range overlap width (-100..+100)
cg_global_huenumberColor grade: global hue, every tone (0-360)
cg_global_lumnumberColor grade: global luminance (-100..+100)
cg_global_satnumberColor grade: global saturation (0-100)
cg_high_huenumberColor grade: highlight hue (0-360)
cg_high_lumnumberColor grade: highlight luminance (-100..+100)
cg_high_satnumberColor grade: highlight saturation (0-100)
cg_mid_huenumberColor grade: midtone hue (0-360)
cg_mid_lumnumberColor grade: midtone luminance (-100..+100)
cg_mid_satnumberColor grade: midtone saturation (0-100)
cg_shadow_huenumberColor grade: shadow hue (0-360)
cg_shadow_lumnumberColor grade: shadow luminance (-100..+100)
cg_shadow_satnumberColor grade: shadow saturation (0-100)
claritynumberClarity: midtone local contrast (-100..+100)
contrastnumberContrast (-100..+100)
defringe_greennumberGreen defringe (0-100)
defringe_purplenumberPurple defringe (0-100)
dehazenumberDehaze (-100..+100)
distortionnumberManual distortion correction (-100..+100)
exposure_evnumberExposure in EV stops (-4..+4)
exposure_protectbooleanExposure + brightens without clipping what was not clipped: the top rolls off towards white instead of past it
grain_amountnumberFilm grain amount (0-100)
grain_roughnessnumberFilm grain roughness (-100..+100)
grain_sizenumberFilm grain size (0-100)
highlightsnumberHighlight recovery (-100..+100)
hsl_hue_bluenumberHSL hue shift, blue zone
hsl_hue_cyannumberHSL hue shift, cyan zone
hsl_hue_greennumberHSL hue shift, green zone
hsl_hue_magentanumberHSL hue shift, magenta zone
hsl_hue_orangenumberHSL hue shift, orange zone
hsl_hue_purplenumberHSL hue shift, purple zone
hsl_hue_rednumberHSL hue shift, red zone
hsl_hue_yellownumberHSL hue shift, yellow zone
hsl_lum_bluenumberHSL luminance, blue zone
hsl_lum_cyannumberHSL luminance, cyan zone
hsl_lum_greennumberHSL luminance, green zone
hsl_lum_magentanumberHSL luminance, magenta zone
hsl_lum_orangenumberHSL luminance, orange zone
hsl_lum_purplenumberHSL luminance, purple zone
hsl_lum_rednumberHSL luminance, red zone
hsl_lum_yellownumberHSL luminance, yellow zone
hsl_sat_bluenumberHSL saturation, blue zone
hsl_sat_cyannumberHSL saturation, cyan zone
hsl_sat_greennumberHSL saturation, green zone
hsl_sat_magentanumberHSL saturation, magenta zone
hsl_sat_orangenumberHSL saturation, orange zone
hsl_sat_purplenumberHSL saturation, purple zone
hsl_sat_rednumberHSL saturation, red zone
hsl_sat_yellownumberHSL saturation, yellow zone
keynumberHigh key (+: the tones past a threshold go to white, the dark ones stay) or low key (−: to black, the light ones stay), -100..+100
lens_mode"as-shot" | "all" | "off"The lens mode: as-shot, all, off
lens_vignettenumberLens vignette vs auto correction (-100 off .. +100 double)
liftnumberLift: brightens from the shadows up through the midtones, the top untouched (-100..+100)
masksobject[]Local adjustments (linear/radial gradient masks); empty array clears
nr_colornumberColor noise reduction (0-100)
nr_color_smoothnessnumberColour NR smoothness (0-100); 50 is neutral
nr_lum_detailnumberLuminance NR detail (0-100); 50 is neutral
nr_luminancenumberLuminance noise reduction (0-100)
off"light" | "color" | "presence" | "detail" | "curve" | "mixer" | "grading" | "transform" | "lens" | "effects" | "spots" | "masks"[]
pcv_amountnumberPost-crop vignette amount (-100..+100)
pcv_feathernumberVignette feather offset (-45..+50)
pcv_highlightsnumberVignette highlights: how much of the highlights a darkening vignette leaves bright (0-100)
pcv_midpointnumberVignette midpoint offset (-50..+50)
pcv_roundnessnumberVignette roundness (-100..+100)
pcv_style"highlight-priority" | "color-priority" | "paint-overlay"The vignette style: highlight-priority, color-priority, paint-overlay
profilestringThe profile the picture is drawn with (#820): `default` (Settings → Camera profiles), `photosuite`, an Adobe DCP by the name Lightroom gives it (`Adobe Standard v2`) or one with an Adobe Raw look over it (`Adobe Standard v2 + Adobe Color`), or a creative look at an amount in percent (`Adobe Standard + Vintage 01 @ 63`, #609). `GET /api/images/current/profiles` lists the picture's.
saturationnumberSaturation (-100..+100)
shadowsnumberShadow lift (-100..+100)
sharpen_amountnumberSharpening vs default capture sharpening (-100 off .. +100 double)
sharpen_detailnumberSharpening detail (0-100): high-pass kept in flat areas; 25 is neutral
sharpen_maskingnumberSharpening edge masking (0-100)
sharpen_radiusnumberSharpening radius in pixels (0.5-3.0); 1.0 is neutral
spotsobject[]Blemishes removed by copying from elsewhere in the frame; empty array clears
tc_darksnumberTone curve: darks region (-100..+100)
tc_highlight_splitnumberTone curve: where lights give way to highlights, from 75 % (-25..+15)
tc_highlightsnumberTone curve: highlights region (-100..+100)
tc_lightsnumberTone curve: lights region (-100..+100)
tc_midtone_splitnumberTone curve: where darks give way to lights, from 50 % (-30..+30)
tc_pointsnumber[][]Freeform point curve, composite ([[x,y],..] in 0..1; empty array clears)
tc_points_bnumber[][]Freeform point curve, blue channel
tc_points_gnumber[][]Freeform point curve, green channel
tc_points_rnumber[][]Freeform point curve, red channel
tc_shadow_splitnumberTone curve: where shadows give way to darks, from 25 % (-15..+25)
tc_shadowsnumberTone curve: shadows region (-100..+100)
texturenumberTexture: fine local contrast (-100..+100)
tf_aspectnumberPerspective: aspect (-100 taller .. +100 wider)
tf_horizontalnumberPerspective: horizontal keystone (-100..+100)
tf_offset_xnumberPerspective: frame offset X (-100..+100 of half the frame)
tf_offset_ynumberPerspective: frame offset Y (-100..+100 of half the frame)
tf_scalenumberPerspective: scale in percent; 100 is untouched
tf_verticalnumberPerspective: vertical keystone (-100..+100)
vibrancenumberVibrance (-100..+100)
wb_temp_shiftnumberWhite balance temperature shift in Kelvin
wb_tint_shiftnumberWhite balance tint shift (-150..+150)
whitesnumberWhite point (-100..+100)
curl -X POST http://127.0.0.1:9100/api/images/current/develop \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ai_denoise":0,"blacks":0,"bw":true}'

Responses

  • 200 — Adjustments updated (partial update — only given fields change)
  • 400 — Unknown field or no images loaded

DELETE /api/images/current/develop

Reset all

The develop and the crop back to as shot, as Develop → Reset Develop. The rotation stays.

curl -X DELETE http://127.0.0.1:9100/api/images/current/develop \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Develop and crop reset
  • 400 — No images loaded

POST /api/images/current/develop/auto

Auto tone

curl -X POST http://127.0.0.1:9100/api/images/current/develop/auto \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Auto tone computed and applied (async when the image is still linearizing)
  • 400 — No images loaded

POST /api/images/current/develop/auto-white-balance

Auto white balance

curl -X POST http://127.0.0.1:9100/api/images/current/develop/auto-white-balance \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The white balance was nudged toward neutral
  • 400 — Nothing neutral enough to measure, or no images loaded

POST /api/images/current/develop/background-mask

Mask background

curl -X POST http://127.0.0.1:9100/api/images/current/develop/background-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Looking for the subject started: the mask of everything but it lands on the picture when it is found, by the subject model (#790). Without the model it is downloaded first (490 MB) and the picture masked when it is in
  • 400 — No images loaded

POST /api/images/current/develop/copy

Copy develop settings

curl -X POST http://127.0.0.1:9100/api/images/current/develop/copy \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Adjustments copied to the develop clipboard
  • 400 — No images loaded

GET /api/images/current/develop/history

History

curl -X GET http://127.0.0.1:9100/api/images/current/develop/history \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Persistent develop history for the current image
  • 400 — No images loaded

POST /api/images/current/develop/history/jump

Go to history step

Body

FieldTypeRequiredDescription
indexnumberyes
curl -X POST http://127.0.0.1:9100/api/images/current/develop/history/jump \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"index":0}'

Responses

  • 200 — Jumped to the given history entry
  • 404 — No entry at that index

POST /api/images/current/develop/landscape-mask

Mask landscape

Body

FieldTypeRequiredDescription
parts"sky" | "water" | "vegetation" | "mountains" | "architecture" | "natural_ground" | "artificial_ground"[]yes
curl -X POST http://127.0.0.1:9100/api/images/current/develop/landscape-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parts":["sky"]}'

Responses

  • 200 — A mask of the landscape's parts asked for (#792): at once when the picture's parts are known, else a few seconds later when they are found, by the landscape model
  • 400 — No images loaded, no part asked for, or the landscape model is not in this app

POST /api/images/current/develop/looks/unlink

Unlink look

Body

FieldTypeRequiredDescription
namestringyes
curl -X POST http://127.0.0.1:9100/api/images/current/develop/looks/unlink \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"text"}'

Responses

  • 200 — The look's masks on the current picture are its own and no longer follow the look
  • 404 — The picture does not follow a look of that name

POST /api/images/current/develop/match

Match selected to this picture

Body

FieldTypeRequiredDescription
referencenumberyesThe picture to match to: its index in the image list.
curl -X POST http://127.0.0.1:9100/api/images/current/develop/match \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"reference":0}'

Responses

  • 200 — Matching started: the selected pictures (or the current one) each get a whole-frame mask that brings them to the reference, as it is worked out
  • 400 — Nothing selected but the reference, or no such picture

POST /api/images/current/develop/node-view

Show at node

Body

FieldTypeRequiredDescription
indexnumberThe mask, 0-based, for `up_to` and `solo`.
view"whole" | "up_to" | "solo"yesThe node view: whole, up_to, solo
curl -X POST http://127.0.0.1:9100/api/images/current/develop/node-view \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"view":"whole"}'

Responses

  • 200 — The develop view shows the masks so
  • 400 — Unknown view, or no mask at that index

POST /api/images/current/develop/object-mask

Mask object

Body

FieldTypeRequiredDescription
strokesobject[]yes
curl -X POST http://127.0.0.1:9100/api/images/current/develop/object-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"strokes":[{"points":[[0]],"radius":0}]}'

Responses

  • 200 — A mask named Object of the strokes is added, and the thing under them is looked for (#789): the brush part becomes the thing's outline a few seconds later, by the edge model. Without the model it is downloading, and the strokes stay a brush mask
  • 400 — No images loaded, or no stroke with points

POST /api/images/current/develop/paste

Paste develop settings

Body

FieldTypeRequiredDescription
only"light" | "color" | "presence" | "detail" | "curve" | "mixer" | "grading" | "transform" | "lens" | "effects" | "spots" | "masks"[]
curl -X POST http://127.0.0.1:9100/api/images/current/develop/paste \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"only":["light"]}'

Responses

  • 200 — Clipboard adjustments pasted onto the current image or selection
  • 400 — Empty clipboard, unknown group, or no images loaded

POST /api/images/current/develop/people-mask

Mask people

Body

FieldTypeRequiredDescription
parts"face_skin" | "body_skin" | "eyes" | "iris" | "brows" | "lips" | "teeth" | "hair" | "facial_hair" | "clothes" | "whole"[]yes
personnumberWhich person, from 1, left to right; left out, everyone.
curl -X POST http://127.0.0.1:9100/api/images/current/develop/people-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parts":["face_skin"]}'

Responses

  • 200 — A mask of the parts added and selected; the people are looked for first if they were not (macOS 14+). Eyes, irises, teeth and hair are put at the picture's own edges by the edge model (#777) and land when that is done, a few seconds a piece; without the model they land as found and the model is downloaded (455 MB) for the next time
  • 400 — No picture, no person found, a person not there, no part, or not macOS 14+

POST /api/images/current/develop/redo

Redo

Kept for scripts written before #709: the same as POST /api/redo.

curl -X POST http://127.0.0.1:9100/api/images/current/develop/redo \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The last undone step done again
  • 400 — Nothing to redo

POST /api/images/current/develop/scope-mask

Mask from scope

Body

FieldTypeRequiredDescription
highnumber
huenumbercolour_range: the hue in degrees (0-360).
kind"colour_range" | "luminance"yesThe scope mask kind: colour_range, luminance
lownumberluminance: the span of levels, 0-1 of the output range.
sat_maxnumber
sat_minnumbercolour_range: the saturations it spans, 0-1 (default 0 and 1).
tolerancenumbercolour_range: how far either side of `hue`, in degrees.
curl -X POST http://127.0.0.1:9100/api/images/current/develop/scope-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"kind":"colour_range"}'

Responses

  • 200 — A mask of what the scope selection covers, on the current picture, as a drag on the scope makes
  • 400 — A field the kind needs is missing, or no picture

PUT /api/images/current/develop/sections/{group}

Switch section on or off

ParameterInTypeDescription
grouppathstringThe section: light, color, presence, detail, curve, mixer, grading, transform, lens, effects, spots, masks

Body

FieldTypeRequiredDescription
onbooleanyesOff keeps the section's values and leaves them out of the picture.
curl -X PUT http://127.0.0.1:9100/api/images/current/develop/sections/<group> \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"on":true}'

Responses

  • 200 — The section is in the picture, or its values are kept and left out of it
  • 400 — Unknown section, or no images loaded

POST /api/images/current/develop/sections/{group}/reset

Reset section

ParameterInTypeDescription
grouppathstringThe section: light, color, presence, detail, curve, mixer, grading, transform, lens, effects, spots, masks
curl -X POST http://127.0.0.1:9100/api/images/current/develop/sections/<group>/reset \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The section's values are neutral again, one undo step; on or off as it was
  • 400 — Unknown section, or no images loaded

GET /api/images/current/develop/selected-mask

Selected mask

curl -X GET http://127.0.0.1:9100/api/images/current/develop/selected-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The mask the develop panel edits, and a brush stroke paints into
  • 400 — No pictures loaded

PUT /api/images/current/develop/selected-mask

Select mask

Body

FieldTypeRequiredDescription
indexnumber0-based, one of the picture's masks: the panel edits it (#629). `null`: the panel edits the picture's own develop.
curl -X PUT http://127.0.0.1:9100/api/images/current/develop/selected-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"index":0}'

Responses

  • 200 — The panel edits that mask; its handles are on the picture
  • 400 — No mask at that index

POST /api/images/current/develop/sky-mask

Mask sky

curl -X POST http://127.0.0.1:9100/api/images/current/develop/sky-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Looking for the sky started: the mask lands on the picture when it is found, by the sky model (#775). Without the model it is downloaded first (176 MB) and the picture masked when it is in; if it cannot be, the top of the frame narrowed to its colour
  • 400 — No images loaded

GET /api/images/current/develop/snapshots

Snapshots

curl -X GET http://127.0.0.1:9100/api/images/current/develop/snapshots \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Snapshot names for the current image

POST /api/images/current/develop/snapshots

Save snapshot

Body

FieldTypeRequiredDescription
namestringyes
curl -X POST http://127.0.0.1:9100/api/images/current/develop/snapshots \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"text"}'

Responses

  • 200 — Current develop state saved as a snapshot
  • 400 — Empty name or no images loaded

DELETE /api/images/current/develop/snapshots/{name}

Delete snapshot

ParameterInTypeDescription
namepathstringSnapshot name
curl -X DELETE http://127.0.0.1:9100/api/images/current/develop/snapshots/<name> \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Snapshot deleted
  • 404 — Unknown snapshot

POST /api/images/current/develop/snapshots/restore

Snapshot

Body

FieldTypeRequiredDescription
namestringyes
curl -X POST http://127.0.0.1:9100/api/images/current/develop/snapshots/restore \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"text"}'

Responses

  • 200 — Snapshot restored
  • 404 — Unknown snapshot

POST /api/images/current/develop/subject-mask

Mask subject

curl -X POST http://127.0.0.1:9100/api/images/current/develop/subject-mask \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Looking for the subject started: the mask lands on the picture at the subject's outline when it is found, by the subject model (#775). Without the model it is downloaded first (490 MB) and the picture masked when it is in; if it cannot be, Vision's outline (macOS 14+), else the detector's box
  • 400 — Nothing found confidently enough to mask, no images loaded, or the detector could not run (no model downloaded)

POST /api/images/current/develop/undo

Undo

Kept for scripts written before #709: the same as POST /api/undo, which takes back the last step of any kind.

curl -X POST http://127.0.0.1:9100/api/images/current/develop/undo \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The last step undone
  • 400 — Nothing to undo

GET /api/images/current/people

People in the picture

curl -X GET http://127.0.0.1:9100/api/images/current/people \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The people found in the picture on screen; null until a people mask has looked

GET /api/images/current/profiles

Profiles

What the picture on screen can be drawn with: photosuite's own look, and Adobe's profiles for its camera where Lightroom, Camera Raw or DNG Converter is installed. Set one with `profile` in the develop body.

curl -X GET http://127.0.0.1:9100/api/images/current/profiles \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The profile the picture is drawn with, and the ones it can be
  • 400 — No images loaded

GET /api/images/current/scopes

Scopes

curl -X GET http://127.0.0.1:9100/api/images/current/scopes \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The scopes of the current picture, as the Scopes panel draws them
  • 404 — No scopes yet: no picture, or the Scopes panel has not drawn one

POST /api/metadata/keep-own-develop

Keep photosuite's develop

Body

FieldTypeRequiredDescription
scope"current" | "selected" | "visible"The scope: current, selected, visible. Default selected: the current image when nothing is selected.
curl -X POST http://127.0.0.1:9100/api/metadata/keep-own-develop \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"scope":"current"}'

Responses

  • 200 — Keep photosuite's develop on the pictures whose Lightroom settings changed outside photosuite: the settings in the file count as seen, and the mark goes
  • 400 — None of the pictures has changed Lightroom settings

GET /api/raw-steps

RAW steps

curl -X GET http://127.0.0.1:9100/api/raw-steps \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The step shown, and whether the current picture's sensor data is read

PUT /api/raw-steps

RAW step

Body

FieldTypeRequiredDescription
centernumber[]The photosite to put in the middle of the view, [x, y].
fitbooleanFit the whole plane (wins over `zoom`).
linearboolean
step"sensor" | "levels" | "filter" | "white_balance" | "demosaic" | "highlights" | "color" | "developed"The RAW step: sensor, levels, filter, white_balance, demosaic, highlights, color, developed
zoomnumberScreen pixels per photosite: 1 is one photosite per screen pixel, 64 a photosite 64 pixels across (each carries its number from 56).
curl -X PUT http://127.0.0.1:9100/api/raw-steps \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"center":[0],"fit":true,"linear":true}'

Responses

  • 200 — Updated
  • 400 — Unknown step

GET /api/raw-steps/probe

Probe RAW steps

ParameterInTypeDescription
xquerynumberPhotosite column, from the sensor plane's left edge.
yquerynumberPhotosite row, from the top edge.
curl -X GET http://127.0.0.1:9100/api/raw-steps/probe \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The photosite through every step
  • 400 — Outside the sensor, or no picture
  • 409 — The sensor data is still being read, or the view is not open
esc
    ↑↓ navigieren↵ öffnen