# Update Reading Progress Update reading progress for a media item. This will sync across all devices via WebSocket. **Endpoint**: `PUT /api/media-items/{media_id}/progress` **Auth**: Required **Content-Type**: `application/json` ## Path Parameters | Parameter | Type | Required | Description | | --------- | ------ | -------- | --------------- | | media_id | string | Yes | Media item UUID | ## Request Body | Field | Type | Required | Description | | --------------------------- | ------- | -------- | ------------------------------------------------- | | source | string | Yes | Progress source (e.g., "web", "koreader", "kobo") | | location | object | Yes | Location information | | location.percentage | float | No | Progress percentage (0-1) | | location.epubcfi | string | No | EPUB CFI location | | location.character | integer | No | Character offset | | location.chapter | integer | No | Chapter number | | location.page | integer | No | Current page | | location.total_pages | integer | No | Total pages | | device_metadata | object | No | Device metadata | | device_metadata.device_type | string | No | Device type | | device_metadata.user_agent | string | No | User agent string | ### Example Request ```json { "source": "web", "location": { "percentage": 0.45678, "epubcfi": "epubcfi(/6/4/2:15)", "character": 15432, "chapter": 3, "page": 89, "total_pages": 200 }, "device_metadata": { "device_type": "web", "user_agent": "Mozilla/5.0..." } } ``` ## Response (200 OK) ```json { "sync_status": "success", "progress_updated": true, "devices_notified": ["device-1", "device-2"], "broadcast": true } ``` ## Error Responses | Code | Description | | ---- | ------------------------ | | 400 | Invalid location data | | 401 | Invalid or expired token | | 404 | Media item not found |