REGISTER NOW: Supercharge Your Cloud Integrations and Register for our Webinar on 9/26
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
              
                  # Download a file
curl -H "Authorization: Bearer $BEARER_TOKEN" \
    "https://api.kloudless.com/v1/accounts/me/storage/files/${FILE_ID}/contents" \
    --output $FILE_NAME

# Upload a file
curl -X POST -H "Authorization: Bearer $BEARER_TOKEN" \
    -H "Content-Type: application/octet-stream" \
    -H "X-Kloudless-Metadata: {\"name\": \"$FILE_NAME\", \"parent_id\": \"root\"}" \
    --data-binary "@$FILE_NAME" \
    "https://api.kloudless.com/v1/accounts/me/storage/files"
              
            
              
                  
import json
from kloudless import Account

account = Account(token=BEARER_TOKEN)

# Download a file
response = account.get("storage/files/%s/contents" % FILE_ID)
content = response.content

# Upload a file
headers = {
    'X-Kloudless-Metadata': json.dumps(
        {'parent_id': 'root', 'name': FILE_NAME}
    )
}
with open(FILE_NAME, 'rb') as f:
    response = account.post("storage/files", data=f, headers=headers)
              
            
              
                  
const account = new Kloudless.sdk.Account({ token: BEARER_TOKEN });

// Download a file
let response = await account.get({
  url: `storage/files/${FILE_ID}/contents`
});

// Prompt a dialog to save the file save
response.download(FILE_NAME);

// Upload a file
const file = document.querySelector('input[type=file]').files[0];
response = await account.post({
  url: 'storage/files',
  headers: {
    'X-Kloudless-Metadata': {
      parent_id: 'root',
      name: file.name
    },
  },
  data: file,
});

              
            
              
                  
import java.io.File;
import com.google.gson.Gson;
import com.kloudless.Account;
import com.kloudless.models.Resource;
import com.kloudless.models.ResponseRaw;
import org.apache.http.HttpResponse;

Account account = new Account("YOUR BEARER TOKEN");

// Download a file
String fileId = "FILE_ID";
ResponseRaw responseRaw =
    (ResponseRaw) account.get("/storage/files/" + fileId + "/contents");
InputStream inputStream = responseRaw.getData().getEntity().getContent();

// Upload a file
File newFile = new File("/path/of/local/file");
String folderId = "FOLDER ID";

Map<String, Object> json = new HashMap<String, Object>();
json.put("name", newFile.getName());
json.put("parent_id", folderId);

Map<String, Object> headers = new HashMap<String, Object>();
headers.put("X-Kloudless-Metadata", new Gson().toJson(json));

Resource file = 
    (Resource) account.post("/storage/files?overwrite=false",
                            headers, newFile);
              
            
              
                  # 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/$ACCOUNT1,$ACCOUNT2,$ACCOUNT3/storage/search?q=test"
              
            
              
                  
from kloudless import Account

# Search for a file within a single storage account
account = Account(token=BEARER_TOKEN)
response = account.get('storage/search', params={"q": "test"})

# Search for files within three storage accounts
BEARER_TOKENS = "%s,%s,%s" % (TOKEN1, TOKEN2, TOKEN3)
ACCOUNT_IDS = "%s,%s,%s" % (ACCOUNT1, ACCOUNT2, ACCOUNT3)

accounts = Account(token=BEARER_TOKENS, account_id=ACCOUNT_IDS)
response = accounts.get('storage/search', params={"q": "test"})
              
            
              
                  
const account = new Kloudless.sdk.Account({ token: BEARER_TOKEN });
const params = { q: 'test' };

// Search for a file within a single storage account
let response = await account.get({
  url: 'storage/search',
  params
});

// Search for files within three storage accounts
const BEARER_TOKENS = [TOKEN1, TOKEN2, TOKEN3].join(',');
const ACCOUNT_IDS = [ACCOUNT1, ACCOUNT2, ACCOUNT3].join(',');
response = await Kloudless.sdk.get({
  url: `accounts/${ACCOUNT_IDS}/storage/search`,
  headers: {
    Authorization: `Bearer ${BEARER_TOKENS}`
  },
  params
});

              
            
              
                  
import com.google.gson.JsonObject;
import com.kloudless.Account;
import com.kloudless.models.ResourceList;

Account account = new Account("YOUR BEARER TOKEN");

ResourceList fileList = 
    (ResourceList) account.get("/storage/search?q=test");
JsonObject data = fileList.getData();
              
            
              
                  # Retrieve the current cursor
CURSOR=$(curl -H "Authorization: Bearer $BEARER_TOKEN" \
              "https://api.kloudless.com/v1/accounts/me/activity" \
              | jq ".cursor")

# Once the user makes a change, retrieve new activity
curl -H "Authorization: Bearer $BEARER_TOKEN" \
        "https://api.kloudless.com/v1/accounts/me/activity?cursor=$CURSOR"
              
            
              
                  
from kloudless import Account

account = Account(token=BEARER_TOKEN)

# Retrieve the current cursor
response = account.get('activity')
cursor = response.data['cursor']

# Once the user makes a change, retrieve new activity
response = account.get('activity', params={"cursor": cursor})
              
            
              
                  
const account = new Kloudless.sdk.Account({ token: BEARER_TOKEN });

// Retrieve the current cursor
let response = await account.get({ url: 'activity' });
let cursor = response.data.cursor;

// Once the user makes a change, retrieve new activity
response = await account.get({
  url: 'activity',
  params: { cursor }
});

              
            
              
                  
import com.google.gson.JsonObject;
import com.kloudless.Account;
import com.kloudless.models.ResourceList;

Account account = new Account("YOUR BEARER TOKEN");

// Retrieve the current cursor
ResourceList response = 
    (ResourceList) account.get("/activity");
JsonObject data = response.getData();
String cursor = response.getCursor();

// Once the user makes a change, retrieve new activity
response =
    (ResourceList) account.get("/activity?cursor=" + cursor);
data = response.getData();
              
            

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 with our 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