test: add Bruno API collections for sync features

- Add device registration and management API tests
- Add conflicts resolution API tests
- Add queue management API tests
- Add KOReader sync protocol tests
- Add Kobo sync protocol tests
This commit is contained in:
2026-01-31 18:25:32 -05:00
parent 707df26453
commit 4d87beb540
14 changed files with 1284 additions and 0 deletions
+127
View File
@@ -0,0 +1,127 @@
meta {
name: "Bookmann Conflicts API"
type: "collection"
environment: {
development: {
base_url: "http://localhost:8765/api"
},
production: {
base_url: "https://your-domain.com/api"
}
}
}
# List Conflicts
@name("List Unresolved Conflicts")
GET {{environment.base_url}}/conflicts?status=unresolved
Authorization: Bearer {{jwt_token}}
@name("List All Conflicts")
GET {{environment.base_url}}/conflicts?status=all
Authorization: Bearer {{jwt_token}}
@name("List Resolved Conflicts")
GET {{environment.base_url}}/conflicts?status=resolved
Authorization: Bearer {{jwt_token}}
@name("List Progress Conflicts")
GET {{environment.base_url}}/conflicts?status=unresolved&type=progress
Authorization: Bearer {{jwt_token}}
@name("List Note Conflicts")
GET {{environment.base_url}}/conflicts?status=unresolved&type=note
Authorization: Bearer {{jwt_token}}
@name("List Highlight Conflicts")
GET {{environment.base_url}}/conflicts?status=unresolved&type=highlight
Authorization: Bearer {{jwt_token}}
# Get Conflict Details
@name("Get Conflict Details")
GET {{environment.base_url}}/conflicts/{{conflict_id}}
Authorization: Bearer {{jwt_token}}
# Resolve Conflict
@name("Resolve - Keep KOReader Progress")
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"winner": "koreader",
"apply_to_all_future_conflicts": false,
"reason": "KOReader was most recently updated"
}
@name("Resolve - Keep Kobo Progress")
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"winner": "kobo",
"apply_to_all_future_conflicts": false,
"reason": "Kobo has more progress"
}
@name("Resolve - Keep Web Progress")
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"winner": "web",
"apply_to_all_future_conflicts": false,
"reason": "Web interface has most recent data"
}
@name("Resolve - Manual Override")
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"winner": "manual",
"manual_data": {
"percentage": 0.43,
"epubcfi": "epubcfi(/6/4/2:20)",
"chapter": 3
},
"apply_to_all_future_conflicts": false,
"reason": "User specified custom progress"
}
@name("Resolve - Manual Override with Page")
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"winner": "manual",
"manual_data": {
"percentage": 0.43,
"page": 89,
"epubcfi": "epubcfi(/6/4/2:20)"
},
"apply_to_all_future_conflicts": false,
"reason": "User specified page number"
}
@name("Resolve - Apply to All Future Conflicts")
POST {{environment.base_url}}/conflicts/{{conflict_id}}/resolve
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"winner": "koreader",
"apply_to_all_future_conflicts": true,
"reason": "Always prefer KOReader for future conflicts"
}
# Delete Conflict
@name("Delete Conflict")
DELETE {{environment.base_url}}/conflicts/{{conflict_id}}
Authorization: Bearer {{jwt_token}}
@name("Dismiss Conflict")
DELETE {{environment.base_url}}/conflicts/{{conflict_id}}
Authorization: Bearer {{jwt_token}}
# Batch Operations
@name("Dismiss All Resolved Conflicts")
DELETE {{environment.base_url}}/conflicts/dismiss-resolved
Authorization: Bearer {{jwt_token}}
@@ -0,0 +1,48 @@
meta {
name: Approve Device Registration
type: http
seq: 6
}
get {
url: {{base_url}}/api/devices/approve/{{registration_id}}
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## Approve Device Registration
Approves a pending device registration request.
**Method:** GET
**Endpoint:** /api/devices/approve/:registration_id
**Authentication:** Bearer token
**Path Parameters:**
- `registration_id` (string): Registration request UUID
**Response:**
- Success message with approved device details
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 404: Registration not found
- 400: Invalid registration status
**Example Response:**
```json
{
"message": "Device registration approved",
"device_id": "uuid",
"device_name": "My Kobo"
}
```
}
@@ -0,0 +1,47 @@
meta {
name: List Pending Device Registrations
type: http
seq: 5
}
get {
url: {{base_url}}/api/devices/pending
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## List Pending Device Registrations
Retrieves all pending device registration requests awaiting approval.
**Method:** GET
**Endpoint:** /api/devices/pending
**Authentication:** Bearer token
**Response:**
- Array of pending device registrations
**Status Codes:**
- 200: Success
- 401: Unauthorized
**Example Response:**
```json
[
{
"id": "uuid",
"device_name": "My Kobo",
"device_type": "kobo",
"user_id": "uuid",
"created_at": "2024-01-01T00:00:00Z"
}
]
```
}
@@ -0,0 +1,47 @@
meta {
name: Reject Device Registration
type: http
seq: 7
}
post {
url: {{base_url}}/api/devices/reject/{{registration_id}}
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## Reject Device Registration
Rejects a pending device registration request.
**Method:** POST
**Endpoint:** /api/devices/reject/:registration_id
**Authentication:** Bearer token
**Path Parameters:**
- `registration_id` (string): Registration request UUID
**Response:**
- Success message confirming rejection
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 404: Registration not found
- 400: Invalid registration status
**Example Response:**
```json
{
"message": "Device registration rejected",
"registration_id": "uuid"
}
```
}
+134
View File
@@ -0,0 +1,134 @@
meta {
name: "Bookmann Device Management API"
type: "collection"
environment: {
development: {
base_url: "http://localhost:8765/api"
},
production: {
base_url: "https://your-domain.com/api"
}
}
}
# Register Device
@name("Register Device")
POST {{environment.base_url}}/devices/register
Content-Type: application/json
{
"device_name": "My Kobo Clara",
"device_type": "kobo",
"device_identifier": "N1234567890123"
}
@name("Register KOReader Device")
POST {{environment.base_url}}/devices/register
Content-Type: application/json
{
"device_name": "My Kindle Paperwhite",
"device_type": "koreader",
"device_identifier": "G090GP123456789"
}
@name("Register Web Device")
POST {{environment.base_url}}/devices/register
Content-Type: application/json
{
"device_name": "Chrome Browser",
"device_type": "web",
"device_identifier": "web-client-abc123"
}
# Check Registration Status
@name("Check Pending Registration")
POST {{environment.base_url}}/devices/register/status
Content-Type: application/json
{
"registration_id": "registration-uuid-here"
}
@name("Check Approved Registration")
POST {{environment.base_url}}/devices/register/status
Content-Type: application/json
{
"registration_id": "registration-uuid-here"
}
# List Devices (requires authentication)
@name("List User Devices")
GET {{environment.base_url}}/devices
Authorization: Bearer {{jwt_token}}
@name("Get Device Details")
GET {{environment.base_url}}/devices/{{device_id}}
Authorization: Bearer {{jwt_token}}
# Update Device Settings
@name("Update Device Settings")
PUT {{environment.base_url}}/devices/{{device_id}}
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"device_name": "Updated Device Name",
"sync_enabled": true,
"auto_sync": true,
"sync_frequency_minutes": 10
}
@name("Disable Device Sync")
PUT {{environment.base_url}}/devices/{{device_id}}
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"device_name": "My Kobo Clara",
"sync_enabled": false,
"auto_sync": false,
"sync_frequency_minutes": 30
}
@name("Update Sync Frequency")
PUT {{environment.base_url}}/devices/{{device_id}}
Authorization: Bearer {{jwt_token}}
Content-Type: application/json
{
"device_name": "My Kobo Clara",
"sync_enabled": true,
"auto_sync": true,
"sync_frequency_minutes": 15
}
# Delete/Revoke Device
@name("Delete Device")
DELETE {{environment.base_url}}/devices/{{device_id}}
Authorization: Bearer {{jwt_token}}
# Get Pending Registrations
@name("Get Pending Registrations")
GET {{environment.base_url}}/devices/pending
Authorization: Bearer {{jwt_token}}
# Approve Device Registration
@name("Approve Device Registration")
GET {{environment.base_url}}/devices/approve/{{registration_id}}
Authorization: Bearer {{jwt_token}}
@name("Approve Registration - KOReader")
GET {{environment.base_url}}/devices/approve/reg-uuid-123
Authorization: Bearer {{jwt_token}}
@name("Approve Registration - Kobo")
GET {{environment.base_url}}/devices/approve/reg-uuid-456
Authorization: Bearer {{jwt_token}}
# Reject Device Registration
@name("Reject Device Registration")
POST {{environment.base_url}}/devices/reject/{{registration_id}}
Authorization: Bearer {{jwt_token}}
@name("Reject Registration - KOReader")
POST {{environment.base_url}}/devices/reject/reg-uuid-123
Authorization: Bearer {{jwt_token}}
@name("Reject Registration - Kobo")
POST {{environment.base_url}}/devices/reject/reg-uuid-456
Authorization: Bearer {{jwt_token}}
+47
View File
@@ -0,0 +1,47 @@
meta {
name: Clear Device Queue
type: http
seq: 6
}
delete {
url: {{base_url}}/api/queue/devices/{{device_id}}/clear
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## Clear Device Queue
Clears all queue items for a specific device.
**Method:** DELETE
**Endpoint:** /api/queue/devices/:device_id/clear
**Authentication:** Bearer token
**Path Parameters:**
- `device_id` (string): Device UUID
**Response:**
- Success message with count of cleared items
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 404: Device not found
**Example Response:**
```json
{
"message": "Queue cleared",
"device_id": "uuid",
"cleared_count": 10
}
```
}
+46
View File
@@ -0,0 +1,46 @@
meta {
name: Delete Queue Item
type: http
seq: 5
}
delete {
url: {{base_url}}/api/queue/items/{{item_id}}
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## Delete Queue Item
Deletes a queue item from the sync queue.
**Method:** DELETE
**Endpoint:** /api/queue/items/:item_id
**Authentication:** Bearer token
**Path Parameters:**
- `item_id` (string): Queue item UUID
**Response:**
- Success message confirming deletion
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 404: Queue item not found
**Example Response:**
```json
{
"message": "Queue item deleted",
"item_id": "uuid"
}
```
}
+49
View File
@@ -0,0 +1,49 @@
meta {
name: Get Device Queue Stats
type: http
seq: 2
}
get {
url: {{base_url}}/api/queue/devices/{{device_id}}/stats
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## Get Device Queue Stats
Retrieves statistics for a specific device's sync queue.
**Method:** GET
**Endpoint:** /api/queue/devices/:device_id/stats
**Authentication:** Bearer token
**Path Parameters:**
- `device_id` (string): Device UUID
**Response:**
- Queue statistics including pending, completed, and failed counts
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 404: Device not found
**Example Response:**
```json
{
"device_id": "uuid",
"total_items": 10,
"pending": 3,
"completed": 5,
"failed": 2
}
```
}
@@ -0,0 +1,48 @@
meta {
name: List All Queue Items (Admin)
type: http
seq: 1
}
get {
url: {{base_url}}/api/queue/items
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## List All Queue Items (Admin)
Retrieves all queue items across all devices (admin only).
**Method:** GET
**Endpoint:** /api/queue/items
**Authentication:** Bearer token (admin role required)
**Response:**
- Array of queue items with device and status information
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 403: Forbidden - admin role required
**Example Response:**
```json
[
{
"id": "uuid",
"device_id": "uuid",
"item_type": "progress",
"status": "pending",
"created_at": "2024-01-01T00:00:00Z"
}
]
```
}
+53
View File
@@ -0,0 +1,53 @@
meta {
name: List Device Queue Items
type: http
seq: 3
}
get {
url: {{base_url}}/api/queue/devices/{{device_id}}/items
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## List Device Queue Items
Retrieves all queue items for a specific device.
**Method:** GET
**Endpoint:** /api/queue/devices/:device_id/items
**Authentication:** Bearer token
**Path Parameters:**
- `device_id` (string): Device UUID
**Response:**
- Array of queue items for the specified device
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 404: Device not found
**Example Response:**
```json
[
{
"id": "uuid",
"device_id": "uuid",
"item_type": "progress",
"status": "pending",
"data": {},
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
]
```
}
+47
View File
@@ -0,0 +1,47 @@
meta {
name: Retry Queue Item
type: http
seq: 4
}
post {
url: {{base_url}}/api/queue/items/{{item_id}}/retry
body: none
auth: bearer
}
headers: {
Authorization: Bearer {{token}}
}
docs {
## Retry Queue Item
Retries a failed queue item.
**Method:** POST
**Endpoint:** /api/queue/items/:item_id/retry
**Authentication:** Bearer token
**Path Parameters:**
- `item_id` (string): Queue item UUID
**Response:**
- Success message indicating retry initiated
**Status Codes:**
- 200: Success
- 401: Unauthorized
- 404: Queue item not found
- 400: Invalid item status
**Example Response:**
```json
{
"message": "Queue item retry initiated",
"item_id": "uuid"
}
```
}
+85
View File
@@ -0,0 +1,85 @@
meta {
name: "Bookmann Sync Queue API"
type: "collection"
environment: {
development: {
base_url: "http://localhost:8765/api"
},
production: {
base_url: "https://your-domain.com/api"
}
}
}
# List Queue Items
@name("List All Queue Items")
GET {{environment.base_url}}/queue/items
Authorization: Bearer {{jwt_token}}
@name("List Queue Items - With Pagination")
GET {{environment.base_url}}/queue/items?limit=50&offset=0
Authorization: Bearer {{jwt_token}}
@name("Filter by Status - Pending")
GET {{environment.base_url}}/queue/items?status=pending
Authorization: Bearer {{jwt_token}}
@name("Filter by Status - Failed")
GET {{environment.base_url}}/queue/items?status=failed
Authorization: Bearer {{jwt_token}}
@name("Filter by Status - Completed")
GET {{environment.base_url}}/queue/items?status=completed
Authorization: Bearer {{jwt_token}}
@name("Filter by Type - Progress")
GET {{environment.base_url}}/queue/items?status=all&type=progress
Authorization: Bearer {{jwt_token}}
@name("Filter by Type - Notes")
GET {{environment.base_url}}/queue/items?status=all&type=note
Authorization: Bearer {{jwt_token}}
@name("Filter by Type - Highlights")
GET {{environment.base_url}}/queue/items?status=all&type=highlight
Authorization: Bearer {{jwt_token}}
@name("Filter by Type - Bookmarks")
GET {{environment.base_url}}/queue/items?status=all&type=bookmark
Authorization: Bearer {{jwt_token}}
# Process Queue Item
@name("Process Queue Item")
POST {{environment.base_url}}/queue/items/{{queue_item_id}}/process
Authorization: Bearer {{jwt_token}}
@name("Retry Queue Item")
POST {{environment.base_url}}/queue/items/{{queue_item_id}}/retry
Authorization: Bearer {{jwt_token}}
# Delete Queue Item
@name("Delete Queue Item")
DELETE {{environment.base_url}}/queue/items/{{queue_item_id}}
Authorization: Bearer {{jwt_token}}
# Clear All Queue
@name("Clear All Queue Items")
DELETE {{environment.base_url}}/queue/clear
Authorization: Bearer {{jwt_token}}
@name("Clear Failed Items")
DELETE {{environment.base_url}}/queue/clear-failed
Authorization: Bearer {{jwt_token}}
# Get Queue Stats
@name("Get Queue Statistics")
GET {{environment.base_url}}/queue/stats
Authorization: Bearer {{jwt_token}}
@name("Get Device Queue Stats")
GET {{environment.base_url}}/queue/devices/{{device_id}}/stats
Authorization: Bearer {{jwt_token}}
@name("Get Device Queue Items")
GET {{environment.base_url}}/queue/devices/{{device_id}}/items
Authorization: Bearer {{jwt_token}}
+230
View File
@@ -0,0 +1,230 @@
meta {
name: "Bookmann Kobo Sync API"
type: "collection"
environment: {
development: {
base_url: "http://localhost:8765/api"
},
production: {
base_url: "https://your-domain.com/api"
}
}
}
# Authentication Headers
@name("Kobo Device Token")
@AuthorizationHeader({
name: "Authorization",
value: "Bearer {{kobo_device_token}}"
})
{
"token": "{{kobo_device_token}}"
}
@name("Kobo Device Info Header")
@Request({
name: "x-kobo-device",
value: '{"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara","SerialNumber":"{{kobo_serial}}"}'
})
{
"test": "data"
}
# Sync Markup (Reading Progress + Annotations)
@name("Sync Reading Progress")
POST {{environment.base_url}}/sync/kobo/markup
Authorization: Bearer {{kobo_device_token}}
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara"}
Content-Type: application/json
{
"ReadingSync": [
{
"ContentId": "book-uuid-here",
"PercentRead": 45.6,
"EntitlementId": "entitlement-id-here",
"RemainingTimeMinutes": 120,
"FirstReadTime": "2026-01-25T10:00:00Z",
"LastModified": "2026-01-30T20:00:00Z"
}
],
"BookmarkSync": []
}
@name("Sync Progress with Bookmarks")
POST {{environment.base_url}}/sync/kobo/markup
Authorization: Bearer {{kobo_device_token}}
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara"}
Content-Type: application/json
{
"ReadingSync": [
{
"ContentId": "book-uuid",
"PercentRead": 42.3,
"EntitlementId": "entitlement-id",
"RemainingTimeMinutes": 138,
"FirstReadTime": "2026-01-25T10:00:00Z",
"LastModified": "2026-01-30T20:00:00Z"
}
],
"BookmarkSync": [
{
"ContentId": "book-uuid",
"BookmarkText": "highlighted text passage",
"BookmarkType": "annotation",
"BookmarkTitle": "Chapter 3"
}
]
}
@name("Sync Multiple Books Progress")
POST {{environment.base_url}}/sync/kobo/markup
Authorization: Bearer {{kobo_device_token}}
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Aura"}
Content-Type: application/json
{
"ReadingSync": [
{
"ContentId": "book-1-uuid",
"PercentRead": 25.0,
"EntitlementId": "entitlement-1",
"RemainingTimeMinutes": 240,
"FirstReadTime": "2026-01-25T10:00:00Z",
"LastModified": "2026-01-30T18:00:00Z"
},
{
"ContentId": "book-2-uuid",
"PercentRead": 78.5,
"EntitlementId": "entitlement-2",
"RemainingTimeMinutes": 45,
"FirstReadTime": "2026-01-25T14:00:00Z",
"LastModified": "2026-01-30T20:00:00Z"
}
],
"BookmarkSync": []
}
@name("Sync with Annotations")
POST {{environment.base_url}}/sync/kobo/markup
Authorization: Bearer {{kobo_device_token}}
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Libra"}
Content-Type: application/json
{
"ReadingSync": [
{
"ContentId": "book-uuid",
"PercentRead": 55.0,
"EntitlementId": "entitlement-id",
"RemainingTimeMinutes": 120,
"FirstReadTime": "2026-01-25T10:00:00Z",
"LastModified": "2026-01-30T20:00:00Z"
}
],
"BookmarkSync": [
{
"ContentId": "book-uuid",
"BookmarkText": "Important quote",
"BookmarkType": "annotation",
"BookmarkTitle": "Chapter 4 - The Truth"
},
{
"ContentId": "book-uuid",
"BookmarkText": "Another quote",
"BookmarkType": "annotation",
"BookmarkTitle": "Chapter 5"
},
{
"ContentId": "book-uuid",
"BookmarkText": "Note to myself",
"BookmarkType": "note",
"BookmarkTitle": "Personal note"
}
]
}
# Sync Bookmark
@name("Sync Single Bookmark")
POST {{environment.base_url}}/sync/kobo/bookmark
Authorization: Bearer {{kobo_device_token}}
x-kobo-device: {"DeviceId":"{{kobo_device_id}}","Model":"Kobo Clara"}
Content-Type: application/json
{
"ContentId": "book-uuid",
"BookmarkText": "Bookmarked passage",
"BookmarkType": "annotation",
"BookmarkTitle": "Chapter 3"
}
# Get Library
@name("Get Kobo Library")
GET {{environment.base_url}}/sync/kobo/library
Authorization: Bearer {{kobo_device_token}}
@name("Get Library for Book")
GET {{environment.base_url}}/sync/kobo/library
Authorization: Bearer {{kobo_device_token}}
Content-Type: application/json
{
"ContentId": "book-uuid"
}
# Analytics Get Tests
@name("Get Analytics Tests")
POST {{environment.base_url}}/sync/kobo/v1/analytics/gettests
Authorization: Bearer {{kobo_device_token}}
Content-Type: application/json
{
"platform": "android"
"firmware_version": "4.30.19023"
}
# Initialization
@name("Kobo Initialization")
GET {{environment.base_url}}/sync/kobo/v1/initialization
Authorization: Bearer {{kobo_device_token}}
@name("Initialization with Device Info")
GET {{environment.base_url}}/sync/kobo/v1/initialization?Platform=android&FirmwareVersion=4.30.19023
Authorization: Bearer {{kobo_device_token}}
# Sync from Server
@name("Sync Books from Server to Kobo")
POST {{environment.base_url}}/sync/kobo/sync-from-server
Authorization: Bearer {{kobo_device_token}}
Content-Type: application/json
{
"force_sync": true,
"books": ["book-uuid-1", "book-uuid-2"]
}
@name("Sync Specific Book from Server")
POST {{environment.base_url}}/sync/kobo/sync-from-server
Authorization: Bearer {{kobo_device_token}}
Content-Type: application/json
{
"ContentId": "book-uuid",
"EntitlementId": "entitlement-id"
}
@name("Partial Sync - Since Date")
POST {{environment.base_url}}/sync/kobo/sync-from-server
Authorization: Bearer {{kobo_device_token}}
Content-Type: application/json
{
"books": ["book-1", "book-2"],
"sync_options": {
"since_date": "2026-01-30T00:00:00Z",
"include_annotations": true
}
}
@name("Sync with Conflict Resolution Preference")
POST {{environment.base_url}}/sync/kobo/sync-from-server
Authorization: Bearer {{kobo_device_token}}
Content-Type: application/json
{
"books": ["book-1", "book-2", "book-3"],
"sync_options": {
"conflict_resolution": "most_recent",
"force_annotations": false
}
}
+276
View File
@@ -0,0 +1,276 @@
meta {
name: "Bookmann KOReader Sync API"
type: "collection"
environment: {
development: {
base_url: "http://localhost:8765/api"
},
production: {
base_url: "https://your-domain.com/api"
}
}
}
# Authentication Headers
@name("KOReader Device Token")
@AuthorizationHeader({
name: "Authorization",
value: "Bearer {{koreader_device_token}}"
})
{
"token": "{{koreader_device_token}}"
}
# Sync Progress
@name("Sync Progress - Single Book")
POST {{environment.base_url}}/sync/koreader/progress
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"library_id": "optional-library-uuid",
"books": [
{
"uuid": "book-uuid-here",
"title": "Book Title",
"authors": ["Author Name"],
"progress": 0.45,
"percentage": 0.45,
"last_read": "2026-01-30T20:00:00Z",
"chapter": 3,
"epubcfi": "epubcfi(/6/4/2:15)",
"character": 15432
}
]
}
@name("Sync Progress - Multiple Books")
POST {{environment.base_url}}/sync/koreader/progress
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"library_id": "optional-library-uuid",
"books": [
{
"uuid": "book-1-uuid",
"title": "Book One",
"authors": ["Author One"],
"progress": 0.25,
"percentage": 0.25,
"last_read": "2026-01-30T19:00:00Z",
"chapter": 1,
"epubcfi": "epubcfi(/6/4/2:10)"
},
{
"uuid": "book-2-uuid",
"title": "Book Two",
"authors": ["Author Two"],
"progress": 0.75,
"percentage": 0.75,
"last_read": "2026-01-30T20:00:00Z",
"chapter": 8,
"epubcfi": "epubcfi(/6/4/2:50)"
}
]
}
@name("Sync Progress - With Bookmarks")
POST {{environment.base_url}}/sync/koreader/progress
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"library_id": "optional-library-uuid",
"books": [
{
"uuid": "book-uuid-here",
"title": "Book Title",
"authors": ["Author Name"],
"progress": 0.45,
"percentage": 0.45,
"last_read": "2026-01-30T20:00:00Z",
"bookmarks": [
{
"chapter": 3,
"datetime": "2026-01-30T19:55:00Z",
"notes": "highlighted text",
"pos0": "epubcfi(/6/4/2:15)",
"pos1": "epubcfi(/6/4/2:20)",
"page": 45,
"text": "highlighted text excerpt",
"type": "highlight"
}
]
}
]
}
@name("Sync Progress - With Highlights and Notes")
POST {{environment.base_url}}/sync/koreader/progress
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"library_id": "optional-library-uuid",
"books": [
{
"uuid": "book-uuid-here",
"title": "Book Title",
"authors": ["Author Name"],
"progress": 0.60,
"percentage": 0.60,
"last_read": "2026-01-30T20:00:00Z",
"highlights": [
{
"datetime": "2026-01-30T19:50:00Z",
"text": "Important passage",
"chapter": 4,
"pos0": "epubcfi(/6/4/2:20)",
"pos1": "epubcfi(/6/4/2:30)",
"page_start": 78,
"page_end": 79
}
],
"notes": [
{
"datetime": "2026-01-30T19:52:00Z",
"text": "My note about this chapter",
"chapter": 4
}
]
}
]
}
# Get Metadata
@name("Get Book Metadata")
GET {{environment.base_url}}/sync/koreader/metadata/{{book_uuid}}
Authorization: Bearer {{koreader_device_token}}
@name("Get Metadata for Multiple Books")
GET {{environment.base_url}}/sync/koreader/metadata
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"books": ["book-uuid-1", "book-uuid-2", "book-uuid-3"]
}
# Sync Bookmarks
@name("Sync Bookmarks")
POST {{environment.base_url}}/sync/koreader/bookmarks
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"library_id": "optional-library-uuid",
"books": [
{
"uuid": "book-uuid",
"bookmarks": [
{
"chapter": 3,
"datetime": "2026-01-30T19:55:00Z",
"notes": "Marked this chapter as important",
"pos0": "epubcfi(/6/4/2:15)",
"pos1": "epubcfi(/6/4/2:20)",
"page": 45,
"text": "Important passage",
"type": "bookmark"
}
]
}
]
}
@name("Sync Highlights")
POST {{environment.base_url}}/sync/koreader/highlights
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"library_id": "optional-library-uuid",
"books": [
{
"uuid": "book-uuid",
"highlights": [
{
"datetime": "2026-01-30T19:50:00Z",
"text": "Important quote from book",
"chapter": 4,
"pos0": "epubcfi(/6/4/2:20)",
"pos1": "epubcfi(/6/4/2:30)",
"page_start": 78,
"page_end": 79
}
]
}
]
}
@name("Sync Notes")
POST {{environment.base_url}}/sync/koreader/notes
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"library_id": "optional-library-uuid",
"books": [
{
"uuid": "book-uuid",
"notes": [
{
"datetime": "2026-01-30T19:52:00Z",
"text": "My personal note about this chapter",
"chapter": 4
}
]
}
]
}
# Get Library
@name("Get User Library for KOReader")
GET {{environment.base_url}}/sync/koreader/library
Authorization: Bearer {{koreader_device_token}}
@name("Get Library for Specific Book")
GET {{environment.base_url}}/sync/koreader/library
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"books": ["book-uuid-1", "book-uuid-2"]
}
# Immediate Sync Mode
@name("Immediate Sync - Page Turn")
POST {{environment.base_url}}/sync/koreader/progress
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"sync_mode": "immediate",
"books": [
{
"uuid": "book-uuid",
"percentage": 0.45678,
"chapter": 3,
"timestamp": "2026-01-30T20:00:00Z"
}
]
}
# Checkpoint Sync Mode
@name("Checkpoint Sync")
POST {{environment.base_url}}/sync/koreader/progress
Authorization: Bearer {{koreader_device_token}}
Content-Type: application/json
{
"sync_mode": "checkpoint",
"checkpoint_id": "checkpoint-uuid",
"since_timestamp": "2026-01-30T19:00:00Z",
"books": [
{
"uuid": "book-uuid-1",
"percentage": 0.45,
"chapter": 3
},
{
"uuid": "book-uuid-2",
"percentage": 0.75,
"chapter": 8
}
]
}