Public API

The public API lets your scripts, integrations, and backend services talk to your archive directly — upload images and videos, check their processing state, and search the library with the same engine the app uses. All endpoints live under /api/v1 and speak JSON.

Base URL and format

https://your-host/api/v1

Requests and responses are JSON (uploads use multipart/form-data). Every request is authenticated with an API key sent as a Bearer token — see Authentication. Session cookies are never accepted on API routes.

Quick start

1. Create an API key. In the app, open Settings → API keys, create a key with the upload and search scopes, and copy the secret — it starts with na_ and is shown only once.

2. Upload a file.

curl -X POST https://your-host/api/v1/files \
  -H "Authorization: Bearer na_your_key" \
  -F "file=@sunset.jpg"

The response is 202 Accepted — processing happens in the background:

{ "id": "0198c9a0-…", "version_id": "0198c9a0-…", "status": "processing" }

3. Poll until it's ready.

curl https://your-host/api/v1/files/0198c9a0-… \
  -H "Authorization: Bearer na_your_key"

Once status is ready, the file has dimensions, a thumbnail URL, and is findable in search.

4. Search for it.

curl -X POST https://your-host/api/v1/search \
  -H "Authorization: Bearer na_your_key" \
  -H "Content-Type: application/json" \
  -d '{"q": "sunset at the beach"}'

What's in this section

  • Authentication — API keys, scopes, and rate limits.
  • Uploading files — direct uploads up to 100 MB and status polling.
  • Searching — queries, the full filter surface, and pagination.
  • Large file uploads — resumable tus uploads for files over 100 MB.
  • Errors — the uniform error format and every error code.

Not in v1

  • OAuth or per-user third-party tokens — keys are created by account members.
  • Original file downloads — responses include thumbnail URLs only.
  • Facet listings and find-similar endpoints.