Tolino cloud API documentation

Servers the Tolino Vision 3/4 HD talk to (Firmware 14.x).

Work in progress.

Contents

General information

Headers

User-Agent

Normal API requests:

Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)

The browser:

Mozilla/5.0 (Linux; Android 4.4.2; en-; tolino vision 3 HD/14.1.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Mobile Safari/537.36 READER OS_BUILD/KOT49H.41429.1044823

bosh v1 header set

Headers common in all HTTP requests to https://bosh.pageplace.de/bosh/rest/... (except ../rest/v2/).

t_auth_token

OAuth token obtained from POST https://thalia.de/auth/oauth2/token.

Example: eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...

Accept

Example: application/json; charset=UTF-8

m_id

Probably the reseller ID

Example: 3

hardware_id

Serial number of the ebook reader.

Second part of the serial number that can be obtained via shell:

$ getprop ro.serialno
60239815,665fc389ef4e47258c5db9fa7821bd19

Example: 665fc389ef4e47258c5db9fa7821bd19

Content-Type

application/json; charset=UTF-8

Always set even if there is no request body.

client_type

Example: TOLINO_VISION_3

client_version

Example: 14.1.0

family v1 header set

Authorization

OAuth token obtained from POST https://thalia.de/auth/oauth2/token.

Example: Bearer eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...

Accept

Example: application/json; charset=UTF-8

Accept-Encoding

gzip

m_id

Probably reseller ID.

Example: 3

Hardware-Id

Serial number of the ebook reader.

Second part of the serial number that can be obtained via shell:

$ getprop ro.serialno
60239815,665fc389ef4e47258c5db9fa7821bd19

Example: 665fc389ef4e47258c5db9fa7821bd19

Content-Type

application/json; charset=UTF-8

Always set even if there is no request body.

client_type

Example: TOLINO_VISION_3

client_version

Example: 14.1.0

Reseller-Id

Example: 3

Cookie

Multiple times:

  • OAUTH-JSESSIONID=3EFAEC6B69D811252C75861880C338AB.15acdb90; Path=/; Secure; HttpOnly

  • JSESSIONID=C0D8A077F6D2E13251ECDCD60FE6D18A

Cookie2

Example: $Version=1

Domains

Domains that are used by the Tolino Vision 3 HD.

Buch.de

auth.buch.de

FIXME

Google

clients3.google.com

Check if the internet is reachable

MyTolino.com

management.mytolino.com
  • List of resellers

  • eInk handshake (FIXME)

Pageplace

bosh.pageplace.de

"bosh" could be short name for "BOokSHelf"

  • ping

  • reseller configuration

  • current time

  • sync main data (books, reading status, notes)

  • ebook upload

  • ebook cover upload

cdp.pageplace.de
  • Book images?

  • Book downloads

family.pageplace.de

Family sharing

inventory.pageplace.de

FIXME

Official documentation

https://bosh.pageplace.de/bosh/doc

Needs HTTP basic auth username + password

Identifiers

Publication ID

A book has an identifier, for example DT0400.9783641267575_A39529579.

The API uses publicationId and pubid as names.

It consists of several parts:

  • Prefix DT

  • four-letter order ID 0400

  • ISBN-13 9783641267575

  • unknown suffix A39529579

Excerpt from Analyse verbreiteter Anwendungen zum Lesen von elektronischen Büchern:

Der Aufbau des Wertes der Variable path erläutern wir anhand eines Beispiels:

/publications/DT<BESTELLUNG>.<ISBN-13>/bookmark/<VAR>

Hierbei handelt es sich bei BESTELLUNG um eine vierstellige Zahl, welche bei allen Büchern, die innerhalb des selben Bestellvorgangs gekauft wurden, identisch ist. Dies wurde mit mehreren Bestellungen von fünf, drei bzw. einem Buch nachvollzogen.

Use cases

Setup process

Initial setup of a factory-reset e-reader.

Prelude

  1. Check if the internet is reachable: GET http://clients3.google.com/generate_204

  2. Check if the internet is really reachable: GET http://mytolino.com/tolino-status.html?responseStatus=204

  3. Check if the internet is really really reachable: GET http://bosh.pageplace.de/bosh/rest/ping

  4. Check if the internet is really really reachable a second time, just in case: GET http://bosh.pageplace.de/bosh/rest/ping

Actual requests

  1. Get list of allowed countries for the reader: GET https://bosh.pageplace.de/bosh/rest/reseller/countries

  2. Get list of selectable book shops: GET https://bosh.pageplace.de/bosh/rest/reseller/selection

  3. Notify tolino about the selected shop: POST https://bosh.pageplace.de/bosh/rest/reseller/selection/report

  4. Fetch the tolino configuration for the shop: GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig

  5. FIXME

Login process

The user-facing stuff happens in the web browser.

  1. Fetch URL of login page: GET https://thalia.de/auth/oauth2/authorize

  2. Show login page with username + password form

  3. Redirect to internal e-book reader login with code.

    Example redirect: Location: epublishing://login?code=GK6jDC

  4. Request OAuth access token: POST https://thalia.de/auth/oauth2/token

  5. Check if the device has been registered already: GET https://bosh.pageplace.de/bosh/rest/userid/xxx

  6. Register the device to the user: POST https://bosh.pageplace.de/bosh/rest/v2/registerhw

  7. Run the Sync process

Sync process

The user presses the synchronization button on the "My books" screen.

  1. Check if the device is online: GET http://bosh.pageplace.de/bosh/rest/ping

  2. Fetch the reseller configuration: GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig

  3. Fetch the number of books/items in the cloud: GET https://bosh.pageplace.de/bosh/rest/inventory/count

  4. Fetch cloud book information: GET https://inventory.pageplace.de/v2/inventory

  5. Fetch the current date/time: GET https://bosh.pageplace.de/bosh/rest/time

  6. Fetch changes since last sync: PATCH https://bosh.pageplace.de/bosh/rest/sync-data

  7. Get list of resellers: GET https://bosh.pageplace.de/bosh/rest/handshake/resellers

  8. Fetch advertisements for the main screen: GET https://bosh.pageplace.de/bosh/rest/recommendation/xyz

  9. Fetch family membership information: GET https://family.pageplace.de/v1/myself

When the user is part of a family:

  1. Fetch list of available dictionaries: GET https://bosh.pageplace.de/bosh/rest/dictionary/list

  2. Fetch list of family members: GET https://family.pageplace.de/v1/family

  3. Fetch list of shared books: GET https://family.pageplace.de/v1/shares

FIXME: What happens if the inventory count is 0? Is the inventory not fetched then?

FIXME: What happens if there is only one family member? Is the list of shared books fetched then?

Upload process

The user wants to upload a book on the reader to the cloud.

  1. Upload the epub file: POST https://bosh.pageplace.de/bosh/rest/upload

  2. Upload the cover image: POST https://bosh.pageplace.de/bosh/rest/cover

  3. Fetch the number of books in the cloud: GET https://bosh.pageplace.de/bosh/rest/inventory/count

  4. Fetch the current date/time: GET https://bosh.pageplace.de/bosh/rest/time

  5. Fetch changes since last sync: PATCH https://bosh.pageplace.de/bosh/rest/sync-data

Some time later:

  1. Download the cover of the uploaded book: GET https://bosh.pageplace.de/bosh/rest/cover/xxx/yyy

API calls

GET https://bosh.pageplace.de/bosh/rest/cloud/downloadinfo

Get information where to download a book from the cloud.

This is fetched when the reader shows a book available in the cloud but has not been downloaded onto the reader. Requesting the download first fetches this URL, then the contentUrl is downloaded via GET https://bosh.pageplace.de/bosh/rest/content/xxx/yyy.

Step 1 of the download process.

Request

Header

See bosh v1 header set

Path parts

Example of a full path: https://bosh.pageplace.de/bosh/rest/cloud/downloadinfo/Ym9zaF8zXzM5NTQ5MDEzNTEzMTE3NTc3NDgwODE5ODk2NQ/Ym9zaF8zXzM5NTQ5MDEzNTEzMTE3NTc3NDgwODE5ODk2NQ/type/ANDROID_GK_6

FIXME: What are those parts? How to calculate them?

Response

HTTP status code: 200 OK

Download info with file size, URL and MIME type.

Example:

{
    "DownloadInfo": {
        "cf1": null,
        "cf2": null,
        "contentUrl": "https://bosh.pageplace.de/bosh/rest/content/bf70563e-2d57-41a7-89d3-023f0c8cc650/MacBest+by+Pratchett+Terry.epub",
        "fileSize": 334528,
        "format": "application/epub+zip",
        "location": "bosh"
    }
}

GET https://bosh.pageplace.de/bosh/rest/content/xxx/yyy

Download a book from the cloud.

The URL is obtained from GET https://bosh.pageplace.de/bosh/rest/cloud/downloadinfo.

Step 2 of the download process.

Request

Header

Parts of the bosh v1 header set:

hardware_id

m_id

t_auth_token

Path parts

Example of a full path: https://bosh.pageplace.de/bosh/rest/content/bf70563e-2d57-41a7-89d3-023f0c8cc650/MacBest+by+Pratchett+Terry.epub

xxx

Some kind of UUID.

yyy

Human-readable file name

Response

HTTP status code: 200 OK

ebook file content.

Error response: Header missing

HTTP/1.1 400 Bad Request

{
    "ResponseInfo": {
        "serviceName": "generic[*]",
        "responseStatus": -113,
        "message": "m_id-Header is missing.",
        "requestId": "0a761034-72f0-4693-a388-990592d08482"
    }
}

POST https://bosh.pageplace.de/bosh/rest/content/delete

Delete a book from the cloud.

Request

Headers

See bosh v1 header set

Request body
contentDeleteRequest
content

Array of objects with a deliverableId property

deleteAll

true or false (Only true observed yet)

Example:

{
  "contentDeleteRequest": {
    "deleteAll": true,
    "content": [
      {
        "deliverableId": "bosh_3_395490135492823841139311838"
      }
    ]
  }
}

Response

HTTP status code: 200 OK.

No content.

POST https://bosh.pageplace.de/bosh/rest/cover

Upload the cover for an uploaded .epub file.

Step 2 of the upload process.

Request

Header
Content-Type

multipart/form-data; boundary="Boundary1612163626238"

Request body
Control data
Header

Content-Disposition: form-data; name="control"

Content

JSON {"filesize":334499,"transactionId":"84401550-d933-4f12-b168-87421835bada"}

The transaction ID is different than the one for the epub upload.

File data
Header

Content-Disposition: form-data; name="file"; filename="1092560016"

Content

Binary cover image contents

Book reference
Header

Content-Disposition: form-data; name="deliverableId"

Content

deliverableId of the epub upload response.

Example: bosh_3_395490135492823841139311838

Response

HTTP status code: 200 OK.

Meta data entry for the uploaded cover.

Example:

{
    "ResponseInfo": {
        "message": "Cover uploaded successfully.",
        "requestId": "41d3243f-6d7a-489a-8d98-b3f7f55cb794",
        "responseStatus": 317,
        "serviceName": "cover[POST]"
    }
}

GET https://bosh.pageplace.de/bosh/rest/cover/xxx/yyy

Fetch the cover for a manually uploaded book.

Part of the upload process.

Request

Only three headers. Unusual.

Full URL example: https://bosh.pageplace.de/bosh/rest/cover/39549013/bosh_3_395490135492823841139311838?size=WS-B04

URL path parts
xxx

8 bytes of the publication ID

Example: 39549013

yyy

Publication ID

Example: bosh_3_395490135492823841139311838

Header
m_id

Maybe reseller ID?

Example: 3

Host

bosh.pageplace.de

Connection

Keep-Alive

GET parameters
size

Image size (so we get a scaled version)

Known values:

  • WS-B04

Response

HTTP status code: 200 OK.

Binary cover image data.

GET https://bosh.pageplace.de/bosh/rest/dictionary/list

Fetch the list of downloadable dictionaries.

Part of the sync process.

Request

Headers

See bosh v1 header set

No request body.

Response

HTTP status code 200 OK.

Example:

{
  "dictionaryListResponse": {
    "dictionaryEntries": [
      {
        "id": 15,
        "filename": "EN-IT.quickdic",
        "file_sha1": "bf31e5d240e8c044c11b0e338fe520648d701dec",
        "download_url": "https://download.pageplace.de/dictionary/EN-IT.quickdic.zip",
        "file_size": 107805685,
        "language_from": "EN",
        "language_to": "IT",
        "last_modified": 1470058728000,
        "created": 1416587670000
      },
      {
        "id": 16,
        "filename": "IT-ES.quickdic",
        "file_sha1": "8d891665a0f3f894fe7f8565cedd301c7e92095f",
        "download_url": "https://download.pageplace.de/dictionary/IT-ES.quickdic.zip",
        "file_size": 706110,
        "language_from": "IT",
        "language_to": "ES",
        "last_modified": 1416587671000,
        "created": 1416587671000
      },
      {
        "id": 17,
        "filename": "IT-FR.quickdic",
        "file_sha1": "fd0e84f7273ed8642f2ca1b55dc679607245b068",
        "download_url": "https://download.pageplace.de/dictionary/IT-FR.quickdic.zip",
        "file_size": 700760,
        "language_from": "IT",
        "language_to": "FR",
        "last_modified": 1416587672000,
        "created": 1416587672000
      },
      {
        "id": 1410196761,
        "filename": "FR.quickdic",
        "file_sha1": "beee10118cfd6ee32542a3a5eee7a71a3007e798",
        "download_url": "https://download.pageplace.de/dictionary/FR.quickdic.zip",
        "file_size": 116064083,
        "language_from": "FR",
        "language_to": null,
        "last_modified": 1391428950000,
        "created": 1384855786000
      },
      {
        "id": 1410196762,
        "filename": "ES.quickdic",
        "file_sha1": "7f994be6876686dd0a4432060266b0c4dbfb41db",
        "download_url": "https://download.pageplace.de/dictionary/ES.quickdic.zip",
        "file_size": 53858404,
        "language_from": "ES",
        "language_to": null,
        "last_modified": 1384855788000,
        "created": 1384855788000
      },
      {
        "id": 8,
        "filename": "DE.quickdic",
        "file_sha1": "dedc33464bfd0a34ee401dba6e3c8856f3219634",
        "download_url": "https://download.pageplace.de/dictionary/DE.quickdic.zip",
        "file_size": 79032764,
        "language_from": "DE",
        "language_to": null,
        "last_modified": 1384855908000,
        "created": 1380285437000
      },
      {
        "id": 9,
        "filename": "NL.quickdic",
        "file_sha1": "8e4fa722779bc5b54089bd85856890ea32d2ab71",
        "download_url": "https://download.pageplace.de/staging/dictionary/NL.quickdic.zip",
        "file_size": 24209379,
        "language_from": "NL",
        "language_to": null,
        "last_modified": 1403259975000,
        "created": 1403259975000
      },
      {
        "id": 10,
        "filename": "DE_NL.quickdic",
        "file_sha1": "2ef65bddb61b6a0ae502e803e456e238671f03a1",
        "download_url": "https://download.pageplace.de/staging/dictionary/DE_NL.quickdic.zip",
        "file_size": 947379,
        "language_from": "DE",
        "language_to": "NL",
        "last_modified": 1403260008000,
        "created": 1403260008000
      },
      {
        "id": 11,
        "filename": "EN_NL.quickdic",
        "file_sha1": "6084cddce46832aea01eb58542a4844a2ae4ee3e",
        "download_url": "https://download.pageplace.de/staging/dictionary/EN_NL.quickdic.zip",
        "file_size": 5687123,
        "language_from": "NL",
        "language_to": "EN",
        "last_modified": 1403260051000,
        "created": 1403260051000
      },
      {
        "id": 12,
        "filename": "FR_NL.quickdic",
        "file_sha1": "88f5974614a98d328930149e1d009b41470c17fb",
        "download_url": "https://download.pageplace.de/staging/dictionary/FR_NL.quickdic.zip",
        "file_size": 3991711,
        "language_from": "NL",
        "language_to": "FR",
        "last_modified": 1403260078000,
        "created": 1403260078000
      },
      {
        "id": 13,
        "filename": "NO_NL.quickdic",
        "file_sha1": "1e20eb807ff5fdf2169d905ce23fa2d74732ffca",
        "download_url": "https://download.pageplace.de/staging/dictionary/NO_NL.quickdic.zip",
        "file_size": 847956,
        "language_from": "NL",
        "language_to": "NO",
        "last_modified": 1403260107000,
        "created": 1403260107000
      },
      {
        "id": 1610761154,
        "filename": "EN-FR.quickdic",
        "file_sha1": "5c419822146d2ad3f941fc2659c4346c53a46f06",
        "download_url": "https://download.pageplace.de/staging/dictionary/EN-FR.quickdic.zip",
        "file_size": 97389181,
        "language_from": "EN",
        "language_to": "FR",
        "last_modified": 1463490158000,
        "created": 1463490158000
      },
      {
        "id": 2,
        "filename": "DE-EN.quickdic",
        "file_sha1": "eab9d5be9fc01a7cb9e689f865febf088bd9f56c",
        "download_url": "https://download.pageplace.de/dictionary/DE-EN.quickdic.zip",
        "file_size": 49376638,
        "language_from": "DE",
        "language_to": "EN",
        "last_modified": 1381395549000,
        "created": null
      },
      {
        "id": 3,
        "filename": "DE-ES.quickdic",
        "file_sha1": "6b26b23ad8658bdffb7d68c54451f36734fde3e2",
        "download_url": "https://download.pageplace.de/dictionary/DE-ES.quickdic.zip",
        "file_size": 2742937,
        "language_from": "DE",
        "language_to": "ES",
        "last_modified": 1381395549000,
        "created": null
      },
      {
        "id": 4,
        "filename": "DE-FR.quickdic",
        "file_sha1": "0f0bb4334b8c5ea21fa3b7063a36943914793746",
        "download_url": "https://download.pageplace.de/dictionary/DE-FR.quickdic.zip",
        "file_size": 12732080,
        "language_from": "DE",
        "language_to": "FR",
        "last_modified": 1381395549000,
        "created": null
      },
      {
        "id": 5,
        "filename": "DE-IT.quickdic",
        "file_sha1": "236b5aae8488ce1b7709f84d7eab1a2d75152405",
        "download_url": "https://download.pageplace.de/dictionary/DE-IT.quickdic.zip",
        "file_size": 8348482,
        "language_from": "DE",
        "language_to": "IT",
        "last_modified": 1381395549000,
        "created": null
      },
      {
        "id": 6,
        "filename": "EN.quickdic",
        "file_sha1": "9b541e02abcb9f2cfe06ae5762dc00f1919c8495",
        "download_url": "https://download.pageplace.de/dictionary/EN.quickdic.zip",
        "file_size": 113927204,
        "language_from": "EN",
        "language_to": null,
        "last_modified": 1381395549000,
        "created": null
      },
      {
        "id": 7,
        "filename": "IT.quickdic",
        "file_sha1": "5970a7ca9bf905693c4138ad0fbbc3b1c0f8c92d",
        "download_url": "https://download.pageplace.de/dictionary/IT.quickdic.zip",
        "file_size": 11566432,
        "language_from": "IT",
        "language_to": null,
        "last_modified": 1416392412000,
        "created": null
      }
    ]
  }
}

GET https://bosh.pageplace.de/bosh/rest/handshake/resellers

Get a list of resellers (book shops) that can be selected when the Tolino reader is unlocked.

It is also used when linking the Tolino to another account on a different book seller. (FIXME: verify)

Part of the sync process.

Request

Header

See bosh v1 header set

Response

HTTP status code 200 OK.

Example:

{
  "resellerListResponse": {
    "resellers": [
      {
        "reseller_id": "81",
        "reseller_name": "eBook.de",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/81/android/81_reseller_logo.png"
      },
      {
        "reseller_id": "80",
        "reseller_name": "myBookShop",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/80/android/80_reseller_logo.png"
      },
      {
        "reseller_id": "30",
        "reseller_name": "buecher.de",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/30/android/30_reseller_logo.png"
      },
      {
        "reseller_id": "90",
        "reseller_name": "IBS.it",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/90/android/90_reseller_logo.png"
      },
      {
        "reseller_id": "23",
        "reseller_name": "OSIANDER",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/23/Android/23_reseller_logo.png"
      },
      {
        "reseller_id": "24",
        "reseller_name": "MAYERSCHE",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/24/android/24_reseller_logo.png"
      },
      {
        "reseller_id": "1",
        "reseller_name": "PagePlace",
        "reseller_connected": false,
        "reseller_logo": "http://www.pageplace.de/media/eink-reader/logo_pageplace_hd.png"
      },
      {
        "reseller_id": "4",
        "reseller_name": "Thalia.at",
        "reseller_connected": false,
        "reseller_logo": "https://images.thalia.de/md4/ereader/Logo-eReading.png"
      },
      {
        "reseller_id": "7",
        "reseller_name": "Buch.ch",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/7/android/7_reseller_logo.png"
      },
      {
        "reseller_id": "11",
        "reseller_name": "Weltbild.at",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/11/android/11_reseller_logo.png"
      },
      {
        "reseller_id": "12",
        "reseller_name": "Weltbild.ch",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/12/android/12_reseller_logo.png"
      },
      {
        "reseller_id": "13",
        "reseller_name": "Hugendubel",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/13/android/13_reseller_logo.png"
      },
      {
        "reseller_id": "3",
        "reseller_name": "Thalia.de",
        "reseller_connected": true,
        "reseller_logo": "https://images.thalia.de/md2/ereader/Logo-eReading.png"
      },
      {
        "reseller_id": "10",
        "reseller_name": "Weltbild.de",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/10/android/10_reseller_logo.png"
      },
      {
        "reseller_id": "8",
        "reseller_name": "Orell Füssli",
        "reseller_connected": false,
        "reseller_logo": "https://images.thalia.de/md37/ereader/Logo-eReading.png"
      },
      {
        "reseller_id": "91",
        "reseller_name": "LIBRACCIO",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/91/android/91_reseller_logo.png"
      },
      {
        "reseller_id": "82",
        "reseller_name": "LIBRIS.NL",
        "reseller_connected": false,
        "reseller_logo": "https://download.pageplace.de/icons_rc/82/android/82_reseller_logo.png"
      }
    ]
  }
}

GET https://bosh.pageplace.de/bosh/rest/inventory/count

Fetch the number of books/items in the cloud storage.

Part of the sync process.

Request

Header

See bosh v1 header set

Response

HTTP status code: 200 OK

Number of books.

Example:

{
    "count": 3
}

GET http://bosh.pageplace.de/bosh/rest/ping

Used to check if the ebook reader is online (internet reachable).

Request

GET Parameters
responseStatus=204

Always there

Headers
User-Agent

Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)

Host

bosh.pageplace.de

Connection

Keep-Alive

Accept-Encoding

gzip

Response

Status Code

204 No Content

GET https://bosh.pageplace.de/bosh/rest/recommendation/xyz

Get advertisements for the main reader screen.

FIXME: Why the xyz in the URL?

Part of the sync process.

Request

Header

See bosh v1 header set

GET parameters
count

Number of recommendations to return

Example: 12

fullShopUrl

true

Response

HTTP status code 200 OK.

Example:

{
  "recommendationResponse": {
    "recommendations": [
      {
        "publicationId": "DT0400.9783751502405_A40541228",
        "description": "Der erste Band der Bridgerton-Serie von Julia Quinn - die Inspiration zur Netflix-Serie! Nichts wünscht die warmherzige Daphne Bridgerton sich mehr, als zu heiraten und Kinder zu bekommen. Dafür schließt sie einen Pakt mit Simon Basset, dem heiratsunwilligen Duke of Hastings: Indem er ihr den Hof macht, erscheint der umschwärmte Aristokrat vergeben. Und Daphne rückt durch das Interesse des Herzogs gesellschaftlich in den Mittelpunkt. Ein prickelndes Spiel, bei dem es nur Sieger zu geben scheint - bis Daphne erkennt, dass nur einem Mann ihr Herz gehört: Simon!",
        "title": "Bridgerton - Der Duke und ich",
        "author": "Julia Quinn",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=149846249&turl=%2Fshop%2Farticle.jsp%3F149846249",
        "cover_url": "https://assets.thalia.media/img/artikel/0ce02217be038330f409a07aa79be644e41d9b85-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783641267575_A39529579",
        "description": "Zwei Frauen auf der Flucht. Eine Entscheidung, die alles verändert. Und kein Weg zurück. New York, Flughafen JFK: Claire soll nach Puerto Rico reisen, um ihren Mann, einen ehrgeizigen Politiker, beim Wahlkampf zu unterstützen. Doch in Wahrheit will sie nichts als fliehen - vor seinen gewalttätigen Übergriffen und der lückenlosen Kontrolle, die er über sie ausübt. Sie kommt mit Eva ins Gespräch, die bei ihrem schwerkranken Mann Sterbehilfe geleistet hat. Zu Hause in Kalifornien erwartet sie die Polizei. Innerhalb weniger Sekunden beschließen sie, die Bordkarten zu tauschen und sich gegenseitig ein neues Leben zu schenken. Erleichtert landet Claire in Kalifornien. In Evas Haus gibt es allerdings keine Hinweise auf einen Ehemann. Dann erfährt sie, dass das Flugzeug nach Puerto Rico abgestürzt ist. Und kurz darauf entdeckt sie die vermeintlich abgestürzte Eva in einer Fernsehreportage über das Unglück. Lebendig. Hat sie die Flucht in das Leben einer Anderen am Ende doch nur in eine Falle gelockt? ",
        "title": "Der Tausch - Zwei Frauen. Zwei Tickets. Und nur ein Ausweg.",
        "author": "Julie Clark",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147900787&turl=%2Fshop%2Farticle.jsp%3F147900787",
        "cover_url": "https://assets.thalia.media/img/artikel/5113d1ed25c611ab7619b4b9d64f735ab4920c7d-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783426439838_A39547289",
        "description": "Wer das Datum seines Todes kennt, hat mit dem Sterben schon begonnen - der neue Bestseller von Sebastian Fitzek! Es ist Samstag, kurz nach 22.00 Uhr. Jules Tannberg sitzt am Begleittelefon. Ein ehrenamtlicher Telefonservice für Frauen, die zu später Stunde auf ihrem Heimweg Angst bekommen und sich einen telefonischen Begleiter wünschen, dessen beruhigende Stimme sie sicher durch die Nacht nach Hause führt - oder im Notfall Hilfe ruft. Noch nie gab es eine wirklich lebensgefährliche Situation. Bis heute, als Jules mit Klara spricht. Die junge Frau hat entsetzliche Angst. Sie glaubt, von einem Mann verfolgt zu werden, der sie schon einmal überfallen hat und der mit Blut ein Datum auf ihre Schlafzimmerwand malte: Klaras Todestag! Und dieser Tag bricht in nicht einmal zwei Stunden an ... Geheimnisvoll, beklemmend, nervenaufreibend. Sebastian Fitzeks bislang unheimlichster Psychothriller.",
        "title": "Der Heimweg",
        "author": "Sebastian Fitzek",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147930114&turl=%2Fshop%2Farticle.jsp%3F147930114",
        "cover_url": "https://assets.thalia.media/img/artikel/165a3878ec433697eb2e7519f4e96b6d29896e54-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783641201968_A40493558",
        "description": "Sieben Sterne umfasst das Sternbild der Plejaden, und die Schwestern d'Aplièse tragen ihre Namen. Stets war ihre siebte Schwester aber ein Rätsel für sie, denn Merope ist verschwunden, seit sie denken können. Eines Tages überbringt der Anwalt der Familie die verblüffende Nachricht, dass er eine Spur entdeckt hat: Ein Weingut in Neuseeland und die Zeichnung eines sternförmigen Rings weisen den Weg. Es beginnt eine Jagd quer über den Globus, denn Mary McDougal - die Frau, die als Einzige bestätigen kann, ob ihre Tochter Mary-Kate die verschwundene Schwester ist - befindet sich auf einer Weltreise. Während die Schwestern ihre Suche nach Neuseeland, Kanada, England, Frankreich und Irland führt, schlüpft ihnen Mary immer wieder durch die Finger. Und es scheint, als wolle sie unbedingt verhindern, gefunden werden ... ",
        "title": "Die verschwundene Schwester",
        "author": "Lucinda Riley",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=149697970&turl=%2Fshop%2Farticle.jsp%3F149697970",
        "cover_url": "https://assets.thalia.media/img/artikel/d72cbd3faa63e6797600e121206703fdb0674945-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783641263140_A40225527",
        "description": "Wenn dich die Angst dein Leben lang verfolgt, weil du zu viel weißt ... Ein wolkenloser Sommertag, die Hitze drückt aufs Land. Im Zug von London nach York zielt ein Fremder mit einer Pistole auf eine Frau. Sie entkommt in letzter Sekunde. Zwei Tage später: Eine junge Frau stürzt mit ihrem Fahrrad, weil jemand einen dünnen Draht über den Weg gespannt hat. Sie ist sofort bewusstlos. Den folgenden Schuss hört sie schon nicht mehr. Die Frauen stehen in keiner Verbindung zueinander, aber die Tatwaffe ist dieselbe. Kate Linville, neu bei der North Yorkshire Police, wird sofort in die Ermittlungen hineingezogen. Sie kommt einem grausamen Geheimnis auf die Spur und gerät selbst in tödliche Gefahr. Denn der Täter, der eine vermeintliche Schuld rächen will, gibt nicht auf ... Weitere Fälle für Kate Linville und Caleb Hale: Die Betrogene Die Suche ",
        "title": "Ohne Schuld",
        "author": "Charlotte Link",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=149148070&turl=%2Fshop%2Farticle.jsp%3F149148070",
        "cover_url": "https://assets.thalia.media/img/artikel/abc400a8f5e7c7ef80964cbd2b107db03d338ffb-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783968170367_A39435394",
        "description": "Der erste Fall für Profiler und Frauenheld Nick Stein Ein fesselnder Krimi für Fans von Nele Neuhaus Eigentlich wollte Nick Stein, Profiler und bester Mann beim BKA, seine Heimatstadt Mödling so weit wie möglich hinter sich lassen. Doch wegen des Mordes an einer alten Schulkollegin, die er damals verspottete, kehrt er zurück. Genau genommen müsste er den Fall abgeben, denn die Ermittlungen führen mitten hinein in seine alte, feierfreudige Clique, die mittlerweile zur Mödlinger Elite gehört. Aber private Gefühle können einen Nick Stein nicht ablenken, er ist schließlich promovierter Psychologe. Allerdings kann der charismatische Nick den Frauen nach wie vor genauso wenig widerstehen wie sie ihm, selbst wenn ihn eine leise Stimme warnt, dass er den Lebensstil seiner alten Freunde seinerzeit nicht grundlos aufgegeben hat. Als sich auch noch der Bürgermeister einmischt und ein zweiter Mord geschieht, ist es mit der professionellen Distanz endgültig vorbei, denn hinter den bürgerlichen Fassaden lauert das nackte Grauen ... Erste Leserstimmen \"ich war überrascht, welche Wendungen die Geschichte immer wieder nimmt\" \"ein Showdown, wie ihn ein Krimi braucht, spannend bis zum Schluss\" \"der Plot ist gut konstruiert und ein Verwirrspiel der Extraklasse nimmt seinen Lauf\" \"der flüssige Schreibstil des Autors hat mich sehr gut duch die Geschichte geleitet\" \"gelungener Krimi mit viel Ermittlerarbeit, einer Prise Erotik und einem spannenden Plot\" Weitere Titel dieser Reihe Stille Schuld (ISBN: 9783968170404)",
        "title": "Narbenfrau",
        "author": "Gerlinde Friewald",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147662274&turl=%2Fshop%2Farticle.jsp%3F147662274",
        "cover_url": "https://assets.thalia.media/img/artikel/04273d0b2c505f2a895adbf008cfa2bfd17a47aa-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783641117009_A23157788",
        "description": "Der erste Roman einer faszinierenden Reihe um die \"Sieben Schwestern\". Maia ist die älteste von sechs Schwestern, die alle von ihrem Vater adoptiert wurden, als sie sehr klein waren. Sie lebt als Einzige noch auf dem herrschaftlichen Anwesen ihres Vaters am Genfer See, denn anders als ihre Schwestern, die es drängte, draußen in der Welt ein ganz neues Leben als Erwachsene zu beginnen, fand die eher schüchterne Maia nicht den Mut, ihre vertraute Umgebung zu verlassen. Doch das ändert sich, als ihr Vater überraschend stirbt und ihr einen Umschlag hinterlässt - und sie plötzlich den Schlüssel zu ihrer bisher unbekannten Vorgeschichte in Händen hält: Sie wurde in Rio de Janeiro in einer alten Villa geboren, deren Adresse noch heute existiert. Maia fasst den Entschluss, nach Rio zu fliegen, und an der Seite von Floriano Quintelas, eines befreundeten Schriftstellers, beginnt sie, das Rätsel ihrer Herkunft zu ergründen. Dabei stößt sie auf eine tragische Liebesgeschichte in der Vergangenheit ihrer Familie, und sie taucht ein in das mondäne Paris der Jahrhundertwende, wo einst eine schöne junge Frau aus Rio einem französischen Bildhauer begegnete. Und erst jetzt fängt Maia an zu begreifen, wer sie wirklich ist und was dies für ihr weiteres Leben bedeutet ... ",
        "title": "Die sieben Schwestern Bd.1",
        "author": "Lucinda Riley",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=41227640&turl=%2Fshop%2Farticle.jsp%3F41227640",
        "cover_url": "https://assets.thalia.media/img/artikel/a720d7e96c65406afe20df76d459365e246e7dc7-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783104912998_A39626270",
        "description": "Die Platz-1-Bestseller-Serie aus Dänemark »Vor kurzem noch unbekannt, überholt Anne Mette Hancock jetzt Jo Nesbø und Jussi Adler-Olsen auf den Bestsellerlisten.« Berlingske Die Kopenhagener Investigativ-Journalistin Heloise Kaldan steckt in einer heiklen Jobkrise, als sie einen mysteriösen Brief erhält: von einer gesuchten Mörderin. Darin stehen Dinge über Heloise, die eigentlich niemand wissen kann. Beunruhigt beginnt Heloise, auf eigene Faust zu recherchieren. Die Absenderin ist seit einem brutalen Mord vor einigen Jahren spurlos verschwunden. Was will sie nun ausgerechnet von Heloise, und woher hat sie die Informationen über sie? Zur gleichen Zeit erhält auch Kommissar Erik Schäfer einen neuen Hinweis auf die Gesuchte. Alle Spuren scheinen zu Heloise Kaldan zu führen. Ist ihr Leben in Gefahr? Und können der Polizist und die Journalistin einander vertrauen? Der erste Fall der Erfolgs-Reihe um Heloise Kaldan und Erik Schäfer. Ausgezeichnet mit dem dänischen Krimi-Preis. Ein fesselnd persönlicher Thriller über Rache, Gerechtigkeit und Vergebung. »Bezwingendes Crime-Debüt auf höchstem skandinavischen Niveau.« Litteratursiden",
        "title": "Leichenblume",
        "author": "Anne Mette Hancock",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=148123770&turl=%2Fshop%2Farticle.jsp%3F148123770",
        "cover_url": "https://assets.thalia.media/img/artikel/96e70f5e92341412d8462adf041226819bbc62bf-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9780063045118_A39289545",
        "description": "An enchanting collection containing the first three novels in New York Times bestselling author Julia Quinn's beloved Bridgerton series set in Regency England—The Duke and I, The Viscount Who Loved Me, and An Offer from a Gentleman—now a series created by Shonda Rhimes for Netflix. The Duke and I When Daphne Bridgerton and Simon Basset, Duke of Hastings, agree to a fake courtship, they think they've found the perfect solution to their problems. Romantically associated with one of London's most desirable catches, Daphne's prospects among the ton will soar. For avowed bachelor Simon, an attachment to Daphne will deter would-be brides and their ambitious mamas. Their plan works like a charm—at first. But amid the glittering, gossipy, cut-throat world of London's elite, there is only one certainty: love ignores every rule. . . The Viscount Who Loved Me London's most elusive bachelor, Anthony Bridgerton is determined to wed. But one obstacle stands in his way—his intended's older sister, Kate Sheffield, who is driving Anthony mad with her determination to stop the betrothal. Kate is quite sure that reformed rakes do not make the best husbands, and Anthony Bridgerton is the most wicked rogue of them all. She's determined to protect her sister—even as she fears she may not be able to resist the reprehensible and oh so desirable rake herself . . . An Offer from a Gentleman Sophie Beckett never dreamed she'd be able to sneak into Lady Bridgerton's famed masquerade ball—or that she would be spinning in the arms of her \"Prince Charming\"—the debonair and devastatingly handsome Benedict Bridgerton. But when the clock strikes midnight, Sophie's enchanting evening ends. Since that night Benedict has been able to think of nothing but the bewitching young woman, and he's sworn to find and wed his mystery miss. Yet will another unexpectedly steal his heart—and his chance for a fairy tale love? ",
        "title": "Bridgerton Collection Volume 1",
        "author": "Julia Quinn",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=147088413&turl=%2Fshop%2Farticle.jsp%3F147088413",
        "cover_url": "https://assets.thalia.media/img/artikel/ba2c5db01eef33c301fdaa951bd98d7a52192152-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783736314221_A39672730",
        "description": "Er glaubt nicht mehr an die Liebe. Bis er sie trifft ... Auf dem Weg zu einem Vorstellungsgespräch passiert es: Elodie erwischt mit ihrem alten Jeep den glänzenden Mercedes eines reichen Schnösels. Es ist Abneigung auf den ersten Blick, als ihr der arrogante - wenn auch leider attraktive - Geschäftsmann die alleinige Schuld an dem Unfall gibt. Nach einem hitzigen Wortgefecht muss die temperamentvolle New Yorkerin sich sputen, um noch pünktlich zu ihrem Termin zu erscheinen - und staunt nicht schlecht, als sich ihr Unfallgegner als ihr zukünftiger Chef entpuppt ... \"Welch. Ein. Spaß!!! Ich habe dieses Buch von Anfang bis Ende einfach nur geliebt!\" Maryse's Book Blog Der neue Bestseller des Erfolgsduos Vi Keeland und Penelope Ward",
        "title": "Park Avenue Player",
        "author": "Vi Keeland,Penelope Ward",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=148210090&turl=%2Fshop%2Farticle.jsp%3F148210090",
        "cover_url": "https://assets.thalia.media/img/artikel/3a198b0f827f682a2f5d971528944a8aa5502aed-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783751505147_A40777800",
        "description": "Auftakt der bezaubernden Smythe-Smith-Serie von Julia Quinn! \"Wie, bitteschön, soll ich heiraten, wenn kein Gentleman um mich anhält?\" Tatendurstig beschließt Honoria Smythe-Smith, dem Eheglück etwas nachzuhelfen. Doch in die Falle, die sie stellt, tappt ausgerechnet Marcus Holroyd, Earl of Chatteris. Dass ihr Freund aus Kindertagen mehr als einen verstauchten Knöchel davonträgt, erweist sich als schicksalhaft. Denn Honoria muss Marcus pflegen - und liegt plötzlich in seinen Armen. Ist er derjenige, mit dem sie lachen, den sie heiraten und aufrichtig lieben kann? Zu spät erfährt Honoria, was Marcus einst ihrem Bruder geschworen hat ...",
        "title": "Mit List und Küssen",
        "author": "Julia Quinn",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=150416693&turl=%2Fshop%2Farticle.jsp%3F150416693",
        "cover_url": "https://assets.thalia.media/img/artikel/605e9f44edac70fb867944e9320b3d7c94acbd18-00_BF160-240.jpeg",
        "publicationType": null
      },
      {
        "publicationId": "DT0400.9783968172187_A40776890",
        "description": "Ein brutaler Mord und ein Opfer mit vielen Feinden - Nick Stein ermittelt Der spannende Krimi für Fans von Andreas Gruber Nach seinem letzten Fall hat sich Nick Stein auf unbestimmte Zeit vom BKA beurlauben lassen und hält Vorträge an diversen Universitäten. Doch die Ruhe währt nicht lange. Während seines Vortrags an der psychologischen Fakultät der LMU bittet ihn der Münchner Kriminalbeamte Axel Mayr um Hilfe bei einem Mordfall. Sofort ist Nicks Neugier geweckt, denn der Fall hat es in sich. Mit Unterstützung so mancher alter Weggefährten stürzt sich Nick in die Ermittlungen und wird immer weiter in den komplexen Fall um Geldwäsche, Prostitution und Vergewaltigung hineingezogen. Schließlich ist er dem Täter dicht auf den Fersen - doch sein Bauchgefühl sagt ihm, dass irgendetwas nicht stimmt … Weitere Titel dieser Reihe Narbenfrau (ISBN: 9783968170367) Stille Schuld (ISBN: 9783968170404) Erste Leserstimmen „Ein sorgsam konstruierter Krimi, der nie an Spannung verliert.\" „Zum Glück ist Nick Stein kein Typ für den Ruhestand. Auch sein dritter Fall ist wieder rätselhaft, komplex und unglaublich fesselnd.\" „Als Krimi-Fan war ich begeistert und habe zu jedem Zeitpunkt mit dem Ermittlerteam mitgefiebert.\" „Ein mitreißender Kriminalfall voller interessanter Wendungen.\"",
        "title": "Totenstein (nur bei Thalia!)",
        "author": "Gerlinde Friewald",
        "shop_url": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco&detailPage=true&bdeArticleId=150412963&turl=%2Fshop%2Farticle.jsp%3F150412963",
        "cover_url": "https://assets.thalia.media/img/artikel/aa36dbdd3dab5a9f1f8aea75119c429f0315b9c6-00_BF160-240.jpeg",
        "publicationType": null
      }
    ]
  }
}

GET https://bosh.pageplace.de/bosh/rest/reseller/countries

Fetch list of countries the e-reader can be used with.

Step 1 of the Setup process.

pageplace.de seems to have a list of hardware IDs and their associated sellers. E-reader devices sold by thalia.de can only choose thalia as book shop when it is being setup.

Only those countries are returned that the device seller is available in.

Request

Header
hardware_id

Required.

Example: 665fc389ef4e47258c5db9fa7821bd19

client_type

Example: TOLINO_VISION_3

client_version

Example: 14.1.0

GET parameters
languageCode

Two-letter e-reader interface language code.

Does not seem to have any influence on the response.

Example: en

Response

Non-rebrandable device

HTTP status code 200 OK.

Has rebrandable property set to false.

Example:

{
  "resellerCountryResponse": {
    "resellerCountryGroups": [
      {
        "languageCode": "DE",
        "resellerCountries": [
          {
            "languageTag": "de-DE",
            "language": "Deutsch",
            "country": "Deutschland",
            "countryCode": "DE"
          },
          {
            "languageTag": "de-CH",
            "language": "Deutsch",
            "country": "Schweiz",
            "countryCode": "CH"
          },
          {
            "languageTag": "de-AT",
            "language": "Deutsch",
            "country": "Österreich",
            "countryCode": "AT"
          }
        ]
      },
      {
        "languageCode": "EN",
        "resellerCountries": [
          {
            "languageTag": "de-AT",
            "language": "German",
            "country": "Austria",
            "countryCode": "AT"
          },
          {
            "languageTag": "de-DE",
            "language": "German",
            "country": "Germany",
            "countryCode": "DE"
          },
          {
            "languageTag": "de-CH",
            "language": "German",
            "country": "Switzerland",
            "countryCode": "CH"
          }
        ]
      },
      {
        "languageCode": "FR",
        "resellerCountries": [
          {
            "languageTag": "de-DE",
            "language": "allemand",
            "country": "Allemagne",
            "countryCode": "DE"
          },
          {
            "languageTag": "de-AT",
            "language": "allemand",
            "country": "Autriche",
            "countryCode": "AT"
          },
          {
            "languageTag": "de-CH",
            "language": "allemand",
            "country": "Suisse",
            "countryCode": "CH"
          }
        ]
      },
      {
        "languageCode": "ES",
        "resellerCountries": [
          {
            "languageTag": "de-DE",
            "language": "alemán",
            "country": "Alemania",
            "countryCode": "DE"
          },
          {
            "languageTag": "de-AT",
            "language": "alemán",
            "country": "Austria",
            "countryCode": "AT"
          },
          {
            "languageTag": "de-CH",
            "language": "alemán",
            "country": "Suiza",
            "countryCode": "CH"
          }
        ]
      },
      {
        "languageCode": "IT",
        "resellerCountries": [
          {
            "languageTag": "de-AT",
            "language": "tedesco",
            "country": "Austria",
            "countryCode": "AT"
          },
          {
            "languageTag": "de-DE",
            "language": "tedesco",
            "country": "Germania",
            "countryCode": "DE"
          },
          {
            "languageTag": "de-CH",
            "language": "tedesco",
            "country": "Svizzera",
            "countryCode": "CH"
          }
        ]
      },
      {
        "languageCode": "NL",
        "resellerCountries": [
          {
            "languageTag": "de-DE",
            "language": "Duits",
            "country": "Duitsland",
            "countryCode": "DE"
          },
          {
            "languageTag": "de-AT",
            "language": "Duits",
            "country": "Oostenrijk",
            "countryCode": "AT"
          },
          {
            "languageTag": "de-CH",
            "language": "Duits",
            "country": "Zwitserland",
            "countryCode": "CH"
          }
        ]
      }
    ],
    "rebrandable": false
  }
}
Missing hardware_id header

When no hardware_id is passed, a 404 Not Found status code is returned together with an error message:

{
  "ResponseInfo": {
    "serviceName": "reseller/countries[GET]",
    "responseStatus": -90,
    "message": "No hardware found for given id.",
    "requestId": "e5a64229-5e64-4d14-aac6-8925be6af48e"
  }
}

GET https://bosh.pageplace.de/bosh/rest/reseller/selection

Fetch list of book sellers the e-reader can be used with.

Step 2 of the Setup process.

pageplace.de seems to have a list of hardware IDs and their associated sellers. E-reader devices sold by thalia.de can only choose thalia as book shop when it is being setup.

Only those book shops are returned that the device may be used with.

Request

Header
hardware_id

Required.

Example: 665fc389ef4e47258c5db9fa7821bd19

client_type

Example: TOLINO_VISION_3

client_version

Example: 14.1.0

GET parameters
client_type

Required.

Example: TOLINOVISION3_14.1.0

countryCode

Required.

The two-letter uppercase country code taken from GET https://bosh.pageplace.de/bosh/rest/reseller/countries

Example: DE

languageCode

Two-letter e-reader interface language code.

Does not seem to have any influence on the response.

Example: en

Response

Non-rebrandable device

HTTP status code 200 OK.

Returns only one reseller.

Example:

{
  "resellerSelectionResponse": {
    "resellerSelection": [
      {
        "resellerId": 3,
        "resellerName": "Thalia.de",
        "logo": "https://download.pageplace.de/partnerlogo/ereader/212ppi/3_resellerselectionlogo_212ppi.png",
        "showPromotion": false,
        "descriptions": []
      }
    ]
  }
}
Missing countryCode parameter

Status Code: 400 Bad Request

{
  "ResponseInfo": {
    "serviceName": "",
    "responseStatus": -1,
    "message": "Required String parameter 'client_type' is not present",
    "requestId": "b2e2aaaf-32a0-4584-ba74-23c3a7301f08"
  }
}
Missing hardware_id header

When no or an unknown hardware_id header is passed, a 404 Not Found status code is returned together with an error message:

{
  "ResponseInfo": {
    "serviceName": "reseller/selection[GET]",
    "responseStatus": -90,
    "message": "No hardware found for given id.",
    "requestId": "baf7cd5d-93af-4000-a172-f7dfd6fd4493"
  }
}

POST https://bosh.pageplace.de/bosh/rest/reseller/selection/report

Notify tolino which shop has been selected.

This is probably used for tracking purposes since it is not required function-wise for the e-reader.

Request

Header
hardware_id

Required.

Example: 665fc389ef4e47258c5db9fa7821bd19

It is not validated; it just must be non-empty.

client_type

Example: TOLINO_VISION_3

client_version

Example: 14.1.0

GET parameters
selectedShopId

Book shop ID, e.g. 3 for Thalia.

Response

HTTP 200 OK without content.

PATCH https://bosh.pageplace.de/bosh/rest/sync-data

Send changes to the server and get changes since last sync back. This is the main API method for synchronization.

Part of the Sync process.

Request

Header

Similar to bosh v1 header set, but not exactly the same. Uses reseller_id instead of m_id and does not send the client_version.

t_auth_token

OAuth token obtained from POST https://thalia.de/auth/oauth2/token.

Example: eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...

Content-Type

application/json; charset=UTF-8

Accept

application/json; charset=UTF-8

reseller_id

Example: 3

hardware_id

Example: 665fc389ef4e47258c5db9fa7821bd19

client_type

Example: TOLINO_VISION_3

GET parameters
paths

Example: publications

FIXME: What else?

Request body parameters
revision

revision of last sync response.

null when it is the first sync ever for this device.

patches

Array of changes.

When no data to sync:

  • in the request: Empty array [].

  • in the response: Property patches is omitted.

Changes are objects with the following properties:

op

The patch operation: add, replace, remove

replace is used to update the reading position or to rename a collection.

path

Examples:

  • /publications/DT0400.9783739673417_A27522964/bookmark/606779074

  • /publications/DT0400.9783641243609_A40398678/tags

Consists of several parts:

  1. The prefix seems always to be /publications/.

  2. A publication ID DT0400.9783739673417_A27522964

  3. The type that is created/updated/deleted:

    • bookmark is the reading position

    • dogears when bookmarking a page in the e-book

    • comments when highlighting/marking some text or adding a note

    • tags for collection management

  4. Server-side database ID.

    When doing op=add requests, the ID is only in the response, but not in the request.

value

Details of the change. Properties depend on the type.

modified

Time when this action was done in milliseconds. Type: Integer.

Example: 1612127562802

position

File name of the chapter in the epub, plus specific data in the anchor. Type: String.

Example: OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)

revision

FIXME. Type: String.

FIXME: Can be null:

  • When the book is added to a new collection.

The patch part revisions share some prefix with the patch revision, but are a bit longer. Seem to be base64-encoded, since the often (always?) have == at the end.

In the response, the patch part revisions also share some prefix with the new server revision.

Example: Lmu7TngaxhKWHdv2FFktQNcGFPmnOshpANcqFEx7udpEDvQDdiq93W8ryZG4oSfm9D9sp2Aowkhu/1wg8qj4PglnxUFM96DOLgZMd9NVnTByM/ZG1vgkHHCrqwpA/7bO67OjTjo1TLKVL442Lx3sGw==

category

Known values:

  • collection (add or remove book from a collection (group of books))

Only for tags (collection) patches.

progress

Reading progress in the ranging from 0-1. Type: Float.

Only for bookmark (reading position) patches.

Example: 0.41666666

currentPosition

Current page number. Type: String.

Only for bookmark (reading position) patches.

Example: "5"

lastPosition

Last page number in the book. Type: String

Only for bookmark (reading position) patches.

Example: "12"

transientId

FIXME. Type: String. String Content: Integer.

Only when op=add on dogears (bookmark), comments and tags (collection).

Example: "3", "50".

name

dogears: Text on the bookmarked page. Type: String.

tags: Name of the collection (book group).

Only for dogears (bookmark) and tags add+remove operations.

text

Highlighted text. Type: String

Only for comments (highlight/note) add+remove operations.

startPosition

Start of highlighted text. Type: String.

Only for comments (highlight/note) add+remove operations.

Example: OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)

endPosition

End of highlighted text. Type: String.

Only for comments (highlight/note) add+remove operations.

Example: OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)

note

Manually entered text (note). Type: String.

Only for comments (note) add+remove operations.

Property does not appear for non-note highlights.

Example: Really?

When closing a book (going back to the book list), the current reading position is synchronized to the server - regardless if it changed. I removed that from the requests + responses to have cleaner examples.

The revision in the request is the revision the server returned in the last response.

First sync request

When nothing needs to be synchronized to the server, and nothing ever has been synchronized:

{
    "patches": [],
    "revision": null
}
Set reading position

Reading a page in the book and exiting back to the books list:

{
  "revision": "Lmu7TngaxhKWHdv2FFktQNcGFPmnOshpANcqFEx7udp9diud9qWGmETRXuQsftz8POQVhe8wrcIy0g4ohwngk3/kdM5IeWkV+jmzPXxVKDs+5KTzHlGTFGz2QeVeXJue",
  "patches": [
    {
      "value": {
        "lastPosition": "12",
        "progress": 0.4166666567325592,
        "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/8/1:0)",
        "revision": "Lmu7TngaxhKWHdv2FFktQNcGFPmnOshpANcqFEx7udpEDvQDdiq93W8ryZG4oSfm9D9sp2Aowkhu/1wg8qj4PglnxUFM96DOLgZMd9NVnTByM/ZG1vgkHHCrqwpA/7bO67OjTjo1TLKVL442Lx3sGw==",
        "currentPosition": "5",
        "modified": 1612116637854
      },
      "path": "/publications/DT0400.9783739673417_A27522964/bookmark/606779074",
      "op": "replace"
    }
  ]
}

Response

HTTP status code: 200 OK

When something changed, a new revision number is returned.

When synchronizing local changes to the server - and the server has no changes from other readers, the request is mirrored back in the response (only the revision number is updated).

The server first ingests the request's patch data into its database, and then calculates and returns the changes from the requests's revision number to the current revision. Those changes are returned in the response, together with the current latest revision number.

Same structure as the request data.

Set reading position

The "Set reading position" changes and a new revision is returned.

{
  "revision": "re5zwHogt+YaBKoqI/FPaER+kwC+lp76xohw4+17pWOQ/NPM4AJQbeRddT3Tl2PFYhMbsJy1mYLWJXtvb3bvcgTJ1mcFy/qfb6QqypvFhZK8AloBfu3iGAc7idteGLzb",
  "patches": [
    {
      "op": "replace",
      "path": "/publications/DT0400.9783739673417_A27522964/bookmark/606779074",
      "value": {
        "revision": "re5zwHogt+YaBKoqI/FPaER+kwC+lp76xohw4+17pWMpTJvUvgIModh4mMwgErEgAEsLMc19cJBs9VIeKIUZUZtKiHHD+M55cQ6+FwLBQkq3nd1fF9cO8QLcAoSFtwBa63M/JbWH85fh4BsuqEfX5g==",
        "modified": 1612116637854,
        "progress": 0.41666666,
        "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/8/1:0)",
        "currentPosition": "5",
        "lastPosition": "12"
      }
    }
  ]
}
Set a bookmark
{
  "revision": "vXVBokvmktlTYbt8GBkbdS1LtinZbt31qkl7c+VWPTUc/H7JQ89XcdH7Vyavf2z8Q4v5leJHCbuOXUAF0KLZkwz0WtYM5Z+0AWeOd0GVVw1Rkh56bz8Ac0Hmkxo/UPnW",
  "patches": [
    {
      "op": "add",
      "path": "/publications/DT0400.9783739673417_A27522964/dogears/606874450",
      "value": {
        "revision": "vXVBokvmktlTYbt8GBkbdS1LtinZbt31qkl7c+VWPTUfsIea2eDXWJ5LfkTKgnbEIAtm25oVIvqtV5nh+yF8WfGiJxRRL4PTehaj8GE602P8qdr/xEd8NYp5U6t+61jTJwWFNH62T4CYaO/tyH0H3g==",
        "modified": 1612127562802,
        "transientId": "3",
        "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)",
        "name": "um hochzukommen, so groß war er geworden. Bald kam die Zeit, dass er ein eigenes Nest gründen würde. Doch seine Interessen lagen woanders. Er wollte die Pyramiden erforschen, hinter ihre Geheimnisse s"
      }
    }
  ]
}
Remove a bookmark
{
  "revision": "vXVBokvmktlTYbt8GBkbdc+yMZgMJzQNMwBgm+4XVPUzyzLIOZTcxGsPmPWySpedk9yrsUonISPHw+Kwd539kJQX6x8933NH0Hhp9gOoSPfakpEel4/uiG+kHpq0GqrS",
  "patches": [
    {
      "op": "remove",
      "path": "/publications/DT0400.9783739673417_A27522964/dogears/606874450",
      "value": {
        "revision": "vXVBokvmktlTYbt8GBkbdc+yMZgMJzQNMwBgm+4XVPWdBAxDuBxbQJfnRXNZ4kSW2jY9yt5T2BQHYyn0oOefNmoJQlBJc++COD/meOP71PA/NsIvqt8YDoldSv5Q+CFpAs0HInj5rcupcKXBU4WURw==",
        "modified": 1612127588570,
        "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:114)",
        "name": "um hochzukommen, so groß war er geworden. Bald kam die Zeit, dass er ein eigenes Nest gründen würde. Doch seine Interessen lagen woanders. Er wollte die Pyramiden erforschen, hinter ihre Geheimnisse s"
      }
    }
  ]
}
Add a highlight
{
  "revision": "mpUEbwYtp/eTagD0N86YpmDfuHc9O9NiQuGXKm3W/Hw6kiAzVlOHYaJYF3sCUNxUdanemyU8jvsTIkSJe4EeZSVugO5ALKPSFiYcaMWekNSyeSeiGXHXVnx6WCiBrpnJ",
  "patches": [
    {
      "op": "add",
      "path": "/publications/DT0400.9783739673417_A27522964/comments/606876020",
      "value": {
        "revision": "mpUEbwYtp/eTagD0N86YpmDfuHc9O9NiQuGXKm3W/HzKtqyrc3pLZBtEfixwK6/TwRHTxnb2tzpI7SUOBZdRrCGJ53Gmzjz6qBsW1xEVyFM5++J3MUSW/vu1egX6wv1m+dGa/u3Xy8Vzrn/rvwTfvA==",
        "modified": 1612127738093,
        "transientId": "11",
        "text": "Dass sie Mysterien bürgen, die ihrer aller Leben von Grund auf veränderten. Er wollte studieren, doch gehörte er nur einem kleinen Farmerstamm an. Der bedeutungslos, weit außerhalb der großen Ansiedlungen, seine Au",
        "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)",
        "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)"
      }
    }
  ]
}
Remove a highlight
{
  "revision": "mpUEbwYtp/eTagD0N86Ypvl4Mzbf6ddMxlIZRmiD007iIIVRjSkpSWU5SS/bYaVeN4irJYl9nIs8N1Z1O8k9r4yZPEN6LkrJ03n7hG73yWEkJBqK7dQr8rNheL8GgQGC",
  "patches": [
    {
      "op": "remove",
      "path": "/publications/DT0400.9783739673417_A27522964/comments/606876020",
      "value": {
        "revision": "mpUEbwYtp/eTagD0N86Ypvl4Mzbf6ddMxlIZRmiD006/DLEE5jYDKecIq5j4vZPOwkSBnzwhepvJ2yCb2LtBnEXpgQStn2FDw78xI/l7M9L+yWtHyOte1/u+6tcebmfbQZ2JQFfSnzsbv0FfVKEWcg==",
        "modified": 1612127804121,
        "text": "Dass sie Mysterien bürgen, die ihrer aller Leben von Grund auf veränderten. Er wollte studieren, doch gehörte er nur einem kleinen Farmerstamm an. Der bedeutungslos, weit außerhalb der großen Ansiedlungen, seine Au",
        "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:463)",
        "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:682)"
      }
    }
  ]
}
Add a note
{
  "revision": "U56mFMWtmzUafX7fZ5csYkOTAR0uWN7NcapDRKi+whDBSXuc4SUQl1X3PGUvSMVadbPpnCaITL9ES5XmJItpf5rm0tRbjqV1kSe6iXWdaKLwjT6o7TeGF3U2cbwSPWa9",
  "patches": [
    {
      "op": "add",
      "path": "/publications/DT0400.9783739673417_A27522964/comments/606876958",
      "value": {
        "revision": "U56mFMWtmzUafX7fZ5csYkOTAR0uWN7NcapDRKi+whDQU/nHOmicjMaixgoF33Oc9NMXK2tldJW9Nix9Lv5LaVnTuHf7tMxcmKKHwwqX8CWts7Ebaba8fX6Ts5MlroFxuF45ERlNPKneIKrLZbuMuQ==",
        "modified": 1612127863357,
        "transientId": "12",
        "note": "really?",
        "text": "Bibliotheken",
        "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:852)",
        "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:864)"
      }
    }
  ]
}
Remove a note
{
  "revision": "U56mFMWtmzUafX7fZ5csYhWlue/h+S4oouwYyFXwpjgOs/YSwYakpSm1LTq6XVVxh8V62/30ckl8lpwzXmUZBOujhb/tiVqNXdUxpziOw/rO/8CFfWkQ5BICMla72gc9",
  "patches": [
    {
      "op": "remove",
      "path": "/publications/DT0400.9783739673417_A27522964/comments/606876958",
      "value": {
        "revision": "U56mFMWtmzUafX7fZ5csYhWlue/h+S4oouwYyFXwpjgyQfuwkmVsFDbhY7YqNV0euelu0VHF/tnDmzOk/GmUEkHQWOVBHcNh7pzh0s9s5SiJrK4BDKA/cl7Ojj5OAhCI5VatYCvpP4QQNqqUafK27Q==",
        "modified": 1612127893444,
        "note": "really?",
        "text": "Bibliotheken",
        "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:852)",
        "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/11/1:864)"
      }
    }
  ]
}
Remove from collection

Here the book gets removed from the group (collection) "Zweicoll".

{
    "patches": [
        {
            "op": "remove",
            "path": "/publications/DT0400.9783739673417_A27522964/tags/606892107",
            "value": {
                "category": "collection",
                "modified": 1612300784084,
                "name": "Zweicoll",
                "revision": "IDuWzVIjHLLhWI8zhrdT+7lyuQkwWknldNeVL4voUd0ahg/2eGd/j93dXHBRukgiKYMF5Xi3SBEVyOj7dhFXHga9qE2T18SXsqCja+t4ASSoHNAQcfClmoj8zMhvPhuTk85ro39FJOV5kC9PNgMHaA=="
            }
        }
    ],
    "revision": "IDuWzVIjHLLhWI8zhrdT+7lyuQkwWknldNeVL4voUd01s16ycIpz+bNde974gSr8pRPtEhxfF7HQ8DwLiWqCR2ByQCJzLSgngatg3CZD0nuxKKzpU2OJe9V5kk6viW/9"
}
New bookmarks and comments

Example:

{
  "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu9lJYnoUMNDwRowMvHSFOu3DsPw+mRfrkPaZiXBeqJ8MitfmhiSoQlNBT6FYjaD4rW6Bcrv7xGvauypLFYkaq9o",
  "patches": [
    {
      "op": "add",
      "path": "/publications/DT0400.9783641243609_A40398678/comments/606778818",
      "value": {
        "revision": "Lmu7TngaxhKWHdv2FFktQFdz4lyc7kDFlZaAS+HeJfHWU2bv9FiPCTCUkDXUo7SKAncqxyDwCxG95t2u0JBMdstap9i8kDytw9JveNZhINal0xDzllUVFMfKm7HBt9m7cLdbVaqPZBKTi8XqBRFK8Q==",
        "modified": 1612116489908,
        "text": "»Würdet ihr die Aufgabe ablehnen, wenn es so wäre?«, fragte ich zurück.",
        "startPosition": "OEBPS/0159E511E7C147BFA524CA3DDE0E937C.xhtml#point(/1/4/2/78/1:0)",
        "endPosition": "OEBPS/0159E511E7C147BFA524CA3DDE0E937C.xhtml#point(/1/4/2/78/1:76)"
      }
    },
    {
      "op": "add",
      "path": "/publications/DT0400.9783641243609_A40398678/bookmark/606777963",
      "value": {
        "revision": "Lmu7TngaxhKWHdv2FFktQFdz4lyc7kDFlZaAS+HeJfHWU2bv9FiPCTCUkDXUo7SKUVTLMA8s57HlhB0Q8mKpZDUmAw+NJyupu0vRits89G6tnbMbc+VW/XxzNQfKsE9BQWfoivx5yoKm7w3r+jgQLw==",
        "modified": 1612116494839,
        "progress": 0.26923078,
        "position": "OEBPS/0159E511E7C147BFA524CA3DDE0E937C.xhtml#point(/1/4/2/70/1:0)",
        "currentPosition": "7",
        "lastPosition": "26"
      }
    },
    {
      "op": "add",
      "path": "/publications/DT0400.9783739673417_A27522964/bookmark/606779074",
      "value": {
        "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6Az/cX05Tmdnoti+PCVOZHjmK0futElUUgQ9l34qpnOLlQbyTlM7SrR6xheKDt04fTHhP1CTD45tmWERGvV3e+xA==",
        "modified": 1612116931592,
        "progress": 0.043393,
        "position": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/1/1:0)",
        "lastPosition": "16"
      }
    },
    {
      "op": "add",
      "path": "/publications/DT0400.9783739673417_A27522964/comments/606780680",
      "value": {
        "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6AxhqFD9WE9tS0SL4VnneAHAwlYWr6D5bEdS9Fyg0Mu/EYUTVuwD28pyiFSp++vhGtDKhUCfPCS0Ohi0C7PXJGtA==",
        "modified": 1612116905561,
        "text": "er einen Gleiter starten",
        "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/4/1:768)",
        "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/4/1:792)"
      }
    },
    {
      "op": "add",
      "path": "/publications/DT0400.9783739673417_A27522964/comments/606780681",
      "value": {
        "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6APKHWbB8HNf1ruRvf+UK5IkjbMGqptZkx8vMscjqcvlVw68+UeS+OAUKuotNqOLayfG2hLLmPZRGz1CyqOZL2Pg==",
        "modified": 1612116914525,
        "text": "Der Sturm brach ohne Vorwarnung los.",
        "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:0)",
        "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:36)"
      }
    },
    {
      "op": "add",
      "path": "/publications/DT0400.9783739673417_A27522964/comments/606780682",
      "value": {
        "revision": "HMwySkb2QvTCBdlNAyjAEpf+UKHoFxsaWV3yQdMYlu/jWquQkHI8AFujlvCDEN6A/r2JVv++Ix5Vk+IcC/9AXtWuTStnbObbxNIzKNHLGFS4L1ZLK8QsUFpdQfGAH5B9C/Sr3Ra+qLV2ayYULwCxkA==",
        "modified": 1612116925942,
        "note": "eine Notiz",
        "text": "kürzester Zeit",
        "startPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:263)",
        "endPosition": "OEBPS/caterina-di-montebasso-das-relikt_0.html#point(/1/2/1/2/1:278)"
      }
    }
  ]
}

GET https://bosh.pageplace.de/bosh/rest/time

Part of the Sync process.

Response is empty.

FIXME: What is that used for? Fetching the current time?

Request

No headers except Host: bosh.pageplace.de and Connection: Keep-Alive. This is strange, because almost all requests have a couple of other default headers (Accept, Content-Type) - so this must be deliberate.

Response

HTTP status code: 200 OK.

No content. Maybe the time is fetched from the Date header.

Example:

Server:                         nginx/1.6.2
Date:                           Sun, 31 Jan 2021 20:13:19 GMT
Content-Length:                 0
Connection:                     keep-alive
Pragma:                         no-cache
Expires:                        Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control:                  no-cache
Cache-Control:                  no-store
Timestamp:                      1612123999282
Access-Control-Allow-Origin:    *
Access-Control-Allow-Methods:   POST,GET,PUT,DELETE,PATCH
Access-Control-Allow-Headers:   t_auth_token, hardware_id, Content-Type, If-Modified-Since, m_id, authorization, X-Audiobook-Enabled, client_type, reseller_id, hardware_type,
                                client_version, os_version, language_code
Access-Control-Max-Age:         1728000
Access-Control-Expose-Headers:  response_timestamp,Date,Timestamp
Vary:                           User-Agent

POST https://bosh.pageplace.de/bosh/rest/upload

Upload a new book .epub file.

Step 1 of the upload process.

Request

Header

Nearly identical to the bosh v1 header set, but not exactly the same. No client_type, no client_version.

Content-Type

multipart/form-data; boundary="Boundary1612163626238"

Content-Transfer-Encoding

binary

Content-Length

Depending on the request body.

Request body
Control data
Header

Content-Disposition: form-data; name="control"

Content

JSON {"filesize":334499,"transactionId":"84401550-d933-4f12-b168-87421835bada"}

File data
Header

Content-Disposition: form-data; name="file"; filename="MacBest by Pratchett Terry.epub"

Content

Binary .epub file contents

Response

HTTP status code: 200 OK.

Meta data entry for the uploaded file.

Example:

{
  "metadata": {
    "deliverableId": "bosh_3_395490135492823841139311838",
    "title": "MacBest",
    "subtitle": null,
    "author": "Terry Pratchett",
    "publisher": "Heyne",
    "isbn": null,
    "edition": null,
    "pages": 0,
    "issued": 0,
    "language": "de",
    "format": "application/epub+zip",
    "epubVersion": "2.0"
  }
}

GET https://bosh.pageplace.de/bosh/rest/userid/xxx

Step 5 in the Login process.

FIXME: Check if the device has been registered already to a user.

Example xxx value: 665fc389ef4e47258c5db9fa7821bd19.

There is some explanation about the hardware id in tolino-python: tolinocloud.py.

Request

No body in the request, despite the Content-Type header.

Header

See bosh v1 header set.

Response

HTTP status code: 200 OK

Example:

{
    "initAppResponse": {
        "config": null,
        "deviceKey": null,
        "update": 0,
        "updateVersion": null,
        "userId": "2086910932"
    }
}

POST https://bosh.pageplace.de/bosh/rest/v2/registerhw

Step 6 in the Login process.

Register the e-book reader's hardware ID with the user account.

Request

Header
t_auth_token

OAuth token obtained from POST https://thalia.de/auth/oauth2/token.

Example: eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...

reseller_id

Example: 3

hardware_type

Example: tolino_vision_3

os_version

Example: 4.4.2

language_code

Example: en

hardware_id

Example: 665fc389ef4e47258c5db9fa7821bd19

client_type

Example: TOLINO_VISION_3

client_version

Example: 14.1.0

Content-Type

text/plain; charset=UTF-8

This is a lie, because the request body is JSON.

Body
{
    "initAppRequest": {
        "hardware_id": "665fc389ef4e47258c5db9fa7821bd19",
        "hardware_name": "",
        "client_type": "TOLINOVISION3_14.1.0",
        "hardware_type": "tolino_vision_3"
    }
}

Response

HTTP status code: 200 OK

Contains a device key, the changelog in several languages and the latest firmware version including its download URL.

Example:

{
  "initAppResponse": {
    "deviceKey": "5Iq76M_tEoze3w49c-IOug",
    "update": 0,
    "updateVersion": "14.1.0",
    "userId": "2086910932",
    "config": [
      {
        "key": "CHANGELOG_NL",
        "value": "Verbeterde prestaties, verbeterde functies en betere integratie van onze nieuwe tolino-leeservaring. (BÈTA)\nWe hebben de software verbeterd, bugs verholpen en gezorgd voor meer stabiliteit."
      },
      {
        "key": "CHANGELOG_EN",
        "value": "Improved performance, feature enhancement and better integration of our new tolino reading experience. (BETA)\nWe have improved the software, fixed bugs and ensured more stability."
      },
      {
        "key": "CHANGELOG_FR",
        "value": "Amélioration des performances, amélioration des fonctionnalités et meilleure intégration de notre nouvelle expérience de lecture tolino. (BÊTA)\nNous avons amélioré le logiciel, corrigé des bugs et assuré plus de stabilité."
      },
      {
        "key": "DOWNLOAD_FILE_MD5",
        "value": "930d0eb9e4c861a43d8360fc8dbc0ced"
      },
      {
        "key": "CHANGELOG_ES",
        "value": "Rendimiento mejorado, mejora de funciones y mejor integración con nuestra nueva experiencia de lectura de tolino. (BETA)\nHemos mejorado el software, arreglado los errores y asegurado una mayor estabilidad.\n"
      },
      {
        "key": "CHANGELOG_DE",
        "value": "Verbesserte Leistung, Funktionserweiterungen und bessere Integration unseres neuen tolino-Leseerlebnisses (BETA).\nWir haben die Software verbessert, Fehler behoben und für mehr Stabilität gesorgt.\n"
      },
      {
        "key": "DOWNLOAD_URL",
        "value": "https://download.pageplace.de/ereader/14.1.0/alldevices/update.zip"
      },
      {
        "key": "CHANGELOG_IT",
        "value": "Prestazioni migliorate, funzionalità avanzate e migliore integrazione della nostra nuova esperienza di lettura tolino. (BETA)\nAbbiamo migliorato il software, corretto i bug e assicurato una maggiore stabilità.\n"
      }
    ]
  }
}

GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig

Fetch information about a given tolino reseller (shop):

etc.

Request

Header
ifmodifiedsince

Timestamp with microseconds of last reseller config file version

Example: 1603111725000

reseller_id

Example: 3

Required. "400 Bad Request" if missing.

hardware_type

Example: tolino_vision_3

os_version

Android version

Example: 4.4.2

language_code

Example: en

hardware_id

Example: 665fd389ea4e47228c5db8fa7821bd23

client_type

Example: TOLINO_VISION_3

Required. "400 Bad Request" if missing.

client_version

Tolino firmware version

Example: 14.1.0

Response

HTTP/1.1 304 Not Modified if the ifmodifiedsince header is equal or later than the modification date.

Success

HTTP/1.1 200 OK for the content

Example for headers reseller_id:3 and client_type:TOLINO_VISION_3:

{
  "reseller_id": 3,
  "client_type": "TOLINO_VISION_3",
  "version": "1.7.0",
  "lastModified": 1603111725000,
  "config": {
    "URL_HANDSHAKE": "https://management.mytolino.com/index.html?reseller=3&platform=eink",
    "STRING_BRAND_NAME": "Thalia.de",
    "URL_SHOP_EBOOK_SEARCH": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/suche?einsprung=firmware&search_complex=",
    "FAMILY_SHARING_ACTIVE": "true",
    "LCP_ACTIVATED": "true",
    "URL_SHOP_EBOOK_START_PAGE": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/startseite?einsprung=firmware",
    "SHOP_BASE": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco",
    "URL_OAUTH_ACCESSTOKEN_FAMILY": "https://thalia.de/auth/oauth2/token?client_secret=gU5a7CA9",
    "IS_EXTERNAL_LINK_ENABLED": "true",
    "URL_RESELLER_LOGO": "http://www.tpereader.thalia.de/logos/Prod/thalia_de_sw_klein.png",
    "IS_LCP_ACTIVATED": "false",
    "URL_BOOKSHELF": "https://bosh.pageplace.de/bosh/rest",
    "OAUTH_CLIENT_ID": "treadervision3",
    "ENABLE_DATA_RECOVERY": "true",
    "URL_DEVICE_MANAGEMENT": "https://management.mytolino.com/index.html?reseller=3&platform=eink",
    "URL_BROWSER_START_PAGE": "https://www.google.de",
    "ADVERTISING_REDIRECT_BASE": "redirect.mytolino.com",
    "URL_OAUTH_AUTHORIZATION": "https://thalia.de/auth/oauth2/authorize?response_type=code&scope=SCOPE_BOSH SCOPE_BUCHDE SCOPE_MANDANT_ID.2004 SCOPE_LOGIN FAMILY&redirect_uri=epublishing://login&x_buchde.skin_id=17",
    "RECOMMENDATIONS_IS_SHUFFLE_ENABLED": "false",
    "URL_OAUTH_ACCESSTOKEN": "https://thalia.de/auth/oauth2/token?client_secret=gU5a7CA9",
    "URL_FAMILY_SHARING_MANUAL": "https://mytolino.de/family-sharing-handbuch-ereader",
    "URL_OAUTH_REVOKETOKEN": "https://thalia.de/auth/oauth2/revoke"
  },
  "configLanguageSpecific": [
    {
      "language": "FR",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Du lundi au vendredi de 9 h à 18 h)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Choisissez vos coups de cœur personnels parmi plus d'un million d'ebooks dans l'ebook-shop de Thalia.##Lisez parallèlement sur la tablette ou sur le smartphone avec l'appli eReading de Thalia.##Synchronisez vos ebooks en sécurité, confortablement et gratuitement à travers le tolino Cloud sur plusieurs appareils.##Avec votre tolino, utilisez gratuitement tous les hotspots de la Deutsche Telekom."
      }
    },
    {
      "language": "EN",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0)251 530 94 44##(German speaking customer care:##Monday to Friday, 9 a.m. to 6 p.m.)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Browse through over 1,000,000 e-books in the Thalia shop.##Use the Thalia eBooks app to read in parallel on your tablet, computer or smartphone.##Synchronize your titles across various devices securely and free of charge via the tolino Cloud.##Use all Deutsche Telekom HotSpots free of charge with your tolino."
      }
    },
    {
      "language": "ES",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Línea directa: +49 (0) 251 530 94 44##(Lunes a viernes de 9:00 a 18:00 horas)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Seleccione de entre más de un millo de libros electrónicos en la tienda de eBooks de Thalia su destacados personalizados.##Lea de forma paralela con la aplicación de lectura digital de Thalia en su tableta o smartphone.##Sincronice sus libros electrónicos de forma segura, cómoda y gratuita a través de la tolino Cloud en distintos dispositivos.##Utilice con su dispositivo tolino de forma gratuita todos los HotSpots de la Deutsche Telekom."
      }
    },
    {
      "language": "NL",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Maandag t/m vrijdag 9:00 uur - 18:00 uur)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Kies uit meer dan een miljoen ebooks in de Thalia eBook-Shop uw persoonlijke favorieten.##Lees met de Thalia eReading-app ook parallel op de tablet of smartphone.##Synchroniseer uw ebooks veilig, comfortabel en kosteloos via de tolino Cloud op verschillende apparaten.##Maak met uw tolino gratis gebruik van alle HotSpots van de Deutsche Telekom."
      }
    },
    {
      "language": "DE",
      "languageConfig": {
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Wählen Sie aus über einer Million eBooks im Thalia eBook-Shop Ihre persönlichen Highlights.##Lesen Sie mit der Thalia eReading App auch parallel auf dem Tablet oder Smartphone.##Synchronisieren Sie Ihre eBooks sicher, komfortabel und kostenlos über die tolino Cloud auf verschiedenen Geräten.##Nutzen Sie mit Ihrem tolino alle HotSpots der Deutschen Telekom kostenlos.",
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Rufnummer: 0251 5309 444##(Montag bis Freitag 9 - 18 Uhr, Samstag 9:30 - 18 Uhr)"
      }
    },
    {
      "language": "IT",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hot line: +49 (0) 251 530 94 44##(da lunedì a venerdì, dalle ore 9 alle ore 18)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Scegli le tue letture preferite tra oltre un milione di eBook nell'eBook shop Thalia.##Con l'app Thalia eReading, leggi in parallelo anche sul tablet o lo smartphone.##Sincronizza i tuoi eBook in modo sicuro, comodo e gratuito su dispositivi diversi tramite tolino Cloud.##Con il tuo tolino, sfrutta gratis tutti gli hot spot di Deutsche Telekom."
      }
    }
  ]
}

Example for headers reseller_id:3 and client_type:TOLINO_VISION_2:

{
  "reseller_id": 3,
  "client_type": "TOLINO_VISION_2",
  "version": "1.7.0",
  "lastModified": 1603111725000,
  "config": {
    "STRING_SUPPORT_CONTACT": "E-Mail: info@thalia.de Rufnummer: +49 (0) 251 530 94 44 (Montag bis Freitag 9:00 Uhr - 18:00 Uhr)",
    "STRING_BRAND_NAME": "Thalia.de",
    "STRING_ARRAY_ACTIVATION_ADVANTAGES_ES": "{[\"Seleccione de entre más de un millo de libros electrónicos en la tienda de eBooks de Thalia su destacados personalizados.\",\"Lea de forma paralela con la aplicación de lectura digital de Thalia en su tableta o smartphone.\",\"Sincronice sus libros electrónicos de forma segura, cómoda y gratuita a través de la tolino Cloud en distintos dispositivos.\",\"Utilice con su dispositivo tolino de forma gratuita todos los HotSpots de la Deutsche Telekom.\"]}",
    "SKIN_ID_VALUE_DE": "17",
    "URL_REVOKETOKEN": "https://auth.buch.de/auth/oauth2/revoke",
    "URL_SHOP_EBOOK_START_PAGE": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/startseite?einsprung=firmware",
    "STRING_ARRAY_ACTIVATION_ADVANTAGES_IT": "{[\"Scegli le tue letture preferite tra oltre un milione di eBook nell'eBook shop Thalia.\",\"Con l'app Thalia eReading, leggi in parallelo anche sul tablet o lo smartphone.\",\"Sincronizza i tuoi eBook in modo sicuro, comodo e gratuito su dispositivi diversi tramite tolino Cloud.\",\"Con il tuo tolino, sfrutta gratis tutti gli hot spot di Deutsche Telekom.\"]}",
    "URL_HELP_EN": "https://ereader.thalia.de/ebooks/shop/faq.jsp?oid=4&lb_m=2004",
    "ENABLE_DATA_RECOVERY": "true",
    "OAUTH_CLIENT_ID": "treadervision2",
    "SKIN_ID_KEY": "x_buchde.skin_id",
    "URL_ACCESSTOKEN": "https://www.thalia.de/de.buch.appservices/api/2004/oauth2/token?client_secret=treaderapp_password",
    "URL_OAUTH_AUTHORIZATION": "https://thalia.de/auth/oauth2/authorize?response_type=code&scope=SCOPE_BOSH SCOPE_BUCHDE SCOPE_MANDANT_ID.2004 SCOPE_LOGIN FAMILY&redirect_uri=epublishing://login&x_buchde.skin_id=17",
    "STRING_ARRAY_ACTIVATION_ADVANTAGES_EN": "{[\"Browse through over 1,000,000 e-books in the Thalia shop.\", \"Use the Thalia eBooks app to read in parallel on your tablet, computer or smartphone.\",\"Synchronize your titles across various devices securely and free of charge via the tolino Cloud.\",\"Use all Deutsche Telekom HotSpots free of charge with your tolino.\"]}",
    "BROWSER_START_PAGE": "https://www.google.de",
    "URL_SHOP_EBOOK_SEARCH": "https://ereader.thalia.de/de.thalia.ers.sun/api/2004/sun/suche?einsprung=firmware&search_complex=",
    "SKIN_ID_VALUE_EN": "17",
    "SCOPE": "SCOPE_BOSH SCOPE_BUCHDE SCOPE_MANDANT_ID.2004",
    "URL_HELP_DE": "https://ereader.thalia.de/ebooks/shop/faq.jsp?oid=4&lb_m=2004",
    "APP_SHOP_SEARCH_TYPE": "WEBVIEW",
    "LCP_ACTIVATED": "true",
    "STRING_ARRAY_ACTIVATION_ADVANTAGES_DE": "{[\"Wählen Sie aus über einer Million eBooks im Thalia eBook-Shop Ihre persönlichen Highlights.\",\"Lesen Sie mit der Thalia eReading App auch parallel auf dem Tablet oder Smartphone.\",\"Synchronisieren Sie Ihre eBooks sicher, komfortabel und kostenlos über die tolino Cloud auf verschiedenen Geräten.\",\"Nutzen Sie mit Ihrem tolino alle HotSpots der Deutschen Telekom kostenlos.\"]}",
    "STRING_SUPPORT_CONTACT_DE": "E-Mail: info@thalia.de Rufnummer: +49 (0) 251 530 94 44 (Montag bis Freitag 9:00 Uhr - 18:00 Uhr)",
    "URL_DEVICE_MANAGEMENT": "https://management.mytolino.com/index.html?reseller=3&platform=eink",
    "ADVERTISING_REDIRECT_BASE": "redirect.mytolino.com",
    "URL_HANDSHAKE": "https://management.mytolino.com/index.html?reseller=3&platform=eink",
    "STRING_SUPPORT_CONTACT_FR": "E-mail: info@thalia.de Hotline: +49 (0) 251 530 94 44 (Du lundi au vendredi de 9 h à 18 h)",
    "SHOP_BASE": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco",
    "URL_OAUTH_ACCESSTOKEN_FAMILY": "https://thalia.de/auth/oauth2/token?client_secret=GPvCYjsNqZJkQsyZ9VUF",
    "IS_EXTERNAL_LINK_ENABLED": "true",
    "URL_RESELLER_LOGO": "http://www.tpereader.thalia.de/logos/Prod/thalia_de_sw_klein.png",
    "IS_LCP_ACTIVATED": "false",
    "WEBVIEW_SHOP_SEARCH_URL": "https://ereader.thalia.de/ebooks/shop/search.jsp?oid=4&lb_m=2004&appsearch=1&search_complex=",
    "URL_FAMILY_SHARING_MANUAL": "https://mytolino.de/family-sharing-handbuch-ereader",
    "URL_OAUTH_ACCESSTOKEN": "https://thalia.de/auth/oauth2/token?client_secret=GPvCYjsNqZJkQsyZ9VUF",
    "BOOKSHELF_URL": "https://bosh.pageplace.de/bosh/rest",
    "URL_OAUTH_REVOKETOKEN": "https://thalia.de/auth/oauth2/revoke",
    "URL_AUTHORIZATION": "https://auth.buch.de/auth/oauth2/authorize",
    "FAMILY_SHARING_ACTIVE": "true",
    "STRING_SUPPORT_CONTACT_EN": "E-Mail: info@thalia.de Hotline: +49 (0)251 530 94 44 (German speaking customer care: Monday to Friday 9a.m. to 6p.m.)",
    "CLIENT_ID": "treaderapp01",
    "STRING_SUPPORT_CONTACT_ES": "E-Mail: info@thalia.de Línea directa: +49 (0) 251 530 94 44 (Lunes a viernes de 9:00 a 18:00 horas)",
    "STRING_ARRAY_ACTIVATION_ADVANTAGES_NL": "{[\"Kies uit meer dan een miljoen ebooks in de Thalia eBook-Shop uw persoonlijke favorieten.\",\"Lees met de Thalia eReading-app ook parallel op de tablet of smartphone.\",\"Synchroniseer uw ebooks veilig, comfortabel en kosteloos via de tolino Cloud op verschillende apparaten.\",\"Maak met uw tolino gratis gebruik van alle HotSpots van de Deutsche Telekom.\"]}",
    "STRING_SUPPORT_CONTACT_NL": "E-Mail: info@thalia.de Hotline: +49 (0) 251 530 94 44 (Maandag t/m vrijdag 9:00 uur - 18:00 uur)",
    "STRING_SUPPORT_CONTACT_IT": "E-mail: info@thalia.de Hot line: +49 (0) 251 530 94 44 (da lunedì a venerdì, dalle ore 9 alle ore 18)",
    "URL_BOOKSHELF": "https://bosh.pageplace.de/bosh/rest",
    "STRING_ARRAY_ACTIVATION_ADVANTAGES_FR": "{[\"Choisissez vos coups de cœur personnels parmi plus d'un million d'ebooks dans l'ebook-shop de Thalia.\",\"Lisez parallèlement sur la tablette ou sur le smartphone avec l'appli eReading de Thalia.\",\"Synchronisez vos ebooks en sécurité, confortablement et gratuitement à travers le tolino Cloud sur plusieurs appareils.\",\"Avec votre tolino, utilisez gratuitement tous les hotspots de la Deutsche Telekom.\"]}",
    "URL_BROWSER_START_PAGE": "https://www.google.de",
    "RECOMMENDATIONS_IS_SHUFFLE_ENABLED": "false"
  },
  "configLanguageSpecific": [
    {
      "language": "FR",
      "languageConfig": {
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Choisissez vos coups de cœur personnels parmi plus d'un million d'ebooks dans l'ebook-shop de Thalia.##Lisez parallèlement sur la tablette ou sur le smartphone avec l'appli eReading de Thalia.##Synchronisez vos ebooks en sécurité, confortablement et gratuitement à travers le tolino Cloud sur plusieurs appareils.##Avec votre tolino, utilisez gratuitement tous les hotspots de la Deutsche Telekom.",
        "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Du lundi au vendredi de 9 h à 18 h)"
      }
    },
    {
      "language": "EN",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0)251 530 94 44##(German speaking customer care:##Monday to Friday, 9 a.m. to 6 p.m.)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Browse through over 1,000,000 e-books in the Thalia shop.##Use the Thalia eBooks app to read in parallel on your tablet, computer or smartphone.##Synchronize your titles across various devices securely and free of charge via the tolino Cloud.##Use all Deutsche Telekom HotSpots free of charge with your tolino."
      }
    },
    {
      "language": "ES",
      "languageConfig": {
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Seleccione de entre más de un millo de libros electrónicos en la tienda de eBooks de Thalia su destacados personalizados.##Lea de forma paralela con la aplicación de lectura digital de Thalia en su tableta o smartphone.##Sincronice sus libros electrónicos de forma segura, cómoda y gratuita a través de la tolino Cloud en distintos dispositivos.##Utilice con su dispositivo tolino de forma gratuita todos los HotSpots de la Deutsche Telekom.",
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Línea directa: +49 (0) 251 530 94 44##(Lunes a viernes de 9:00 a 18:00 horas)"
      }
    },
    {
      "language": "NL",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Hotline: +49 (0) 251 530 94 44##(Maandag t/m vrijdag 9:00 Uhr - 18:00 Uhr)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Kies uit meer dan een miljoen ebooks in de Thalia eBook-Shop uw persoonlijke favorieten.##Lees met de Thalia eReading-app ook parallel op de tablet of smartphone.##Synchroniseer uw ebooks veilig, comfortabel en kosteloos via de tolino Cloud op verschillende apparaten.##Maak met uw tolino gratis gebruik van alle HotSpots van de Deutsche Telekom."
      }
    },
    {
      "language": "DE",
      "languageConfig": {
        "STRING_ARRAY_SUPPORT_CONTACT": "E-Mail: info@thalia.de##Rufnummer: 0251 5309 444##(Montag bis Freitag 9 - 18 Uhr, Samstag 9:30 - 18 Uhr)",
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Wählen Sie aus über einer Million eBooks im Thalia eBook-Shop Ihre persönlichen Highlights.##Lesen Sie mit der Thalia eReading App auch parallel auf dem Tablet oder Smartphone.##Synchronisieren Sie Ihre eBooks sicher, komfortabel und kostenlos über die tolino Cloud auf verschiedenen Geräten.##Nutzen Sie mit Ihrem tolino alle HotSpots der Deutschen Telekom kostenlos."
      }
    },
    {
      "language": "IT",
      "languageConfig": {
        "STRING_ARRAY_ACTIVATION_ADVANTAGES": "Scegli le tue letture preferite tra oltre un milione di eBook nell'eBook shop Thalia.##Con l'app Thalia eReading, leggi in parallelo anche sul tablet o lo smartphone.##Sincronizza i tuoi eBook in modo sicuro, comodo e gratuito su dispositivi diversi tramite tolino Cloud.##Con il tuo tolino, sfrutta gratis tutti gli hot spot di Deutsche Telekom.",
        "STRING_ARRAY_SUPPORT_CONTACT": "E-mail: info@thalia.de##Hot line: +49 (0) 251 530 94 44##(da lunedì a venerdì, dalle ore 9 alle ore 18)"
      }
    }
  ]
}

Example for headers reseller_id:3 and client_type:TOLINO_VISION_1:

{
  "reseller_id": 3,
  "client_type": "TOLINO_VISION_1",
  "lastModified": 1603111725000,
  "config": {
    "URL_HANDSHAKE": "https://www.pageplace.de/media/client/handshake/index.html",
    "STRING_BRAND_NAME": "Thalia.de",
    "FAMILY_SHARING_ACTIVE": "true",
    "IS_LCP_ACTIVATED": "false",
    "URL_BOOKSHELF": "https://bosh.pageplace.de/bosh/rest/",
    "ENABLE_DATA_RECOVERY": "true",
    "URL_DEVICE_MANAGEMENT": "https://www.pageplace.de/media/client/handshake/index.html",
    "ADVERTISING_REDIRECT_BASE": "redirect.mytolino.com",
    "LCP_ACTIVATED": "true",
    "SHOP_BASE": "https://ereader.thalia.de/de.thalia.ers.artikel/api/2004/artikel/details/?einsprung=reco"
  }
}

GET https://family.pageplace.de/v1/family

Get the list of family members.

Part of the sync process.

This is only called when the user has family member data (GET https://family.pageplace.de/v1/myself).

Request

Header

See family v1 header set.

No request body.

Response

HTTP status code 200 OK.

Family members

Example:

{
    "maxMembers": 6,
    "members": [
        {
            "membershipId": 67674,
            "nickname": "oldtest"
        },
        {
            "membershipId": 67675,
            "nickname": "dev"
        }
    ]
}

POST https://family.pageplace.de/v1/family

Add someone to a family.

To add a family member, an OAuth token with scope family needs to be obtained.

Request

Header

See family v1 header set.

Body

JSON encoded object.

resellerId

Example: 81

token

Example: eyJhbGciOiJSUzUxMiJ9.eyJpc3MiOiJ3...hGCE8Yc6g

Response

HTTP status code 200 OK.

All family members are returned.

Family with 3 members

Example:

{
    "maxMembers": 6,
    "members": [
        {
            "membershipId": 67675,
            "nickname": "devnew"
        },
        {
            "membershipId": 90498,
            "nickname": "Ebookde"
        },
        {
            "membershipId": 67674,
            "nickname": "oldtest"
        }
    ]
}

DELETE https://family.pageplace.de/v1/family/members/xxx

Remove someone from own family.

Request

Header

See family v1 header set.

xxx

Family member ID. Example: 90498

Response

Success

HTTP status code 200 OK.

No response body (status code thus should be 204).

Removing non-member

Status code: 401 Unauthorized. No response body.

Missing OAuth token

Status code: 401 Unauthorized. Body:

{
    "timestamp":"2021-04-08T15:52:13.186+00:00",
    "status":403,
    "error":"Forbidden",
    "message":"",
    "path":"/v1/family/members/90490"
}

GET https://family.pageplace.de/v1/myself

Obtain the family member ID.

Part of the sync process.

Request

Header

See family v1 header set.

No request body.

Response

HTTP status code 200 OK.

No family membership

Example:

{
    "membershipId": null,
    "nickname": null
}
Member information

Example:

{
    "membershipId": 67675,
    "nickname": "dev"
}

PUT https://family.pageplace.de/v1/myself

Rename myself in the family.

Request

Header

See family v1 header set.

Body

JSON-Encoded. Structure:

nickname

New own name

{
    "nickname": "devnew"
}

Response

HTTP status code 200 OK.

{
    "membershipId": 67675,
    "nickname": "devnew"
}

GET https://family.pageplace.de/v1/shares

Obtain the list of books shared in the family.

FIXME: Only books that are shared from/to the current user?

Part of the sync process.

This is only called when the user has family member data (GET https://family.pageplace.de/v1/myself).

Request

Header

See family v1 header set.

No request body.

Response

HTTP status code 200 OK.

Family members

Example:

[
  {
    "type": "RECEIVED",
    "publicationId": "DT0400.9783739616957_A25832535",
    "sharer": {
      "membershipId": 67674,
      "nickname": "oldtest"
    },
    "receivers": [
      {
        "membershipId": 67675,
        "nickname": "devnew"
      }
    ]
  },
  {
    "type": "SHARED",
    "publicationId": "DT0400.9783739673417_A27522964",
    "sharer": {
      "membershipId": 67675,
      "nickname": "devnew"
    },
    "receivers": [
      {
        "membershipId": 67674,
        "nickname": "oldtest"
      }
    ]
  },
  {
    "type": "SHARED",
    "publicationId": "DT0400.9783641243609_A40398678",
    "sharer": {
      "membershipId": 67675,
      "nickname": "devnew"
    },
    "receivers": [
      {
        "membershipId": 67674,
        "nickname": "oldtest"
      }
    ]
  }
]

DELETE https://family.pageplace.de/v1/shares

Un-share a book.

Request

Header

See family v1 header set.

GET parameters
pubid

Example: DT0400.9783641243609_A40398678

receiver

Example: 67674

sharer

Example: 67675

No body.

Response

HTTP status code 200 OK.

No response body (thus status code should better be 204).

POST https://family.pageplace.de/v1/shares

Share a book with a family member

Request

Header

See family v1 header set.

Body

JSON-Encoded. Structure:

shares

Array of books to share (each an object)

publicationId

Example: DT0400.9783641243609_A40398678

receiver

Example: 67674

{
    "shares": [
        {
            "publicationId": "DT0400.9783641243609_A40398678",
            "receiver": "67674"
        }
    ]
}

Response

HTTP status code 200 OK.

No response body (thus status code should better be 204).

GET https://inventory.pageplace.de/v2/inventory

Fetch information about books stored in the cloud.

Part of the sync process.

Request

Full example request URL:

https://inventory.pageplace.de/v2/inventory?page=0&size=300&includeLoaned=true&contentTypeFilter=EBOOK&contentFormatFilter=ACSM&contentFormatFilter=EPUB&contentFormatFilter=PDF
Header
Authorization

OAuth token obtained from POST https://thalia.de/auth/oauth2/token.

Example: Bearer eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...

Accept

Example: application/json; charset=UTF-8

Accept-Encoding

gzip

m_id

FIXME: Maybe reseller ID?

Example: 3

Hardware-Id

Example: 665fc389ef4e47258c5db9fa7821bd19

Content-Type

application/json; charset=UTF-8

This is a lie; there is no request body.

client_type

Example: TOLINO_VISION_3

client_version

Example: 14.1.0

Reseller-Id

Example: 3

Cookie

Multiple times:

  • OAUTH-JSESSIONID=3EFAEC6B69D811252C75861880C338AB.15acdb90; Path=/; Secure; HttpOnly

  • JSESSIONID=C0D8A077F6D2E13251ECDCD60FE6D18A

Cookie2

Example: $Version=1

GET parameters
fullResponse

Optional. Values: true

page

Example: 0

size

Example: 300

includeLoaned

Example: true

contentTypeFilter

Example: EBOOK

contentFormatFilter:

Multiple values allowed (repeat the parameter)

Allowed values:
  • ACSM

  • EPUB

  • PDF

Response

Header
Content-Type

application/json;charset=UTF-8

Example:

{
  "lastModifiedDate": 1612123999080,
  "page": {
    "content": [
      {
        "publicationId": "DT0400.9783641243609_A40398678",
        "resellerId": "3",
        "resellerName": "THALIA.DE",
        "contentType": "EBOOK",
        "shelfId": "39549013",
        "authors": [
          {
            "name": null,
            "firstName": "Patrick",
            "lastName": "Ness"
          }
        ],
        "title": "Chaos Walking - Die Mission (E-Only)",
        "subtitle": "Die Vorgeschichte zur »Chaos Walking«-Trilogie",
        "isbnEan": "9783641243609",
        "language": null,
        "keywords": [
          "Tribute von Panem; Divergent; Dystopie; Tom Holland; Daisy Ridley; Mads Mikkelsen; Young Adult; Nick Jonas; Hollywood-Verfilmung",
          "9783641243609"
        ],
        "publisher": "Random House ebook",
        "issuedDate": 1607900400000,
        "fileResources": [
          {
            "resource": "https://cdp.pageplace.de/cdp/public/publications/DT0400/9783641243609_A40398678/cover",
            "format": "image/jpeg",
            "type": "COVER_IMAGE",
            "lastModifiedDate": null
          }
        ],
        "contentProtectionType": "UNPROTECTED",
        "purchasedDate": 1612116184445,
        "sequenceNo": null,
        "transactionId": "339905364",
        "contentSources": [
          "PURCHASED"
        ],
        "readableContentInfo": {
          "isTextToSpeechEnabled": false,
          "renderingEngine": "FGRE"
        },
        "audioContentInfo": null,
        "subscriptionInfo": null,
        "familySharing": true,
        "defaultCover": null,
        "contentFormat": "application/epub+zip",
        "abstract": "Wer ist das Mädchen an der Seite von Todd Hewitt?\n\nAls Todd Hewitt auf das Mädchen Viola trifft, verändert dies sein Leben schlagartig. Er erkennt, dass es auf einer Lüge aufgebaut war. Er ist plötzlich in tödlicher Gefahr. Er hat zum ersten Mal in seinem Leben jemanden gefunden, dessen Gedanken er nicht lesen kann - und den er trotzdem perfekt versteht. Doch woher nur kommt die geheimnisvolle Viola, mit der er auf der Flucht ist? Die exklusive Vorgeschichte zur »Chaos Walking«-Bestseller-Trilogie beantwortet diese Frage zum ersten Mal."
      },
      {
        "publicationId": "DT0400.9783739673417_A27522964",
        "resellerId": "3",
        "resellerName": "THALIA.DE",
        "contentType": "EBOOK",
        "shelfId": "39549013",
        "authors": [
          {
            "name": null,
            "firstName": "Caterina",
            "lastName": "di Montebasso"
          }
        ],
        "title": "Das Relikt",
        "subtitle": "Sci Fi Kurzgeschichte",
        "isbnEan": "9783739673417",
        "language": "de",
        "keywords": [],
        "publisher": "BookRix",
        "issuedDate": 1473804000000,
        "fileResources": [
          {
            "resource": "https://cdp.pageplace.de/cdp/public/publications/DT0400/9783739673417_A27522964/cover",
            "format": "image/jpeg",
            "type": "COVER_IMAGE",
            "lastModifiedDate": null
          }
        ],
        "contentProtectionType": "WATERMARK",
        "purchasedDate": 1612116343128,
        "sequenceNo": null,
        "transactionId": "339901326",
        "contentSources": [
          "PURCHASED"
        ],
        "readableContentInfo": {
          "isTextToSpeechEnabled": true,
          "renderingEngine": "FGRE"
        },
        "audioContentInfo": null,
        "subscriptionInfo": null,
        "familySharing": true,
        "defaultCover": null,
        "contentFormat": "application/epub+zip",
        "abstract": "<p>Eine Pyramide. Niemand kennt ihren wahren Ursprung. Mythen und falsche Interpretationen umwölken sie. Puhlie, ein Farmerjunge aus dem Volk der Amaranth, gibt sich mit den alten Erklährungen nicht zufrieden. Er widmet sein Leben der Lösung des Rätsels. Doch erst eine Generation später wird es entschlüsselt. Ungeheure Umwälzungen durchströmen daraufhin das gesamte Universum. Doch geschiet dies alles nicht zum ersten Mal.</p>"
      },
      {
        "publicationId": "DT0400.9783842028357_A29383154",
        "resellerId": "3",
        "resellerName": "THALIA.DE",
        "contentType": "EBOOK",
        "shelfId": "39549013",
        "authors": [
          {
            "name": null,
            "firstName": "Ban",
            "lastName": "Zarbo"
          }
        ],
        "title": "Gratis-Leseprobe: Kamo - Pakt mit der Geisterwelt",
        "subtitle": null,
        "isbnEan": "9783842028357",
        "language": null,
        "keywords": [
          "Shounen; Shonen Jump; Abenteuer; Action; Mystery; Shonen; Geist; Geister; Dämon; Dämonen; Tod; Bleach; Death Note; Fantasy"
        ],
        "publisher": "TOKYOPOP Verlag",
        "issuedDate": 1489618800000,
        "fileResources": [
          {
            "resource": "https://cdp.pageplace.de/cdp/public/publications/DT0400/9783842028357_A29383154/cover",
            "format": "image/jpeg",
            "type": "COVER_IMAGE",
            "lastModifiedDate": null
          }
        ],
        "contentProtectionType": "WATERMARK",
        "purchasedDate": 1612116728634,
        "sequenceNo": null,
        "transactionId": "339906865",
        "contentSources": [
          "PURCHASED"
        ],
        "readableContentInfo": {
          "isTextToSpeechEnabled": true,
          "renderingEngine": "FGRE"
        },
        "audioContentInfo": null,
        "subscriptionInfo": null,
        "familySharing": true,
        "defaultCover": null,
        "contentFormat": "application/pdf",
        "abstract": "All die Jahre hat der herzkranke Kamo gegen den Tod gekämpft, doch vergebens - sein junges Leben neigt sich dem Ende zu. Kurz vor seinem letzten Atemzug erhält er Besuch von Crimson, einem mächtigen Geist, der ihm ein unglaubliches Angebot macht: \"Hilf mir, zwölf Geister zu besiegen und ihre Seelen einzufangen, und ich schenke dir ein neues Herz.\" Aber welchen Preis zahlt man für einen Pakt mit einem Geist?"
      }
    ],
    "totalElements": 3,
    "totalPages": 1,
    "numberOfElements": 3,
    "size": 300,
    "number": 0
  },
  "deletedContent": []
}

GET https://thalia.de/auth/oauth2/authorize

Fetch URL of actual login page.

First step in the Login process.

Source

This URL is provided in the reseller configuration, key config.URL_OAUTH_ACCESSTOKEN.

Request

GET Parameters
response_type

Example: code

scope

Example: SCOPE_BOSH%20SCOPE_BUCHDE%20SCOPE_MANDANT_ID.2004%20SCOPE_LOGIN%20FAMILY

redirect_uri

Example: epublishing://login

x_buchde.skin_id

Example: 17

client_id

Example: treadervision3

Headers
User-Agent

Browser user agent.

lcp

Example: 1

X-Requested-With

Example: de.telekom.epub

Response

Redirect to actual login page.

Status code: HTTP/1.1 302

Header
Location:

Example: https://thalia.de/de.thalia.ecp.authservice.application/oauth2/login?response_type=code&scope=SCOPE_BOSH%20SCOPE_BUCHDE%20SCOPE_MANDANT_ID.2004%20SCOPE_LOGIN%20FAMILY&redirect_uri=epublishing://login&x_buchde.skin_id=17&client_id=treadervision3

POST https://thalia.de/auth/oauth2/token

Step 4 of the Login process.

Uses:

  1. Log in to obtain an access token.

  2. Generate access token from a refresh token.

Request

GET parameters
client_secret

Provided in the reseller configuration.

Example: gU5a7CA9

Headers
Content-Type

application/x-www-form-urlencoded

User-Agent

DT_EINK_10_NETRONIX DT_EINK_UPD_PP_14.1.0

Cookie:

The refresh_token request sends no cookie.

Example: gcor=SIDYBbxYkmvUvoO8hy@2Sfx4QAAA9o; ab_bucket=9; ab_container=3; OAUTH-JSESSIONID=9C95C20ECEE74164E76F60C205147822.15acdb90

Cookie2

$Version=1

POST parameters: New token
grant_type:

authorization_code

redirect_uri

epublishing://login

The e-reader internal login process

code

Obtained from login form page redirect.

Example: GK6jDC

client_id

Example: treadervision3

POST parameters: Refresh token
grant_type

refresh_token

refresh_token

Obtained in the last OAuth token response.

Example: 91132a11-dd87-4450-bf16-a63dff1da4d1

client_id

Example: treadervision3

Response

HTTP status code 200 OK

{
    "access_token": "eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiwiZXhwaXJlcyI6IjE2MTIxMzgzOTczMzMiLCJ4X2J1Y2hkZS51c2VyX2lk...",
    "expires_in": 14399,
    "refresh_token": "ad351547-bcb3-43b2-9914-d88f0a3704c8",
    "scope": "FAMILY SCOPE_BOSH SCOPE_BUCHDE SCOPE_LOGIN",
    "token_type": "bearer",
    "x_buchde.mandant_id": "2004",
    "x_buchde.user_id": "39549013"
}

Other requests

GET http://clients3.google.com/generate_204

Check if the internet is reachable.

Request

Header
User-Agent

Example: Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)

Response

HTTP 204 No Content

GET http://mytolino.com/tolino-status.html?responseStatus=204

Check if the internet is reachable.

Request

Header
User-Agent

Example: Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)

Response

At the time of writing, a 301 Moved Permanently is returned (2021-04) with a location header to https://mytolino.com/tolino-status.php?responseStatus=204 .

That URL returns a 204 No Content response.

About

This documentation has been written by Christian Weiske, cweiske+tolino@cweiske.de.

Last update: 2021-04-14T22:18:14+02:00

License

It is licensed under the GNU Free Documentation License.

Source code

The documentation sources are available at http://git.cweiske.de/tolino-api-docs.git/ and mirrored at https://github.com/cweiske/tolino-api-docs

Home page

A rendered version of this documentation is available at http://cweiske.de/tolino-api-docs.htm

Building

You need to install rst2html5 before (the version with bootstrap CSS):

$ pip3 install rst2html5-tools

Rendering the docs is done via the Makefile:

$ make