Nefariously Programmed Mecha
    Have ideas to improve npm?Join in the discussion! »


    2.0.5 • Public • Published


    The unofficial reMarkable API for Node.js

    version 2

    Version 2 will introduce breaking changes to the API. It is currently a work in progress.


    npm install adcharity-remarkable-api

    intializing a new device

    After you install the remarkable-api module, you can create a new reMarkable device.

    const Device = require("adcharity-remarkable-api")
    const reMarkable = new Device()

    registering a device

    To use this module, you must retrieve a one-time code from the reMarkable dashboard. Confirming your one-time code will return a userToken that can be used to interact with the device. You should store this token somewhere safe, such as in an environmental variable.

    const Device = require("adcharity-remarkable-api")
    const reMarkable = new Device()
    reMarkable.register("one-time code").then(code => {

    setting user token

    You can set the userToken of the device using the refresh method. This method will also reset storageHost and notificationsHost, which are required to upload documents and send messages to the reMarkable.

    reMarkable.userToken = process.env.USER_TOKEN // will not work


    items will return an array of all documents and collections (or folders) on your reMarkable.

    (async () => {
      await reMarkable.refresh(process.env.USER_TOKEN);
      reMarkable.items().then(everything => {


    If you have an id for a particular document, you can fetch it with item. It will return a signle document or collection.

    (async () => {
      await reMarkable.refresh(process.env.USER_TOKEN);


    upload takes the file path as a parameter. It is recommended to use __dirname. Uploading a document will return some very basic metadata, including the document id and visibleName.

    (async () => {
      await reMarkable.refresh(process.env.USER_TOKEN);
      const document = await reMarkable.upload(path.join(__dirname, "./example.pdf"))
      if(document) {
        const item = await reMarkable.item(

    item class

    Unlike v1 of the reMarkable api, everything returned from items or item is encapsulated within an Item class. This class contains methods that will allow you to delete or modify a particular document.

    original metadata

    The metadata initially retrieved from reMarkable's cloud servers contains odd capitilizations and spelling errors. Some of the data is not completely necessary and pertains to the details of the request (and not the document itself).

      "ID": "ec53580c-3579-4fe7-a096-fd1de8011b70", // id
      "Version": 0, // version
      "Message": "", // removed
      "Success": false, // removed
      "BlobURLGet": "", // blob
      "BlobURLGetExpires": "0001-01-01T00:00:00Z", // blobExpiration
      "ModifiedClient": "0001-01-01T00:00:00Z", // lastModified
      "Type": "", // type
      "VissibleName": "", // visibleName
      "CurrentPage": 0, // currentPage
      "Bookmarked": false, // bookmarked
      "Parent": "" // parent


    Metadata in an Item is non-standard; it does not follow other reMarkable apis. It has been modified to address spelling mistakes (such as VissibleName) and make the data more convenient for JavaScript programmers.

    • id: used to identify documents, can be stored and passed into item
    • type: DocumentType or CollectionType
    • blob: where the file is located
    • blobExpiration: when the blob will expire
    • lastModified: when the file was last edited
    • visibleName: file or directory visibleName
    • currentPage: opened page
    • bookmarked: starred or not
    • parent: parent directory


    update allows you to change the metadata of a document. The only properties you can change are parent, bookmarked, and visibleName.

    (async () => {
      await reMarkable.refresh(process.env.USER_TOKEN);
      const item = await reMarkable.item("4c8566a1-1d89-4e3d-80e6-5f6bb125c5a7");
        visibleName: "spanish-test"
      }).then(success => {
        // success = true or false


    remove deletes a document.

    (async () => {
      await reMarkable.refresh(process.env.USER_TOKEN);
      const item = await reMarkable.item("4c8566a1-1d89-4e3d-80e6-5f6bb125c5a7");
      item.remove().then(success => {
        // success = true or false

    resources & alternative apis


    npm i adcharity-remarkable-api

    DownloadsWeekly Downloads






    Unpacked Size

    13.7 kB

    Total Files


    Last publish


    • avatar