Files
immish/docs/api-reference.md

8.7 KiB

API Reference

The mobile app communicates with the server through a REST API and WebSocket connection. This document covers all API endpoints used by the app.

API Service Structure

The API is organized into domain-specific sub-APIs:

API Purpose
authenticationApi Login, logout, session management
usersApi User profile and settings
assetsApi Asset CRUD operations
albumsApi Album management
searchApi Smart search and filters
partnersApi Partner sharing
sharedLinksApi External share links
activitiesApi Comments and likes
peopleApi Face recognition and people
memoriesApi Memory lane feature
trashApi Trash management
serverApi Server info and config
oauthApi OAuth authentication
downloadApi Asset downloads
syncApi Data synchronization

Authentication

Login

POST /auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "password123"
}

Response:
{
  "accessToken": "jwt-token",
  "userId": "user-uuid",
  "userEmail": "user@example.com",
  "name": "John Doe",
  "isAdmin": false,
  "profileImagePath": "/path/to/image"
}

Logout

POST /auth/logout
Authorization: Bearer {token}

Response: 204 No Content

Validate Token

POST /auth/validateToken
Authorization: Bearer {token}

Response:
{
  "authStatus": true
}

Change Password

POST /auth/change-password
Authorization: Bearer {token}
Content-Type: application/json

{
  "password": "current-password",
  "newPassword": "new-password"
}

OAuth

Get OAuth Config

GET /oauth/config

Response:
{
  "enabled": true,
  "autoRegister": true,
  "autoLaunch": false,
  "buttonText": "Login with SSO"
}

Start OAuth Flow

POST /oauth/authorize
Content-Type: application/json

{
  "redirectUri": "app://oauth-callback",
  "codeChallenge": "challenge-string",
  "codeChallengeMethod": "S256"
}

Response:
{
  "url": "https://oauth-provider.com/authorize?..."
}

Complete OAuth

POST /oauth/callback
Content-Type: application/json

{
  "url": "app://oauth-callback?code=auth-code",
  "codeVerifier": "verifier-string"
}

Response:
{
  "accessToken": "jwt-token",
  "userId": "user-uuid",
  ...
}

Assets

Get All Assets

GET /assets?updatedAfter={timestamp}&updatedBefore={timestamp}
Authorization: Bearer {token}

Response:
[
  {
    "id": "asset-uuid",
    "ownerId": "user-uuid",
    "checksum": "sha1-hash",
    "fileCreatedAt": "2024-01-15T10:30:00Z",
    "fileModifiedAt": "2024-01-15T10:30:00Z",
    "type": "IMAGE",
    "originalFileName": "IMG_1234.jpg",
    "isFavorite": false,
    "isArchived": false,
    "isTrashed": false,
    "thumbhash": "base64-thumbhash",
    "exifInfo": { ... }
  }
]

Upload Asset

POST /assets
Authorization: Bearer {token}
Content-Type: multipart/form-data

Form fields:
- assetData: File binary
- deviceAssetId: Device-specific ID
- deviceId: Device identifier
- fileCreatedAt: Original creation time
- fileModifiedAt: Original modification time
- duration: Video duration (if applicable)
- isFavorite: Boolean
- isArchived: Boolean
- isVisible: Boolean

Response:
{
  "id": "asset-uuid",
  "duplicate": false
}

Get Asset Info

GET /assets/{id}
Authorization: Bearer {token}

Response: Asset object

Update Asset

PUT /assets/{id}
Authorization: Bearer {token}
Content-Type: application/json

{
  "isFavorite": true,
  "isArchived": false,
  "description": "Updated description"
}

Delete Assets

DELETE /assets
Authorization: Bearer {token}
Content-Type: application/json

{
  "ids": ["asset-uuid-1", "asset-uuid-2"],
  "force": false
}

Get Asset Thumbnail

GET /assets/{id}/thumbnail?size={thumbnail|preview}
Authorization: Bearer {token}

Response: Image binary

Get Asset Original

GET /assets/{id}/original
Authorization: Bearer {token}

Response: Original file binary

Get Video Playback

GET /assets/{id}/video/playback
Authorization: Bearer {token}

Response: Video stream

Check Duplicates

POST /assets/bulk-upload-check
Authorization: Bearer {token}
Content-Type: application/json

{
  "assets": [
    {
      "id": "device-asset-id",
      "checksum": "sha1-hash"
    }
  ]
}

Response:
{
  "results": [
    {
      "id": "device-asset-id",
      "action": "accept|reject",
      "reason": "duplicate"
    }
  ]
}

Albums

Get All Albums

GET /albums?shared={true|false}
Authorization: Bearer {token}

Response:
[
  {
    "id": "album-uuid",
    "ownerId": "user-uuid",
    "albumName": "Vacation 2024",
    "createdAt": "2024-01-15T10:30:00Z",
    "assetCount": 50,
    "shared": true,
    "albumThumbnailAssetId": "asset-uuid"
  }
]

Create Album

POST /albums
Authorization: Bearer {token}
Content-Type: application/json

{
  "albumName": "New Album",
  "assetIds": ["asset-uuid-1", "asset-uuid-2"]
}

Response: Album object

Get Album Details

GET /albums/{id}
Authorization: Bearer {token}

Response: Album object with assets

Update Album

PATCH /albums/{id}
Authorization: Bearer {token}
Content-Type: application/json

{
  "albumName": "Updated Name",
  "activityEnabled": true
}

Delete Album

DELETE /albums/{id}
Authorization: Bearer {token}

Add Assets to Album

PUT /albums/{id}/assets
Authorization: Bearer {token}
Content-Type: application/json

{
  "ids": ["asset-uuid-1", "asset-uuid-2"]
}

Remove Assets from Album

DELETE /albums/{id}/assets
Authorization: Bearer {token}
Content-Type: application/json

{
  "ids": ["asset-uuid-1", "asset-uuid-2"]
}

Add Users to Album

PUT /albums/{id}/users
Authorization: Bearer {token}
Content-Type: application/json

{
  "sharedUserIds": ["user-uuid-1"],
  "albumUserRoles": [{"userId": "user-uuid-1", "role": "editor"}]
}
POST /search/smart
Authorization: Bearer {token}
Content-Type: application/json

{
  "query": "beach sunset",
  "page": 1,
  "size": 100,
  "type": "IMAGE"
}

Response:
{
  "assets": {
    "items": [...],
    "total": 150,
    "count": 100
  }
}
POST /search/metadata
Authorization: Bearer {token}
Content-Type: application/json

{
  "originalFileName": "IMG",
  "city": "New York",
  "make": "Apple",
  "takenAfter": "2024-01-01",
  "takenBefore": "2024-12-31"
}

Get Search Suggestions

GET /search/suggestions?query={text}&type={type}
Authorization: Bearer {token}

Response:
["suggestion1", "suggestion2", ...]

Partners

Get Partners

GET /partners?direction={shared-by|shared-with}
Authorization: Bearer {token}

Response:
[
  {
    "id": "user-uuid",
    "email": "partner@example.com",
    "name": "Partner Name",
    "inTimeline": true
  }
]

Create Partnership

POST /partners/{userId}
Authorization: Bearer {token}

Response: Partner object

Update Partnership

PUT /partners/{userId}
Authorization: Bearer {token}
Content-Type: application/json

{
  "inTimeline": true
}

Remove Partnership

DELETE /partners/{userId}
Authorization: Bearer {token}
POST /shared-links
Authorization: Bearer {token}
Content-Type: application/json

{
  "type": "ALBUM|INDIVIDUAL",
  "albumId": "album-uuid",
  "assetIds": ["asset-uuid"],
  "allowUpload": false,
  "allowDownload": true,
  "showMetadata": true,
  "password": "optional-password",
  "expiresAt": "2024-12-31T23:59:59Z"
}

Response:
{
  "id": "link-uuid",
  "key": "share-key",
  "url": "https://server/share/share-key"
}
GET /shared-links/me
Authorization: Bearer {token}

Response: Array of shared links
DELETE /shared-links/{id}
Authorization: Bearer {token}

Server

Get Server Info

GET /server/info
Authorization: Bearer {token}

Response:
{
  "version": "1.2.3",
  "diskAvailable": "50 GB",
  "diskSize": "100 GB",
  "diskUsagePercentage": 50
}

Get Server Features

GET /server/features
Authorization: Bearer {token}

Response:
{
  "clipEncode": true,
  "facialRecognition": true,
  "map": true,
  "trash": true,
  "oauth": true,
  "oauthAutoLaunch": false,
  "passwordLogin": true
}

Get Server Config

GET /server/config

Response:
{
  "loginPageMessage": "Welcome",
  "trashDays": 30,
  "isInitialized": true
}

Ping Server

GET /server/ping

Response:
{
  "res": "pong"
}

Error Responses

All endpoints may return error responses:

{
  "error": "Error Type",
  "statusCode": 400,
  "message": "Detailed error message"
}

Common status codes:

  • 400: Bad Request
  • 401: Unauthorized
  • 403: Forbidden
  • 404: Not Found
  • 500: Internal Server Error

Previous: Data Models | Next: Local Storage