Supabase: CORS errors from browser [2026 fix]

Browser blocks Supabase requests due to missing CORS headers. Add your domain to Supabase project settings under API > CORS allowed origins.

Supabase CORS Errors from Browser – 2am Emergency Fix

TL;DR

Cause: Your browser domain isn't whitelisted in Supabase's CORS allowed origins settings. Fix: Add your domain to Project Settings → API → CORS Allowed Origins, then restart your app.

---

Exact Error Messages You're Seeing

Here are the real console errors that indicate this problem:

``` Access to XMLHttpRequest at 'https://your-project.supabase.co/rest/v1/table_name' 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. ```

``` Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://your-project.supabase.co/rest/v1/auth/v1/token (Reason: CORS header 'Access-Control-Allow-Origin' missing). ```

``` Failed to fetch from supabase: TypeError: Failed to fetch No 'Access-Control-Allow-Origin' header is present on the requested resource with credentials mode ('include'). ```

``` [Supabase] Auth session error: FetchError – 403 Forbidden Response headers don't include the necessary CORS headers for this origin. ```

``` Unexpected end of JSON input while calling signIn at supabase.auth.signInWithPassword CORS preflight failed with status 403 ```

---

Broken Code vs. Exact Fix

❌ BROKEN: No CORS Configuration

```javascript // app.ts – This will fail in production import { createClient } from '@supabase/supabase-js';

const supabase = createClient( 'https://your-project.supabase.co', 'YOUR_ANON_KEY' );

// Later in your component const { data, error } = await supabase .from('users') .select('*'); // ^ CORS error in browser, works fine in server ```

Why it breaks: Supabase receives the request but rejects it at the browser level because your domain (e.g., localhost:3000, app.example.com) isn't in the allowed origins list.

---

✅ FIXED: Add Domain to Supabase Settings

Step 1: Go to Supabase Dashboard 1. Navigate to your project 2. Click Settings (gear icon, bottom-left) 3. Select API from the sidebar 4. Scroll to CORS Allowed Origins

Step 2: Add Your Domain

Add these origins (one per line or as comma-separated): ``` http://localhost:3000 https://app.example.com https://www.example.com ```

For production: Use https://yourdomain.com exactly as users access it (with or without www, but be explicit).

For development: Include all local variants: ``` http://localhost:3000 http://localhost:5173 http://127.0.0.1:3000 http://[::1]:3000 ```

Step 3: Your Code Stays the Same

```javascript // app.ts – This now works! import { createClient } from '@supabase/supabase-js';

const supabase = createClient( 'https://your-project.supabase.co', 'YOUR_ANON_KEY' );

const { data, error } = await supabase .from('users') .select('*'); // ^ Now the browser allows this request ✓ ```

Step 4: Save & Wait

Click Save. Changes propagate in ~30 seconds. Hard-refresh your browser (Cmd+Shift+R / Ctrl+Shift+R) to clear cached headers.

---

Version & Behavior Notes

This fix applies to Supabase v2 and later (all current versions as of 2026). Older v1 projects used deprecated auth endpoints—we're uncertain if CORS behavior differed; if you're on legacy infrastructure, check the official docs link below.

---

Still Broken? Check These Too

1. Wildcard doesn't work: Supabase requires explicit domains; * or *.example.com patterns aren't supported. List each domain individually.

2. Trailing slashes matter: Use https://example.com not https://example.com/. Some frameworks auto-add slashes; test both variations in settings.

3. Port mismatches in dev: If your app runs on 3001 but you added localhost:3000, it will fail. Match your exact dev port number.

4. Cached API keys: If you changed CORS after your app started, your API client may have cached the old headers. [See auth token refresh guide](/?guide=supabase-refresh-token) for session clearing.

5. Edge function vs REST API: Edge Functions have separate CORS rules. If you're calling an Edge Function, check the --cors flag in your function definition. [Edge Functions CORS setup](/?guide=supabase-edge-cors).

---

Official Resources

  • [Supabase CORS Documentation](https://supabase.com/docs/guides/api/cors)
  • [API Configuration Guide](https://supabase.com/docs/guides/api)
  • ---

    Found a different variation? Drop it in the comments

    If you hit a CORS error with a different stack trace, different root cause, or a Supabase version-specific workaround, reply below. We'll add it to this guide.

    🔥 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