Supabase: CORS errors from browser [2026 fix]

Browser blocks Supabase requests due to missing CORS headers in your API URL config. Fix: use your actual project URL with https:// prefix, not localhost.

Supabase: CORS errors from browser [2026 fix]

TL;DR

Cause: You're initializing Supabase with an incorrect or missing SUPABASE_URL that doesn't include the full HTTPS endpoint.

Fix: Use your actual Supabase project URL (format: https://xxxxx.supabase.co) in your environment variables, not localhost or a partial path.

---

Real Console Error Messages

``` 1. Access to XMLHttpRequest at 'https://xxxxx.supabase.co/rest/v1/table' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

2. Uncaught (in promise) Error: Failed to fetch at async getUser() (user.js:5:10)

3. Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://xxxxx.supabase.co/auth/v1/token. (Reason: CORS request did not succeed). Status code: (null).

4. TypeError: Failed to fetch at FetchError (main.js:1:1) at processQueue (main.js:1:1)

5. POST https://xxxxx.supabase.co/rest/v1/users 403 Forbidden Access-Control-Allow-Origin: missing header ```

---

Broken Code vs. Fixed Code

❌ BROKEN: Incomplete or localhost URL

```javascript // .env.local VITE_SUPABASE_URL=localhost:3000 VITE_SUPABASE_ANON_KEY=your-key-here

// src/lib/supabase.ts import { createClient } from '@supabase/supabase-js'

const supabaseUrl = import.meta.env.VITE_SUPABASE_URL const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY

export const supabase = createClient(supabaseUrl, supabaseKey) // Result: CORS error when browser tries to reach localhost:3000 ```

✅ FIXED: Full HTTPS project URL

```javascript // .env.local VITE_SUPABASE_URL=https://abcdefghijklmnop.supabase.co VITE_SUPABASE_ANON_KEY=your-key-here

// src/lib/supabase.ts import { createClient } from '@supabase/supabase-js'

const supabaseUrl = import.meta.env.VITE_SUPABASE_URL const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY

export const supabase = createClient(supabaseUrl, supabaseKey) // Result: CORS headers respected, requests succeed ```

Key differences:

  • localhost:3000 → ✅ https://abcdefghijklmnop.supabase.co
  • ❌ Missing protocol → ✅ Must include https://
  • ❌ Local port → ✅ Actual Supabase project domain
  • ---

    Finding Your Correct Supabase URL

    1. Log in to [Supabase Dashboard](https://app.supabase.com) 2. Select your project 3. Click Settings (gear icon) → API 4. Copy the Project URL (format: https://xxxxx.supabase.co) 5. Paste into your .env.local file exactly as shown 6. Do NOT commit .env.local to git—add to .gitignore

    ---

    Version-Specific Notes

    @supabase/supabase-js v2.x and v3.x: Both versions require the full HTTPS URL. No differences in CORS behavior between versions.

    Next.js App Router: If using server-side createClient() on the server, CORS doesn't apply—but browser-side clients still need the full URL.

    Vite vs. Create React App: Env variable prefix differs (VITE_ vs REACT_APP_), but Supabase URL format requirement is identical.

    ---

    Still broken? Check these too

    1. RLS (Row Level Security) Policies Blocking Read Access - Your URL might be correct, but your table has RLS policies denying unauthenticated access. Verify table policies in Supabase Dashboard → Authentication → Policies. Test with anon role enabled.

    2. Anon Key Mismatch or Expired - If you copied the wrong key (e.g., service_role instead of anon), Supabase rejects the request with CORS-like symptoms. Always use the anon public key in browsers, never service_role in client code.

    3. Browser Extensions or Corporate Proxy Blocking Requests - VPNs, ad blockers, or corporate proxies can silently drop requests before they reach Supabase. Test in an incognito window without extensions. Check network tab for actual response status vs. blocked state.

    ---

    Related Guides

  • [Supabase Authentication Setup Guide: Fix JWT Token Errors](/guide=supabase-auth)
  • [CORS Errors Across All APIs: General Debugging](/guide=cors-troubleshooting)
  • ---

    Official Resources

  • [Supabase JavaScript Client Library Docs](https://supabase.com/docs/reference/javascript/initializing)
  • [Supabase CORS Configuration](https://supabase.com/docs/guides/api/cors)
  • ---

    Found a different variation? Drop it in the comments—your fix could save someone else 2 hours at 2am.

    🔥 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