Skip to content

Background Fetch support

Published Updated

Background Fetch hands a long-running download (or upload) off to the browser itself: the browser performs the fetch in a user-visible way, showing progress and a cancel option, and wakes the service worker once the operation completes.

  • Legend
  • Yes
  • Partial
  • Flag
  • No
  • Unknown
Browser / PlatformSupportVersionsConfidenceSourceNotes
Chrome (Desktop)Yes74highsource—
Chrome (Android)Yes74highsource1
Edge (Desktop)Yes79highsource2
Firefox (Desktop)No—highsource3
Firefox (Android)No—highsource45
Safari (macOS)No—highsource6
Safari (iOS)No—highsource78
Samsung InternetYes11.0highsource9
WebView (Android)No—highsource10
  1. Derived by browser-compat-data mirroring from Chrome.
  2. Derived by browser-compat-data mirroring from Chrome.
  3. No Firefox support is recorded in browser-compat-data.
  4. No Firefox for Android support is recorded in browser-compat-data.
  5. Derived by browser-compat-data mirroring from Firefox.
  6. No Safari support is recorded in browser-compat-data.
  7. No Safari on iOS support is recorded in browser-compat-data.
  8. Derived by browser-compat-data mirroring from Safari.
  9. Derived by browser-compat-data mirroring from Chrome Android.
  10. No WebView Android support is recorded in browser-compat-data.

Source data: /compatibility/background-fetch.json · Global usage: 72 % (StatCounter 2026-05)

Source: spec · MDN · Last verified 2026-10-03 · Confidence: high (computed from sources)

Feature-detect, then call fetch() on the service worker registration’s backgroundFetch manager:

async function startBackgroundFetch(urls) {
const registration = await navigator.serviceWorker.ready;
return registration.backgroundFetch.fetch('my-fetch', urls, {
title: 'Episode 5',
downloadTotal: 60 * 1024 * 1024,
});
}

Handle the settlement events in the service worker:

self.addEventListener('backgroundfetchsuccess', (event) => {
event.waitUntil(handleCompletedFetch(event.registration));
});
self.addEventListener('backgroundfetchfail', (event) => {
event.waitUntil(cleanUpFailedFetch(event.registration));
});

Check for BackgroundFetchManager before calling fetch(). When it is absent, download each file with a regular fetch() call instead:

async function downloadFiles(urls) {
if (!('BackgroundFetchManager' in self)) {
for (const url of urls) {
const response = await fetch(url);
await handleResponse(response);
}
return;
}
const registration = await navigator.serviceWorker.ready;
await registration.backgroundFetch.fetch('my-fetch', urls, {
title: 'Files',
downloadTotal: 0,
});
}
  • Firefox and Safari do not implement this API — per the table above, support is Chromium-only, so always branch to a regular-fetch() fallback rather than assuming availability.
  • Group files that belong together (e.g. media plus artwork) into a single fetch() call so they appear as one user-visible download.
  • Handle backgroundfetchsuccess and backgroundfetchfail in the service worker to process or clean up after the download; handle backgroundfetchclick to route the user back to a relevant screen.
  • Reserve Background Fetch for large, long-running downloads — it is not a substitute for short tasks that don’t need user-visible progress.

← Back to the Compatibility explorer.