Download OpenAPI specification:
Self-hosted library tracking API. All protected endpoints require a Bearer JWT in the Authorization header.
Returns provider status, masked config, active flag, and config-field schema for each registered AI provider.
[- {
- "active": true,
- "config": {
- "property1": "string",
- "property2": "string"
}, - "config_fields": [
- {
- "help_text": "string",
- "key": "string",
- "label": "string",
- "options": [
- "string"
], - "placeholder": "string",
- "required": true,
- "type": "string"
}
], - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string"
}
]Exactly one AI provider is active at a time. Passing an empty name disables AI suggestions.
Provider name
| provider | string |
{- "provider": "string"
}Returns the deployment-wide data categories the AI may access. Combined restrictive-wins with each user's opt-in.
{- "favourites": true,
- "full_library": true,
- "ratings": true,
- "reading_history": true,
- "taste_profile": true
}Replaces the deployment-wide data-access policy. All fields must be provided; omitted fields default to false.
Permissions object
| favourites | boolean |
| full_library | boolean |
| ratings | boolean |
| reading_history | boolean |
| taste_profile | boolean |
{- "favourites": true,
- "full_library": true,
- "ratings": true,
- "reading_history": true,
- "taste_profile": true
}Updates the API key, model, base URL, or enabled flag for the named provider. Secrets are merged over existing config so omitted keys are preserved.
| provider required | string Provider name |
Provider configuration key-value pairs
{ }[- {
- "active": true,
- "config": {
- "property1": "string",
- "property2": "string"
}, - "config_fields": [
- {
- "help_text": "string",
- "key": "string",
- "label": "string",
- "options": [
- "string"
], - "placeholder": "string",
- "required": true,
- "type": "string"
}
], - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string"
}
]{- "enabled": true,
- "include_taste_profile": true,
- "interval_minutes": 0,
- "max_buy_per_user": 0,
- "max_read_next_per_user": 0,
- "max_tokens_backfill": 0,
- "max_tokens_initial": 0,
- "user_run_rate_limit_per_day": 0
}Job config
| enabled | boolean |
| include_taste_profile | boolean |
| interval_minutes | integer |
| max_buy_per_user | integer |
| max_read_next_per_user | integer |
| max_tokens_backfill | integer MaxTokensBackfill applies to each backfill retry prompt. Smaller than initial since backfill only asks for the remaining slots. |
| max_tokens_initial | integer MaxTokensInitial is the cap on output tokens for the first pass. Thinking models (qwen3, deepseek-r1, extended-thinking Claude) burn through many tokens reasoning before emitting anything — too low a cap leaves the response empty. |
| user_run_rate_limit_per_day | integer |
{- "enabled": true,
- "include_taste_profile": true,
- "interval_minutes": 0,
- "max_buy_per_user": 0,
- "max_read_next_per_user": 0,
- "max_tokens_backfill": 0,
- "max_tokens_initial": 0,
- "user_run_rate_limit_per_day": 0
}{- "enabled": true,
- "include_taste_profile": true,
- "interval_minutes": 0,
- "max_buy_per_user": 0,
- "max_read_next_per_user": 0,
- "max_tokens_backfill": 0,
- "max_tokens_initial": 0,
- "user_run_rate_limit_per_day": 0
}Returns the most recent suggestion runs with cost, status, and owning user. Used by the admin jobs page.
[- {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
]Returns the run metadata plus every pipeline event. Admin can view any user's run.
| id required | string Run ID |
{- "events": [
- {
- "content": [
- 0
], - "created_at": "string",
- "seq": 0,
- "type": "string"
}
], - "run": {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
}Marks a running run as cancelled; the worker checks status between stages and exits on the next check. Completed or already-cancelled runs return 404.
| id required | string Run ID |
{- "error": "string"
}Returns the status and configuration of all registered metadata providers.
[- {
- "capabilities": [
- "string"
], - "config": {
- "property1": "string",
- "property2": "string"
}, - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string",
- "requires_key": true
}
]Sets the ordered list of provider names used when merging results.
Ordered provider names
| order | Array of strings |
{- "order": [
- "string"
]
}Updates the API key or settings for the named provider.
| name required | string Provider name |
Provider configuration key-value pairs
{ }[- {
- "capabilities": [
- "string"
], - "config": {
- "property1": "string",
- "property2": "string"
}, - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string",
- "requires_key": true
}
]Returns a paginated list of all instance users. Instance admin only.
| page | integer Page number (default 1) |
| per_page | integer Items per page (default 20, max 100) |
{- "items": [
- { }
], - "page": 0,
- "per_page": 0,
- "total": 0
}Creates a new user account bypassing registration settings. Instance admin only.
Create user request
| display_name | string |
string | |
| password | string |
| username | string |
{- "display_name": "string",
- "email": "string",
- "password": "string",
- "username": "string"
}{- "created_at": "string",
- "display_name": "string",
- "email": "string",
- "id": "string",
- "is_active": true,
- "is_instance_admin": true,
- "last_login_at": "string",
- "username": "string"
}Partially updates a user's profile or admin/active status. Instance admin only.
| id required | string User UUID |
Fields to update
| display_name | string |
string | |
| is_active | boolean |
| is_instance_admin | boolean |
{- "display_name": "string",
- "email": "string",
- "is_active": true,
- "is_instance_admin": true
}{- "created_at": "string",
- "display_name": "string",
- "email": "string",
- "id": "string",
- "is_active": true,
- "is_instance_admin": true,
- "last_login_at": "string",
- "username": "string"
}Returns provider status, masked config, active flag, and config-field schema for each registered AI provider.
[- {
- "active": true,
- "config": {
- "property1": "string",
- "property2": "string"
}, - "config_fields": [
- {
- "help_text": "string",
- "key": "string",
- "label": "string",
- "options": [
- "string"
], - "placeholder": "string",
- "required": true,
- "type": "string"
}
], - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string"
}
]Exactly one AI provider is active at a time. Passing an empty name disables AI suggestions.
Provider name
| provider | string |
{- "provider": "string"
}Returns the deployment-wide data categories the AI may access. Combined restrictive-wins with each user's opt-in.
{- "favourites": true,
- "full_library": true,
- "ratings": true,
- "reading_history": true,
- "taste_profile": true
}Replaces the deployment-wide data-access policy. All fields must be provided; omitted fields default to false.
Permissions object
| favourites | boolean |
| full_library | boolean |
| ratings | boolean |
| reading_history | boolean |
| taste_profile | boolean |
{- "favourites": true,
- "full_library": true,
- "ratings": true,
- "reading_history": true,
- "taste_profile": true
}Updates the API key, model, base URL, or enabled flag for the named provider. Secrets are merged over existing config so omitted keys are preserved.
| provider required | string Provider name |
Provider configuration key-value pairs
{ }[- {
- "active": true,
- "config": {
- "property1": "string",
- "property2": "string"
}, - "config_fields": [
- {
- "help_text": "string",
- "key": "string",
- "label": "string",
- "options": [
- "string"
], - "placeholder": "string",
- "required": true,
- "type": "string"
}
], - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string"
}
]Sets whether the caller is opted in to AI features.
Opt-in flag
| opt_in | boolean |
{- "opt_in": true
}{- "opt_in": true
}Returns the current AI-generated recommendations for the caller. Filter by type (buy | read_next) and status.
| type | string Filter by type: buy | read_next |
| status | string Filter by status: new | dismissed | interested | added_to_library |
[- {
- "author": "string",
- "book_edition_id": "string",
- "book_id": "string",
- "cover_url": "string",
- "created_at": "string",
- "id": "string",
- "isbn": "string",
- "library_id": "string",
- "reasoning": "string",
- "status": "string",
- "title": "string",
- "type": "string"
}
]Returns the caller's most recent suggestion runs with cost and status. Newest first.
[- {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
]Returns the run metadata plus every pipeline event emitted during execution (prompt, AI responses, enrichment decisions, read_next matches, backfill passes).
| id required | string Run ID |
{- "events": [
- {
- "content": [
- 0
], - "created_at": "string",
- "seq": 0,
- "type": "string"
}
], - "run": {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
}Creates a persistent block scoped to the book, the author, or the series.
| id required | string Suggestion ID |
Block scope: book | author | series
| scope | string |
{- "scope": "string"
}{- "error": "string"
}Mark a suggestion as dismissed, interested, or added_to_library.
| id required | string Suggestion ID |
New status
| status | string |
{- "status": "string"
}{- "error": "string"
}Replaces the saved taste profile with the supplied JSON object.
Taste profile JSON object
{ }{ }{- "enabled": true,
- "include_taste_profile": true,
- "interval_minutes": 0,
- "max_buy_per_user": 0,
- "max_read_next_per_user": 0,
- "max_tokens_backfill": 0,
- "max_tokens_initial": 0,
- "user_run_rate_limit_per_day": 0
}Job config
| enabled | boolean |
| include_taste_profile | boolean |
| interval_minutes | integer |
| max_buy_per_user | integer |
| max_read_next_per_user | integer |
| max_tokens_backfill | integer MaxTokensBackfill applies to each backfill retry prompt. Smaller than initial since backfill only asks for the remaining slots. |
| max_tokens_initial | integer MaxTokensInitial is the cap on output tokens for the first pass. Thinking models (qwen3, deepseek-r1, extended-thinking Claude) burn through many tokens reasoning before emitting anything — too low a cap leaves the response empty. |
| user_run_rate_limit_per_day | integer |
{- "enabled": true,
- "include_taste_profile": true,
- "interval_minutes": 0,
- "max_buy_per_user": 0,
- "max_read_next_per_user": 0,
- "max_tokens_backfill": 0,
- "max_tokens_initial": 0,
- "user_run_rate_limit_per_day": 0
}{- "enabled": true,
- "include_taste_profile": true,
- "interval_minutes": 0,
- "max_buy_per_user": 0,
- "max_read_next_per_user": 0,
- "max_tokens_backfill": 0,
- "max_tokens_initial": 0,
- "user_run_rate_limit_per_day": 0
}Returns the most recent suggestion runs with cost, status, and owning user. Used by the admin jobs page.
[- {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
]Returns the run metadata plus every pipeline event. Admin can view any user's run.
| id required | string Run ID |
{- "events": [
- {
- "content": [
- 0
], - "created_at": "string",
- "seq": 0,
- "type": "string"
}
], - "run": {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
}Marks a running run as cancelled; the worker checks status between stages and exits on the next check. Completed or already-cancelled runs return 404.
| id required | string Run ID |
{- "error": "string"
}Returns the status and configuration of all registered metadata providers.
[- {
- "capabilities": [
- "string"
], - "config": {
- "property1": "string",
- "property2": "string"
}, - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string",
- "requires_key": true
}
]Sets the ordered list of provider names used when merging results.
Ordered provider names
| order | Array of strings |
{- "order": [
- "string"
]
}Updates the API key or settings for the named provider.
| name required | string Provider name |
Provider configuration key-value pairs
{ }[- {
- "capabilities": [
- "string"
], - "config": {
- "property1": "string",
- "property2": "string"
}, - "description": "string",
- "display_name": "string",
- "enabled": true,
- "has_api_key": true,
- "help_text": "string",
- "help_url": "string",
- "name": "string",
- "requires_key": true
}
]Authenticates with username/email and password; returns tokens.
Login request
| identifier | string |
| password | string |
{- "identifier": "string",
- "password": "string"
}{- "access_token": "string",
- "expires_in": 0,
- "refresh_token": "string",
- "user": {
- "display_name": "string",
- "email": "string",
- "id": "string",
- "is_instance_admin": true,
- "username": "string"
}
}Updates the display name and email of the authenticated user.
Update profile request
| display_name | string |
string |
{- "display_name": "string",
- "email": "string"
}{- "display_name": "string",
- "email": "string",
- "id": "string",
- "is_instance_admin": true,
- "username": "string"
}Changes the password for the authenticated user.
Change password request
| current_password | string |
| new_password | string |
{- "current_password": "string",
- "new_password": "string"
}{- "message": "string"
}Merges supplied key-value pairs into the stored preferences.
Arbitrary key-value pairs to merge
{ }{- "message": "string"
}Exchanges a valid refresh token for a new token pair.
Refresh request
| refresh_token | string |
{- "refresh_token": "string"
}{- "access_token": "string",
- "expires_in": 0,
- "refresh_token": "string",
- "user": {
- "display_name": "string",
- "email": "string",
- "id": "string",
- "is_instance_admin": true,
- "username": "string"
}
}Creates a new user account. Registration may be disabled by instance config.
Registration request
| display_name | string |
string | |
| password | string |
| username | string |
{- "display_name": "string",
- "email": "string",
- "password": "string",
- "username": "string"
}{- "access_token": "string",
- "expires_in": 0,
- "refresh_token": "string",
- "user": {
- "display_name": "string",
- "email": "string",
- "id": "string",
- "is_instance_admin": true,
- "username": "string"
}
}Full-text search across users; returns minimal profile data. Query must be at least 2 characters.
| q required | string Search query (min 2 chars) |
[- {
- "display_name": "string",
- "email": "string",
- "id": "string",
- "username": "string"
}
]Full-text search for contributors (authors, illustrators, etc.). Query must be at least 2 characters.
| q required | string Search query (min 2 chars) |
[- {
- "id": "string",
- "name": "string"
}
]Creates a new contributor record (author, illustrator, etc.).
Contributor name
| name | string |
{- "name": "string"
}{- "id": "string",
- "name": "string"
}Searches the library for a book with the given ISBN.
| library_id required | string Library UUID |
| isbn required | string ISBN-10 or ISBN-13 |
{- "added_by": "string",
- "contributors": [
- {
- "contributor_id": "string",
- "display_order": 0,
- "name": "string",
- "role": "string"
}
], - "cover_url": "string",
- "created_at": "string",
- "description": "string",
- "genres": [
- {
- "id": "string",
- "name": "string"
}
], - "id": "string",
- "language": "string",
- "library_id": "string",
- "media_type": "string",
- "media_type_id": "string",
- "publish_year": 0,
- "publisher": "string",
- "series": [
- {
- "position": 0,
- "series_id": "string",
- "series_name": "string"
}
], - "shelves": [
- {
- "id": "string",
- "name": "string"
}
], - "subtitle": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "title": "string",
- "updated_at": "string"
}Returns a paginated, filtered, sorted list of books in the library.
| library_id required | string Library UUID |
| q | string Search query or query-language expression |
| page | integer Page number |
| per_page | integer Items per page |
| sort | string Sort field |
| sort_dir | string Sort direction (asc/desc) |
| letter | string Filter by first letter |
| tag | string Filter by tag name |
| type_filter | string Filter by media type |
| regex | boolean Treat q as regex |
{- "items": [
- {
- "added_by": "string",
- "contributors": [
- {
- "contributor_id": "string",
- "display_order": 0,
- "name": "string",
- "role": "string"
}
], - "cover_url": "string",
- "created_at": "string",
- "description": "string",
- "genres": [
- {
- "id": "string",
- "name": "string"
}
], - "id": "string",
- "language": "string",
- "library_id": "string",
- "media_type": "string",
- "media_type_id": "string",
- "publish_year": 0,
- "publisher": "string",
- "series": [
- {
- "position": 0,
- "series_id": "string",
- "series_name": "string"
}
], - "shelves": [
- {
- "id": "string",
- "name": "string"
}
], - "subtitle": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "title": "string",
- "updated_at": "string"
}
], - "page": 0,
- "per_page": 0,
- "total": 0
}Adds a new book to the library.
| library_id required | string Library UUID |
Book details
| contributors | Array of objects |
| description | string |
| edition | object |
| genre_ids | Array of strings |
| media_type_id | string |
| subtitle | string |
| tag_ids | Array of strings |
| title | string |
{- "contributors": [
- { }
], - "description": "string",
- "edition": { },
- "genre_ids": [
- "string"
], - "media_type_id": "string",
- "subtitle": "string",
- "tag_ids": [
- "string"
], - "title": "string"
}{- "added_by": "string",
- "contributors": [
- {
- "contributor_id": "string",
- "display_order": 0,
- "name": "string",
- "role": "string"
}
], - "cover_url": "string",
- "created_at": "string",
- "description": "string",
- "genres": [
- {
- "id": "string",
- "name": "string"
}
], - "id": "string",
- "language": "string",
- "library_id": "string",
- "media_type": "string",
- "media_type_id": "string",
- "publish_year": 0,
- "publisher": "string",
- "series": [
- {
- "position": 0,
- "series_id": "string",
- "series_name": "string"
}
], - "shelves": [
- {
- "id": "string",
- "name": "string"
}
], - "subtitle": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "title": "string",
- "updated_at": "string"
}Creates an enrichment batch to refresh cover images for a list of books.
| library_id required | string Library UUID |
Books to refresh covers for
| book_ids | Array of strings |
{- "book_ids": [
- "string"
]
}{- "book_ids": [
- "string"
], - "created_at": "string",
- "created_by": "string",
- "failed_books": 0,
- "force": true,
- "id": "string",
- "items": [
- {
- "batch_id": "string",
- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "id": "string",
- "message": "string",
- "status": "pending",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "processed_books": 0,
- "skipped_books": 0,
- "status": "pending",
- "total_books": 0,
- "type": "metadata",
- "updated_at": "string"
}Creates an enrichment batch to refresh metadata for a list of books.
| library_id required | string Library UUID |
Books to enrich
| book_ids | Array of strings |
| force | boolean |
{- "book_ids": [
- "string"
], - "force": true
}{- "book_ids": [
- "string"
], - "created_at": "string",
- "created_by": "string",
- "failed_books": 0,
- "force": true,
- "id": "string",
- "items": [
- {
- "batch_id": "string",
- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "id": "string",
- "message": "string",
- "status": "pending",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "processed_books": 0,
- "skipped_books": 0,
- "status": "pending",
- "total_books": 0,
- "type": "metadata",
- "updated_at": "string"
}Returns a cheap summary (count + max updated_at) that clients can compare against a stored value to decide whether to resync.
| library_id required | string Library UUID |
{- "max_updated_at": "string",
- "total": 0
}Returns full details for a specific book including contributors, tags, genres, and series.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
{- "added_by": "string",
- "contributors": [
- {
- "contributor_id": "string",
- "display_order": 0,
- "name": "string",
- "role": "string"
}
], - "cover_url": "string",
- "created_at": "string",
- "description": "string",
- "genres": [
- {
- "id": "string",
- "name": "string"
}
], - "id": "string",
- "language": "string",
- "library_id": "string",
- "media_type": "string",
- "media_type_id": "string",
- "publish_year": 0,
- "publisher": "string",
- "series": [
- {
- "position": 0,
- "series_id": "string",
- "series_name": "string"
}
], - "shelves": [
- {
- "id": "string",
- "name": "string"
}
], - "subtitle": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "title": "string",
- "updated_at": "string"
}Replaces the book's metadata.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
Updated book
| contributors | Array of objects |
| description | string |
| genre_ids | Array of strings |
| media_type_id | string |
| subtitle | string |
| tag_ids | Array of strings |
| title | string |
{- "contributors": [
- { }
], - "description": "string",
- "genre_ids": [
- "string"
], - "media_type_id": "string",
- "subtitle": "string",
- "tag_ids": [
- "string"
], - "title": "string"
}{- "added_by": "string",
- "contributors": [
- {
- "contributor_id": "string",
- "display_order": 0,
- "name": "string",
- "role": "string"
}
], - "cover_url": "string",
- "created_at": "string",
- "description": "string",
- "genres": [
- {
- "id": "string",
- "name": "string"
}
], - "id": "string",
- "language": "string",
- "library_id": "string",
- "media_type": "string",
- "media_type_id": "string",
- "publish_year": 0,
- "publisher": "string",
- "series": [
- {
- "position": 0,
- "series_id": "string",
- "series_name": "string"
}
], - "shelves": [
- {
- "id": "string",
- "name": "string"
}
], - "subtitle": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "title": "string",
- "updated_at": "string"
}| contributor_id required | string Contributor UUID |
Payload (all fields optional)
{ }{ }Writes provider-sourced fields and bibliography to the contributor record.
| contributor_id required | string Contributor UUID |
Metadata payload
{ }{ }Fetches full profile + bibliography from a specific provider without persisting.
| contributor_id required | string Contributor UUID |
| provider required | string Provider name |
| external_id required | string Provider-specific ID |
{ }Returns a paginated, filtered, sorted list of contributors.
| library_id required | string Library UUID |
| q | string Name filter |
| letter | string First-letter filter |
| sort | string Sort field: name|book_count |
| sort_dir | string Sort direction: asc|desc |
| page | integer Page number |
| per_page | integer Items per page |
{ }Returns full contributor profile and bibliography, annotated with library context.
| library_id required | string Library UUID |
| contributor_id required | string Contributor UUID |
{ }Returns all enrichment batches for the calling user across all libraries.
[- {
- "book_ids": [
- "string"
], - "created_at": "string",
- "created_by": "string",
- "failed_books": 0,
- "force": true,
- "id": "string",
- "items": [
- {
- "batch_id": "string",
- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "id": "string",
- "message": "string",
- "status": "pending",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "processed_books": 0,
- "skipped_books": 0,
- "status": "pending",
- "total_books": 0,
- "type": "metadata",
- "updated_at": "string"
}
]Returns a specific enrichment batch with its per-book items.
| batch_id required | string Batch UUID |
{- "book_ids": [
- "string"
], - "created_at": "string",
- "created_by": "string",
- "failed_books": 0,
- "force": true,
- "id": "string",
- "items": [
- {
- "batch_id": "string",
- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "id": "string",
- "message": "string",
- "status": "pending",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "processed_books": 0,
- "skipped_books": 0,
- "status": "pending",
- "total_books": 0,
- "type": "metadata",
- "updated_at": "string"
}Creates an enrichment batch to refresh metadata for a list of books.
| library_id required | string Library UUID |
Books to enrich
| book_ids | Array of strings |
| force | boolean |
{- "book_ids": [
- "string"
], - "force": true
}{- "book_ids": [
- "string"
], - "created_at": "string",
- "created_by": "string",
- "failed_books": 0,
- "force": true,
- "id": "string",
- "items": [
- {
- "batch_id": "string",
- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "id": "string",
- "message": "string",
- "status": "pending",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "processed_books": 0,
- "skipped_books": 0,
- "status": "pending",
- "total_books": 0,
- "type": "metadata",
- "updated_at": "string"
}Creates a new global genre. Instance admin only.
Genre name
| name | string |
{- "name": "string"
}{- "created_at": "string",
- "id": "string",
- "name": "string"
}Updates the name of a global genre. Instance admin only.
| genre_id required | string Genre UUID |
Updated name
| name | string |
{- "name": "string"
}{- "created_at": "string",
- "id": "string",
- "name": "string"
}Returns all import jobs across all libraries for the calling user.
[- {
- "created_at": "string",
- "created_by": "string",
- "failed_rows": 0,
- "id": "string",
- "items": [
- {
- "book_id": "string",
- "created_at": "string",
- "id": "string",
- "import_job_id": "string",
- "isbn": "string",
- "message": "string",
- "raw_data": {
- "property1": "string",
- "property2": "string"
}, - "row_number": 0,
- "status": "pending",
- "title": "string",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "options": {
- "default_format": "string",
- "enrich_covers": true,
- "enrich_metadata": true,
- "prefer_csv": {
- "property1": true,
- "property2": true
}, - "skip_duplicates": true
}, - "processed_rows": 0,
- "skipped_rows": 0,
- "status": "pending",
- "total_rows": 0,
- "updated_at": "string"
}
]Returns all import jobs for a specific library.
| library_id required | string Library UUID |
[- {
- "created_at": "string",
- "created_by": "string",
- "failed_rows": 0,
- "id": "string",
- "items": [
- {
- "book_id": "string",
- "created_at": "string",
- "id": "string",
- "import_job_id": "string",
- "isbn": "string",
- "message": "string",
- "raw_data": {
- "property1": "string",
- "property2": "string"
}, - "row_number": 0,
- "status": "pending",
- "title": "string",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "options": {
- "default_format": "string",
- "enrich_covers": true,
- "enrich_metadata": true,
- "prefer_csv": {
- "property1": true,
- "property2": true
}, - "skip_duplicates": true
}, - "processed_rows": 0,
- "skipped_rows": 0,
- "status": "pending",
- "total_rows": 0,
- "updated_at": "string"
}
]Accepts a multipart form upload with a CSV file and column mapping, and starts an import job.
| library_id required | string Library UUID |
| file required | string <binary> CSV file to import |
| mapping | string JSON column mapping {field_name: column_index} |
| skip_duplicates | string Skip duplicate ISBNs (default true) |
| default_format | string Default edition format (default paperback) |
| enrich_metadata | string Enrich metadata after import |
| enrich_covers | string Fetch covers after import |
{- "created_at": "string",
- "created_by": "string",
- "failed_rows": 0,
- "id": "string",
- "items": [
- {
- "book_id": "string",
- "created_at": "string",
- "id": "string",
- "import_job_id": "string",
- "isbn": "string",
- "message": "string",
- "raw_data": {
- "property1": "string",
- "property2": "string"
}, - "row_number": 0,
- "status": "pending",
- "title": "string",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "options": {
- "default_format": "string",
- "enrich_covers": true,
- "enrich_metadata": true,
- "prefer_csv": {
- "property1": true,
- "property2": true
}, - "skip_duplicates": true
}, - "processed_rows": 0,
- "skipped_rows": 0,
- "status": "pending",
- "total_rows": 0,
- "updated_at": "string"
}Returns the status and progress of a specific import job.
| library_id required | string Library UUID |
| import_id required | string Import job UUID |
{- "created_at": "string",
- "created_by": "string",
- "failed_rows": 0,
- "id": "string",
- "items": [
- {
- "book_id": "string",
- "created_at": "string",
- "id": "string",
- "import_job_id": "string",
- "isbn": "string",
- "message": "string",
- "raw_data": {
- "property1": "string",
- "property2": "string"
}, - "row_number": 0,
- "status": "pending",
- "title": "string",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "options": {
- "default_format": "string",
- "enrich_covers": true,
- "enrich_metadata": true,
- "prefer_csv": {
- "property1": true,
- "property2": true
}, - "skip_duplicates": true
}, - "processed_rows": 0,
- "skipped_rows": 0,
- "status": "pending",
- "total_rows": 0,
- "updated_at": "string"
}Returns all libraries the authenticated user has access to.
[- {
- "created_at": "string",
- "description": "string",
- "id": "string",
- "is_public": true,
- "name": "string",
- "owner_id": "string",
- "slug": "string",
- "updated_at": "string"
}
]Creates a new library owned by the authenticated user.
Library details
| description | string |
| is_public | boolean |
| name | string |
| slug | string |
{- "description": "string",
- "is_public": true,
- "name": "string",
- "slug": "string"
}{- "created_at": "string",
- "description": "string",
- "id": "string",
- "is_public": true,
- "name": "string",
- "owner_id": "string",
- "slug": "string",
- "updated_at": "string"
}Returns details for a specific library.
| library_id required | string Library UUID |
{- "created_at": "string",
- "description": "string",
- "id": "string",
- "is_public": true,
- "name": "string",
- "owner_id": "string",
- "slug": "string",
- "updated_at": "string"
}Updates name, description, or visibility of a library.
| library_id required | string Library UUID |
Updated fields
| description | string |
| is_public | boolean |
| name | string |
{- "description": "string",
- "is_public": true,
- "name": "string"
}{- "created_at": "string",
- "description": "string",
- "id": "string",
- "is_public": true,
- "name": "string",
- "owner_id": "string",
- "slug": "string",
- "updated_at": "string"
}Returns all members of a library with their roles.
| library_id required | string Library UUID |
| search | string Filter by username/display name |
| tag | string Filter by tag name |
[- {
- "display_name": "string",
- "email": "string",
- "invited_by": "string",
- "joined_at": "string",
- "role": "string",
- "role_id": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "user_id": "string",
- "username": "string"
}
]Adds an existing user to the library with the specified role.
| library_id required | string Library UUID |
Member details
| role | string |
| user_id | string |
{- "role": "string",
- "user_id": "string"
}Changes the role of an existing library member.
| library_id required | string Library UUID |
| user_id required | string User UUID |
New role
| role | string |
{- "role": "string"
}Creates an enrichment batch to refresh cover images for a list of books.
| library_id required | string Library UUID |
Books to refresh covers for
| book_ids | Array of strings |
{- "book_ids": [
- "string"
]
}{- "book_ids": [
- "string"
], - "created_at": "string",
- "created_by": "string",
- "failed_books": 0,
- "force": true,
- "id": "string",
- "items": [
- {
- "batch_id": "string",
- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "id": "string",
- "message": "string",
- "status": "pending",
- "updated_at": "string"
}
], - "library_id": "string",
- "library_name": "string",
- "processed_books": 0,
- "skipped_books": 0,
- "status": "pending",
- "total_books": 0,
- "type": "metadata",
- "updated_at": "string"
}Accepts a multipart form upload and stores the image as the book's cover.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
| cover required | string <binary> Cover image file |
Downloads a cover image from the given URL and stores it as the book's cover.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
Cover URL
| url | string |
{- "url": "string"
}Returns all editions (physical/digital/audio) for a book.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
[- {
- "acquired_at": "string",
- "book_id": "string",
- "copy_count": 0,
- "created_at": "string",
- "description": "string",
- "duration_seconds": 0,
- "edition_name": "string",
- "format": "string",
- "id": "string",
- "is_primary": true,
- "isbn_10": "string",
- "isbn_13": "string",
- "language": "string",
- "narrator": "string",
- "page_count": 0,
- "publish_date": "string",
- "publisher": "string",
- "updated_at": "string"
}
]Adds a new edition to an existing book.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
Edition details
| acquired_at | string |
| copy_count | integer |
| description | string |
| duration_seconds | integer |
| edition_name | string |
| format | string |
| is_primary | boolean |
| isbn_10 | string |
| isbn_13 | string |
| language | string |
| narrator | string |
| page_count | integer |
| publish_date | string |
| publisher | string |
{- "acquired_at": "string",
- "copy_count": 0,
- "description": "string",
- "duration_seconds": 0,
- "edition_name": "string",
- "format": "string",
- "is_primary": true,
- "isbn_10": "string",
- "isbn_13": "string",
- "language": "string",
- "narrator": "string",
- "page_count": 0,
- "publish_date": "string",
- "publisher": "string"
}{- "acquired_at": "string",
- "book_id": "string",
- "copy_count": 0,
- "created_at": "string",
- "description": "string",
- "duration_seconds": 0,
- "edition_name": "string",
- "format": "string",
- "id": "string",
- "is_primary": true,
- "isbn_10": "string",
- "isbn_13": "string",
- "language": "string",
- "narrator": "string",
- "page_count": 0,
- "publish_date": "string",
- "publisher": "string",
- "updated_at": "string"
}Replaces an edition's metadata.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
| edition_id required | string Edition UUID |
Edition details
| acquired_at | string |
| copy_count | integer |
| description | string |
| duration_seconds | integer |
| edition_name | string |
| format | string |
| is_primary | boolean |
| isbn_10 | string |
| isbn_13 | string |
| language | string |
| narrator | string |
| page_count | integer |
| publish_date | string |
| publisher | string |
{- "acquired_at": "string",
- "copy_count": 0,
- "description": "string",
- "duration_seconds": 0,
- "edition_name": "string",
- "format": "string",
- "is_primary": true,
- "isbn_10": "string",
- "isbn_13": "string",
- "language": "string",
- "narrator": "string",
- "page_count": 0,
- "publish_date": "string",
- "publisher": "string"
}{- "acquired_at": "string",
- "book_id": "string",
- "copy_count": 0,
- "created_at": "string",
- "description": "string",
- "duration_seconds": 0,
- "edition_name": "string",
- "format": "string",
- "id": "string",
- "is_primary": true,
- "isbn_10": "string",
- "isbn_13": "string",
- "language": "string",
- "narrator": "string",
- "page_count": 0,
- "publish_date": "string",
- "publisher": "string",
- "updated_at": "string"
}Attaches an ebook or audiobook file to an edition.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
| edition_id required | string Edition UUID |
| file required | string <binary> Book file (epub, pdf, mp3, m4b, etc.) |
Returns the current user's reading status, rating, and notes for a specific edition.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
| edition_id required | string Edition UUID |
{- "book_edition_id": "string",
- "created_at": "string",
- "date_finished": "string",
- "date_started": "string",
- "id": "string",
- "is_favorite": true,
- "notes": "string",
- "rating": 0,
- "read_status": "string",
- "reread_count": 0,
- "review": "string",
- "updated_at": "string",
- "user_id": "string"
}Creates or updates the current user's reading status, rating, and notes for an edition.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
| edition_id required | string Edition UUID |
Interaction data
| date_finished | string |
| date_started | string |
| is_favorite | boolean |
| notes | string |
| rating | integer |
| read_status | string |
| review | string |
{- "date_finished": "string",
- "date_started": "string",
- "is_favorite": true,
- "notes": "string",
- "rating": 0,
- "read_status": "string",
- "review": "string"
}{- "book_edition_id": "string",
- "created_at": "string",
- "date_finished": "string",
- "date_started": "string",
- "id": "string",
- "is_favorite": true,
- "notes": "string",
- "rating": 0,
- "read_status": "string",
- "reread_count": 0,
- "review": "string",
- "updated_at": "string",
- "user_id": "string"
}Lists files and subdirectories within the server's configured ebook or audiobook upload path.
| library_id required | string Library UUID |
| format required | string ebook or audiobook |
| path | string Relative sub-path (default: root) |
Returns all series that a specific book belongs to.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
[- {
- "position": 0,
- "series_id": "string",
- "series_name": "string"
}
]Returns all series defined in the library.
| library_id required | string Library UUID |
| search | string Filter by series name |
| tag | string Filter by tag |
[- {
- "book_count": 0,
- "created_at": "string",
- "demographic": "string",
- "description": "string",
- "external_id": "string",
- "external_source": "string",
- "genres": [
- "string"
], - "id": "string",
- "is_complete": true,
- "last_release_date": "string",
- "library_id": "string",
- "name": "string",
- "next_release_date": "string",
- "original_language": "string",
- "publication_year": 0,
- "status": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "total_count": 0,
- "updated_at": "string",
- "url": "string"
}
]Creates a new series in the library.
| library_id required | string Library UUID |
Series details
| demographic | string |
| description | string |
| external_id | string |
| external_source | string |
| genres | Array of strings |
| name | string |
| original_language | string |
| publication_year | integer |
| status | string |
| tag_ids | Array of strings |
| total_count | integer |
| url | string |
{- "demographic": "string",
- "description": "string",
- "external_id": "string",
- "external_source": "string",
- "genres": [
- "string"
], - "name": "string",
- "original_language": "string",
- "publication_year": 0,
- "status": "string",
- "tag_ids": [
- "string"
], - "total_count": 0,
- "url": "string"
}{- "book_count": 0,
- "created_at": "string",
- "demographic": "string",
- "description": "string",
- "external_id": "string",
- "external_source": "string",
- "genres": [
- "string"
], - "id": "string",
- "is_complete": true,
- "last_release_date": "string",
- "library_id": "string",
- "name": "string",
- "next_release_date": "string",
- "original_language": "string",
- "publication_year": 0,
- "status": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "total_count": 0,
- "updated_at": "string",
- "url": "string"
}Creates each named series and adds the listed books at the given positions.
| library_id required | string Library UUID |
Series to create
| series | Array of any |
{- "series": [
- null
]
}{- "created": 0,
- "series": [
- null
]
}Scans books not yet in any series, detects volume-numbered titles, groups them by base name, and returns proposed new series. Does not modify state.
| library_id required | string Library UUID |
| media_type | string Media type name filter (repeatable) |
[- {
- "books": [
- null
], - "proposed_name": "string"
}
]Returns details for a specific series.
| library_id required | string Library UUID |
| series_id required | string Series UUID |
{- "book_count": 0,
- "created_at": "string",
- "demographic": "string",
- "description": "string",
- "external_id": "string",
- "external_source": "string",
- "genres": [
- "string"
], - "id": "string",
- "is_complete": true,
- "last_release_date": "string",
- "library_id": "string",
- "name": "string",
- "next_release_date": "string",
- "original_language": "string",
- "publication_year": 0,
- "status": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "total_count": 0,
- "updated_at": "string",
- "url": "string"
}Replaces a series's metadata.
| library_id required | string Library UUID |
| series_id required | string Series UUID |
Updated series
| demographic | string |
| description | string |
| external_id | string |
| external_source | string |
| genres | Array of strings |
| name | string |
| original_language | string |
| publication_year | integer |
| status | string |
| tag_ids | Array of strings |
| total_count | integer |
| url | string |
{- "demographic": "string",
- "description": "string",
- "external_id": "string",
- "external_source": "string",
- "genres": [
- "string"
], - "name": "string",
- "original_language": "string",
- "publication_year": 0,
- "status": "string",
- "tag_ids": [
- "string"
], - "total_count": 0,
- "url": "string"
}{- "book_count": 0,
- "created_at": "string",
- "demographic": "string",
- "description": "string",
- "external_id": "string",
- "external_source": "string",
- "genres": [
- "string"
], - "id": "string",
- "is_complete": true,
- "last_release_date": "string",
- "library_id": "string",
- "name": "string",
- "next_release_date": "string",
- "original_language": "string",
- "publication_year": 0,
- "status": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "total_count": 0,
- "updated_at": "string",
- "url": "string"
}Returns all books in a series with their position.
| library_id required | string Library UUID |
| series_id required | string Series UUID |
[- {
- "book_id": "string",
- "contributors": [
- {
- "contributor_id": "string",
- "display_order": 0,
- "name": "string",
- "role": "string"
}
], - "media_type": "string",
- "position": 0,
- "subtitle": "string",
- "title": "string"
}
]Sets the position of a book within a series (insert or update).
| library_id required | string Library UUID |
| series_id required | string Series UUID |
Book position
| book_id | string |
| position | number |
{- "book_id": "string",
- "position": 0
}Upserts each (book_id, position) pair into the target series. Accepts the preview list that the caller has optionally tweaked.
| library_id required | string Library UUID |
| series_id required | string Series UUID |
Matches to apply
| matches | Array of any |
{- "matches": [
- null
]
}{- "applied": 0
}Scans the library for books whose title begins with the series name plus a volume number, and returns a list of proposed (book, position) pairs along with any other series each book already belongs to. Does not modify state.
| library_id required | string Library UUID |
| series_id required | string Series UUID |
[- {
- "book_id": "string",
- "other_series": [
- null
], - "position": 0,
- "subtitle": "string",
- "title": "string"
}
]Returns known release volumes for a series from provider data.
| library_id required | string Library UUID |
| series_id required | string Series UUID |
[- {
- "cover_url": "string",
- "created_at": "string",
- "external_id": "string",
- "id": "string",
- "position": 0,
- "release_date": "string",
- "series_id": "string",
- "title": "string",
- "updated_at": "string"
}
]Fetches the latest volume/release data from providers and stores it.
| library_id required | string Library UUID |
| series_id required | string Series UUID |
[- {
- "cover_url": "string",
- "created_at": "string",
- "external_id": "string",
- "id": "string",
- "position": 0,
- "release_date": "string",
- "series_id": "string",
- "title": "string",
- "updated_at": "string"
}
]Returns all shelves that contain the given book.
| library_id required | string Library UUID |
| book_id required | string Book UUID |
[- {
- "book_count": 0,
- "color": "string",
- "created_at": "string",
- "description": "string",
- "display_order": 0,
- "icon": "string",
- "id": "string",
- "library_id": "string",
- "name": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "updated_at": "string"
}
]Returns all shelves for a library with book counts and tags.
| library_id required | string Library UUID |
| search | string Filter by shelf name |
| tag | string Filter by tag name |
[- {
- "book_count": 0,
- "color": "string",
- "created_at": "string",
- "description": "string",
- "display_order": 0,
- "icon": "string",
- "id": "string",
- "library_id": "string",
- "name": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "updated_at": "string"
}
]Creates a new shelf in the library.
| library_id required | string Library UUID |
Shelf details
| color | string |
| description | string |
| display_order | integer |
| icon | string |
| name | string |
| tag_ids | Array of strings |
{- "color": "string",
- "description": "string",
- "display_order": 0,
- "icon": "string",
- "name": "string",
- "tag_ids": [
- "string"
]
}{- "book_count": 0,
- "color": "string",
- "created_at": "string",
- "description": "string",
- "display_order": 0,
- "icon": "string",
- "id": "string",
- "library_id": "string",
- "name": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "updated_at": "string"
}Replaces a shelf's metadata.
| library_id required | string Library UUID |
| shelf_id required | string Shelf UUID |
Updated shelf
| color | string |
| description | string |
| display_order | integer |
| icon | string |
| name | string |
| tag_ids | Array of strings |
{- "color": "string",
- "description": "string",
- "display_order": 0,
- "icon": "string",
- "name": "string",
- "tag_ids": [
- "string"
]
}{- "book_count": 0,
- "color": "string",
- "created_at": "string",
- "description": "string",
- "display_order": 0,
- "icon": "string",
- "id": "string",
- "library_id": "string",
- "name": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "updated_at": "string"
}Returns all books currently on the given shelf.
| library_id required | string Library UUID |
| shelf_id required | string Shelf UUID |
[- {
- "added_by": "string",
- "contributors": [
- {
- "contributor_id": "string",
- "display_order": 0,
- "name": "string",
- "role": "string"
}
], - "cover_url": "string",
- "created_at": "string",
- "description": "string",
- "genres": [
- {
- "id": "string",
- "name": "string"
}
], - "id": "string",
- "language": "string",
- "library_id": "string",
- "media_type": "string",
- "media_type_id": "string",
- "publish_year": 0,
- "publisher": "string",
- "series": [
- {
- "position": 0,
- "series_id": "string",
- "series_name": "string"
}
], - "shelves": [
- {
- "id": "string",
- "name": "string"
}
], - "subtitle": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "title": "string",
- "updated_at": "string"
}
]Adds a book to the specified shelf.
| library_id required | string Library UUID |
| shelf_id required | string Shelf UUID |
Book to add
| book_id | string |
{- "book_id": "string"
}Returns current (and optionally returned) loans for a library.
| library_id required | string Library UUID |
| include_returned | boolean Include returned loans |
| search | string Filter by borrower name |
| tag | string Filter by tag |
[- {
- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "due_date": "string",
- "id": "string",
- "library_id": "string",
- "loaned_at": "string",
- "loaned_to": "string",
- "notes": "string",
- "returned_at": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "updated_at": "string"
}
]Records that a book has been loaned to someone.
| library_id required | string Library UUID |
Loan details
| book_id | string |
| due_date | string |
| loaned_at | string |
| loaned_to | string |
| notes | string |
| tag_ids | Array of strings |
{- "book_id": "string",
- "due_date": "string",
- "loaned_at": "string",
- "loaned_to": "string",
- "notes": "string",
- "tag_ids": [
- "string"
]
}{- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "due_date": "string",
- "id": "string",
- "library_id": "string",
- "loaned_at": "string",
- "loaned_to": "string",
- "notes": "string",
- "returned_at": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "updated_at": "string"
}Updates loan details including marking a book as returned.
| library_id required | string Library UUID |
| loan_id required | string Loan UUID |
Updated loan
| due_date | string |
| loaned_to | string |
| notes | string |
| returned_at | string |
| tag_ids | Array of strings |
{- "due_date": "string",
- "loaned_to": "string",
- "notes": "string",
- "returned_at": "string",
- "tag_ids": [
- "string"
]
}{- "book_id": "string",
- "book_title": "string",
- "created_at": "string",
- "due_date": "string",
- "id": "string",
- "library_id": "string",
- "loaned_at": "string",
- "loaned_to": "string",
- "notes": "string",
- "returned_at": "string",
- "tags": [
- {
- "color": "string",
- "created_at": "string",
- "id": "string",
- "library_id": "string",
- "name": "string"
}
], - "updated_at": "string"
}Lists files and subdirectories within a storage location at the given path.
| library_id required | string Library UUID |
| location_id required | string Storage location UUID |
| path | string Relative sub-path (default: root) |
Queries all enabled providers for books matching the freetext query.
| q required | string Search query |
[- {
- "authors": [
- "string"
], - "categories": [
- "string"
], - "cover_url": "string",
- "description": "string",
- "isbn_10": "string",
- "isbn_13": "string",
- "language": "string",
- "page_count": 0,
- "provider": "string",
- "provider_display": "string",
- "publish_date": "string",
- "publisher": "string",
- "subtitle": "string",
- "title": "string"
}
]Queries all enabled providers and returns per-provider results.
| isbn required | string ISBN-10 or ISBN-13 |
[- {
- "authors": [
- "string"
], - "categories": [
- "string"
], - "cover_url": "string",
- "description": "string",
- "isbn_10": "string",
- "isbn_13": "string",
- "language": "string",
- "page_count": 0,
- "provider": "string",
- "provider_display": "string",
- "publish_date": "string",
- "publisher": "string",
- "subtitle": "string",
- "title": "string"
}
]Returns a single merged result across all providers with per-field source attribution.
| isbn required | string ISBN-10 or ISBN-13 |
{- "authors": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "categories": [
- "string"
], - "covers": [
- {
- "cover_url": "string",
- "source": "string",
- "source_display": "string"
}
], - "description": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "isbn_10": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "isbn_13": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "language": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "page_count": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "publish_date": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "publisher": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "subtitle": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}, - "title": {
- "alternatives": [
- {
- "source": "string",
- "source_display": "string",
- "value": "string"
}
], - "source": "string",
- "source_display": "string",
- "value": "string"
}
}Queries enabled providers for series matching the search term.
| q required | string Search query |
[- {
- "cover_url": "string",
- "demographic": "string",
- "description": "string",
- "external_id": "string",
- "external_source": "string",
- "genres": [
- "string"
], - "is_complete": true,
- "name": "string",
- "original_language": "string",
- "provider": "string",
- "provider_display": "string",
- "publication_year": 0,
- "status": "string",
- "total_count": 0,
- "url": "string"
}
]Sets whether the caller is opted in to AI features.
Opt-in flag
| opt_in | boolean |
{- "opt_in": true
}{- "opt_in": true
}Returns the current AI-generated recommendations for the caller. Filter by type (buy | read_next) and status.
| type | string Filter by type: buy | read_next |
| status | string Filter by status: new | dismissed | interested | added_to_library |
[- {
- "author": "string",
- "book_edition_id": "string",
- "book_id": "string",
- "cover_url": "string",
- "created_at": "string",
- "id": "string",
- "isbn": "string",
- "library_id": "string",
- "reasoning": "string",
- "status": "string",
- "title": "string",
- "type": "string"
}
]Returns the caller's most recent suggestion runs with cost and status. Newest first.
[- {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
]Returns the run metadata plus every pipeline event emitted during execution (prompt, AI responses, enrichment decisions, read_next matches, backfill passes).
| id required | string Run ID |
{- "events": [
- {
- "content": [
- 0
], - "created_at": "string",
- "seq": 0,
- "type": "string"
}
], - "run": {
- "error": "string",
- "estimated_cost_usd": 0,
- "finished_at": "string",
- "id": "string",
- "model_id": "string",
- "provider_type": "string",
- "started_at": "string",
- "status": "string",
- "tokens_in": 0,
- "tokens_out": 0,
- "triggered_by": "string",
- "user_id": "string"
}
}Creates a persistent block scoped to the book, the author, or the series.
| id required | string Suggestion ID |
Block scope: book | author | series
| scope | string |
{- "scope": "string"
}{- "error": "string"
}Mark a suggestion as dismissed, interested, or added_to_library.
| id required | string Suggestion ID |
New status
| status | string |
{- "status": "string"
}{- "error": "string"
}Replaces the saved taste profile with the supplied JSON object.
Taste profile JSON object
{ }{ }Creates a new global media type. Instance admin only.
Media type details
| description | string |
| display_name | string |
| name | string |
{- "description": "string",
- "display_name": "string",
- "name": "string"
}{- "book_count": 0,
- "description": "string",
- "display_name": "string",
- "id": "string",
- "name": "string"
}Updates the display name and description of a media type. Instance admin only.
| media_type_id required | string Media type UUID |
Updated fields
| description | string |
| display_name | string |
{- "description": "string",
- "display_name": "string"
}{- "book_count": 0,
- "description": "string",
- "display_name": "string",
- "id": "string",
- "name": "string"
}Creates the initial instance admin on a fresh install. Fails with 409 once any user exists.
Admin account request
| display_name | string |
string | |
| password | string |
| username | string |
{- "display_name": "string",
- "email": "string",
- "password": "string",
- "username": "string"
}{- "access_token": "string",
- "expires_in": 0,
- "refresh_token": "string",
- "user": { }
}