Skip to main content

ReadingProgressExportDocument

The whole export: one user's reading state, self-describing enough to be matched back against a differently organised library.

exportedAtstring<date-time>required
formatstringrequired
Example: codex-reading-progress
includesSessionsbooleanrequired
series object[]
  • Array [
  • books object[]
  • Array [
  • completions object[]
  • Array [
  • completedAtstring<date-time>required
    idstring<uuid>required
    startedAtstring<date-time>required
  • ]
  • fileHashstring

    Empty when the book was never analyzed; never treated as a value to match on in that case.

    fileNamestringrequired
    Example: v01.cbz
    partialHashstring
    pathstringrequired

    Relative to the series folder, so a series move does not invalidate it.

    Example: Vol 01/v01.cbz
    progress object

    The live resume position for one book. Retains r2_progression: it is the only place the EPUB locator survives, since sessions strip it.

    completedbooleanrequired
    completedAt(string | null)<date-time>nullable
    currentPageinteger<int32>required
    progressPercentage(number | null)<double>nullable
    r2Progressionstring | nullnullable
    startedAtstring<date-time>required
    updatedAtstring<date-time>required
    sessions object[]

    Omitted entirely (not an empty array) when the export was taken with includeSessions=false.

  • Array [
  • activeDurationMs(integer | null)<int64>nullable
    clientEndedAtstring<date-time>required
    clientStartedAtstring<date-time>required
    deviceIdstringrequired
    deviceNamestring | nullnullable
    durationSourcestringrequired

    "measured", "inferred", or "unknown".

    Example: measured
    idstring<uuid>required
    kindstringrequired

    "progress", "completed", or "reset".

    Example: progress
    pagesRead(integer | null)<int32>nullable
    passinteger<int32>required
    serverRecordedAtstring<date-time>required
    toPage(integer | null)<int32>nullable
    toPercentage(number | null)<double>nullable
  • ]
  • ]
  • externalIds object[]
  • Array [
  • idstringrequired
    Example: 12345
    sourcestringrequired

    plugin:<name>, comicinfo, epub, or manual.

    Example: plugin:mangabaka
  • ]
  • libraryRelativePathstringrequired

    The series path as stored, relative to the library root.

    Example: shonen/Naruto
    namestringrequired
    Example: Naruto
    notesstring | nullnullable
    rating(integer | null)<int32>nullable
    ratingUpdatedAt(string | null)<date-time>nullable

    When the rating was last changed. The newest conflict policy needs it to tell a stale rating from a fresh one; a file without it never overwrites an existing rating except under overwrite.

  • ]
  • versioninteger<int32>required
    Example: 1
    ReadingProgressExportDocument
    {
    "exportedAt": "2024-07-29T15:51:28.071Z",
    "format": "codex-reading-progress",
    "includesSessions": true,
    "series": [
    {
    "books": [
    {
    "completions": [
    {
    "completedAt": "2024-07-29T15:51:28.071Z",
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "startedAt": "2024-07-29T15:51:28.071Z"
    }
    ],
    "fileHash": "string",
    "fileName": "v01.cbz",
    "partialHash": "string",
    "path": "Vol 01/v01.cbz",
    "progress": {
    "completed": true,
    "completedAt": "2024-07-29T15:51:28.071Z",
    "currentPage": 0,
    "progressPercentage": 0,
    "r2Progression": "string",
    "startedAt": "2024-07-29T15:51:28.071Z",
    "updatedAt": "2024-07-29T15:51:28.071Z"
    },
    "sessions": "Unknown Type: array,null"
    }
    ],
    "externalIds": [
    {
    "id": "12345",
    "source": "plugin:mangabaka"
    }
    ],
    "libraryRelativePath": "shonen/Naruto",
    "name": "Naruto",
    "notes": "string",
    "rating": 0,
    "ratingUpdatedAt": "2024-07-29T15:51:28.071Z"
    }
    ],
    "version": 1
    }