Cloud Storage API

Any cloud storage service.
One simple integration.

Build with our common Cloud Storage API to easily add integrations to Dropbox, Box, Google Drive, SharePoint, OneDrive, and more.

big yellow left quotation mark

The worst challenge was keeping bespoke integrations up-to-date. Having access to Kloudless APIs to integrate with a single set of APIs greatly simplifies our work

customer image
Brent Mundy

Sr. Director of Product Management at Blackboard

Write code once and reuse it for any service

Kloudless is a Cloud Storage API abstraction layer that enables you to work with one general API in the place of many. We also take care of all the underlying cloud storage service API maintenance and updates, so you don’t have to.

Explore our API documentation
Dropbox
Box
Google Drive
OneDrive
Alfresco
SharePoint
Egnyte
Amazon S3
              
                  
# Retrieve access token
open "https://api.kloudless.com/v1/oauth/?&scope=any.storage&client_id=d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5&response_type=token&state=13373"

$BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"

# Download a file
curl "https://api.kloudless.com/v1//accounts/me/storage/files/$FILE_ID/contents/" \
    -H "Authorization: Bearer $BEARER_TOKEN"

# Upload a file
curl -XPOST -H "Authorization: Bearer $BEARER_TOKEN" \
    -H 'Content-Type: application/octet-stream' \
    -H 'X-Kloudless-Metadata: {"name": "héllö.png", "parent_id": "root"}' \
    "https://api.kloudless.com/v1/accounts/me/storage/files" \
    --data-binary @FILENAME
              
            
              
                  
import webbrowser
import requests
import pprint

# Access Token
OAUTH_FLOW_URL = ("https://api.kloudless.com/v1/oauth?scope=any.storage"
                  "&client_id="
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5"
                  "&response_type=token&state=13373")
webbrowser.open(OAUTH_FLOW_URL)

# Authorization
BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
HEADERS = {
    "Authorization": "Bearer %s" % BEARER_TOKEN
}

# Download a file
DOWNLOAD_URL = ("https://api.kloudless.com/v1/accounts/me/"
                "storage/files/%s/contents" % FILE_ID)
response = requests.get(LIST_CONTACTS_URL, headers=HEADERS, stream=True)
with open(FILENAME, 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024):
        if chunk:
            f.write(chunk)

# Upload a file

UPLOAD_URL = ("https://api.kloudless.com/v1/accounts/me/"
              "storage/files")
with open(FILENAME, 'rb') as f:
    requests.post(UPLOAD_URL, data=f, headers=HEADERS)
              
            
              
                  
import axios from 'axios';

// Access Token
const OAUTH_URL = "https://api.kloudless.com/v1/oauth?scope=any.storage" +
                  "&client_id=" +
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5" +
                  "&response_type=token&state=13373";

window.open(OAUTH_URL);

// Authorization
const BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
let config = {
  headers: {
    Authorization: "Bearer " + BEARER_TOKEN,
  }
}

// Download a File
let DOWNLOAD_URL = "https://api.kloudless.com/v1/accounts/me/" +
                   "storage/files/" + FILEID + "/contents"

axios.get(DOWNLOAD_URL, {responseType: 'blob'}, config)
  .then((response) => {
    let data = new Buffer(response.data, 'binary')
      .toString('base64');
    console.log(data);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });


// Upload a File
let UPLOAD_URL = "https://api.kloudless.com/v1/accounts/me/" +
                 "storage/files";
let formData = new FormData();
formData.append('file', this.file);
config['headers']['Content-Type'] = 'multipart/form-data'

axios.post(UPLOAD_URL, formData, config)
  .then(function (response) {
    // handle success
    console.log('SUCCESS!!');
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });
              
            
              
                  
# Retrieve access token
open "https://api.kloudless.com/v1/oauth/?&scope=any.storage&client_id=d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5&response_type=token&state=13373"

$BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"

# Search for a file within a single storage account
curl -H 'Authorization: Bearer $BEARER_TOKEN' \
    'https://api.kloudless.com/v1/accounts/me/storage/search?q=test'

# Search for files within three storage accounts
curl -H 'Authorization: Bearer $TOKEN1,$TOKEN2,$TOKEN3' \
    'https://api.kloudless.com/v1/accounts/123,456,789/storage/search?q=test'
              
            
              
                  
import webbrowser
import requests
import pprint

# Access Token
OAUTH_FLOW_URL = ("https://api.kloudless.com/v1/oauth?scope=any.storage"
                  "&client_id="
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5"
                  "&response_type=token&state=13373")
webbrowser.open(OAUTH_FLOW_URL)

# Authorization
BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
HEADERS = {
    "Authorization": "Bearer %s" % BEARER_TOKEN
}

# Search for a file within a single storage account
SEARCH_ACCOUNT_URL = ("https://api.kloudless.com/v1/accounts/me/"
                      "storage/search")
params = {"q": "test"}

response = requests.get(SEARCH_ACCOUNT_URL, headers=HEADERS, params=params)
# Pretty Print response
if response.ok:
    data = response.json()
    for child in data['objects'][:5]:
        pprint.pprint(child)

# Search for files within three storage accounts
HEADERS = {
    "Authorization": "Bearer %s,%s,%s" % (TOKEN1, TOKEN2, TOKEN3)
}
SEARCH_ACCOUNTS_URL = ("https://api.kloudless.com/v1/accounts/"
                       "123,456,789/storage/search")
params = {"q": "test"}

response = requests.get(SEARCH_ACCOUNTS_URL, headers=HEADERS, params=params)
# Pretty Print response
if response.ok:
    data = response.json()
    for child in data['objects'][:5]:
        pprint.pprint(child)

              
            
              
                  
import axios from 'axios';

// Access Token
const OAUTH_URL = "https://api.kloudless.com/v1/oauth?scope=any.storage" +
                  "&client_id=" +
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5" +
                  "&response_type=token&state=13373";

window.open(OAUTH_URL);

// Authorization
const BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
let config = {
  headers: {
    Authorization: "Bearer " + BEARER_TOKEN,
  }
}

// Search for a file within a single storage account
let SEARCH_URL = "https://api.kloudless.com/v1/accounts/me/" +
                        "storage/search";
axios.get(SEARCH_URL, {q: "test"}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

// Search for files within three storage accounts
let SEARCH_ACCOUNTS_URL = "https://api.kloudless.com/v1/accounts/" +
                          "123,456,789/storage/search";
config['headers'] = {
    Authorization: 'Bearer ' + [TOKEN1, TOKEN2, TOKEN3].join(',')
}
axios.get(SEARCH_ACCOUNTS_URL, {q: "test"}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });
              
            
              
                  
# Retrieve access token
open "https://api.kloudless.com/v1/oauth/?&scope=any.storage&client_id=d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5&response_type=token&state=13373"

$BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"

## Retrieve the latest cursor
curl -H 'Authorization: Bearer $BEARER_TOKEN' \
    'https://api.kloudless.com/v1/accounts/me/events/latest'

## TODO: It would be best to perform some actions, so that
## there will be events to retrieve

## Retrieve the latest events using the latest cursor
curl -H 'Authorization: Bearer $BEARER_TOKEN' \
    'https://api.kloudless.com/v1/accounts/me/events?cursor=$CURSOR'
              
            
              
                  
import webbrowser
import requests
import pprint

# Access Token
OAUTH_FLOW_URL = ("https://api.kloudless.com/v1/oauth?scope=any.storage"
                  "&client_id="
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5"
                  "&response_type=token&state=13373")
webbrowser.open(OAUTH_FLOW_URL)

# Authorization
BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
HEADERS = {
    "Authorization": "Bearer %s" % BEARER_TOKEN
}

## Retrieve the latest cursor
CURSOR_URL = ("https://api.kloudless.com/v1/accounts/me/"
              "events/latest")
response = requests.get(CURSOR_URL, headers=HEADERS)

# Pretty Print response
if response.ok:
    data = response.json()
    pprint.pprint(data)

## TODO: It would be best to perform some actions, so that
## there will be events to retrieve

## Retrieve the latest events using the latest cursor
EVENTS_URL = ("https://api.kloudless.com/v1/accounts/me/"
              "events")
params = {"cursor": LATEST_CURSOR}

response = requests.get(EVENTS_URL, headers=HEADERS, params=params)
# Pretty Print response
if response.ok:
    data = response.json()
    for child in data['objects'][:5]:
        pprint.pprint(child)
              
            
              
                  
import axios from 'axios';

// Access Token
const OAUTH_URL = "https://api.kloudless.com/v1/oauth?scope=any.storage" +
                  "&client_id=" +
                  "d5tecX5XUmc2dgnOwolR4WADXG4iMcXNhjxxjGsVRfavESi5" +
                  "&response_type=token&state=13373";

window.open(OAUTH_URL);

// Authorization
const BEARER_TOKEN = "PASTE ACCESS TOKEN HERE"
let config = {
  headers: {
    Authorization: "Bearer " + BEARER_TOKEN,
  }
}

// Retrieve the latest cursor
let CURSOR_URL = "https://api.kloudless.com/v1/accounts/me/" +
                 "events/latest";
axios.get(CURSOR_URL, {}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

// Retrieve the latest events using the latest cursor
let EVENTS_URL = "https://api.kloudless.com/v1/accounts/me/" +
                 "storage/search";
axios.get(SEARCH_URL, {cursor: LATEST_CURSOR}, config)
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });
              
            

Built by developers, for developers

All the cloud storage features you need from CRUD to real-time webhooks. Here are some example use cases.

File Transfer

Upload to and download from any storage service

Search

Find files across any cloud storage services

Sync

Get webhook notifications on any file or folder

View more code samples

Add integrations even faster our plugin file picker

The Kloudless File Explorer is an open source, JavaScript library that enables your users to browse and select files and folders from any of the cloud storage services we support. Use this plugin as an authentication interface, file and folder picker, file uploader, or downloader right inside your app.

With over 100 million learners on their platform, Blackboard integrated Kloudless to power document collaboration workflows from any cloud storage service. Blackboard is saving over 5,000 developer hours and as much as $150,000 a year by using Kloudless to scale the way they build and maintain integrations.

blackboard title copy

Deployment Options

Take advantage of our flexible hosting options to run Kloudless according to your business’ requirements.

Cloud

Securely and reliably hosted by Kloudless — the quickest way to start building integrations.

  • Fully managed by Kloudless
  • Pre-configured connectors to get started quickly
  • 99.9% uptime
  • Bank-level encryption both in transit and at rest
Self-hosted

Kloudless Enterprise is a Docker container, AWS AMI, or OVA to deploy in private infrastructure.

  • Complete data privacy and regulatory compliance
  • On-prem connectors, such as Exchange and Oracle
  • Clustering for high availability
  • Custom SLAs including 24/7 support

Enough reading — let’s code.
Try our cloud storage API today.

Not a developer? Talk to an expert.

An arrow pointing to the 'get your api key' button