Develop — Referencia de la API
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.
La referencia de la API está en inglés: se genera a partir del propio documento OpenAPI de la aplicación.
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 them400— 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 went400— 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 restart400— 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 examples400— 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
| Field | Type | Required | Description |
|---|---|---|---|
make | string | yes | |
model | string | yes | |
style | string |
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 again404— No look was learned for that body
POST /api/camera-looks/learn
Learn camera look
Body
| Field | Type | Required | Description |
|---|---|---|---|
make | string | yes | |
model | string | yes | |
style | string |
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_refused400— 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
| Field | Type | Required | Description |
|---|---|---|---|
active | boolean | Open the crop tool, or close it. Closing applies what is there unless `apply` says otherwise. | |
apply | boolean | What 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 | |
portrait | boolean | Swap width and height of the locked ratio. | |
reset | boolean | The toolbar's Reset: the rectangle back to the whole frame. | |
show_frame | boolean | Show the whole frame with the crop drawn on it, rather than the cropped region. | |
straighten | boolean | Arm the straighten gesture — a drag on the picture sets the angle. | |
suggestion | number | Put 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 updated400— 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
| Field | Type | Required | Description |
|---|---|---|---|
source | "embedded-jpeg" | "native-raw" | yes | The 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 changed400— 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
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes |
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 follows400— Empty name, or the picture has no masks
DELETE /api/develop/looks/{name}
Delete look
| Parameter | In | Type | Description |
|---|---|---|---|
name | path | string | Look 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 have404— No look of that name
POST /api/develop/looks/apply
Look
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes |
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 look400— The picture already has the look404— 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
| Field | Type | Required | Description |
|---|---|---|---|
group | string | The group to list it under (#633); `""` for none. Left out: the group a preset by that name already has, else none. | |
name | string | yes | |
values | any |
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 develop400— Empty name, or no values given and no adjustments on the picture
DELETE /api/develop/presets/{name}
Delete preset
| Parameter | In | Type | Description |
|---|---|---|---|
name | path | string | Preset name |
curl -X DELETE http://127.0.0.1:9100/api/develop/presets/<name> \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Preset deleted404— Unknown preset
PUT /api/develop/presets/{name}/group
Move preset to group
| Parameter | In | Type | Description |
|---|---|---|---|
name | path | string | Preset name |
Body
| Field | Type | Required | Description |
|---|---|---|---|
group | string | yes | The 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 moved404— Unknown preset
POST /api/develop/presets/apply
Preset
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes |
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 image404— 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
| Field | Type | Required | Description |
|---|---|---|---|
before_after | boolean | ||
brush | boolean | ||
brush_erase | boolean | ||
brush_feather | number | ||
brush_flow | number | ||
brush_size | number | ||
mask_edge | boolean | ||
mask_graph | boolean | ||
mask_overlay | boolean | ||
solo_sections | boolean | ||
spot | boolean | ||
spot_feather | number | ||
spot_heal | boolean | ||
spot_opacity | number | ||
spot_size | number |
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
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | number | Image 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 image404— No image at that index
POST /api/images/{id}/develop
Set develop of a picture
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | number | Image index |
Body
| Field | Type | Required | Description |
|---|---|---|---|
ai_denoise | number | AI noise reduction (0-100): how much of the learned denoiser's picture is used, run before exposure and tone | |
blacks | number | Black point (-100..+100) | |
bw | boolean | Black & white mode (HSL luminance zones become the B&W mix) | |
ca_amount | number | Manual lateral CA correction (-100..+100) | |
cg_balance | number | Color grade: shadow/highlight balance (-100..+100) | |
cg_blend | number | Color grade: range overlap width (-100..+100) | |
cg_global_hue | number | Color grade: global hue, every tone (0-360) | |
cg_global_lum | number | Color grade: global luminance (-100..+100) | |
cg_global_sat | number | Color grade: global saturation (0-100) | |
cg_high_hue | number | Color grade: highlight hue (0-360) | |
cg_high_lum | number | Color grade: highlight luminance (-100..+100) | |
cg_high_sat | number | Color grade: highlight saturation (0-100) | |
cg_mid_hue | number | Color grade: midtone hue (0-360) | |
cg_mid_lum | number | Color grade: midtone luminance (-100..+100) | |
cg_mid_sat | number | Color grade: midtone saturation (0-100) | |
cg_shadow_hue | number | Color grade: shadow hue (0-360) | |
cg_shadow_lum | number | Color grade: shadow luminance (-100..+100) | |
cg_shadow_sat | number | Color grade: shadow saturation (0-100) | |
clarity | number | Clarity: midtone local contrast (-100..+100) | |
contrast | number | Contrast (-100..+100) | |
defringe_green | number | Green defringe (0-100) | |
defringe_purple | number | Purple defringe (0-100) | |
dehaze | number | Dehaze (-100..+100) | |
distortion | number | Manual distortion correction (-100..+100) | |
exposure_ev | number | Exposure in EV stops (-4..+4) | |
exposure_protect | boolean | Exposure + brightens without clipping what was not clipped: the top rolls off towards white instead of past it | |
grain_amount | number | Film grain amount (0-100) | |
grain_roughness | number | Film grain roughness (-100..+100) | |
grain_size | number | Film grain size (0-100) | |
highlights | number | Highlight recovery (-100..+100) | |
hsl_hue_blue | number | HSL hue shift, blue zone | |
hsl_hue_cyan | number | HSL hue shift, cyan zone | |
hsl_hue_green | number | HSL hue shift, green zone | |
hsl_hue_magenta | number | HSL hue shift, magenta zone | |
hsl_hue_orange | number | HSL hue shift, orange zone | |
hsl_hue_purple | number | HSL hue shift, purple zone | |
hsl_hue_red | number | HSL hue shift, red zone | |
hsl_hue_yellow | number | HSL hue shift, yellow zone | |
hsl_lum_blue | number | HSL luminance, blue zone | |
hsl_lum_cyan | number | HSL luminance, cyan zone | |
hsl_lum_green | number | HSL luminance, green zone | |
hsl_lum_magenta | number | HSL luminance, magenta zone | |
hsl_lum_orange | number | HSL luminance, orange zone | |
hsl_lum_purple | number | HSL luminance, purple zone | |
hsl_lum_red | number | HSL luminance, red zone | |
hsl_lum_yellow | number | HSL luminance, yellow zone | |
hsl_sat_blue | number | HSL saturation, blue zone | |
hsl_sat_cyan | number | HSL saturation, cyan zone | |
hsl_sat_green | number | HSL saturation, green zone | |
hsl_sat_magenta | number | HSL saturation, magenta zone | |
hsl_sat_orange | number | HSL saturation, orange zone | |
hsl_sat_purple | number | HSL saturation, purple zone | |
hsl_sat_red | number | HSL saturation, red zone | |
hsl_sat_yellow | number | HSL saturation, yellow zone | |
key | number | High 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_vignette | number | Lens vignette vs auto correction (-100 off .. +100 double) | |
lift | number | Lift: brightens from the shadows up through the midtones, the top untouched (-100..+100) | |
masks | object[] | Local adjustments (linear/radial gradient masks); empty array clears | |
nr_color | number | Color noise reduction (0-100) | |
nr_color_smoothness | number | Colour NR smoothness (0-100); 50 is neutral | |
nr_lum_detail | number | Luminance NR detail (0-100); 50 is neutral | |
nr_luminance | number | Luminance noise reduction (0-100) | |
off | "light" | "color" | "presence" | "detail" | "curve" | "mixer" | "grading" | "transform" | "lens" | "effects" | "spots" | "masks"[] | ||
pcv_amount | number | Post-crop vignette amount (-100..+100) | |
pcv_feather | number | Vignette feather offset (-45..+50) | |
pcv_highlights | number | Vignette highlights: how much of the highlights a darkening vignette leaves bright (0-100) | |
pcv_midpoint | number | Vignette midpoint offset (-50..+50) | |
pcv_roundness | number | Vignette roundness (-100..+100) | |
pcv_style | "highlight-priority" | "color-priority" | "paint-overlay" | The vignette style: highlight-priority, color-priority, paint-overlay | |
profile | string | The 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. | |
saturation | number | Saturation (-100..+100) | |
shadows | number | Shadow lift (-100..+100) | |
sharpen_amount | number | Sharpening vs default capture sharpening (-100 off .. +100 double) | |
sharpen_detail | number | Sharpening detail (0-100): high-pass kept in flat areas; 25 is neutral | |
sharpen_masking | number | Sharpening edge masking (0-100) | |
sharpen_radius | number | Sharpening radius in pixels (0.5-3.0); 1.0 is neutral | |
spots | object[] | Blemishes removed by copying from elsewhere in the frame; empty array clears | |
tc_darks | number | Tone curve: darks region (-100..+100) | |
tc_highlight_split | number | Tone curve: where lights give way to highlights, from 75 % (-25..+15) | |
tc_highlights | number | Tone curve: highlights region (-100..+100) | |
tc_lights | number | Tone curve: lights region (-100..+100) | |
tc_midtone_split | number | Tone curve: where darks give way to lights, from 50 % (-30..+30) | |
tc_points | number[][] | Freeform point curve, composite ([[x,y],..] in 0..1; empty array clears) | |
tc_points_b | number[][] | Freeform point curve, blue channel | |
tc_points_g | number[][] | Freeform point curve, green channel | |
tc_points_r | number[][] | Freeform point curve, red channel | |
tc_shadow_split | number | Tone curve: where shadows give way to darks, from 25 % (-15..+25) | |
tc_shadows | number | Tone curve: shadows region (-100..+100) | |
texture | number | Texture: fine local contrast (-100..+100) | |
tf_aspect | number | Perspective: aspect (-100 taller .. +100 wider) | |
tf_horizontal | number | Perspective: horizontal keystone (-100..+100) | |
tf_offset_x | number | Perspective: frame offset X (-100..+100 of half the frame) | |
tf_offset_y | number | Perspective: frame offset Y (-100..+100 of half the frame) | |
tf_scale | number | Perspective: scale in percent; 100 is untouched | |
tf_vertical | number | Perspective: vertical keystone (-100..+100) | |
vibrance | number | Vibrance (-100..+100) | |
wb_temp_shift | number | White balance temperature shift in Kelvin | |
wb_tint_shift | number | White balance tint shift (-150..+150) | |
whites | number | White 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— Levelled400— 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 correction400— 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
| Field | Type | Required | Description |
|---|---|---|---|
angle | number | ||
bottom | number | yes | |
left | number | yes | |
right | number | yes | |
top | number | yes |
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 set400— 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 cleared400— 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 state400— No images loaded
POST /api/images/current/develop
Set develop
Body
| Field | Type | Required | Description |
|---|---|---|---|
ai_denoise | number | AI noise reduction (0-100): how much of the learned denoiser's picture is used, run before exposure and tone | |
blacks | number | Black point (-100..+100) | |
bw | boolean | Black & white mode (HSL luminance zones become the B&W mix) | |
ca_amount | number | Manual lateral CA correction (-100..+100) | |
cg_balance | number | Color grade: shadow/highlight balance (-100..+100) | |
cg_blend | number | Color grade: range overlap width (-100..+100) | |
cg_global_hue | number | Color grade: global hue, every tone (0-360) | |
cg_global_lum | number | Color grade: global luminance (-100..+100) | |
cg_global_sat | number | Color grade: global saturation (0-100) | |
cg_high_hue | number | Color grade: highlight hue (0-360) | |
cg_high_lum | number | Color grade: highlight luminance (-100..+100) | |
cg_high_sat | number | Color grade: highlight saturation (0-100) | |
cg_mid_hue | number | Color grade: midtone hue (0-360) | |
cg_mid_lum | number | Color grade: midtone luminance (-100..+100) | |
cg_mid_sat | number | Color grade: midtone saturation (0-100) | |
cg_shadow_hue | number | Color grade: shadow hue (0-360) | |
cg_shadow_lum | number | Color grade: shadow luminance (-100..+100) | |
cg_shadow_sat | number | Color grade: shadow saturation (0-100) | |
clarity | number | Clarity: midtone local contrast (-100..+100) | |
contrast | number | Contrast (-100..+100) | |
defringe_green | number | Green defringe (0-100) | |
defringe_purple | number | Purple defringe (0-100) | |
dehaze | number | Dehaze (-100..+100) | |
distortion | number | Manual distortion correction (-100..+100) | |
exposure_ev | number | Exposure in EV stops (-4..+4) | |
exposure_protect | boolean | Exposure + brightens without clipping what was not clipped: the top rolls off towards white instead of past it | |
grain_amount | number | Film grain amount (0-100) | |
grain_roughness | number | Film grain roughness (-100..+100) | |
grain_size | number | Film grain size (0-100) | |
highlights | number | Highlight recovery (-100..+100) | |
hsl_hue_blue | number | HSL hue shift, blue zone | |
hsl_hue_cyan | number | HSL hue shift, cyan zone | |
hsl_hue_green | number | HSL hue shift, green zone | |
hsl_hue_magenta | number | HSL hue shift, magenta zone | |
hsl_hue_orange | number | HSL hue shift, orange zone | |
hsl_hue_purple | number | HSL hue shift, purple zone | |
hsl_hue_red | number | HSL hue shift, red zone | |
hsl_hue_yellow | number | HSL hue shift, yellow zone | |
hsl_lum_blue | number | HSL luminance, blue zone | |
hsl_lum_cyan | number | HSL luminance, cyan zone | |
hsl_lum_green | number | HSL luminance, green zone | |
hsl_lum_magenta | number | HSL luminance, magenta zone | |
hsl_lum_orange | number | HSL luminance, orange zone | |
hsl_lum_purple | number | HSL luminance, purple zone | |
hsl_lum_red | number | HSL luminance, red zone | |
hsl_lum_yellow | number | HSL luminance, yellow zone | |
hsl_sat_blue | number | HSL saturation, blue zone | |
hsl_sat_cyan | number | HSL saturation, cyan zone | |
hsl_sat_green | number | HSL saturation, green zone | |
hsl_sat_magenta | number | HSL saturation, magenta zone | |
hsl_sat_orange | number | HSL saturation, orange zone | |
hsl_sat_purple | number | HSL saturation, purple zone | |
hsl_sat_red | number | HSL saturation, red zone | |
hsl_sat_yellow | number | HSL saturation, yellow zone | |
key | number | High 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_vignette | number | Lens vignette vs auto correction (-100 off .. +100 double) | |
lift | number | Lift: brightens from the shadows up through the midtones, the top untouched (-100..+100) | |
masks | object[] | Local adjustments (linear/radial gradient masks); empty array clears | |
nr_color | number | Color noise reduction (0-100) | |
nr_color_smoothness | number | Colour NR smoothness (0-100); 50 is neutral | |
nr_lum_detail | number | Luminance NR detail (0-100); 50 is neutral | |
nr_luminance | number | Luminance noise reduction (0-100) | |
off | "light" | "color" | "presence" | "detail" | "curve" | "mixer" | "grading" | "transform" | "lens" | "effects" | "spots" | "masks"[] | ||
pcv_amount | number | Post-crop vignette amount (-100..+100) | |
pcv_feather | number | Vignette feather offset (-45..+50) | |
pcv_highlights | number | Vignette highlights: how much of the highlights a darkening vignette leaves bright (0-100) | |
pcv_midpoint | number | Vignette midpoint offset (-50..+50) | |
pcv_roundness | number | Vignette roundness (-100..+100) | |
pcv_style | "highlight-priority" | "color-priority" | "paint-overlay" | The vignette style: highlight-priority, color-priority, paint-overlay | |
profile | string | The 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. | |
saturation | number | Saturation (-100..+100) | |
shadows | number | Shadow lift (-100..+100) | |
sharpen_amount | number | Sharpening vs default capture sharpening (-100 off .. +100 double) | |
sharpen_detail | number | Sharpening detail (0-100): high-pass kept in flat areas; 25 is neutral | |
sharpen_masking | number | Sharpening edge masking (0-100) | |
sharpen_radius | number | Sharpening radius in pixels (0.5-3.0); 1.0 is neutral | |
spots | object[] | Blemishes removed by copying from elsewhere in the frame; empty array clears | |
tc_darks | number | Tone curve: darks region (-100..+100) | |
tc_highlight_split | number | Tone curve: where lights give way to highlights, from 75 % (-25..+15) | |
tc_highlights | number | Tone curve: highlights region (-100..+100) | |
tc_lights | number | Tone curve: lights region (-100..+100) | |
tc_midtone_split | number | Tone curve: where darks give way to lights, from 50 % (-30..+30) | |
tc_points | number[][] | Freeform point curve, composite ([[x,y],..] in 0..1; empty array clears) | |
tc_points_b | number[][] | Freeform point curve, blue channel | |
tc_points_g | number[][] | Freeform point curve, green channel | |
tc_points_r | number[][] | Freeform point curve, red channel | |
tc_shadow_split | number | Tone curve: where shadows give way to darks, from 25 % (-15..+25) | |
tc_shadows | number | Tone curve: shadows region (-100..+100) | |
texture | number | Texture: fine local contrast (-100..+100) | |
tf_aspect | number | Perspective: aspect (-100 taller .. +100 wider) | |
tf_horizontal | number | Perspective: horizontal keystone (-100..+100) | |
tf_offset_x | number | Perspective: frame offset X (-100..+100 of half the frame) | |
tf_offset_y | number | Perspective: frame offset Y (-100..+100 of half the frame) | |
tf_scale | number | Perspective: scale in percent; 100 is untouched | |
tf_vertical | number | Perspective: vertical keystone (-100..+100) | |
vibrance | number | Vibrance (-100..+100) | |
wb_temp_shift | number | White balance temperature shift in Kelvin | |
wb_tint_shift | number | White balance tint shift (-150..+150) | |
whites | number | White 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 reset400— 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 neutral400— 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 in400— 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 clipboard400— 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 image400— No images loaded
POST /api/images/current/develop/history/jump
Go to history step
Body
| Field | Type | Required | Description |
|---|---|---|---|
index | number | yes |
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 entry404— No entry at that index
POST /api/images/current/develop/landscape-mask
Mask landscape
Body
| Field | Type | Required | Description |
|---|---|---|---|
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 model400— 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
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes |
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 look404— The picture does not follow a look of that name
POST /api/images/current/develop/match
Match selected to this picture
Body
| Field | Type | Required | Description |
|---|---|---|---|
reference | number | yes | The 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 out400— Nothing selected but the reference, or no such picture
POST /api/images/current/develop/node-view
Show at node
Body
| Field | Type | Required | Description |
|---|---|---|---|
index | number | The mask, 0-based, for `up_to` and `solo`. | |
view | "whole" | "up_to" | "solo" | yes | The 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 so400— Unknown view, or no mask at that index
POST /api/images/current/develop/object-mask
Mask object
Body
| Field | Type | Required | Description |
|---|---|---|---|
strokes | object[] | 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 mask400— No images loaded, or no stroke with points
POST /api/images/current/develop/paste
Paste develop settings
Body
| Field | Type | Required | Description |
|---|---|---|---|
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 selection400— Empty clipboard, unknown group, or no images loaded
POST /api/images/current/develop/people-mask
Mask people
Body
| Field | Type | Required | Description |
|---|---|---|---|
parts | "face_skin" | "body_skin" | "eyes" | "iris" | "brows" | "lips" | "teeth" | "hair" | "facial_hair" | "clothes" | "whole"[] | yes | |
person | number | Which 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 time400— 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 again400— Nothing to redo
POST /api/images/current/develop/scope-mask
Mask from scope
Body
| Field | Type | Required | Description |
|---|---|---|---|
high | number | ||
hue | number | colour_range: the hue in degrees (0-360). | |
kind | "colour_range" | "luminance" | yes | The scope mask kind: colour_range, luminance |
low | number | luminance: the span of levels, 0-1 of the output range. | |
sat_max | number | ||
sat_min | number | colour_range: the saturations it spans, 0-1 (default 0 and 1). | |
tolerance | number | colour_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 makes400— A field the kind needs is missing, or no picture
PUT /api/images/current/develop/sections/{group}
Switch section on or off
| Parameter | In | Type | Description |
|---|---|---|---|
group | path | string | The section: light, color, presence, detail, curve, mixer, grading, transform, lens, effects, spots, masks |
Body
| Field | Type | Required | Description |
|---|---|---|---|
on | boolean | yes | Off 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 it400— Unknown section, or no images loaded
POST /api/images/current/develop/sections/{group}/reset
Reset section
| Parameter | In | Type | Description |
|---|---|---|---|
group | path | string | The 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 was400— 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 into400— No pictures loaded
PUT /api/images/current/develop/selected-mask
Select mask
Body
| Field | Type | Required | Description |
|---|---|---|---|
index | number | 0-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 picture400— 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 colour400— 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
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes |
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 snapshot400— Empty name or no images loaded
DELETE /api/images/current/develop/snapshots/{name}
Delete snapshot
| Parameter | In | Type | Description |
|---|---|---|---|
name | path | string | Snapshot 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 deleted404— Unknown snapshot
POST /api/images/current/develop/snapshots/restore
Snapshot
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes |
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 restored404— 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 box400— 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 undone400— 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 be400— 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 them404— No scopes yet: no picture, or the Scopes panel has not drawn one
POST /api/metadata/keep-own-develop
Keep photosuite's develop
Body
| Field | Type | Required | Description |
|---|---|---|---|
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 goes400— 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
| Field | Type | Required | Description |
|---|---|---|---|
center | number[] | The photosite to put in the middle of the view, [x, y]. | |
fit | boolean | Fit the whole plane (wins over `zoom`). | |
linear | boolean | ||
step | "sensor" | "levels" | "filter" | "white_balance" | "demosaic" | "highlights" | "color" | "developed" | The RAW step: sensor, levels, filter, white_balance, demosaic, highlights, color, developed | |
zoom | number | Screen 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— Updated400— Unknown step
GET /api/raw-steps/probe
Probe RAW steps
| Parameter | In | Type | Description |
|---|---|---|---|
x | query | number | Photosite column, from the sensor plane's left edge. |
y | query | number | Photosite 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 step400— Outside the sensor, or no picture409— The sensor data is still being read, or the view is not open