API
FLOGVIT.culling exposes a local REST API that gives you full control over the application. Automate your entire workflow, build custom integrations, or connect to external tools.
A TypeScript SDK is available as an npm package. You can also call the API from any language that supports HTTP requests.
Getting Started
The API runs on localhost when the app is open. No authentication is required — it's your machine, your data.
When the app is running, interactive API documentation is available at:
- http://localhost:9100/docs — Swagger UI
- http://localhost:9100/redoc — ReDoc
GET http://localhost:9100/api/v1/status
TypeScript SDK
npm install @flogvit/culling-sdk
import { CullingClient } from '@flogvit/culling-sdk';
const client = new CullingClient();
// Get current image info
const image = await client.currentImage();
console.log(image.filename, image.rating);
// Rate the current image
await client.setRating(4);
// Move to next
await client.next();
Images
List images
GET /api/v1/images
Returns all images in the current folder. Supports query parameters for filtering:
rating— Minimum star rating (1–5)flag— Filter by flag (pick,reject,unflagged)color— Filter by color labeltype— Filter by file type (raw,jpeg,video)
Get current image
GET /api/v1/images/current
Returns full metadata for the currently selected image including EXIF, rating, flag, color label, and file path.
Set rating
PUT /api/v1/images/{id}/rating
{ "rating": 4 }
Set star rating (0–5). Use 0 to clear.
Set flag
PUT /api/v1/images/{id}/flag
{ "flag": "pick" }
Values: pick, reject, none.
Set color label
PUT /api/v1/images/{id}/color
{ "color": "red" }
Values: red, yellow, green, blue, purple, orange, pink, gray, none.
Auto-crop
POST /api/v1/images/{id}/autocrop
{ "subject": "person" }
Automatically crop around detected subjects. Currently supports person — more subjects coming soon.
Navigation
Go to next/previous
POST /api/v1/navigate/next
POST /api/v1/navigate/previous
Go to specific image
POST /api/v1/navigate/goto
{ "index": 42 }
Select images
POST /api/v1/navigate/select
{ "indices": [0, 3, 7] }
Metadata
Get EXIF
GET /api/v1/images/{id}/exif
Returns camera, lens, aperture, shutter speed, ISO, focal length, GPS coordinates, and more.
Get/set IPTC
GET /api/v1/images/{id}/iptc
PUT /api/v1/images/{id}/iptc
{
"headline": "Concert at Rockefeller",
"caption": "Lead singer during encore",
"keywords": ["concert", "music", "live"],
"city": "Oslo",
"country": "Norway"
}
Upload
Upload to FTP
POST /api/v1/upload
{
"image_id": "abc123",
"profile": "VG"
}
Upload an image to a named FTP profile. Runs in the background.
Upload status
GET /api/v1/upload/status
Returns status of all active and recent uploads.
Denoise
Send to denoise
POST /api/v1/denoise
{
"image_id": "abc123",
"tool": "topaz"
}
Send an image to an external denoise tool. The result is automatically imported back when processing completes.
Import
Start import
POST /api/v1/import
{
"source": "/Volumes/SD_CARD",
"destination": "/Photos/2026/event",
"profile": "default"
}
Start an import from a source path using a named import profile.
Import status
GET /api/v1/import/status
Returns progress, file count, speed, and ETA for active imports.
Application
Get app status
GET /api/v1/status
Returns application state: current folder, image count, filter state, view mode.
Open folder
POST /api/v1/folder/open
{ "path": "/Photos/2026/wedding" }
Set view mode
POST /api/v1/view
{ "mode": "grid" }
Values: grid, single, compare, nup.
Set filter
POST /api/v1/filter
{
"min_rating": 3,
"flag": "pick",
"color": "red"
}
All fields are optional. Omit a field to not filter on it. Pass an empty object to clear all filters.
Webhooks / Events
The API supports Server-Sent Events for real-time notifications:
GET /api/v1/events
Events are emitted when:
- An image is selected, rated, flagged, or labeled
- Import starts, progresses, or completes
- Upload starts or completes
- Denoise completes
This lets you build reactive integrations that respond to user actions in real time.