-
Notifications
You must be signed in to change notification settings - Fork 25
Storage
This is the interesting API. The current endpoint is document-storage-production-dot-remarkable-production.appspot.com, but the Service Discovery should be used to make sure that the right one is used.
All requests should be made with a Bearer authentication header. Input and Output is JSON.
The Storage API uses a JSON object to represent individual file or folder items. These items are passed to and from the calls described below. Not all of the fields are always present or needed.
The items used in the API are similar but not the same as the *.metadata files located on the reMarkable device itself.
{
"ID": "10280264-2546-4319-a150-0cd02ca69c2d",
"Version": 2,
"Message": "",
"Success": true,
"BlobURLGet": "",
"BlobURLGetExpires": "0001-01-01T00:00:00Z",
"ModifiedClient": "2018-01-24T21:02:59.624624Z",
"Type": "CollectionType",
"VissibleName": "Projects",
"CurrentPage": 0,
"Bookmarked": false,
"Parent": "6d6ad886-5d8d-4b3e-aa6f-b05d46d31e83"
}
| Field | Type | Description |
|---|---|---|
ID |
uuid | The unique ID of this object. UUID-4 format. This is always required! |
Version |
integer | The item's version counting starts at 1
|
Message |
string | This is used in API replies to return error messages regarding this item |
Success |
boolean | This is used in API replies to signal that an error occurred handling this item (=false) |
BlobURLGet |
string | FIXME probably the download URL |
BlobURLGetExpires |
datetime | when above URL expires |
BlobURLPut |
string | Where the data for the file can be uploaded |
BlobURLPutExpires |
datetime | when above URL expires |
ModifiedClient |
datetime | The last modified date time as set on the client that created the item |
Type |
type | The type of the object. See below for available types |
VissibleName |
string | The file's label. Yes, there is a typo in this key. |
CurrentPage |
integer | The currently open page, starting at 0
|
Bookmarked |
boolean | is this bookmarked? |
Parent |
uuid | The ID of the parent object or empty if this is a top level object |
The Type is sent as string using the following values:
-
DocumentTypefor Notebooks -
CollectionTypefor Folders
datetimes are specified in ISO 8601 format.
Note that all calls accepting items as input, expect an array of items and will alway return a corresponding array of items. However the example PHP implementation will always pass single items (eg. arrays of a single item) to make error handling easier.
GET https://document-storage-production-dot-remarkable-production.appspot.com/document-storage/json/2/docs
The response is a JSON encoded array of items:
[{
"ID": "10280264-2546-4319-a150-0cd02ca69c2d",
"Version": 2,
"Message": "",
"Success": true,
"BlobURLGet": "",
"BlobURLGetExpires": "0001-01-01T00:00:00Z",
"ModifiedClient": "2018-01-24T21:02:59.624624Z",
"Type": "CollectionType",
"VissibleName": "Projects",
"CurrentPage": 0,
"Bookmarked": false,
"Parent": "6d6ad886-5d8d-4b3e-aa6f-b05d46d31e83"
},...]Note, that the BlobURLGet values are always empty in this call.
PUT https://document-storage-production-dot-remarkable-production.appspot.com/document-storage/json/2/upload/update-status'
Payload is a JSON array as described under Listing Files. You can use this to 'move' or 'rename' an item. Since an array is passed, it might be possible to change multiple objects at once.
[{
"Bookmarked": false,
"ID": "1dd71dfc-a463-4317-9428-ece0bff128b9",
"ModifiedClient": "2018-01-29T19:18:55.017017Z",
"Parent": "",
"Type": "CollectionType",
"Version": 1,
"VissibleName": "Folder"
}]FIXME response?
To create an item you create a minimal stub of the object first. The ID needs to be generated by yourself (a UUID-4). Since an array is passed, it might be possible to create multiple objects at once.
PUT https://document-storage-production-dot-remarkable-production.appspot.com/document-storage/json/2/upload/request
[{
"ID": "1dd71dfc-a463-4317-9428-ece0bff128b9",
"Parent": "",
"Type": "CollectionType",
"Version": 1
}]
The response is a typical item. But with the upload URL available.
[{
"ID": "1dd71dfc-a463-4317-9428-ece0bff128b9",
"Version": 1,
"Message": "",
"Success": true,
"BlobURLPut": "https://storage.googleapis.com/remarkable-production-document-storage/user-auth0%7C5a68dc51cb30df3877a1d7c4/1dd71dfc-a463-4317-9428-ece0bff128b9?Expires=1517253532\u0026GoogleAccessId=remarkable-production%40appspot.gserviceaccount.com\u0026Signature=RklnAKXYxl6%2FEDXxAj%2B0d8W8IrqymHYeNZoPXEcHTGdjc1F0%2B8jsxsYFC7AVYVYG2yHt3R3ujTaWfaV1fa%2BX1MMjdLEjzsbhDv5F5HW3dJ4OHtllwBMi7HY8pEj%2FIO2c0PkY1vhfNuRriAhhPKVMm3Y17g7vdm%2Bcli90QtIvdh%2FlHfPh8OWhlZ%2BShH5fwEzNH%2Bs5EgUoq2YVqEOzWdPUclSPQGp9PbKQwJuKw7tTynjbfQCV%2FRFrh2zDn%2BK7Pci4CVCMjZCKfFqUThTxVmPEBLHtC%2F2oKWTOL4CQ8FQPtAWIPmL65zm7iGIlmfkTzu9BRpUov86QXds6tpSFSLcAmQ%3D%3D",
"BlobURLPutExpires": "2018-01-29T19:18:52.854382809Z"
}]
The actual file contents can then be uploaded with a PUT request to the BlobURLPut URL.
After creating a new item, you can rename it as mentioned above.