App — Référence de l’API
The app itself: settings, license, setup, about, the console, and running scripts.
La référence de l’API est en anglais : elle est générée à partir du document OpenAPI de l’application.
The app itself: settings, license, setup, about, the console, and running scripts.
57 operations. Generated from the application's own OpenAPI document.
GET /api/about/licenses
Third-party licenses
curl -X GET http://127.0.0.1:9100/api/about/licenses \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every third-party notice the app ships with
GET /api/actions
Everything the app can do
curl -X GET http://127.0.0.1:9100/api/actions \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every command (the menu bar flattened, and the shortcuts no menu item has), and every dial: the view's and every develop slider
POST /api/actions/adjust
Turn a dial
Body
| Field | Type | Required | Description |
|---|---|---|---|
field | string | yes | |
reset | boolean | Press it instead: back to neutral, zoom to fit, the first picture. | |
steps | number | Ticks to turn it, negative down. |
curl -X POST http://127.0.0.1:9100/api/actions/adjust \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"field":"text"}'
Responses
200— The dial turned; a develop slider turns on the picture on screen, and a turn that rests is one undo step400— No such dial, or no picture
POST /api/actions/run
Run a menu command
Body
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes |
curl -X POST http://127.0.0.1:9100/api/actions/run \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"text"}'
Responses
200— Ran, as its menu item or key does400— It did nothing, and why404— No such action
GET /api/actions/state
What a console shows
curl -X GET http://127.0.0.1:9100/api/actions/state \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every dial's value (the develop sliders, picture and rating only with a picture on screen) and the commands that are on
GET /api/app/changelog
What's new
curl -X GET http://127.0.0.1:9100/api/app/changelog \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— What changed in each version this build carries, and what a newer version brings; Help → What's New… shows the same
GET /api/app/log
Log
| Parameter | In | Type | Description |
|---|---|---|---|
lines | query | number | How many of the last lines (default 200, at most 5000). |
curl -X GET http://127.0.0.1:9100/api/app/log \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— The log file and its last lines, as Help → Show Log File finds it400— There is no log file: HOME is not set
POST /api/app/scripts-folder
Scripts folder
curl -X POST http://127.0.0.1:9100/api/app/scripts-folder \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— The folder Help → Scripts Folder opens, with this app's SDK (photosuite-sdk.mjs) written into it: save a script there and run it400— The folder could not be written
GET /api/app/update
Update
curl -X GET http://127.0.0.1:9100/api/app/update \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— This build's version, and a newer release if the update check found one
POST /api/app/update
Install update and restart
curl -X POST http://127.0.0.1:9100/api/app/update \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— The update is being downloaded, checked and put in place of the app, which then starts again (macOS)400— There is no update this app can install
POST /api/cache/clear
Clear cache
curl -X POST http://127.0.0.1:9100/api/cache/clear \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every folder's cached previews are gone, as Clear Cache does400— No cache is set up
GET /api/downloads
Downloads
curl -X GET http://127.0.0.1:9100/api/downloads \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every optional download: here, downloading, missing or failed
POST /api/downloads
Download
Body
| Field | Type | Required | Description |
|---|---|---|---|
items | "subject" | "sky" | "objects" | "people" | "landscape" | "search" | "detector" | "places"[] | yes |
curl -X POST http://127.0.0.1:9100/api/downloads \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"items":["subject"]}'
Responses
200— Started, or queued until its feature is free; GET /api/downloads says how far400— Not a download
POST /api/feedback
Send feedback
Body
| Field | Type | Required | Description |
|---|---|---|---|
include_crash_log | boolean | ||
include_log | boolean | ||
kind | "hdr" | "panorama" | yes | What to make of the frames. |
message | string | yes | |
reply_to | string | Where to answer; empty for no answer. |
curl -X POST http://127.0.0.1:9100/api/feedback \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"kind":"hdr","message":"text"}'
Responses
200— The report arrived at photosuite.flogvit.com400— It was not sent: nothing written, no e-mail address, or the server or the network said no
GET /api/ingest/watch
Watches
curl -X GET http://127.0.0.1:9100/api/ingest/watch \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Active watch ids
POST /api/ingest/watch
Start watch
Body
| Field | Type | Required | Description |
|---|---|---|---|
concurrency | number | Files leased out at once — handed out and not yet settled. Default 1. A lease is not a worker: the engine runs every step on a thread of its own whatever this says, and the one step that must not overlap, denoise, is serialised by its own lock. Raise it when a client has to HOLD several frames before it can judge any of them — a picker keeping one frame per burst. | |
connection | string | yes | Named connection profile to poll. Credentials stay in the keychain, so a caller never carries them. |
deleteFromSource | boolean | Delete each file from the source once it is downloaded. The local copy then becomes the only one, which is why the queue keeps receipts. | |
ordered | boolean | ||
pollIntervalSecs | number | ||
remotePath | string | Remote folder to watch. | |
replace | boolean | Stop a watch already using this `work_dir` and take its place, instead of answering `409`. For a delivery that OWNS its work directory and is being started again: the watch its last run left behind is still polling, and — if the run died mid-frame — still holding that frame, so it is never reaped. Every file it downloaded and never delivered is on disk, and the new watch hands it out again. Other watches are untouched. | |
workDir | string | yes | A path. In an instance started with `--dir` it is in the instance's root: `/` is the root, and a path that leads out of it is refused (403). |
curl -X POST http://127.0.0.1:9100/api/ingest/watch \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"connection":"text","workDir":"text"}'
Responses
200— Watch started400— Unknown connection, a local folder that does not exist, or a concurrency of 0409— A live watch is already using this work_dir, and `replace` was not asked for
GET /api/ingest/watch/{id}
Watch
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | string | Watch id |
curl -X GET http://127.0.0.1:9100/api/ingest/watch/<id> \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Queue depth and delivery counts404— No such watch
DELETE /api/ingest/watch/{id}
Stop watch
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | string | Watch id |
curl -X DELETE http://127.0.0.1:9100/api/ingest/watch/<id> \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
204— Watch stopped404— No such watch
GET /api/ingest/watch/{id}/next
Next frame of a watch
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | string | Watch id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
curl -X GET http://127.0.0.1:9100/api/ingest/watch/<id>/next \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Next file, leased to the caller204— Nothing waiting within the wait window404— No such watch
GET /api/key-bindings
Shortcuts
curl -X GET http://127.0.0.1:9100/api/key-bindings \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every key action and its combination, as Settings → Shortcuts lists them
PUT /api/key-bindings/{action}
Set shortcut
| Parameter | In | Type | Description |
|---|---|---|---|
action | path | string | The key action, as GET /api/key-bindings names it |
Body
| Field | Type | Required | Description |
|---|---|---|---|
combo | string | The combination ("Cmd+Shift+N", "Space", "Alt+3"); null or "" unbinds. |
curl -X PUT http://127.0.0.1:9100/api/key-bindings/<action> \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"combo":"text"}'
Responses
200— Bound (or unbound); every binding as it is now400— No such action, or not a key combination409— Another action has that combination
POST /api/key-bindings/reset
Reset shortcuts
curl -X POST http://127.0.0.1:9100/api/key-bindings/reset \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every binding back to its default
GET /api/license
License
curl -X GET http://127.0.0.1:9100/api/license \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— The licence on this machine
POST /api/license/activate
Activate license
Body
| Field | Type | Required | Description |
|---|---|---|---|
license_key | string | yes |
curl -X POST http://127.0.0.1:9100/api/license/activate \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"license_key":"text"}'
Responses
200— Asked the licence server; the outcome comes as `license_changed` and in GET /api/license400— No key409— Another licence request is under way
POST /api/license/deactivate
Deactivate license
curl -X POST http://127.0.0.1:9100/api/license/deactivate \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Asked the server to free this machine's activation400— No activated licence on this machine409— Another licence request is under way
POST /api/license/refresh
Refresh license
curl -X POST http://127.0.0.1:9100/api/license/refresh \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Asked the server for the licence as it is now: an extension, a revocation400— No licence key on this machine409— Another licence request is under way
POST /api/license/sign-in
Sign in
curl -X POST http://127.0.0.1:9100/api/license/sign-in \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— The browser opened on FLOGVIT's activation page, as Sign in with FLOGVIT does; the licence lands when it is confirmed there409— Another licence request is under way
DELETE /api/license/sign-in
Cancel sign-in
curl -X DELETE http://127.0.0.1:9100/api/license/sign-in \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Stopped waiting for the browser, as Cancel does; nothing to stop is not an error
POST /api/license/trial
Start trial
curl -X POST http://127.0.0.1:9100/api/license/trial \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Asked for a trial409— Another licence request is under way
GET /api/pipeline/handles/{handle}
Handle
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
curl -X GET http://127.0.0.1:9100/api/pipeline/handles/<handle> \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Handle info404— No such handle, or a step is running on it
POST /api/pipeline/handles/{handle}/add-to-album
Step: add to album
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
album | string | yes | The album, created when it does not exist; the same variables as an export path. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/add-to-album \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"album":"text"}'
Responses
200— In the album, the develop and crop in its sidecar202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/approve
Step: approve
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
criteria | string | yes | What right looks like, in the photographer's words. |
model | string | The Claude model asked; the watcher's default when left out. | |
onFail | "hold" | "mark" | "recrop" | The on fail: hold, mark, recrop | |
timeoutSecs | number | How long Claude may take before the picture counts as unjudged (default 30). |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/approve \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"criteria":"text"}'
Responses
200— Judged: the verdict, Claude's reason and a better crop when it has one are in `outcome`; `unjudged` when Claude did not answer202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/auto
Step: auto
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
strength | number | How much of the correction to keep, 0.0 to 1.0. Defaults to all of it. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/auto \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"strength":0}'
Responses
200— Exposed202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/auto-crop
Step: auto crop
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
aroundFocus | boolean | Crop to the subject the camera focused on, with the air measured around swimmers, rather than the crop model's guess. | |
aspect | string | yes | Shape: `16:9` or `16x9`, `3:2`, `9:16`, `square`, `Free`, or a range like `3:2..16:9`. An unknown shape is a 400. |
level | boolean | Also turn the frame level by its own lines, the crop pulled in as far as the turn needs. | |
padding | number |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/auto-crop \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"aspect":"text"}'
Responses
200— Cropped202— Still running400— Unknown aspect422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/crop
Step: crop
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
aspect | string | Shape to force it into — `9:16`, `16:9`, or a range like `3:2..16:9`. The rectangle is grown around its centre and shifted inside the frame, never clipped, so the delivered file really is the shape asked for. Omit to crop exactly what was given. | |
height | number | yes | |
width | number | yes | |
x | number | yes | The rectangle, 0.0–1.0 relative to the image. |
y | number | yes |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/crop \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"x":0,"y":0,"width":0,"height":0}'
Responses
200— Cropped202— Still running400— Unknown aspect422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/denoise
Step: denoise
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
fallback | boolean | Deliver the CAMERA's own JPEG rather than nothing when the denoiser will not play. The delivery is renamed (`{base}` becomes `<name>_org`) so a picture that skipped noise reduction cannot be mistaken for one that did not. | |
files | "rawOnly" | "all" | The files filter: rawOnly, all | |
profile | string | yes | Name of a configured denoise profile (the external NR application). |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/denoise \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profile":"text"}'
Responses
200— Denoised202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/develop
Step: develop
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
crop | boolean | Take the stored crop (and straighten) too. Defaults to true. | |
expose | boolean | Develop a picture with no develop of its own with Auto: exposure, lift, black point and balance read on its own scopes. Defaults to false. | |
preset | string | A develop preset for a picture with no develop of its own. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/develop \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"crop":true,"expose":true,"preset":"text"}'
Responses
200— Developed202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/export
Step: export
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/export \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Exported202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/fork
Step: fork
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
Body
| Field | Type | Required | Description |
|---|---|---|---|
count | number | How many branches. Default 2. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/fork \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"count":0}'
Responses
200— Branched400— No such handle, or it is busy
POST /api/pipeline/handles/{handle}/identify
Step: identify
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/identify \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Identified (possibly nobody)202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/reset
Step: reset
Same picture, same source, no crop and no resize — so one frame can be delivered more than once from the same material. It does NOT rewind past a denoise: a frame delivered without noise reduction looks perfectly fine on a desk and is wrong.
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/reset \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Reset202— Still running422— Nothing loaded to reset to
POST /api/pipeline/handles/{handle}/resize
Step: resize
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
Body
| Field | Type | Required | Description |
|---|---|---|---|
maxSide | number | yes | Target length of the long side in pixels. |
upscale | boolean | Enlarge when the image is smaller. This is what a fixed delivery size means: without it a tight crop is delivered below the target. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/resize \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"maxSide":0}'
Responses
200— Resized202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/use-jpeg
Step: use JPEG
After a denoise the current file is the DNG the denoiser wrote, and the JPEG inside it IS its result — full size, already demosaiced. Reading that is both faster and more correct than decoding the DNG again with our own decoder.
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/use-jpeg \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Loaded202— Still running422— Step failed; input handle still valid
POST /api/pipeline/handles/{handle}/use-raw
Step: use RAW
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Handle id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
curl -X POST http://127.0.0.1:9100/api/pipeline/handles/<handle>/use-raw \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Loaded202— Still running422— Step failed; input handle still valid
GET /api/pipeline/jobs/{id}
Job
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | string | Job id |
wait | query | number | Seconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately. |
retry | query | number | How many times to run the step before reporting it failed. Default 1. For steps that fail in ways that pass — an external denoiser busy with the batch before this one, or waiting behind a dialog. The attempts belong to the job: they run however long the caller waits, and `GET /api/pipeline/jobs/{id}` reports the step as running until the last one is over. Ignored everywhere but a step. |
retryPauseMs | query | number | Milliseconds between attempts. Default 5000. |
curl -X GET http://127.0.0.1:9100/api/pipeline/jobs/<id> \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Finished202— Still running404— No such job422— Step failed
POST /api/pipeline/sessions
Open session
Body
| Field | Type | Required | Description |
|---|---|---|---|
lease | string | ||
path | string | yes | A path. In an instance started with `--dir` it is in the instance's root: `/` is the root, and a path that leads out of it is refused (403). |
source | "embedded-jpeg" | "native-raw" | The decode source: embedded-jpeg, native-raw | |
watch | string | Watch id this file came from, with `lease`, so closing the session acknowledges the file instead of leaving it to be handed out again. | |
workDir | any |
curl -X POST http://127.0.0.1:9100/api/pipeline/sessions \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"path":"text"}'
Responses
200— Session opened400— File not found or bad source
DELETE /api/pipeline/sessions/{id}
Close session
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | string | Session id |
outcome | query | "delivered" | "abandoned" | "failed" | "discarded" | |
reason | query | string |
curl -X DELETE http://127.0.0.1:9100/api/pipeline/sessions/<id> \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
204— Session closed400— Unknown outcome404— No such session
POST /api/redo
Redo
curl -X POST http://127.0.0.1:9100/api/redo \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— The last undone step done again, as Edit → Redo400— Nothing to redo
GET /api/settings
Settings
curl -X GET http://127.0.0.1:9100/api/settings \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— App settings (secrets are keychain-backed and never included)
PATCH /api/settings
Change settings
curl -X PATCH http://127.0.0.1:9100/api/settings \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Deep-merge the given JSON object into the app settings; returns the result
POST /api/settings/api-token
New API token
curl -X POST http://127.0.0.1:9100/api/settings/api-token \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— A new API token, as Regenerate makes; the server takes it once this answer is out403— api_allow_credential_writes is off409— CULLING_API_TOKEN in the environment decides the token
GET /api/settings/bundle
Export settings
curl -X GET http://127.0.0.1:9100/api/settings/bundle \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Everything Settings → Export Settings… writes: settings, key bindings, label names, IPTC templates, import presets, export profiles, camera destinations
PUT /api/settings/bundle
Import settings
curl -X PUT http://127.0.0.1:9100/api/settings/bundle \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Every setup in the bundle replaced the saved one, as Import Settings… does400— Not a settings bundle
GET /api/transcription/key
Transcription key
curl -X GET http://127.0.0.1:9100/api/transcription/key \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Whether the transcription service has its key
PUT /api/transcription/key
Save transcription key
Body
| Field | Type | Required | Description |
|---|---|---|---|
key | string | yes |
curl -X PUT http://127.0.0.1:9100/api/transcription/key \
-H "Authorization: Bearer $CULLING_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key":"text"}'
Responses
200— Stored in the keychain, as Save Key does400— The key is empty403— api_allow_credential_writes is off
GET /api/undo
Undo and redo
curl -X GET http://127.0.0.1:9100/api/undo \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— What Undo and Redo would do now
POST /api/undo
Undo
curl -X POST http://127.0.0.1:9100/api/undo \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— The last step taken back, as Edit → Undo; pictures changed since by something else are left and said400— Nothing to undo