Supabase: CORS errors from browser [2026 fix]

Browser blocks Supabase requests due to missing CORS headers in your client config. Fix: add your domain to Project Settings > CORS or use proper anon key setup.

Supabase: CORS errors from browser [2026 fix]

TL;DR

Cause: Your browser is blocking Supabase API requests because your domain isn't whitelisted in CORS settings or your client is misconfigured.

Fix: Add your domain to Supabase Project Settings > API > CORS, or ensure you're initializing the client with the correct anon key and URL.

---

Exact Error Messages You'll See

Copy-paste these from your browser console:

``` Access to XMLHttpRequest at 'https://xxxxx.supabase.co/rest/v1/users' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. ```

``` CORS error: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode (include) is 'include'. ```

``` Failed to load resource: the server responded with a status of 403 (Forbidden) https://xxxxx.supabase.co/rest/v1/posts?select=* ```

``` TypeError: Failed to fetch (CORS policy: Response to preflight request doesn't pass access control check) ```

``` Access-Control-Allow-Origin header missing. Request blocked. Status: 0 (net::ERR_FAILED) ```

---

Broken Code vs. Fixed Code

Problem 1: Missing Domain in CORS Whitelist

BROKEN: ```javascript // Supabase project initialized correctly, but domain not in CORS settings import { createClient } from '@supabase/supabase-js';

const supabase = createClient( 'https://xxxxx.supabase.co', 'eyJhbGc...' );

// This request fails with CORS error await supabase.from('users').select('*'); ```

FIXED: 1. Go to [Supabase Dashboard](https://app.supabase.com) > Your Project > Settings > API > CORS 2. Add your domain to the allowed list: - Development: http://localhost:3000, http://localhost:5173, etc. - Production: https://yourdomain.com 3. Click Save 4. Hard refresh browser (Ctrl+Shift+R or Cmd+Shift+R)

Code remains the same—the fix is in dashboard settings, not code.

---

Problem 2: Client Initialization with Wrong/Missing Anon Key

BROKEN: ```javascript const supabase = createClient( 'https://xxxxx.supabase.co', '' // Empty or wrong anon key );

await supabase.from('posts').select('*'); // CORS blocked ```

FIXED: ```javascript // Get correct anon key from Project Settings > API > Project API Keys const supabase = createClient( import.meta.env.VITE_SUPABASE_URL, // https://xxxxx.supabase.co import.meta.env.VITE_SUPABASE_ANON_KEY // eyJhbGc... );

await supabase.from('posts').select('*'); // Works ```

.env file: ``` VITE_SUPABASE_URL=https://xxxxx.supabase.co VITE_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ```

---

Problem 3: Using Service Role Key in Browser (Security + CORS Issue)

BROKEN: ```javascript // NEVER expose service role key to browser const supabase = createClient( 'https://xxxxx.supabase.co', 'sbp_service_role_secret_key_xxx' // This is public—bad! ); ```

FIXED: ```javascript // Always use anon key in browser, service role key only in backend const supabase = createClient( 'https://xxxxx.supabase.co', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' // Anon key );

// For admin operations, call your own backend endpoint await fetch('/api/admin/create-user', { method: 'POST', body: ... }); ```

---

Still broken? Check these too

1. Browser cache and localStorage: Clear all site data for your domain (DevTools > Application > Clear storage). Old tokens or cached responses cause phantom CORS errors.

2. Third-party cookies blocked: If you're in private/incognito mode or have third-party cookies disabled, Supabase auth tokens may not persist. Check browser privacy settings.

3. Network tab shows 401/403, not preflight failure: If the preflight passes (OPTIONS request succeeds) but actual request fails with 401/403, your RLS (Row Level Security) policy is rejecting the query—not CORS. Check [RLS policies guide](/?guide=supabase-rls).

---

Version-Specific Notes

  • @supabase/supabase-js v2.39.0+: CORS handling improved; explicit domain whitelisting now required (previously more lenient).
  • Not certain: Whether Supabase's serverless functions have different CORS behavior in 2026 vs. REST API—if you hit this with Edge Functions, verify their CORS config separately.
  • ---

    Official Resources

  • [Supabase CORS Configuration Docs](https://supabase.com/docs/guides/platform/project-settings#cors)
  • [Supabase Auth Client Setup](https://supabase.com/docs/reference/javascript/introduction)
  • ---

    Related Guides

  • [Supabase RLS policies blocking queries](/?guide=supabase-rls)
  • [Environment variables in frontend frameworks](/?guide=env-vars-frontend)
  • ---

    Found a different variation? Drop it in the comments.

    🔥 0d
    LIVE
    ↓ PlanetScale rage spiking •⚠ Vercel pricing complaints •↑ Railway gaining fast •↑ Supabase happiness rising •↑ Resend loved by devs •↓ PlanetScale rage spiking •⚠ Vercel pricing complaints •↑ Railway gaining fast •↑ Supabase happiness rising
    DEVELOPER PAIN RADAR // Loading...

    Developers complain.
    Opportunities appear.

    We track what developers are struggling with today — and what opportunities that creates.

    —
    guides today
    —
    avg happiness
    🔥 Pain
    📖 Guides
    🔭 Explore
    👤 Mine
    🔥 Pain Radar — rage scores today
    ↗ share
    💡 Opportunity Feed — pain = market gap
    📈 Tool Momentum
    all scores →
    📖 Latest Guide
    all guides →
    📖 All Guides
    📊 Tool Scores
    + Submit
    📰 Hacker News
    ➕ Submit a Tool
    ← back