Publications

11
GET/v1/publicationsGet all publications.

Parameters

NameTypeDescriptionRequired
limitintegerMaximum number of resources to return. Must be between 1 and 50.No
nextTokenstringOpaque continuation token returned by the previous page.No
searchstringQuerystring parameter.No
collectionIdstringQuerystring parameter.No
statusesstringQuerystring parameter.No
formatsstringQuerystring parameter.No
sortBystringQuerystring parameter.No
sortDirectionstringQuerystring parameter.No

Request Body Fields

NameTypeOptionsRequired
limit
numberAnyNo
nextToken
stringAnyNo
search
stringAnyNo
collectionId
stringAnyNo
statuses
enum[]
draftlive
No
formats
enum[]
epub-reflowableepub-fixedpdfaudio
No
sortBy
enum
titleauthorcreatedAtIso
No
sortDirection
enum
ascdesc
No
curl -X GET "https://api.cirrusreader.com/v1/publications" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Response Body Fields

NameTypeOptionsRequired
items
object[]AnyYes
defaultPublicationId
stringAnyYes
stats
objectAnyNo
nextToken
stringAnyNo
context
objectAnyYes

Response 200

Publications were fetched successfully.

{
  "items": [
    {
      "title": "string",
      "author": [
        "string"
      ],
      "type": "EPUB",
      "isReflowable": true,
      "status": "draft",
      "uploadStatus": "upload_pending",
      "currentEditionId": "string",
      "publicationId": "string",
      "cover": "string",
      "createdAtIso": "2026-04-29T10:00:00.000Z",
      "collectionIds": [
        "string"
      ]
    }
  ],
  "defaultPublicationId": "string",
  "stats": {
    "publicationCount": 1,
    "publicationEditionCount": 1,
    "months": {
      "key": "value"
    }
  },
  "nextToken": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
POST/v1/publication-uploadsCreate an upload intent for a publication or publication edition.

Request Body Fields

NameTypeOptionsRequired
uploadRequestId
uuidAnyYes
publicationFilename
stringAnyYes
coverFilename
stringAnyNo
publicationType
enum
EPUBPDFAudio
Yes
curl -X POST "https://api.cirrusreader.com/v1/publication-uploads" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "uploadRequestId": "00000000-0000-4000-8000-000000000000",
  "publicationFilename": "string",
  "publicationType": "EPUB"
}'

Request Body

application/json

{
  "uploadRequestId": "00000000-0000-4000-8000-000000000000",
  "publicationFilename": "string",
  "publicationType": "EPUB"
}

Response Body Fields

NameTypeOptionsRequired
result
objectAnyYes
context
objectAnyYes

Response 201

The publication upload intent was created successfully.

{
  "result": {
    "uploadRequestId": "00000000-0000-4000-8000-000000000000",
    "uploadMode": "single",
    "cover": {
      "objectKey": "string",
      "uploadUrl": "string",
      "expiresIn": 1,
      "requiredHeaders": {
        "Content-Type": "string"
      }
    },
    "objectKey": "string",
    "uploadUrl": "string",
    "expiresIn": 1,
    "requiredHeaders": {
      "Content-Type": "string"
    }
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 500

The request body or parameters failed validation.

{
  "error": "DB_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
POST/v1/publicationsCreate a publication and upload session.

Request Body Fields

NameTypeOptionsRequired
language
string | enum
EnglishFrenchGermanItalianSpanish
No
description
stringAnyNo
sampleItems
string[]AnyNo
isForInternalReadingInstance
booleanAnyNo
uploadRequestId
uuidAnyYes
publicationFilename
stringAnyYes
coverFilename
stringAnyNo
collectionIds
string[]AnyNo
edition
objectAnyYes
curl -X POST "https://api.cirrusreader.com/v1/publications" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "uploadRequestId": "00000000-0000-4000-8000-000000000000",
  "publicationFilename": "string",
  "edition": {
    "title": "string",
    "author": [
      "string"
    ],
    "metadata": {},
    "type": "EPUB"
  }
}'

Request Body

application/json

{
  "uploadRequestId": "00000000-0000-4000-8000-000000000000",
  "publicationFilename": "string",
  "edition": {
    "title": "string",
    "author": [
      "string"
    ],
    "metadata": {},
    "type": "EPUB"
  }
}

Response Body Fields

NameTypeOptionsRequired
item
objectAnyYes
context
objectAnyYes

Response 201

The publication upload session was created successfully.

{
  "item": {
    "id": "string",
    "language": "string",
    "description": "string",
    "sampleItems": [
      "string"
    ],
    "isForInternalReadingInstance": true,
    "editions": [
      {
        "id": "string",
        "type": "EPUB",
        "isReflowable": true,
        "editionCreated": "2026-04-29T10:00:00.000Z",
        "title": "string",
        "titleSource": "user",
        "author": [
          "string"
        ],
        "version": 1,
        "isCurrentVersion": true,
        "status": "draft",
        "editionNotes": "string",
        "key": "string",
        "uploadStatus": "upload_pending",
        "metadata": {
          "pageCount": "string",
          "fileSize": "string",
          "epubVersion": "string",
          "spreadBehaviour": "AUTO",
          "layoutType": "REFLOWABLE",
          "cover": "string",
          "coverImageAlt": "string",
          "isbn": "string",
          "publisher": "string"
        },
        "navigationData": [
          {
            "collectionType": "TOC",
            "collectionIndex": 1,
            "navigationItemId": 1,
            "title": "string",
            "depth": 1,
            "path": [
              1
            ],
            "pathKey": "string"
          }
        ]
      }
    ]
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 500

The request body or parameters failed validation.

{
  "error": "DB_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
GET/v1/publications/{id}Get publication by id

Parameters

NameTypeDescriptionRequired
idstringPath parameter.Yes

Request Body Fields

NameTypeOptionsRequired
id
stringAnyYes
curl -X GET "https://api.cirrusreader.com/v1/publications/ID" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Response Body Fields

NameTypeOptionsRequired
item
objectAnyYes
context
objectAnyYes

Response 200

Publication fetched successfully.

{
  "item": {
    "id": "string",
    "language": "string",
    "description": "string",
    "sampleItems": [
      "string"
    ],
    "isForInternalReadingInstance": true,
    "editions": [
      {
        "id": "string",
        "type": "EPUB",
        "isReflowable": true,
        "editionCreated": "2026-04-29T10:00:00.000Z",
        "title": "string",
        "titleSource": "user",
        "author": [
          "string"
        ],
        "version": 1,
        "isCurrentVersion": true,
        "status": "draft",
        "editionNotes": "string",
        "key": "string",
        "uploadStatus": "upload_pending",
        "metadata": {
          "pageCount": "string",
          "fileSize": "string",
          "epubVersion": "string",
          "spreadBehaviour": "AUTO",
          "layoutType": "REFLOWABLE",
          "cover": "string",
          "coverImageAlt": "string",
          "isbn": "string",
          "publisher": "string"
        },
        "navigationData": [
          {
            "collectionType": "TOC",
            "collectionIndex": 1,
            "navigationItemId": 1,
            "title": "string",
            "depth": 1,
            "path": [
              1
            ],
            "pathKey": "string"
          }
        ]
      }
    ]
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 404

The requested API key could not be found.

{
  "error": "EMPTY_RESPONSE",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
PATCH/v1/publications/{id}Update a publication.

Parameters

NameTypeDescriptionRequired
idstringPath parameter.Yes

Request Body Fields

NameTypeOptionsRequired
language
string | enum
EnglishFrenchGermanItalianSpanish
No
description
stringAnyNo
sampleItems
string[]AnyNo
isForInternalReadingInstance
booleanAnyNo
curl -X PATCH "https://api.cirrusreader.com/v1/publications/ID" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Response Body Fields

NameTypeOptionsRequired
item
objectAnyYes
context
objectAnyYes

Response 200

The publication was updated successfully.

{
  "item": {
    "id": "string",
    "language": "string",
    "description": "string",
    "sampleItems": [
      "string"
    ],
    "isForInternalReadingInstance": true,
    "editions": [
      {
        "id": "string",
        "type": "EPUB",
        "isReflowable": true,
        "editionCreated": "2026-04-29T10:00:00.000Z",
        "title": "string",
        "titleSource": "user",
        "author": [
          "string"
        ],
        "version": 1,
        "isCurrentVersion": true,
        "status": "draft",
        "editionNotes": "string",
        "key": "string",
        "uploadStatus": "upload_pending",
        "metadata": {
          "pageCount": "string",
          "fileSize": "string",
          "epubVersion": "string",
          "spreadBehaviour": "AUTO",
          "layoutType": "REFLOWABLE",
          "cover": "string",
          "coverImageAlt": "string",
          "isbn": "string",
          "publisher": "string"
        },
        "navigationData": [
          {
            "collectionType": "TOC",
            "collectionIndex": 1,
            "navigationItemId": 1,
            "title": "string",
            "depth": 1,
            "path": [
              1
            ],
            "pathKey": "string"
          }
        ]
      }
    ]
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 500

The request body or parameters failed validation.

{
  "error": "DB_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
DELETE/v1/publications/{id}Delete publication by id

Parameters

NameTypeDescriptionRequired
idstringPath parameter.Yes
curl -X DELETE "https://api.cirrusreader.com/v1/publications/ID" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Response Body Fields

NameTypeOptionsRequired
item
objectAnyYes
context
objectAnyYes

Response 200

Publication deleted successfully.

{
  "item": {
    "id": "string",
    "language": "string",
    "description": "string",
    "sampleItems": [
      "string"
    ],
    "isForInternalReadingInstance": true,
    "editions": [
      {
        "id": "string",
        "type": "EPUB",
        "isReflowable": true,
        "editionCreated": "2026-04-29T10:00:00.000Z",
        "title": "string",
        "titleSource": "user",
        "author": [
          "string"
        ],
        "version": 1,
        "isCurrentVersion": true,
        "status": "draft",
        "editionNotes": "string",
        "key": "string",
        "uploadStatus": "upload_pending",
        "metadata": {
          "pageCount": "string",
          "fileSize": "string",
          "epubVersion": "string",
          "spreadBehaviour": "AUTO",
          "layoutType": "REFLOWABLE",
          "cover": "string",
          "coverImageAlt": "string",
          "isbn": "string",
          "publisher": "string"
        },
        "navigationData": [
          {
            "collectionType": "TOC",
            "collectionIndex": 1,
            "navigationItemId": 1,
            "title": "string",
            "depth": 1,
            "path": [
              1
            ],
            "pathKey": "string"
          }
        ]
      }
    ]
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 404

The requested API key could not be found.

{
  "error": "EMPTY_RESPONSE",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
GET/v1/publications/{id}/editionsGet all editions for a publication.

Parameters

NameTypeDescriptionRequired
idstringPath parameter.Yes

Request Body Fields

NameTypeOptionsRequired
id
stringAnyYes
curl -X GET "https://api.cirrusreader.com/v1/publications/ID/editions" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Response Body Fields

NameTypeOptionsRequired
items
object[]AnyYes
context
objectAnyYes

Response 200

Publication editions fetched successfully.

{
  "items": [
    {
      "id": "string",
      "type": "EPUB",
      "isReflowable": true,
      "editionCreated": "2026-04-29T10:00:00.000Z",
      "title": "string",
      "titleSource": "user",
      "author": [
        "string"
      ],
      "version": 1,
      "isCurrentVersion": true,
      "status": "draft",
      "editionNotes": "string",
      "key": "string",
      "uploadStatus": "upload_pending",
      "metadata": {
        "pageCount": "string",
        "fileSize": "string",
        "epubVersion": "string",
        "spreadBehaviour": "AUTO",
        "layoutType": "REFLOWABLE",
        "cover": "string",
        "coverImageAlt": "string",
        "isbn": "string",
        "publisher": "string"
      },
      "navigationData": [
        {
          "collectionType": "TOC",
          "collectionIndex": 1,
          "navigationItemId": 1,
          "title": "string",
          "depth": 1,
          "path": [
            1
          ],
          "pathKey": "string"
        }
      ]
    }
  ],
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
POST/v1/publications/{id}/editionsCreate an edition for a publication and upload session.

Parameters

NameTypeDescriptionRequired
idstringPath parameter.Yes

Request Body Fields

NameTypeOptionsRequired
language
string | enum
EnglishFrenchGermanItalianSpanish
No
description
stringAnyNo
sampleItems
string[]AnyNo
isForInternalReadingInstance
booleanAnyNo
uploadRequestId
uuidAnyYes
publicationFilename
stringAnyYes
coverFilename
stringAnyNo
collectionIds
string[]AnyNo
edition
objectAnyYes
curl -X POST "https://api.cirrusreader.com/v1/publications/ID/editions" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "uploadRequestId": "00000000-0000-4000-8000-000000000000",
  "publicationFilename": "string",
  "edition": {
    "title": "string",
    "author": [
      "string"
    ],
    "metadata": {},
    "type": "EPUB"
  }
}'

Request Body

application/json

{
  "uploadRequestId": "00000000-0000-4000-8000-000000000000",
  "publicationFilename": "string",
  "edition": {
    "title": "string",
    "author": [
      "string"
    ],
    "metadata": {},
    "type": "EPUB"
  }
}

Response Body Fields

NameTypeOptionsRequired
item
objectAnyYes
context
objectAnyYes

Response 201

The publication edition upload session was created successfully.

{
  "item": {
    "id": "string",
    "language": "string",
    "description": "string",
    "sampleItems": [
      "string"
    ],
    "isForInternalReadingInstance": true,
    "editions": [
      {
        "id": "string",
        "type": "EPUB",
        "isReflowable": true,
        "editionCreated": "2026-04-29T10:00:00.000Z",
        "title": "string",
        "titleSource": "user",
        "author": [
          "string"
        ],
        "version": 1,
        "isCurrentVersion": true,
        "status": "draft",
        "editionNotes": "string",
        "key": "string",
        "uploadStatus": "upload_pending",
        "metadata": {
          "pageCount": "string",
          "fileSize": "string",
          "epubVersion": "string",
          "spreadBehaviour": "AUTO",
          "layoutType": "REFLOWABLE",
          "cover": "string",
          "coverImageAlt": "string",
          "isbn": "string",
          "publisher": "string"
        },
        "navigationData": [
          {
            "collectionType": "TOC",
            "collectionIndex": 1,
            "navigationItemId": 1,
            "title": "string",
            "depth": 1,
            "path": [
              1
            ],
            "pathKey": "string"
          }
        ]
      }
    ]
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 500

The request body or parameters failed validation.

{
  "error": "DB_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
GET/v1/publications/{id}/editions/{editionid}Get edition by ID for a publication.

Parameters

NameTypeDescriptionRequired
idstringPath parameter.Yes
editionidstringPath parameter.Yes
curl -X GET "https://api.cirrusreader.com/v1/publications/ID/editions/EDITIONID" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Response Body Fields

NameTypeOptionsRequired
item
objectAnyYes
context
objectAnyYes

Response 200

Publication edition fetched successfully.

{
  "item": {
    "id": "string",
    "type": "EPUB",
    "isReflowable": true,
    "editionCreated": "2026-04-29T10:00:00.000Z",
    "title": "string",
    "titleSource": "user",
    "author": [
      "string"
    ],
    "version": 1,
    "isCurrentVersion": true,
    "status": "draft",
    "editionNotes": "string",
    "key": "string",
    "uploadStatus": "upload_pending",
    "metadata": {
      "pageCount": "string",
      "fileSize": "string",
      "epubVersion": "string",
      "spreadBehaviour": "AUTO",
      "layoutType": "REFLOWABLE",
      "cover": "string",
      "coverImageAlt": "string",
      "isbn": "string",
      "publisher": "string"
    },
    "navigationData": [
      {
        "collectionType": "TOC",
        "collectionIndex": 1,
        "navigationItemId": 1,
        "title": "string",
        "depth": 1,
        "path": [
          1
        ],
        "pathKey": "string"
      }
    ]
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
PATCH/v1/publications/{id}/editions/{editionid}Update an edition for a publication.

Parameters

NameTypeDescriptionRequired
idstringPath parameter.Yes
editionidstringPath parameter.Yes

Request Body Fields

NameTypeOptionsRequired
isReflowable
booleanAnyNo
title
stringAnyNo
author
string[]AnyNo
status
enum
draftlive
No
isCurrentVersion
booleanAnyNo
editionNotes
stringAnyNo
metadata
objectAnyNo
coverFilename
stringAnyNo
curl -X PATCH "https://api.cirrusreader.com/v1/publications/ID/editions/EDITIONID" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"

Response Body Fields

NameTypeOptionsRequired
item
objectAnyYes
result
objectAnyNo
context
objectAnyYes

Response 200

Publication editions fetched successfully.

{
  "item": {
    "id": "string",
    "type": "EPUB",
    "isReflowable": true,
    "editionCreated": "2026-04-29T10:00:00.000Z",
    "title": "string",
    "titleSource": "user",
    "author": [
      "string"
    ],
    "version": 1,
    "isCurrentVersion": true,
    "status": "draft",
    "editionNotes": "string",
    "key": "string",
    "uploadStatus": "upload_pending",
    "metadata": {
      "pageCount": "string",
      "fileSize": "string",
      "epubVersion": "string",
      "spreadBehaviour": "AUTO",
      "layoutType": "REFLOWABLE",
      "cover": "string",
      "coverImageAlt": "string",
      "isbn": "string",
      "publisher": "string"
    },
    "navigationData": [
      {
        "collectionType": "TOC",
        "collectionIndex": 1,
        "navigationItemId": 1,
        "title": "string",
        "depth": 1,
        "path": [
          1
        ],
        "pathKey": "string"
      }
    ]
  },
  "result": {
    "cover": {
      "objectKey": "string",
      "uploadUrl": "string",
      "expiresIn": 1,
      "requiredHeaders": {
        "Content-Type": "string"
      }
    }
  },
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 500

The request body or parameters failed validation.

{
  "error": "DB_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}
POST/v1/publications/bulkPerform a batch operation for Publications.

Request Body Fields

NameTypeOptionsRequired
operation
"deletePublications" | "createPublications"
deletePublicationscreatePublications
Yes
params
objectAnyYes
curl -X POST "https://api.cirrusreader.com/v1/publications/bulk" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "operation": "deletePublications",
  "params": {
    "publicationIds": [
      "string"
    ]
  }
}'

Request Body

application/json

{
  "operation": "deletePublications",
  "params": {
    "publicationIds": [
      "string"
    ]
  }
}

Response Body Fields

NameTypeOptionsRequired
status
enum
okfail
Yes
context
objectAnyYes

Response 201

The batch operation completed successfully.

{
  "status": "ok",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string",
    "authentication": {
      "requestId": "string",
      "authType": "apiKey",
      "sub": "string",
      "email": "string",
      "groups": "string",
      "keyId": "string",
      "organisationId": "string",
      "errorCode": "string",
      "error": "string",
      "user": {
        "id": "string",
        "sub": "string",
        "firstName": "string",
        "lastName": "string",
        "email": "string",
        "role": "Admin",
        "status": "Active",
        "onboarded": true,
        "userImage": "string",
        "billing": {
          "planId": "starter",
          "status": "incomplete",
          "billingAccessStatus": "enabled",
          "billingGracePeriodEndIso": "2026-04-29T10:00:00.000Z",
          "billingInterval": "month",
          "trialEndIso": "2026-04-29T10:00:00.000Z",
          "currentPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "cancelAtPeriodEnd": true,
          "publicationLimit": 1,
          "monthlyBandwidthLimitBytes": "string",
          "bandwidthPeriodStartIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodEndIso": "2026-04-29T10:00:00.000Z",
          "bandwidthPeriodUsedBytes": "string",
          "bandwidthPeriodCalculatedThroughIso": "2026-04-29T10:00:00.000Z",
          "bandwidthAccessStatus": "enabled"
        }
      },
      "scopeId": "string"
    }
  }
}

Error Responses

Response 400

The request body or parameters failed validation.

{
  "error": "QL_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  },
  "details": [
    {
      "message": "string"
    }
  ]
}

Response 401

The request is missing valid authentication credentials.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 403

The authenticated user is not allowed to access this resource.

{
  "error": "AUTHENTICATION_ERROR",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}

Response 405

The request method is not supported.

{
  "error": "UNSUPPORTED_METHOD",
  "message": "string",
  "context": {
    "path": "string",
    "method": "string",
    "requestId": "string"
  }
}