Supabase: CORS errors from browser [2026 fix]

Browser blocks Supabase requests due to missing CORS headers. Fix: Configure allowed origins in Supabase dashboard or use proper auth headers.

Supabase CORS Errors from Browser – Emergency Fix

TL;DR

Problem: Your browser is blocking requests to Supabase because the server isn't sending the Access-Control-Allow-Origin header. Fix: Add your frontend domain to Supabase's CORS allowlist in Project Settings → API → CORS, or use the Supabase client library instead of raw fetch.

---

Common Error Messages You'll See

Open your browser DevTools (F12 → Console) and look for one of these:

``` Access to XMLHttpRequest at 'https://[project].supabase.co/rest/v1/...' 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 policy: Request header field 'authorization' is not allowed by Access-Control-Allow-Headers. ```

``` CORS error: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be either 'true' or 'false'. ```

``` Failed to load https://[project].supabase.co/rest/v1/users: Response to preflight request doesn't pass access control check: Wildcard '*' cannot be used in the value of the 'Access-Control-Allow-Origin' header when the request's credentials mode is 'include'. ```

``` No 'Access-Control-Allow-Methods' header is present on the requested resource. If an OPTIONS request is an opaque response, the CORS headers must be included with it. ```

---

Broken Code vs. Fixed Code

❌ BROKEN: Direct fetch without proper headers

```javascript // This will trigger CORS errors const response = await fetch( 'https://myproject.supabase.co/rest/v1/users', { method: 'GET', headers: { 'Authorization': 'Bearer ' + token } } ); const data = await response.json(); ```

✅ FIXED: Use official Supabase client library

```javascript // Install: npm install @supabase/supabase-js import { createClient } from '@supabase/supabase-js';

const supabase = createClient( 'https://myproject.supabase.co', 'YOUR_PUBLIC_ANON_KEY' );

const { data, error } = await supabase .from('users') .select('*'); ```

Why this works: The official client handles CORS, authentication, and headers automatically.

---

Alternative Fix: Manual CORS Configuration

If you must use raw fetch, whitelist your domain:

1. Go to [Supabase Dashboard](https://app.supabase.com) 2. Select your project → Settings → API 3. Scroll to CORS configuration 4. Add your frontend origin: ``` http://localhost:3000 https://myapp.com ``` 5. Click Save

Then use fetch with proper headers:

```javascript const response = await fetch( 'https://myproject.supabase.co/rest/v1/users', { method: 'GET', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', 'Prefer': 'return=representation' }, credentials: 'include' // Only if CORS allows credentials } ); ```

⚠️ Important: Never use wildcard * in CORS origins if you're sending credentials (tokens/cookies). Always specify exact domains.

---

Version-Specific Notes

Supabase JS Client (v2.0+): CORS is handled transparently. If you're still getting errors with @supabase/supabase-js@latest, check that your anon key is correct and your origin is whitelisted.

Supabase JS Client (v1.x): Same behavior. We cannot confirm if pre-v1.0 versions handle CORS differently—upgrade if using ancient versions.

Self-hosted Supabase: If running Supabase yourself, CORS is configured in docker-compose.yml under postgrest environment variables. Check PGRST_OPENAPI_SERVER_PROXY_URI and network settings.

---

Still Broken? Check These Too

1. Wrong anon key: Verify your SUPABASE_ANON_KEY is copied correctly (Settings → API Keys). Typos cause 401 errors that look like CORS issues.

2. Forgot to whitelist localhost during development: Many devs fix production but forget to add http://localhost:3000 for local testing. Check both environments separately.

3. Trailing slash mismatch: If your origin in CORS settings is https://app.com but your app runs on https://app.com/, browsers treat them as different origins. Be exact.

Related Guides:

  • [Supabase Authentication Errors: 401 vs 403](/?guide=supabase-auth-errors)
  • [Row-Level Security (RLS) Silent Failures](/?guide=supabase-rls-debugging)
  • ---

    Official Documentation

    📚 [Supabase CORS Documentation](https://supabase.com/docs/guides/api/cors)

    ---

    Found a different variation? Drop it in the comments—your 2am fix might save the next person.

    🔥 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