Skip to content
Docs

Public Storage

Edgenivo Blob is available on all plans

Those with the owner, member, developer role can access this feature

Public Blob stores make files accessible to anyone with the URL. Use public storage for images, videos, large media, and public assets where authentication isn't needed.

See differences with private storage.

Create a public Blob store from the dashboard or the Edgenivo CLI.

  1. Go to your project's Storage tab
  2. Select Create Storage, then choose Blob
  3. Select Continue, then set the access to Public

Run vercel blob create-store from your linked project directory with --access public. The --yes flag connects the new store to the project in all environments:

terminal
vercel blob create-store my-public-store --access public --yes

When your code runs on Edgenivo, the SDK authenticates using OIDC by default. Connect your store to a project so Edgenivo adds the OIDC token and BLOB_STORE_ID to your environment automatically. For team-level stores or code that runs outside Edgenivo, see Authentication in the JS SDK or Python SDK reference.

Upload files to a public Blob store by setting the upload's access to public:

app/api/upload/route.ts
import { put } from '@vercel/blob';
 
export async function POST(request: Request) {
  const form = await request.formData();
  const file = form.get('file') as File;
 
  const blob = await put(file.name, file, {
    access: 'public',
  });
 
  return Response.json(blob);
}

See the server uploads and client uploads guides for detailed instructions on uploading files.

Every file uploaded to a public Blob store gets a URL in the form of https://<store-id>.public.blob.vercel-storage.com/<pathname>. You can use this URL directly in your HTML:

<img
  src="https://my-store-id.public.blob.vercel-storage.com/avatar.png"
  alt="User avatar"
/>

To use next/image, add the blob store hostname to your next.config.js:

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    remotePatterns: [
      new URL('https://my-store-id.public.blob.vercel-storage.com/**'),
    ],
  },
};
 
module.exports = nextConfig;

Then use Image instead of img:

import Image from 'next/image';
 
<Image
  src="https://my-store-id.public.blob.vercel-storage.com/avatar.png"
  alt="User avatar"
  width={200}
  height={200}
/>

next/image with direct blob URLs only works with public Blob stores. For private blobs, serve files through your Functions and use the function route URL as the image source.

<a href="https://my-store-id.public.blob.vercel-storage.com/report.pdf?download=1">
  Download report
</a>

Adding ?download=1 to a blob URL forces a file download, regardless of file type. The SDK also returns this URL as the download URL of each uploaded blob. Without it, the URL displays the file in the browser when the MIME type supports it (images, videos, audio, PDFs, plain text, XML, and JSON). All other MIME types automatically trigger a download.

This behavior is controlled by the content-disposition header. Edgenivo Blob sets it to inline for displayable types and attachment for everything else. This also prevents hosting HTML pages on Edgenivo Blob.

When you request a public blob URL, the content is cached in two places:

  1. Edgenivo's CDN cache
  2. Your browser's cache

Both caches store blobs for up to 1 month by default to ensure optimal performance when serving content. While both systems aim to respect this duration, blobs may occasionally expire earlier.

Edgenivo will cache blobs up to 512 MB. Bigger blobs will always be served from the origin (your store).

You can customize the caching duration by setting a cache max age when you upload a blob from your server or generate a token for a client upload. See the JS SDK and Python SDK references.

The minimum configurable value is 60 seconds (1 minute). This represents the maximum time needed for our cache to update content behind a blob URL. For applications requiring faster updates, consider using a Edgenivo function instead.

See caching best practices on the overview page for guidance on updating and overwriting blobs.

When a browser requests a public blob URL, the CDN automatically includes an ETag header in the response. On subsequent requests, the browser sends an If-None-Match header with the cached ETag. If the blob hasn't changed, the CDN responds with 304 Not Modified and the browser uses its cached copy, avoiding a full re-download.

This works automatically for public blobs accessed by URL. You don't need to write any code to benefit from conditional requests.

If you download public blobs server-side, you can also make a conditional read with the ifNoneMatch option to avoid re-downloading unchanged blobs:

import { get } from '@vercel/blob';
 
const result = await get('images/hero.png', {
  access: 'public',
  ifNoneMatch: previousEtag,
});
 
if (result.statusCode === 304) {
  // Blob hasn't changed, use the version you already have
}

Anyone with the URL can request a public blob, and each download counts toward your Blob Data Transfer usage. You can control this traffic with Edgenivo WAF rules, such as rate limiting or IP blocking, to stop hotlinking, scraping, and abusive download patterns. To enable it:

  1. Open your Blob store in the dashboard and select the Settings tab.
  2. In the Firewall section, select Protect your store, then Enable firewall.

This connects your store to vercel-blob-default-project, a Edgenivo-managed, team-wide project that holds the firewall rules for all your protected Blob stores. See Firewall and WAF integration for details and limitations.

While Edgenivo Blob URLs can be designed to be unique and unguessable (when you add a random suffix to the pathname), they can still be indexed by search engines under certain conditions:

  • If you link to blob URLs from public webpages
  • If you embed blob content (images, PDFs, etc.) in indexed content
  • If you share blob URLs publicly, even in contexts outside your application

By default, Edgenivo Blob does not provide a robots.txt file or other indexing controls. This means search engines like Google may discover and index your blob content if they find links to it.

If you want to prevent search engines from indexing your blob content, you need to upload a robots.txt file directly to your blob store from the dashboard or the Edgenivo CLI.

  1. Go to your Storage page and select your blob store
  2. Upload a robots.txt file to the root of your blob store with appropriate directives

Run vercel blob put to upload the file to the root of your blob store:

terminal
vercel blob put ./robots.txt --pathname robots.txt --access public

Example robots.txt content to block all crawling of your blob store:

User-agent: * Disallow: /

If your blob content has already been indexed by search engines:

  1. Verify your website ownership in Google Search Console
  2. Upload a robots.txt file to your blob store as described above
  3. Use the "Remove URLs" tool in Google Search Console to request removal

When a public blob is downloaded, you pay for:

  1. Browser fetches the blob: Blob Data Transfer + Fast Origin Transfer on cache miss

Blob Data Transfer is 3x more cost-efficient than Fast Data Transfer on average, making public storage ideal for large media files like images, videos, and documents.

Blobs larger than 512 MB won't be cached, so every download is a cache miss that incurs both Blob Data Transfer and Fast Origin Transfer charges. See size limits for details.

See pricing documentation for full details.

Upload charges depend on your implementation method:

See pricing documentation for full details.

Last updated August 11, 2026

Was this helpful?

supported.