> ## Documentation Index
> Fetch the complete documentation index at: https://docs.omni.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Triage 'Failed to fetch' browser errors

> Diagnose and resolve Failed to fetch browser errors caused by extensions, firewalls, proxies, or VPNs.

export const categoryIcons = {
  'administration': 'lock',
  'api': 'terminal',
  'connections': 'database',
  'dashboards': 'table-columns',
  'embed': 'code',
  'errors': 'exclamation',
  'modeling': 'wrench',
  'patterns': 'plus',
  'schedules & alerts': 'envelope',
  'visualizations': 'chart-column',
  'workbooks': 'book'
};

export const GuideSidebar = ({category, relatedLinks, updatedDate}) => {
  const [progress, setProgress] = React.useState(0);
  React.useEffect(() => {
    const sidebar = document.querySelector('.guide-sidebar');
    if (!sidebar) return;
    let container = sidebar.parentElement;
    while (container && !container.querySelector('.guide-header')) {
      container = container.parentElement;
    }
    if (container && !container.classList.contains('guide-page-layout')) {
      container.classList.add('guide-page-layout');
    }
  }, []);
  React.useEffect(() => {
    const handleScroll = () => {
      const scrollTop = window.scrollY;
      const docHeight = document.documentElement.scrollHeight - window.innerHeight;
      const scrollPercent = docHeight > 0 ? scrollTop / docHeight * 100 : 0;
      setProgress(Math.min(100, Math.max(0, scrollPercent)));
    };
    window.addEventListener('scroll', handleScroll, {
      passive: true
    });
    handleScroll();
    return () => window.removeEventListener('scroll', handleScroll);
  }, []);
  const icon = category ? categoryIcons[category.toLowerCase()] || 'book' : 'book';
  return <aside className="guide-sidebar">
      <div className="guide-sidebar-content">
        <a href="/guides" className="guide-sidebar-back">
          <Icon icon="arrow-left" iconType="solid" size={14} />
          <span>All guides</span>
        </a>

        <div className="guide-sidebar-section">
          <div className="guide-sidebar-label">Progress</div>
          <div className="guide-sidebar-progress">
            <div className="guide-mascot">
              <svg viewBox="0 0 688 690" width="48" height="48">
                <defs>
                  <clipPath id="progressClip">
                    <rect x="0" y={0} width="688" height={progress * 6.9} />
                  </clipPath>
                </defs>

                {}
                <path d="M343.67 1.5C542.684 1.5 685.84 149.351 685.84 344.84C685.84 540.328 542.685 688.18 343.67 688.18C144.655 688.18 1.5 540.318 1.5 344.84C1.50007 149.361 144.655 1.50005 343.67 1.5Z" fill="#FCFCF7" stroke="#FF5FA2" strokeWidth="3" />

                {}
                <path d="M343.67 0C143.81 0 0 148.55 0 344.84C0 541.13 143.81 689.68 343.67 689.68C543.53 689.68 687.34 541.14 687.34 344.84C687.34 148.54 543.53 0 343.67 0Z" fill="#FF5FA2" clipPath="url(#progressClip)" />

                {}
                <path d="M337.89 319.29C337.89 336.75 322.49 350.14 302.81 349.83C286.18 349.57 273.89 337.29 274.37 321.45C274.88 304.82 290.91 290.88 309.98 290.44C325.69 290.09 337.88 302.69 337.88 319.29H337.89Z" fill="#4D122C" />
                <path d="M566.17 319.29C566.17 336.75 550.77 350.14 531.09 349.83C514.46 349.57 502.17 337.29 502.65 321.45C503.16 304.82 519.19 290.88 538.26 290.44C553.97 290.09 566.16 302.69 566.16 319.29H566.17Z" fill="#4D122C" />
                <path d="M367.74 342.07C360.22 346.32 359.4 354.9 370.62 366.4C381.85 377.9 399.76 389.56 420.81 389.18C441.88 389.1 460.67 377.72 472.47 363.53C473.83 361.93 478.84 356.88 478.51 351.07C478.32 348.35 476.17 341.19 467.83 341.38C463.46 341.44 461.21 343.68 456.69 347.36C445.2 356.14 432.7 361.21 420.56 361.27C408.43 361.43 395.68 356.17 385.39 347.22C380.32 342.81 375.25 337.82 367.74 342.07Z" fill="#4D122C" />
              </svg>
            </div>
            <span className="guide-sidebar-progress-text">{Math.round(progress)}%</span>
          </div>
        </div>

        {category && <div className="guide-sidebar-section">
            <div className="guide-sidebar-label">Category</div>
            <div className="guide-sidebar-category">
              <Icon icon={icon} iconType="solid" size={14} />
              <span>{category}</span>
            </div>
          </div>}

        {updatedDate && <div className="guide-sidebar-section">
            <div className="guide-sidebar-label">Last updated</div>
            <div className="guide-sidebar-date">{updatedDate}</div>
          </div>}

        {relatedLinks && relatedLinks.length > 0 && <div className="guide-sidebar-section">
            <div className="guide-sidebar-label">Related</div>
            <ul className="guide-sidebar-links">
              {relatedLinks.map((link, index) => <li key={index}>
                  <a href={link.href}>{link.title}</a>
                </li>)}
            </ul>
          </div>}
      </div>
    </aside>;
};

export const GuideTitle = ({title}) => {
  return <div className="guide-header">
      <h1 className="guide-title">{title}</h1>
    </div>;
};

<GuideSidebar
  categoryIcons={categoryIcons}
  category="errors"
  updatedDate="June 2026"
  relatedLinks={[
{ title: "Allowlisting Omni's IP addresses", href: "/administration/security/omni-ip-addresses" },
{ title: "Embedding limitations", href: "/embed/limitations" },
{ title: "Troubleshooting connection issues", href: "/connect-data/troubleshooting" },
]}
/>

<GuideTitle title="Triage Failed to fetch browser errors" />

`Failed to fetch` is a browser-level network error — it means your browser blocked or dropped a request before it reached Omni.

If a page refresh fixes it, the cause was likely a brief internet drop. If the error is consistent or reproducible, work through the steps below to find the cause.

## Scope the problem first

Before troubleshooting, answer these questions — they'll tell you which step to start with and what to tell support if you need to escalate.

| Question                                                | Why it matters                                                                                                               |
| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Is it one user or multiple?                             | Multiple users points to a network or Omni configuration issue, not a browser extension                                      |
| Is it one dashboard or everywhere in Omni?              | Scoped to one dashboard suggests a specific query or data connection; everywhere suggests a browser or network issue         |
| Is it in an embedded context or directly on omniapp.co? | Embed adds iframe and cookie restrictions that can trigger this error                                                        |
| Is it consistent or intermittent?                       | Intermittent errors often indicate network instability (VPN drops, weak Wi-Fi); consistent errors point to a blocked request |

## Steps

<Steps>
  <Step title="Disable browser extensions">
    Ad blockers, privacy tools, and VPN browser extensions are the most common cause of `Failed to fetch` errors. They intercept network requests and can silently block calls to Omni's servers.

    1. Open a **private or incognito window** — extensions are disabled by default in most browsers' private modes.
    2. Log in to Omni and reproduce the action that caused the error.
    3. If the error is gone, a browser extension is the cause. Re-enable your extensions one at a time in a normal window to identify the specific culprit.

    Common offenders include uBlock Origin, Privacy Badger, Ghostery, and any extension marketed as an ad blocker or tracker blocker.
  </Step>

  <Step title="Test on a different network">
    Corporate networks — including firewalls, proxies, and content filters — can block requests to Omni's servers even when Omni is working correctly.

    1. Connect to a **mobile hotspot** or a non-corporate network.
    2. Log in to Omni and reproduce the action.
    3. If the error is gone on a different network, the issue is with your corporate network. Your IT team will need to allowlist Omni's IP addresses in your firewall or proxy.

    Omni's IP addresses are listed on each connection's settings page. Navigate to **Settings > Connections**, click a connection, and copy the IP addresses shown. See [Allowlisting Omni's IP addresses](/administration/security/omni-ip-addresses) for details.

    <Note>
      VPNs can cause intermittent `Failed to fetch` errors even outside a corporate network. If the error appears and disappears, try disabling your VPN first.
    </Note>
  </Step>

  <Step title="Inspect the browser Network tab">
    If the first two steps don't resolve the error, use your browser's developer tools to capture exactly which request is failing and why.

    **To open the Network tab:**

    * **Chrome / Edge**: Press `F12` (or `Cmd+Option+I` on Mac), then click the **Network** tab
    * **Firefox**: Press `F12`, then click **Network**
    * **Safari**: Enable the Develop menu under **Safari > Settings > Advanced**, then press `Cmd+Option+I` and click **Network**

    **What to look for:**

    1. Clear the Network tab log, then reproduce the error.
    2. Filter by **XHR** or **Fetch** requests.
    3. Look for requests with a red status, `(canceled)`, `(blocked)`, or status codes in the `4xx`/`5xx` range.
    4. Click the failing request and open the **Headers** tab.

    **What to capture for escalation:**

    * The full request URL
    * The response status (or the error message if blocked)
    * Any `net::ERR_*` message shown in the status column (e.g. `net::ERR_BLOCKED_BY_CLIENT` typically indicates a browser extension or firewall block)
  </Step>
</Steps>

## Escalating to support

If the steps above don't resolve the error, contact Omni support with the following:

* **Browser and version** (e.g. Chrome 125, Safari 17.4)
* **List of browser extensions** installed, or a screenshot of your extensions list
* **Network tab screenshot** showing the failing request, with the Headers panel open (request URL, response status, and any error message visible)
* **Scope**: whether the error is on one dashboard or everywhere, and whether it affects one user or multiple
* **Network context**: whether it reproduces on a different network or with VPN disabled

## Next steps

* [Allowlisting Omni's IP addresses](/administration/security/omni-ip-addresses)
* [Embedding limitations](/embed/limitations)
* [Troubleshooting connection issues](/connect-data/troubleshooting)
