Metadata — API-viite
IPTC and its templates, keywords, people, places and GPS, capture time, captions, race numbers on a picture, and what Lightroom wrote.
API-viite on englanniksi: se luodaan sovelluksen omasta OpenAPI-dokumentista.
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
| Field | Type | Required | Description |
|---|---|---|---|
paths | string[] | 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 take400— 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
| Field | Type | Required | Description |
|---|---|---|---|
dirs | string[] | Folders holding a `teams.json`; empty: every Identify step's. | |
loaded | string[] | The start lists that loaded, by event name (in answers only). | |
numbersOnly | boolean | Write 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 folder400— 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
| Field | Type | Required | Description |
|---|---|---|---|
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 use409— 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 dataset400— It is not downloaded, or busy
POST /api/geocode/reverse
Reverse geocode
Body
| Field | Type | Required | Description |
|---|---|---|---|
scope | "current" | "selected" | "visible" | The scope: current, selected, visible. Default selected: the current image when nothing is selected. |
curl -X POST http://127.0.0.1:9100/api/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
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | number | Image 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 image404— Image not found
PATCH /api/images/{id}/iptc
Edit IPTC of a picture
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | number | Image index |
Body
| Field | Type | Required | Description |
|---|---|---|---|
caption | string | Caption | |
caption_mode | "replace" | "prefix" | "append" | The caption mode: replace, prefix, append. Default replace. | |
city | string | City | |
copyright_notice | string | Copyright Notice | |
copyright_url | string | Copyright URL | |
country | string | Country | |
country_code | string | Country Code | |
creator | string | Creator | |
creator_title | string | Creator Title | |
credit | string | Credit | |
event | string | Event | |
headline | string | Headline | |
instructions | string | Instructions | |
keywords | any | Keywords: the whole list, or one text split on commas | |
keywords_add | string[] | Add keywords (after any `keywords` list) | |
keywords_remove | string[] | Remove keywords (after any `keywords` list) | |
location | string | Location | |
marked | boolean | The copyright flag (`xmpRights:Marked`) | |
person_in_image | any | People: the whole list, or one text split on commas | |
source | string | Source | |
state | string | State/Province | |
usage_terms | string | Usage Terms | |
user_comment | string | User 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 updated404— Image not found
GET /api/images/{id}/metadata
Metadata of a picture
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | number | Image 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 picture404— 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
| Field | Type | Required | Description |
|---|---|---|---|
index | number | The 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 does400— 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 image404— No images loaded
PATCH /api/images/current/iptc
Edit IPTC
Body
| Field | Type | Required | Description |
|---|---|---|---|
caption | string | Caption | |
caption_mode | "replace" | "prefix" | "append" | The caption mode: replace, prefix, append. Default replace. | |
city | string | City | |
copyright_notice | string | Copyright Notice | |
copyright_url | string | Copyright URL | |
country | string | Country | |
country_code | string | Country Code | |
creator | string | Creator | |
creator_title | string | Creator Title | |
credit | string | Credit | |
event | string | Event | |
headline | string | Headline | |
instructions | string | Instructions | |
keywords | any | Keywords: the whole list, or one text split on commas | |
keywords_add | string[] | Add keywords (after any `keywords` list) | |
keywords_remove | string[] | Remove keywords (after any `keywords` list) | |
location | string | Location | |
marked | boolean | The copyright flag (`xmpRights:Marked`) | |
person_in_image | any | People: the whole list, or one text split on commas | |
source | string | Source | |
state | string | State/Province | |
usage_terms | string | Usage Terms | |
user_comment | string | User 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 updated404— 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 picture400— 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 metadata400— 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 image400— The current image has no IPTC metadata, or no images loaded
POST /api/iptc/find-replace
Find & replace
Body
| Field | Type | Required | Description |
|---|---|---|---|
apply_to | "current" | "selected" | "visible" | The scope: current, selected, visible. Default selected: the current image when nothing is selected. | |
find | string | yes | |
replace | string | yes | |
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_regex | boolean |
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 executed400— 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 shown400— 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 images400— 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— Saved400— No name, an unknown field or a value of the wrong type
DELETE /api/iptc/templates/{name}
Delete IPTC template
| Parameter | In | Type | Description |
|---|---|---|---|
name | path | string | The preset's name |
curl -X DELETE http://127.0.0.1:9100/api/iptc/templates/<name> \
-H "Authorization: Bearer $CULLING_API_TOKEN"
Responses
200— Deleted404— 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
| Field | Type | Required | Description |
|---|---|---|---|
path | string | yes |
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 list400— 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
| Field | Type | Required | Description |
|---|---|---|---|
text | string | yes | A 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 had400— Not a keyword list: what is wrong, by line
POST /api/library/keywords/merge
Merge keyword
Body
| Field | Type | Required | Description |
|---|---|---|---|
into | string | yes | The keyword it becomes part of, by its path. |
path | string | yes |
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 other400— A change is still being written
POST /api/library/keywords/move
Move keyword
Body
| Field | Type | Required | Description |
|---|---|---|---|
parent | string | The keyword to put it under; none for the top. | |
path | string | yes |
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 list400— A change is still being written
PUT /api/library/keywords/paint
Painting keyword
Body
| Field | Type | Required | Description |
|---|---|---|---|
path | string | The 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 it400— No painting keyword, or no picture
POST /api/library/keywords/rename
Rename keyword
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | Its new name, in the same place. |
path | string | yes | The 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 list400— 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 step400— Nothing to undo, a later step comes first, or the change is still being written
PUT /api/library/keywords/vocabulary
Keyword synonyms
Body
| Field | Type | Required | Description |
|---|---|---|---|
export | boolean | ||
path | string | yes | |
synonyms | string[] |
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
| Parameter | In | Type | Description |
|---|---|---|---|
south | query | number | |
west | query | number | |
north | query | number | |
east | query | number | |
zoom | query | number | The map's zoom, 0 (the world) to 19. |
cell | query | number | A 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 position400— 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
| Field | Type | Required | Description |
|---|---|---|---|
path | string | Only 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 none400— 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
| Field | Type | Required | Description |
|---|---|---|---|
catalog | 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). |
under | any |
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 done400— No catalog there, or an import is already going
POST /api/map/place-by-neighbours
Place by neighbours
Body
| Field | Type | Required | Description |
|---|---|---|---|
apply | boolean | Give them the positions; without, only say what they would be. | |
minutes | number | How 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
| Field | Type | Required | Description |
|---|---|---|---|
indices | number[] | Rows to set; left out, the selected pictures, else the one on screen. | |
latitude | number | yes | |
longitude | number | yes |
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 now400— 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
| Field | Type | Required | Description |
|---|---|---|---|
direction | "latin1_to_utf8" | "utf8_to_latin1" | The direction: latin1_to_utf8, utf8_to_latin1 | |
dry_run | boolean | When 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
| Field | Type | Required | Description |
|---|---|---|---|
auto_geocode | boolean | Also reverse-geocode the matched coordinates | |
offset | string | Overrides 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_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). |
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
| Field | Type | Required | Description |
|---|---|---|---|
scope | "current" | "selected" | "visible" | The scope: current, selected, visible. Default selected: the current image when nothing is selected. |
curl -X POST http://127.0.0.1:9100/api/metadata/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
| Field | Type | Required | Description |
|---|---|---|---|
rules | object[] | 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
| Field | Type | Required | Description |
|---|---|---|---|
exif | boolean | ||
gps | boolean | ||
iptc | boolean | ||
output_dir | any | ||
scope | "current" | "selected" | "visible" | The scope: current, selected, visible. Default selected: the current image when nothing is selected. | |
thumbnails | boolean | ||
xmp | boolean |
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
| Field | Type | Required | Description |
|---|---|---|---|
offset | string | yes | How 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… does400— Not a UTC offset, or no images in scope
PUT /api/numbers
Set numbers
Body
| Field | Type | Required | Description |
|---|---|---|---|
entry | string | Or numbers and names as a person types them ("12, Ida Hauge"), looked up in the folder's start lists. | |
numbers | string[] | 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 logged400— 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
| Field | Type | Required | Description |
|---|---|---|---|
photographers | object[] | 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