Servers the Tolino Vision 3/4 HD talk to (Firmware 14.x).
Work in progress.
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
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
Headers common in all HTTP requests to https://bosh.pageplace.de/bosh/rest/v2/...
.
hardware_type
Example: tolino_vision_3
os_version
Android version
Example: 4.4.2
language_code
Example: en
hardware_id
Example: 665fc389ef4e47258c5db9fa7821bd19
client_type
Example: TOLINO_VISION_3
client_version
Tolino firmware version
Example: 14.1.0
, 15.2.0
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 that are used by the Tolino Vision 3 HD.
auth.buch.de
Had been used by Thalia.de for authentication, but now has been moved to directly access thalia.de.
clients3.google.com
Check if the internet is reachable
management.mytolino.com
List of resellers
eInk handshake (FIXME)
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
Needs HTTP basic auth username + password
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.
Initial setup of a factory-reset e-reader.
Check if the internet is reachable: GET http://clients3.google.com/generate_204
Check if the internet is really reachable: GET http://mytolino.com/tolino-status.html?responseStatus=204
Check if the internet is really really reachable: GET http://bosh.pageplace.de/bosh/rest/ping
Check if the internet is really really reachable a second time, just in case: GET http://bosh.pageplace.de/bosh/rest/ping
Get list of allowed countries for the reader: GET https://bosh.pageplace.de/bosh/rest/reseller/countries
Get list of selectable book shops: GET https://bosh.pageplace.de/bosh/rest/reseller/selection
Notify tolino about the selected shop: POST https://bosh.pageplace.de/bosh/rest/reseller/selection/report
Fetch the tolino configuration for the shop: GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig
FIXME
The user-facing stuff happens in the web browser.
Fetch URL of login page: GET https://thalia.de/auth/oauth2/authorize
Show login page with username + password form
Redirect to internal e-book reader login with code.
Example redirect: Location: epublishing://login?code=GK6jDC
Request OAuth access token: POST https://thalia.de/auth/oauth2/token
Check if the device has been registered already: GET https://bosh.pageplace.de/bosh/rest/userid/xxx
Register the device to the user: POST https://bosh.pageplace.de/bosh/rest/v2/registerhw
Run the Sync process
The user presses the synchronization button on the "My books" screen.
Check if the device is online: GET http://bosh.pageplace.de/bosh/rest/ping
Fetch the reseller configuration: GET https://bosh.pageplace.de/bosh/rest/v2/resellerconfig
Fetch the number of books/items in the cloud: GET https://bosh.pageplace.de/bosh/rest/inventory/count
Fetch cloud book information: GET https://inventory.pageplace.de/v2/inventory
Fetch the current date/time: GET https://bosh.pageplace.de/bosh/rest/time
Fetch changes since last sync: PATCH https://bosh.pageplace.de/bosh/rest/sync-data
Get list of resellers: GET https://bosh.pageplace.de/bosh/rest/handshake/resellers
Fetch advertisements for the main screen: GET https://bosh.pageplace.de/bosh/rest/recommendation/xyz
Fetch family membership information: GET https://family.pageplace.de/v1/myself
When the user is part of a family:
Fetch list of available dictionaries: GET https://bosh.pageplace.de/bosh/rest/dictionary/list
Fetch list of family members: GET https://family.pageplace.de/v1/family
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?
The user wants to upload a book on the reader to the cloud.
Upload the epub file: POST https://bosh.pageplace.de/bosh/rest/upload
Upload the cover image: POST https://bosh.pageplace.de/bosh/rest/cover
Fetch the number of books in the cloud: GET https://bosh.pageplace.de/bosh/rest/inventory/count
Fetch the current date/time: GET https://bosh.pageplace.de/bosh/rest/time
Fetch changes since last sync: PATCH https://bosh.pageplace.de/bosh/rest/sync-data
Some time later:
Download the cover of the uploaded book: GET https://bosh.pageplace.de/bosh/rest/cover/xxx/yyy
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.
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?
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.
Parts of the bosh v1 header set:
hardware_id
m_id
t_auth_token
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
HTTP status code: 200 OK
ebook file content.
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.
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"
}
]
}
}
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.
Content-Type
multipart/form-data; boundary="Boundary1612163626238"
Content-Disposition: form-data; name="control"
JSON
{"filesize":334499,"transactionId":"84401550-d933-4f12-b168-87421835bada"}
The transaction ID is different than the one for the epub upload.
Content-Disposition: form-data; name="file"; filename="1092560016"
Binary cover image contents
Content-Disposition: form-data; name="deliverableId"
deliverableId
of the epub upload response.
Example: bosh_3_395490135492823841139311838
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.
Only three headers. Unusual.
Full URL example: https://bosh.pageplace.de/bosh/rest/cover/39549013/bosh_3_395490135492823841139311838?size=WS-B04
xxx
8 bytes of the publication ID
Example: 39549013
yyy
Publication ID
Example: bosh_3_395490135492823841139311838
m_id
Maybe reseller ID?
Example: 3
Host
bosh.pageplace.de
Connection
Keep-Alive
size
Image size (so we get a scaled version)
Known values:
WS-B04
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.
No request body.
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.
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.
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).
responseStatus=204
Always there
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
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.
count
Number of recommendations to return
Example: 12
fullShopUrl
true
HTTP status code 200 OK
.
publicationType
Can be empty or one of: EBOOK
, EMAGAZINE
, EPAPER
or EDATA
.
Not used.
{
"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.
hardware_id
Required.
Example: 665fc389ef4e47258c5db9fa7821bd19
client_type
Example: TOLINO_VISION_3
client_version
Example: 14.1.0
languageCode
Two-letter e-reader interface language code.
Does not seem to have any influence on the response.
Example: en
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
}
}
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.
hardware_id
Required.
Example: 665fc389ef4e47258c5db9fa7821bd19
client_type
Example: TOLINO_VISION_3
client_version
Example: 14.1.0
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
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": []
}
]
}
}
Status Code: 400 Bad Request
{
"ResponseInfo": {
"serviceName": "",
"responseStatus": -1,
"message": "Required String parameter 'client_type' is not present",
"requestId": "b2e2aaaf-32a0-4584-ba74-23c3a7301f08"
}
}
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.
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
selectedShopId
Book shop ID, e.g. 3
for Thalia.
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.
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
paths
Example: publications
FIXME: What else?
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:
The prefix seems always to be /publications/
.
A publication ID DT0400.9783739673417_A27522964
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
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.
When nothing needs to be synchronized to the server, and nothing ever has been synchronized:
{
"patches": [],
"revision": null
}
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"
}
]
}
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.
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"
}
}
]
}
{
"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"
}
}
]
}
{
"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"
}
}
]
}
{
"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)"
}
}
]
}
{
"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)"
}
}
]
}
{
"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)"
}
}
]
}
{
"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)"
}
}
]
}
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"
}
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?
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.
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.
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.
Content-Disposition: form-data; name="control"
JSON
{"filesize":334499,"transactionId":"84401550-d933-4f12-b168-87421835bada"}
Content-Disposition: form-data; name="file"; filename="MacBest by Pratchett Terry.epub"
Binary .epub file contents
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.
No body in the request, despite the Content-Type
header.
See bosh v1 header set.
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.
See bosh v2 header set, plus:
t_auth_token
OAuth token obtained from POST https://thalia.de/auth/oauth2/token.
Example: eyJhbGciOiJSUzI1NiJ9.eyJhdWRpZW5jZSI6InRyZWFkZXJ2aXNpb24zIiw...
reseller_id
Example: 3
Content-Type
text/plain; charset=UTF-8
This is a lie, because the request body is JSON.
{
"initAppRequest": {
"hardware_id": "665fc389ef4e47258c5db9fa7821bd19",
"hardware_name": "",
"client_type": "TOLINOVISION3_14.1.0",
"hardware_type": "tolino_vision_3"
}
}
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):
Authentication URLs
Browser start page
Brand name ("Thalia.de")
if LCP encryption is available
etc.
See bosh v2 header set, plus:
ifmodifiedsince
Timestamp with microseconds of last reseller config file version
Example: 1603111725000
reseller_id
Example: 3
client_type
Required. "400 Bad Request" if missing.
HTTP/1.1 304 Not Modified
if the ifmodifiedsince
header is equal or
later than the modification date.
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"
}
}
POST https://bosh.pageplace.de/bosh/rest/v2/versioncheck
Was not used in firmware 13.
See bosh v2 header set, plus:
Content-Type
text/plain; charset=UTF-8
This is a lie, because the request body is JSON.
{"initAppRequest":{"hardware_id":"665fc389ef4e47258c5db9fa7821bd19","hardware_name":"","client_type":"TOLINOVISION3_15.2.0","hardware_type":"tolino_vision_3"}}
Tolino firmware 14 made the request, version 15.2.0 was available.
Key update
is 2
.
{
"initAppResponse": {
"deviceKey": "",
"update": 2,
"updateVersion": "15.2.0",
"userId": "",
"config": [
{
"key": "CHANGELOG_NL",
"value": "Met deze update hebben we de zoekmachine van de webbrowser gewijzigd in een meer privacyvriendelijke service. Verder hebben we de levensduur van de batterij verbeterd, de prestaties verbeterd en meer stabiliteit aan uw tolino toegevoegd."
},
{
"key": "CHANGELOG_EN",
"value": "With this update we have changed the web browser search engine to more privacy friendly service. Furthermore, we have improved the battery life, enhanced the performance and added more stability to your tolino."
},
{
"key": "CHANGELOG_FR",
"value": "Avec cette mise à jour, nous avons changé le moteur de recherche du navigateur web pour un service plus respectueux de la vie privée. De plus, nous avons amélioré l'autonomie de la batterie, les performances et la stabilité de votre tolino."
},
{
"key": "DOWNLOAD_FILE_MD5",
"value": "9bebf4437a81cfe1106f89b44e611dd6"
},
{
"key": "CHANGELOG_ES",
"value": "Con esta actualización hemos cambiado el motor de búsqueda del navegador por un servicio más respetuoso con la privacidad. Además, hemos mejorado la duración de la batería, incrementado el rendimiento y añadido más estabilidad en tu tolino."
},
{
"key": "CHANGELOG_DE",
"value": "Mit diesem Update haben wir die Suchmaschine im Browser auf einen datenschutzfreundlicheren Anbieter umgestellt sowie Deinen tolino weiter optimiert, indem wir die Fehler behoben und die Stabilität sowie die Batterielaufzeit erhöht haben. Genieße nun wie gewohnt weiter spannende Lese-Abenteuer auf Deinem tolino!"
},
{
"key": "DOWNLOAD_URL",
"value": "https://download.pageplace.de/ereader/15.2.0/OS44/update.zip"
},
{
"key": "CHANGELOG_IT",
"value": "Con questo aggiornamento abbiamo cambiato il motore di ricerca del browser web con un servizio più rispettoso della privacy. Inoltre, abbiamo migliorato la durata della batteria, migliorato le prestazioni ed aggiunto più stabilità al tuo tolino."
}
]
}
}
Key update
is 0
.
{
"initAppResponse": {
"deviceKey": "",
"update": 0,
"updateVersion": "15.2.0",
"userId": "",
"config": [
{
"key": "CHANGELOG_NL",
"value": "Met deze update hebben we de zoekmachine van de webbrowser gewijzigd in een meer privacyvriendelijke service. Verder hebben we de levensduur van de batterij verbeterd, de prestaties verbeterd en meer stabiliteit aan uw tolino toegevoegd."
},
{
"key": "CHANGELOG_EN",
"value": "With this update we have changed the web browser search engine to more privacy friendly service. Furthermore, we have improved the battery life, enhanced the performance and added more stability to your tolino."
},
{
"key": "CHANGELOG_FR",
"value": "Avec cette mise à jour, nous avons changé le moteur de recherche du navigateur web pour un service plus respectueux de la vie privée. De plus, nous avons amélioré l'autonomie de la batterie, les performances et la stabilité de votre tolino."
},
{
"key": "DOWNLOAD_FILE_MD5",
"value": "9bebf4437a81cfe1106f89b44e611dd6"
},
{
"key": "CHANGELOG_ES",
"value": "Con esta actualización hemos cambiado el motor de búsqueda del navegador por un servicio más respetuoso con la privacidad. Además, hemos mejorado la duración de la batería, incrementado el rendimiento y añadido más estabilidad en tu tolino."
},
{
"key": "CHANGELOG_DE",
"value": "Mit diesem Update haben wir die Suchmaschine im Browser auf einen datenschutzfreundlicheren Anbieter umgestellt sowie Deinen tolino weiter optimiert, indem wir die Fehler behoben und die Stabilität sowie die Batterielaufzeit erhöht haben. Genieße nun wie gewohnt weiter spannende Lese-Abenteuer auf Deinem tolino!"
},
{
"key": "DOWNLOAD_URL",
"value": "https://download.pageplace.de/ereader/15.2.0/OS44/update.zip"
},
{
"key": "CHANGELOG_IT",
"value": "Con questo aggiornamento abbiamo cambiato il motore di ricerca del browser web con un servizio più rispettoso della privacy. Inoltre, abbiamo migliorato la durata della batteria, migliorato le prestazioni ed aggiunto più stabilità al tuo tolino."
}
]
}
}
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).
See family v1 header set.
No request body.
HTTP status code 200 OK
.
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.
See family v1 header set.
JSON encoded object.
resellerId
Example: 81
token
Example: eyJhbGciOiJSUzUxMiJ9.eyJpc3MiOiJ3...hGCE8Yc6g
HTTP status code 200 OK
.
All family members are returned.
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.
See family v1 header set.
xxx
Family member ID. Example: 90498
HTTP status code 200 OK
.
No response body (status code thus should be 204).
Status code: 401 Unauthorized
. No response body.
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.
See family v1 header set.
No request body.
HTTP status code 200 OK
.
Example:
{
"membershipId": null,
"nickname": null
}
Example:
{
"membershipId": 67675,
"nickname": "dev"
}
PUT https://family.pageplace.de/v1/myself
Rename myself in the family.
See family v1 header set.
JSON-Encoded. Structure:
nickname
New own name
{
"nickname": "devnew"
}
HTTP status code 200 OK
.
{
"membershipId": 67675,
"nickname": "devnew"
}
GET https://inventory.pageplace.de/v2/inventory
Fetch information about books stored in the cloud.
Part of the sync process.
Full example request URL:
https://inventory.pageplace.de/v2/inventory?page=0&size=300&includeLoaned=true&contentTypeFilter=EBOOK&contentFormatFilter=ACSM&contentFormatFilter=EPUB&contentFormatFilter=PDF
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
fullResponse
Optional. Values: true
page
Example: 0
size
Example: 300
includeLoaned
Example: true
contentTypeFilter
Example: EBOOK
contentFormatFilter
:Multiple values allowed (repeat the parameter)
ACSM
EPUB
PDF
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": []
}
POST https://thalia.de/auth/oauth2/token
Step 4 of the Login process.
Uses:
Log in to obtain an access token.
Generate access token from a refresh token.
client_secret
Provided in the reseller configuration.
Example: gU5a7CA9
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
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
grant_type
refresh_token
refresh_token
Obtained in the last OAuth token response.
Example: 91132a11-dd87-4450-bf16-a63dff1da4d1
client_id
Example: treadervision3
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"
}
GET http://clients3.google.com/generate_204
Check if the internet is reachable.
User-Agent
Example: Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)
HTTP 204 No Content
GET http://mytolino.com/tolino-status.html?responseStatus=204
Check if the internet is reachable.
User-Agent
Example: Dalvik/1.6.0 (Linux; U; Android 4.4.2; tolino Build/KOT49H)
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.
epublishing://closeshop
URL of the close button inside the online shop. Goes back to the main screen.
epublishing://closeshop_skoti
Close the Skoobe shop
epublishing://handshakeCancel
FIXME
epublishing://handshakeFinish
FIXME
epublishing://library
Open the "my books" library view
epublishing://library_skoti
FIXME
epublishing://login?code=GK6jDC
The code
is optional.
epublishing://openbook
Start the reading mode for the given book
deliverableid
Book ID to open.
Example: DT0400.9783641267575_A39529579
epublishing://openbook_skoti
FIXME
epublishing://openextract
Download the file and start the reading mode for a demo book extract (German: "Leseprobe")
extractcoverurl
URL of the book cover image.
extractdeliverableid
Book ID
extractdownloadurl
Download URL for the book demo .epub
file.
extractpurchaseurl
Where to buy the book after reading the extract.
Is used at the "To the shop" button that is shown on top of the reading view for demo books.
The URL in the web view must not be escaped for this link to work.
Escpecially the &
may not be escaped as &
(which would be correct HTML), so you are forced to provide invalid HTML.
epublishing://opensearchresult
FIXME
epublishing://requestauth
FIXME "Open login"
loginfailureurl
FIXME
targeturl
FIXME
epublishing://resellerChangeFinishFactoryReset
FIXME
epublishing://search
Open the "search books" view.
q
Search term to search the books list for.
Non-browser web views have a special JavaScript API that provides integration with Tolino UI elements.
Example is the ShopWebViewActivity that is opens when clicking the "To the shop" link and the recommendations/advertisements on the main page.
android_init()
When the page has been loaded in the web view,
a function android_init
is invoked.
This can be used to detect if the page has been loaded on a Tolino.
screenController
Each web view has a JavaScript variable screenController
that provides the interface to the Tolino UI.
screenController.hideNavigationHeader()
Hides the header when it was enabled with showNavigationHeader
.
screenController.hideProgressDialog()
FIXME
screenController.refreshScreen()
Re-draw the e-ink screen
screenController.setNavigationHeaderTitle("my header")
Override the title in the navigation header.
Call showNavigationHeader
first.
screenController.setNavigationHeaderUrl("epublishing://closeshop")
Set the URL of the "back" arrow button.
screenController.setTokens("accesstoken", "refreshtoken")
FIXME
screenController.showNavigationHeader("header title")
Show the native navigation header and set its title
screenController.showProgressDialog()
FIXME
screenController.processHTML("<html>")
Firmware 15.2: Does nothing
Firmware 15.4.0, Vision 6/Epos 3: Logs the HTML content to the application log.
This documentation has been written by Christian Weiske, cweiske+tolino@cweiske.de.
Last update: 2023-01-21T15:35:55+01:00
It is licensed under the GNU Free Documentation License.
The documentation sources are available at http://git.cweiske.de/tolino-api-docs.git/ and mirrored at https://github.com/cweiske/tolino-api-docs
A rendered version of this documentation is available at http://cweiske.de/tolino-api-docs.htm
You need to install rst2html5
before (the version with bootstrap CSS):
$ pip3 install rst2html5-tools
Rendering the docs is done via the Makefile:
$ make