Metadata — API-referanse

IPTC and its templates, keywords, people, places and GPS, capture time, captions, race numbers on a picture, and what Lightroom wrote.

API-referansen er på engelsk: han blir laga frå OpenAPI-dokumentet til appen.

IPTC and its templates, keywords, people, places and GPS, capture time, captions, race numbers on a picture, and what Lightroom wrote.

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

POST /api/captions/suggest

Suggest caption and keywords

Body

FieldTypeRequiredDescription
pathsstring[]Pictures in the open folder; left out, the selected pictures, else the one on screen.
curl -X POST http://127.0.0.1:9100/api/captions/suggest \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"paths":["text"]}'

Responses

  • 200 — A caption and keywords suggested per picture, or why there is none. Nothing is written: the IPTC editor shows them for the picture on screen, and PATCH /api/images/current/iptc saves the ones you take
  • 400 — No picture, or a path not in the open folder

POST /api/capture-notes/refresh

Refresh capture notes

curl -X POST http://127.0.0.1:9100/api/capture-notes/refresh \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Fetching newer notes from the server, as Refresh does

GET /api/folder/start-lists

Start lists

curl -X GET http://127.0.0.1:9100/api/folder/start-lists \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The start lists the open folder's numbers are looked up in

PUT /api/folder/start-lists

Set start lists

Body

FieldTypeRequiredDescription
dirsstring[]Folders holding a `teams.json`; empty: every Identify step's.
loadedstring[]The start lists that loaded, by event name (in answers only).
numbersOnlybooleanWrite numbers, never names.
curl -X PUT http://127.0.0.1:9100/api/folder/start-lists \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dirs":["text"],"loaded":["text"],"numbersOnly":true}'

Responses

  • 200 — Chosen and loaded; remembered with the folder
  • 400 — No folder is open

GET /api/geocode/dataset

Geocoding data

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

Responses

  • 200 — The geocoding dataset: downloaded, loaded, or on its way

POST /api/geocode/dataset/download

Download geocoding data

Body

FieldTypeRequiredDescription
dataset"cities500" | "all_countries"The geocoding dataset: cities500, all_countries
curl -X POST http://127.0.0.1:9100/api/geocode/dataset/download \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dataset":"cities500"}'

Responses

  • 200 — Downloading from GeoNames; it becomes the dataset in use
  • 409 — It is downloading or loading already

POST /api/geocode/dataset/load

Load geocoding data

curl -X POST http://127.0.0.1:9100/api/geocode/dataset/load \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Loading the downloaded dataset
  • 400 — It is not downloaded, or busy

POST /api/geocode/reverse

Reverse geocode

Body

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

Responses

  • 200 — Reverse-geocode images with GPS into IPTC location fields

GET /api/images/{id}/iptc

IPTC of a picture

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

Responses

  • 200 — IPTC metadata for image
  • 404 — Image not found

PATCH /api/images/{id}/iptc

Edit IPTC of a picture

ParameterInTypeDescription
idpathnumberImage index

Body

FieldTypeRequiredDescription
captionstringCaption
caption_mode"replace" | "prefix" | "append"The caption mode: replace, prefix, append. Default replace.
citystringCity
copyright_noticestringCopyright Notice
copyright_urlstringCopyright URL
countrystringCountry
country_codestringCountry Code
creatorstringCreator
creator_titlestringCreator Title
creditstringCredit
eventstringEvent
headlinestringHeadline
instructionsstringInstructions
keywordsanyKeywords: the whole list, or one text split on commas
keywords_addstring[]Add keywords (after any `keywords` list)
keywords_removestring[]Remove keywords (after any `keywords` list)
locationstringLocation
markedbooleanThe copyright flag (`xmpRights:Marked`)
person_in_imageanyPeople: the whole list, or one text split on commas
sourcestringSource
statestringState/Province
usage_termsstringUsage Terms
user_commentstringUser Comment
curl -X PATCH http://127.0.0.1:9100/api/images/<id>/iptc \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"caption":"text","caption_mode":"replace","city":"text"}'

Responses

  • 200 — IPTC metadata updated
  • 404 — Image not found

GET /api/images/{id}/metadata

Metadata of a picture

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

Responses

  • 200 — What the info sidebar shows about the picture
  • 404 — No such picture

GET /api/images/current/capture-notes

Capture notes

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

Responses

  • 200 — The day's capture notes for the current picture, as the person-tagging overlay lists them

POST /api/images/current/capture-notes/apply

Tag people

Body

FieldTypeRequiredDescription
indexnumberThe note's `index`; left out, the suggested one.
curl -X POST http://127.0.0.1:9100/api/images/current/capture-notes/apply \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"index":0}'

Responses

  • 200 — The note's people written as keywords and PersonInImage, as Apply does
  • 400 — No such note, or no note for the picture

GET /api/images/current/iptc

IPTC

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

Responses

  • 200 — IPTC metadata for current image
  • 404 — No images loaded

PATCH /api/images/current/iptc

Edit IPTC

Body

FieldTypeRequiredDescription
captionstringCaption
caption_mode"replace" | "prefix" | "append"The caption mode: replace, prefix, append. Default replace.
citystringCity
copyright_noticestringCopyright Notice
copyright_urlstringCopyright URL
countrystringCountry
country_codestringCountry Code
creatorstringCreator
creator_titlestringCreator Title
creditstringCredit
eventstringEvent
headlinestringHeadline
instructionsstringInstructions
keywordsanyKeywords: the whole list, or one text split on commas
keywords_addstring[]Add keywords (after any `keywords` list)
keywords_removestring[]Remove keywords (after any `keywords` list)
locationstringLocation
markedbooleanThe copyright flag (`xmpRights:Marked`)
person_in_imageanyPeople: the whole list, or one text split on commas
sourcestringSource
statestringState/Province
usage_termsstringUsage Terms
user_commentstringUser Comment
curl -X PATCH http://127.0.0.1:9100/api/images/current/iptc \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"caption":"text","caption_mode":"replace","city":"text"}'

Responses

  • 200 — IPTC metadata updated
  • 404 — No images loaded

GET /api/images/current/metadata

Metadata

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

Responses

  • 200 — What the info sidebar shows about the current picture
  • 400 — No images loaded

GET /api/images/current/numbers

Numbers in the picture

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

Responses

  • 200 — The numbers on the picture on screen, and who wears each

POST /api/images/current/transcribe

Transcribe audio note

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

Responses

  • 200 — Transcribing the audio note, as the sidebar's Transcribe does; the text comes as `transcribed` and in the metadata
  • 400 — No audio note, or no transcription service set up

POST /api/iptc/copy

Copy IPTC

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

Responses

  • 200 — IPTC metadata copied from current image
  • 400 — The current image has no IPTC metadata, or no images loaded

POST /api/iptc/find-replace

Find & replace

Body

FieldTypeRequiredDescription
apply_to"current" | "selected" | "visible"The scope: current, selected, visible. Default selected: the current image when nothing is selected.
findstringyes
replacestringyes
scope"all_fields" | "creator" | "creator_title" | "credit" | "source" | "copyright_notice" | "usage_terms" | "copyright_url" | "caption" | "headline" | "keywords" | "person_in_image" | "event" | "user_comment" | "instructions" | "city" | "state" | "country" | "country_code" | "location"The find/replace scope: all_fields, creator, creator_title, credit, source, copyright_notice, usage_terms, copyright_url, caption, headline, keywords, person_in_image, event, user_comment, instructions, city, state, country, country_code, location. Default all_fields: every IPTC field, each keyword and person on its own.
use_regexboolean
curl -X POST http://127.0.0.1:9100/api/iptc/find-replace \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"find":"text","replace":"text"}'

Responses

  • 200 — Find & replace executed
  • 400 — Invalid parameters

GET /api/iptc/keyword-tree

Keyword tree

curl -X GET http://127.0.0.1:9100/api/iptc/keyword-tree \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The keyword tree the Keywords panel shows: `{roots: [{name, children}]}`

PUT /api/iptc/keyword-tree

Set keyword tree

curl -X PUT http://127.0.0.1:9100/api/iptc/keyword-tree \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The tree is saved and shown
  • 400 — Not a keyword tree

GET /api/iptc/keywords

Known keywords

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

Responses

  • 200 — Known keywords from current folder

POST /api/iptc/paste

Paste IPTC

curl -X POST http://127.0.0.1:9100/api/iptc/paste \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — IPTC metadata pasted to target images
  • 400 — Nothing copied yet, or no images loaded

GET /api/iptc/templates

IPTC templates

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

Responses

  • 200 — Every saved IPTC template

POST /api/iptc/templates

Save IPTC template

curl -X POST http://127.0.0.1:9100/api/iptc/templates \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Saved
  • 400 — No name, an unknown field or a value of the wrong type

DELETE /api/iptc/templates/{name}

Delete IPTC template

ParameterInTypeDescription
namepathstringThe preset's name
curl -X DELETE http://127.0.0.1:9100/api/iptc/templates/<name> \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — Deleted
  • 404 — None by that name

GET /api/library/keywords

Keyword list

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

Responses

  • 200 — Every keyword the pictures have and the keyword list's, as a tree with how many pictures have each; the change being written, the pictures waiting for a disk, Undo, and the painting keyword

POST /api/library/keywords/delete

Delete keyword

Body

FieldTypeRequiredDescription
pathstringyes
curl -X POST http://127.0.0.1:9100/api/library/keywords/delete \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"text"}'

Responses

  • 200 — Taken off every picture that has it, with what is under it, and out of the list
  • 400 — A change is still being written

GET /api/library/keywords/lightroom

Export keyword list

curl -X GET http://127.0.0.1:9100/api/library/keywords/lightroom \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The keyword list in Lightroom's text format (Metadata → Import Keywords reads it)

POST /api/library/keywords/lightroom

Import keyword list

Body

FieldTypeRequiredDescription
textstringyesA keyword a line, a tab deeper per level, `{synonym}`, `[not exported]`.
curl -X POST http://127.0.0.1:9100/api/library/keywords/lightroom \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text":"text"}'

Responses

  • 200 — The keywords, synonyms and export settings added to the list; a keyword there already keeps what it had
  • 400 — Not a keyword list: what is wrong, by line

POST /api/library/keywords/merge

Merge keyword

Body

FieldTypeRequiredDescription
intostringyesThe keyword it becomes part of, by its path.
pathstringyes
curl -X POST http://127.0.0.1:9100/api/library/keywords/merge \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"text","into":"text"}'

Responses

  • 200 — Every picture with it has the other instead; what was under it is under the other
  • 400 — A change is still being written

POST /api/library/keywords/move

Move keyword

Body

FieldTypeRequiredDescription
parentstringThe keyword to put it under; none for the top.
pathstringyes
curl -X POST http://127.0.0.1:9100/api/library/keywords/move \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"text"}'

Responses

  • 200 — Under another keyword, or at the top, in every picture and in the list
  • 400 — A change is still being written

PUT /api/library/keywords/paint

Painting keyword

Body

FieldTypeRequiredDescription
pathstringThe keyword ⇧K paints with; none for none.
curl -X PUT http://127.0.0.1:9100/api/library/keywords/paint \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"text"}'

Responses

  • 200 — The keyword Metadata → Paint Keyword puts on pictures

POST /api/library/keywords/paint/toggle

Paint keyword

curl -X POST http://127.0.0.1:9100/api/library/keywords/paint/toggle \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The painting keyword on the selected pictures, or the one on screen — or off them, when every one has it
  • 400 — No painting keyword, or no picture

POST /api/library/keywords/rename

Rename keyword

Body

FieldTypeRequiredDescription
namestringyesIts new name, in the same place.
pathstringyesThe keyword, by its path (`Places|Stavanegr`).
curl -X POST http://127.0.0.1:9100/api/library/keywords/rename \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"text","name":"text"}'

Responses

  • 200 — Being written in every picture that has it, and in the keyword list
  • 400 — No name, or a change is still being written

POST /api/library/keywords/undo

Undo keyword change

curl -X POST http://127.0.0.1:9100/api/library/keywords/undo \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The keyword list and every picture's keywords as they were before the change, as Edit → Undo does when the change was the last step
  • 400 — Nothing to undo, a later step comes first, or the change is still being written

PUT /api/library/keywords/vocabulary

Keyword synonyms

Body

FieldTypeRequiredDescription
exportboolean
pathstringyes
synonymsstring[]
curl -X PUT http://127.0.0.1:9100/api/library/keywords/vocabulary \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"text"}'

Responses

  • 200 — The keyword's synonyms and whether it is exported, in the keyword list

GET /api/library/map

Library map

ParameterInTypeDescription
southquerynumber
westquerynumber
northquerynumber
eastquerynumber
zoomquerynumberThe map's zoom, 0 (the world) to 19.
cellquerynumberA cell's side in map pixels; 28 without.
curl -X GET http://127.0.0.1:9100/api/library/map \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — The library's pictures in the box, counted in cells of the map at the zoom, and how many have no position
  • 400 — Not a box or a zoom

GET /api/library/pending-writes

Changes waiting for a disk

curl -X GET http://127.0.0.1:9100/api/library/pending-writes \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — What was changed on pictures whose disk is not connected — marks, an IPTC field, a keyword renamed across the library — written to the files when the disk is back. The library has them already

GET /api/library/places

Places

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

Responses

  • 200 — Every place in the library as a tree with counts — what the files say, else where the positions are — and the place names being written

POST /api/library/places/write

Write place names

Body

FieldTypeRequiredDescription
pathstringOnly the pictures of this place (`Norway|Rogaland`); every place without.
curl -X POST http://127.0.0.1:9100/api/library/places/write \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"text"}'

Responses

  • 200 — The places found from positions being written into the files that name none
  • 400 — Place names are still being written

GET /api/lightroom/catalog-import

Lightroom catalog import

curl -X GET http://127.0.0.1:9100/api/lightroom/catalog-import \
  -H "Authorization: Bearer $CULLING_API_TOKEN"

Responses

  • 200 — How the Lightroom catalog import goes, with its report once done

POST /api/lightroom/catalog-import

Import Lightroom catalog

Body

FieldTypeRequiredDescription
catalogstringyesA 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).
underany
curl -X POST http://127.0.0.1:9100/api/lightroom/catalog-import \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"catalog":"text"}'

Responses

  • 200 — Started: each picture's Lightroom settings, marks, keywords and virtual copies go into its sidecar; GET says how far, and the report when it is done
  • 400 — No catalog there, or an import is already going

POST /api/map/place-by-neighbours

Place by neighbours

Body

FieldTypeRequiredDescription
applybooleanGive them the positions; without, only say what they would be.
minutesnumberHow far apart in time, in minutes; 10 without (`NEIGHBOUR_MINUTES`).
curl -X POST http://127.0.0.1:9100/api/map/place-by-neighbours \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apply":true,"minutes":0}'

Responses

  • 200 — The window's pictures without a position that a picture with one, by the same camera and close in time, places — given those positions with `apply`

POST /api/map/position

Set position

Body

FieldTypeRequiredDescription
indicesnumber[]Rows to set; left out, the selected pictures, else the one on screen.
latitudenumberyes
longitudenumberyes
curl -X POST http://127.0.0.1:9100/api/map/position \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"latitude":0,"longitude":0}'

Responses

  • 200 — The position is written to the pictures' sidecars; the pictures with a position now
  • 400 — A position off the globe, no picture, or an index not in the list

GET /api/map/positions

Positions

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

Responses

  • 200 — The pictures shown that have a position, as the Map panel pins them

POST /api/metadata/fix-encoding

Fix encoding

Body

FieldTypeRequiredDescription
direction"latin1_to_utf8" | "utf8_to_latin1"The direction: latin1_to_utf8, utf8_to_latin1
dry_runbooleanWhen true, return the detected issues without writing anything — the API equivalent of the dialog's reviewable list.
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/fix-encoding \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"direction":"latin1_to_utf8","dry_run":true,"scope":"current"}'

Responses

  • 200 — Scan for and fix mojibake in IPTC fields

POST /api/metadata/gps-tracklog

Apply GPS track

Body

FieldTypeRequiredDescription
auto_geocodebooleanAlso reverse-geocode the matched coordinates
offsetstringOverrides the photos' UTC offset, as "+02:00", "-05:30" or "+0200". Omitted: each photo's own — the camera's OffsetTimeOriginal, else the app machine's time zone on the capture date.
scope"current" | "selected" | "visible"The scope: current, selected, visible. Default selected: the current image when nothing is selected.
tracklog_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).
curl -X POST http://127.0.0.1:9100/api/metadata/gps-tracklog \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tracklog_path":"text"}'

Responses

  • 200 — Match a GPX tracklog against capture times and write GPS

POST /api/metadata/read-from-file

Read metadata from file

Body

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

Responses

  • 200 — Read the pictures' sidecars again, as Lightroom's Read Metadata from File: taken whether or not they changed, and what changed in the file wins — Lightroom's settings when they changed outside photosuite, else the file's own develop. Applied as the reads land; each is a develop_changed event

POST /api/metadata/remap

Remap fields

Body

FieldTypeRequiredDescription
rulesobject[]yes
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/remap \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"rules":[{"action":"copy","conflict":"overwrite","source":"creator","target":"creator"}]}'

Responses

  • 200 — Copy/move/swap values between IPTC fields

POST /api/metadata/strip

Strip metadata

Body

FieldTypeRequiredDescription
exifboolean
gpsboolean
iptcboolean
output_dirany
scope"current" | "selected" | "visible"The scope: current, selected, visible. Default selected: the current image when nothing is selected.
thumbnailsboolean
xmpboolean
curl -X POST http://127.0.0.1:9100/api/metadata/strip \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"exif":true,"gps":true,"iptc":true}'

Responses

  • 200 — Strip metadata categories: copies to output_dir at once, or the originals in place after any JPEG edit already queued for them — `metadata_stripped` says when that is done

POST /api/metadata/timezone

Adjust timezone

Body

FieldTypeRequiredDescription
offsetstringyesHow far to shift the capture times, as "+05:30", "-03:00" or "+0200". The shift is added to what the camera recorded.
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/timezone \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"offset":"text"}'

Responses

  • 200 — Capture times shifted, as Metadata → Adjust Timezone… does
  • 400 — Not a UTC offset, or no images in scope

PUT /api/numbers

Set numbers

Body

FieldTypeRequiredDescription
entrystringOr numbers and names as a person types them ("12, Ida Hauge"), looked up in the folder's start lists.
numbersstring[]Exactly these numbers; empty is nobody.
scope"current" | "selected" | "visible"The scope: current, selected, visible. Default selected: the current image when nothing is selected.
curl -X PUT http://127.0.0.1:9100/api/numbers \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"entry":"text","numbers":["text"],"scope":"current"}'

Responses

  • 200 — The pictures' numbers are set; people, keywords and caption follow from the start lists, and the correction is logged
  • 400 — No folder or start list, a name nobody or several wear, or neither numbers nor entry

GET /api/photographers

Photographers

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

Responses

  • 200 — Camera serial number → photographer, for crediting deliveries

PUT /api/photographers

Set photographers

Body

FieldTypeRequiredDescription
photographersobject[]yes
curl -X PUT http://127.0.0.1:9100/api/photographers \
  -H "Authorization: Bearer $CULLING_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"photographers":[{"credit":"text","name":"text","serial":"text"}]}'

Responses

  • 200 — The table as it is now

GET /api/review

Numbers to review

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

Responses

  • 200 — The open folder's pictures with a read Identify held for a person, and what each could be. PUT /api/numbers settles one
esc
    ↑↓ naviger↵ opne