App — API-Referenz

The app itself: settings, license, setup, about, the console, and running scripts.

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

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

FieldTypeRequiredDescription
fieldstringyes
resetbooleanPress it instead: back to neutral, zoom to fit, the first picture.
stepsnumberTicks 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 step
  • 400 — No such dial, or no picture

POST /api/actions/run

Run a menu command

Body

FieldTypeRequiredDescription
idstringyes
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 does
  • 400 — It did nothing, and why
  • 404 — 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

ParameterInTypeDescription
linesquerynumberHow 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 it
  • 400 — 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 it
  • 400 — 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 does
  • 400 — 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

FieldTypeRequiredDescription
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 far
  • 400 — Not a download

POST /api/feedback

Send feedback

Body

FieldTypeRequiredDescription
include_crash_logboolean
include_logboolean
kind"hdr" | "panorama"yesWhat to make of the frames.
messagestringyes
reply_tostringWhere 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.com
  • 400 — 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

FieldTypeRequiredDescription
concurrencynumberFiles 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.
connectionstringyesNamed connection profile to poll. Credentials stay in the keychain, so a caller never carries them.
deleteFromSourcebooleanDelete each file from the source once it is downloaded. The local copy then becomes the only one, which is why the queue keeps receipts.
orderedboolean
pollIntervalSecsnumber
remotePathstringRemote folder to watch.
replacebooleanStop 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.
workDirstringyesA 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 started
  • 400 — Unknown connection, a local folder that does not exist, or a concurrency of 0
  • 409 — A live watch is already using this work_dir, and `replace` was not asked for

GET /api/ingest/watch/{id}

Watch

ParameterInTypeDescription
idpathstringWatch 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 counts
  • 404 — No such watch

DELETE /api/ingest/watch/{id}

Stop watch

ParameterInTypeDescription
idpathstringWatch id
curl -X DELETE http://127.0.0.1:9100/api/ingest/watch/<id> \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 204 — Watch stopped
  • 404 — No such watch

GET /api/ingest/watch/{id}/next

Next frame of a watch

ParameterInTypeDescription
idpathstringWatch id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds 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 caller
  • 204 — Nothing waiting within the wait window
  • 404 — 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

ParameterInTypeDescription
actionpathstringThe key action, as GET /api/key-bindings names it

Body

FieldTypeRequiredDescription
combostringThe 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 now
  • 400 — No such action, or not a key combination
  • 409 — 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

FieldTypeRequiredDescription
license_keystringyes
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/license
  • 400 — No key
  • 409 — 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 activation
  • 400 — No activated licence on this machine
  • 409 — 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 revocation
  • 400 — No licence key on this machine
  • 409 — 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 there
  • 409 — 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 trial
  • 409 — Another licence request is under way

GET /api/pipeline/handles/{handle}

Handle

ParameterInTypeDescription
handlepathstringHandle id
curl -X GET http://127.0.0.1:9100/api/pipeline/handles/<handle> \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Handle info
  • 404 — No such handle, or a step is running on it

POST /api/pipeline/handles/{handle}/add-to-album

Step: add to album

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
albumstringyesThe 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 sidecar
  • 202 — Still running
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/approve

Step: approve

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
criteriastringyesWhat right looks like, in the photographer's words.
modelstringThe Claude model asked; the watcher's default when left out.
onFail"hold" | "mark" | "recrop"The on fail: hold, mark, recrop
timeoutSecsnumberHow 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 answer
  • 202 — Still running
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/auto

Step: auto

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
strengthnumberHow 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 — Exposed
  • 202 — Still running
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/auto-crop

Step: auto crop

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
aroundFocusbooleanCrop to the subject the camera focused on, with the air measured around swimmers, rather than the crop model's guess.
aspectstringyesShape: `16:9` or `16x9`, `3:2`, `9:16`, `square`, `Free`, or a range like `3:2..16:9`. An unknown shape is a 400.
levelbooleanAlso turn the frame level by its own lines, the crop pulled in as far as the turn needs.
paddingnumber
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 — Cropped
  • 202 — Still running
  • 400 — Unknown aspect
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/crop

Step: crop

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
aspectstringShape 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.
heightnumberyes
widthnumberyes
xnumberyesThe rectangle, 0.0–1.0 relative to the image.
ynumberyes
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 — Cropped
  • 202 — Still running
  • 400 — Unknown aspect
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/denoise

Step: denoise

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
fallbackbooleanDeliver 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
profilestringyesName 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 — Denoised
  • 202 — Still running
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/develop

Step: develop

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
cropbooleanTake the stored crop (and straighten) too. Defaults to true.
exposebooleanDevelop a picture with no develop of its own with Auto: exposure, lift, black point and balance read on its own scopes. Defaults to false.
presetstringA 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 — Developed
  • 202 — Still running
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/export

Step: export

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds 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 — Exported
  • 202 — Still running
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/fork

Step: fork

ParameterInTypeDescription
handlepathstringHandle id

Body

FieldTypeRequiredDescription
countnumberHow 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 — Branched
  • 400 — No such handle, or it is busy

POST /api/pipeline/handles/{handle}/identify

Step: identify

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds 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 running
  • 422 — 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.

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds 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 — Reset
  • 202 — Still running
  • 422 — Nothing loaded to reset to

POST /api/pipeline/handles/{handle}/resize

Step: resize

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds between attempts. Default 5000.

Body

FieldTypeRequiredDescription
maxSidenumberyesTarget length of the long side in pixels.
upscalebooleanEnlarge 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 — Resized
  • 202 — Still running
  • 422 — 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.

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds 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 — Loaded
  • 202 — Still running
  • 422 — Step failed; input handle still valid

POST /api/pipeline/handles/{handle}/use-raw

Step: use RAW

ParameterInTypeDescription
handlepathstringHandle id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds 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 — Loaded
  • 202 — Still running
  • 422 — Step failed; input handle still valid

GET /api/pipeline/jobs/{id}

Job

ParameterInTypeDescription
idpathstringJob id
waitquerynumberSeconds to wait for completion before returning `202` with a job id. Absent or `0` returns immediately.
retryquerynumberHow 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.
retryPauseMsquerynumberMilliseconds 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 — Finished
  • 202 — Still running
  • 404 — No such job
  • 422 — Step failed

POST /api/pipeline/sessions

Open session

Body

FieldTypeRequiredDescription
leasestring
pathstringyesA 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
watchstringWatch id this file came from, with `lease`, so closing the session acknowledges the file instead of leaving it to be handed out again.
workDirany
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 opened
  • 400 — File not found or bad source

DELETE /api/pipeline/sessions/{id}

Close session

ParameterInTypeDescription
idpathstringSession id
outcomequery"delivered" | "abandoned" | "failed" | "discarded"
reasonquerystring
curl -X DELETE http://127.0.0.1:9100/api/pipeline/sessions/<id> \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 204 — Session closed
  • 400 — Unknown outcome
  • 404 — 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 → Redo
  • 400 — 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 out
  • 403 — api_allow_credential_writes is off
  • 409 — 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… does
  • 400 — 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

FieldTypeRequiredDescription
keystringyes
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 does
  • 400 — The key is empty
  • 403 — 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 said
  • 400 — Nothing to undo
esc
    ↑↓ navigieren↵ öffnen