Decentralized NFT Storage

# Upload using cURL
$ curl -X POST -F file=@/path/file.extension

# Upload from web
Drag your files here or click to browse.


This service allows you to use IPFS pinning to the decentralized cloud via a Storj-hosted, IPFS-dedicated node on the Storj network. This service has exceptional performance when uploading and downloading your CID at our IPFS gateway. And, storing on the decentralized cloud inherently means your NFTs are more secure, automatically globally redundant and immutable.
Storing on Storj distributes pieces of your NFT across 13,500+ geographical diverse Storage Nodes in 100 countries for long-term, ultra secure, auto redundant, and immutable storage.


Upload your digital asset by either using our cURL command from your CLI or by dragging and dropping your file onto our upload box. After uploading, an IPFS hash of the content (CID) will be generated and you can use it to make an IPFS URL (i.e.<cid>).
# Upload using cURL
$ curl -X POST -F file=@/path/file.extension
This service is free and your data will remain pinned for 30 days until it falls off during ongoing garbage collection. See our Data Retention Policy or click here for permanent pinning.


Easily fetch or “retrieve” your content by using your CID in a browser like Brave, a public IPFS gateway, or IPFS programs like IPFS Desktop or IPFS CLI. You will experience the best performance using the Storj Gateway below.
Storj IPFS Gateway<cid>
In cases where the gateway is unable to retrieve a given CID (e.g., returns a 404 error), you can try a different gateway or running and using your own IPFS node instead.

Upload example using JavaScript

You'll need Node.js installed on your local system for this example.
1. Make a new JavaScript project.
Create a new directory and use npm to create a new project:
mkdir storj-ipfs-quickstart
cd storj-ipfs-quickstart
npm init

NPM will ask a few questions about your project and create a package.json file.
2. Add the axios HTTP client to your project dependencies.
Install the latest version of the axios package:
npm install axios

3. Create a file called upload.js and open it with your code editor.
Below is the code we need to upload a file and pin it on the Storj IPFS pinning service.
Paste in the code below and read through it. Feel free to remove the comments - they're just there to highlight what’s going on.
// The 'axios' module gives a promised-based HTTP client.
const axios = require('axios');

// The 'fs' builtin module provides us access to the file system.
const fs = require('fs');

// The 'form-data' builtin module helps us submit forms and file uploads
// to other web applications.
const FormData = require('form-data');

  * Uploads a file from `filepath` and pins it to the Storj IPFS pinning service.
  * @param {string} filepath the path to the file
async function pinFileToIPFS(filepath) {
    // The HTTP upload endpoint of the Storj IPFS pinning service
    const url = ``;

    // Create a form with the file to upload
    let data = new FormData();
    data.append('file', fs.createReadStream(filepath));

    // Execute the Upload request to the Storj IPFS pinning service
            headers: {
                'Content-Type': `multipart/form-data; boundary= ${data._boundary}`,
            // These arguments remove any client-side upload size restrictions
            maxContentLength: Infinity,
            maxBodyLength: Infinity,
    ).then(function (response) {
    }).catch(function (error) {

 * The main entry point for the script that checks the command line arguments and
 * calls pinFileToIPFS.
 * To simplify the example, we don't do any fancy command line parsing. Just three
 * positional arguments for imagePath, name, and description
 async function main() {
    const args = process.argv.slice(2)
    if (args.length !== 1) {
        console.error(`usage: ${process.argv[0]} ${process.argv[1]} `)

    const filepath = args[0]
    const result = await pinFileToIPFS(filepath)

 * Don't forget to actually call the main function!
 * We can't `await` things at the top level, so this adds
 * a .catch() to grab any errors and print them to the console.
  .catch(err => {

4. Run your script with node.
You should now be able to run the script and give it the path to a file.
node upload.js path/file.extension

Storj enabled the largest NFT sale in history.

Discover how the Jupiter Group leveraged the security, performance and scalability benefits of Storj to bring Brendan Murphy's art into the metaverse for the largest NFT sale in history.
Read the Case Study

Powering P2E Gaming Through Decentralized NFT Storage.

Ultimate Division is a P2E game where players build teams using NFT player cards. See how Ultimate Division is getting better performance and costs for their NFT storage on Storj.
Read the Case Study

Your NFT's. Decentralized.

With Storj, data isn't stored in centralized data centers— instead, it's encrypted, split into pieces, and distributed on a massive global cloud network.


Identity-based access controls and continuous authentication of zero-trust provides a better way to protect NFTs.
Learn More


The decentralized and content-addressed approach radically increasesof data - delivering 11 .
Learn More


Automatic global redundancy through Reed Solomon erasure coding guarantees 99.95% availability.
Learn More


Extreme paralellism and edge-based performance take bandwidth to the next level with hot rodded performance.
Learn More

Have questions?

Get in touch with our sales team to learn more about the Storj IPFS pinning service, our plans for permanent NFT storage and how you can join our beta.