Background Fetch API

Enable reliable large file downloads that continue even when the browser closes, with visible progress and automatic retry for offline scenarios.

Understanding the Problem Background Fetch Solves

When web applications need to download large files, traditional approaches face significant challenges. A standard fetch request requires the page to remain open--if the user closes the tab, navigates away, or loses internet connectivity, the download fails and must restart from the beginning.

The Background Synchronization API addressed part of this problem by allowing service workers to defer work until connectivity returns, but it has limitations. Synchronization tasks that run too long get terminated by browsers to protect user privacy and battery life. For a comprehensive overview of service worker capabilities, including background sync patterns, see our detailed guide.

Key challenges with traditional downloads:

  • Downloads fail when users close tabs or navigate away
  • Network interruptions require full restart of downloads
  • No user-visible progress for background operations
  • Battery and privacy concerns limit long-running tasks

The Background Fetch API fills this gap by providing a mechanism for long-running downloads that browsers can manage safely and transparently.

How Background Fetch Differs from Standard Fetch

Standard fetch operations are tightly coupled to page execution. Background Fetch operates at the browser level rather than the page level. When you initiate a background fetch, the browser takes ownership of the download process. The browser displays visible progress to users, handles network interruptions gracefully, and allows users to cancel downloads at any time. Once all files complete downloading, the browser wakes the service worker to handle the results.

This approach enables reliable downloads without requiring pages to remain open, making it essential for progressive web apps and offline-first experiences.

Core Capabilities

What Background Fetch brings to modern web applications

Browser-Managed Downloads

Downloads continue even when the browser closes, with progress displayed in the browser's download manager.

Offline Resilience

Downloads pause during network interruptions and resume automatically when connectivity returns.

User Visibility

Users see download progress, file names, and can cancel downloads at any time through browser UI.

Service Worker Integration

Events notify your service worker when downloads complete or fail, enabling proper response handling.

Core API Interfaces and Methods

The Background Fetch API consists of several interconnected interfaces that work together to enable background download functionality. Understanding these interfaces helps developers implement the API correctly and leverage its full capabilities.

BackgroundFetchManager

The entry point for the API, accessed through the service worker registration via the backgroundFetch property. From this manager, developers can initiate new fetches with the fetch() method, retrieve existing fetches with get(), and list all active fetches with getIds(). Proper service worker registration is a prerequisite for using this API.

Key methods:

  • fetch(id, requests, options) - Initiates a new background fetch
  • get(id) - Retrieves an existing background fetch
  • getIds() - Returns all active background fetch IDs

BackgroundFetchRegistration

Represents an ongoing or completed fetch operation with status and progress information. Key properties include id, downloadTotal and downloaded for progress calculation, result for status, and failureReason for specific error information.

Key properties:

  • id - The unique identifier
  • downloadTotal and downloaded - For progress calculation
  • result - success, failure, or empty for ongoing
  • failureReason - Specific error information (aborted, bad-status, fetch-error, quota-exceeded, download-total-exceeded)

Key methods:

  • abort() - Cancels the download
  • match(request) and matchAll() - Retrieves individual records

BackgroundFetchRecord

Represents an individual fetch request and its response within a background fetch operation. Each record contains the request URL and provides access to the response once downloaded.

Initiating a Background Fetch
1navigator.serviceWorker.ready.then(async (swReg) => {2 const bgFetch = await swReg.backgroundFetch.fetch(3 'podcast-episode-42',4 ['/episodes/42.mp3', '/episodes/42-artwork.jpg'],5 {6 title: 'Episode 42: The Future of Web APIs',7 icons: [8 { sizes: '300x300', src: '/icons/podcast.png', type: 'image/png' }9 ],10 downloadTotal: 75 * 1024 * 1024, // 75 MB estimated11 }12 );13 14 // Track progress15 bgFetch.addEventListener('progress', () => {16 const percent = bgFetch.downloadTotal17 ? Math.round((bgFetch.downloaded / bgFetch.downloadTotal) * 100)18 : null;19 console.log(`Download progress: ${percent}%`);20 });21});

Browser Support

74+

Chrome Version

79+

Edge Version

1

Safari Support

No

Firefox Support

Implementing Background Fetch in Your Application

Successful implementation requires several coordinated components working together: feature detection in the main thread, service worker registration, proper fetch initiation, event handling in the service worker, and response processing.

Main Thread Responsibilities

  • Feature detection before using the API
  • Service worker registration if not already registered
  • Initiating fetches with appropriate parameters
  • Displaying initial feedback to users
  • Listening for progress events

Service Worker Event Handling

The service worker receives events when downloads complete or encounter errors. This event-driven approach means the service worker only runs when necessary, preserving battery and resources. Our web development services include comprehensive service worker implementation to handle these patterns correctly.

// Service worker event handlers
self.addEventListener('backgroundfetchsuccess', (event) => {
 const bgFetch = event.registration;
 event.waitUntil(async () => {
 // Process downloaded responses
 const cache = await caches.open('downloaded-content');
 const records = await bgFetch.matchAll();
 for (const record of records) {
 const response = await record.responseReady;
 await cache.put(record.request, response);
 }
 });
});

self.addEventListener('backgroundfetchfail', (event) => {
 // Handle download failure
});

self.addEventListener('backgroundfetchabort', (event) => {
 // Handle user cancellation
});

Progress tracking provides users with feedback during downloads. The BackgroundFetchRegistration fires a progress event whenever downloaded bytes change, enabling real-time progress updates. Since the download happens at the browser level, progress continues even when the page isn't open on supporting platforms. This pattern is particularly valuable for AI-powered applications that need to download large models for offline inference.

Best Practices and Common Patterns

Implementing Background Fetch effectively requires following established patterns that ensure reliability, user experience, and proper error handling.

Feature Detection and Fallbacks

Always check for API support before using Background Fetch. Not all browsers support this API, so implement graceful degradation for unsupported platforms.

async function isBackgroundFetchSupported() {
 return 'serviceWorker' in navigator &&
 'backgroundFetch' in await navigator.serviceWorker.ready;
}

User Experience Guidelines

  • Clear Messaging: Inform users when downloads will continue in the background
  • Progress Indicators: Show download progress even when users navigate away
  • Notification Management: Use service worker notifications appropriately to inform users of completion
  • Storage Management: Monitor downloaded content and provide options to clear cache

These patterns are essential for progressive web apps that deliver native-like experiences in the browser.

Error Handling Patterns

Background Fetch operations can fail for several reasons. Implement comprehensive error handling that addresses each failure mode:

  • Network errors: Implement retry logic with exponential backoff
  • Storage quota exceeded: Inform users and provide cleanup options
  • User cancellation: Respect user choices and clean up partial downloads
  • Server errors: Retry temporary failures, fail gracefully on permanent errors

Security Considerations

  • Validate download URLs to prevent malicious redirects
  • Use HTTPS for all downloads to protect user data
  • Consider implementing request signing for authenticated downloads
  • Implement rate limiting to prevent abuse

Performance Optimization

  • Estimate downloadTotal accurately to provide meaningful progress
  • Chunk large downloads into logical groups
  • Use appropriate cache strategies for downloaded content
  • Consider background preloading for frequently accessed resources

For applications requiring robust offline capabilities, combining Background Fetch with caching strategies creates a powerful foundation for delivering reliable user experiences.

Service Worker Event Handling
1self.addEventListener('backgroundfetchsuccess', (event) => {2 const bgFetch = event.registration;3 4 event.waitUntil(async () => {5 // Get all downloaded responses6 const records = await bgFetch.matchAll();7 8 // Cache responses for offline use9 const cache = await caches.open('podcast-episodes');10 for (const record of records) {11 const response = await record.responseReady;12 await cache.put(record.request, response);13 }14 15 // Notify user of completion16 registration.showNotification('Download Complete', {17 body: 'Your content is ready for offline use.',18 icon: '/icons/download-complete.png'19 });20 });21});22 23self.addEventListener('backgroundfetchfail', (event) => {24 registration.showNotification('Download Failed', {25 body: 'Unable to download. Please try again.'26 });27});

Frequently Asked Questions

Build Reliable Offline-First Web Applications

Our team specializes in progressive web apps, service worker implementations, and modern web APIs that deliver native-like experiences in the browser.

Sources

  1. MDN Web Docs - Background Fetch API - Comprehensive API documentation with interface definitions
  2. Chrome for Developers - Introducing Background Fetch - Official Chrome team implementation guide
  3. web.dev - Download AI models with the Background Fetch API - Progressive enhancement patterns for modern use cases