A 500 Internal Server Error in Lovable means your Supabase Edge Function crashed on the server. Check the Cloud tab, then Logs to see the exact error — common causes are missing environment variables in Secrets, invalid SQL queries, unhandled exceptions, and the sandbox proxy failing. The error is server-side, so the browser console only shows '500' without details. Always check Cloud Logs first, then fix the Edge Function code.
Why 500 internal server errors occur in Lovable API calls
A 500 error means something went wrong on the server, not in the browser. In Lovable projects, the 'server' is a Supabase Edge Function — a serverless JavaScript/TypeScript function that runs in Deno. When this function crashes, throws an unhandled exception, or cannot connect to its dependencies, it returns a 500 status code to the browser. The frustrating part is that the browser console only shows 'Error: 500 Internal Server Error' with no further details. The actual error message — the one that tells you what went wrong — is only visible in the Cloud tab Logs. This is because server-side errors are intentionally hidden from the browser for security reasons (you do not want to expose database connection strings or internal error details to end users). The most common cause is a missing secret. When Lovable creates an Edge Function that needs an API key or database URL, it references a secret name (like OPENAI_API_KEY). If you forget to add that secret in Cloud tab, then Secrets, the function crashes with an 'undefined' error when it tries to read the missing value. The sandbox proxy failure is another frequent cause — this happens when the Edge Function times out or the Supabase infrastructure has a temporary issue.
- Missing environment variable in Secrets — the Edge Function tries to read a secret that does not exist
- Invalid SQL query — the function sends a malformed query to the database
- Unhandled exception — the function code throws an error that is not caught by a try/catch block
- Sandbox proxy failure — the Supabase Edge Function infrastructure had a temporary issue
- Request body parsing failure — the function expects JSON but receives malformed input
- Database connection timeout — the external database or Supabase itself is slow or unreachable
Error messages you might see
Internal Server Error, sandbox proxy failedThe Supabase Edge Function runtime failed to execute your function. This can be a timeout, a Deno runtime error, or a temporary Supabase infrastructure issue. Check Cloud tab Logs for the specific error. If the logs are empty, it may be a platform incident — check status.lovable.dev.
Error: 500 Internal Server Error at /functions/v1/your-function-nameYour Edge Function threw an unhandled exception. The browser only sees '500' — the actual error is in Cloud tab Logs. Common causes are missing secrets, invalid database queries, or undefined variables.
FunctionsFetchError: Failed to send a request to the Edge FunctionThe Supabase client could not reach the Edge Function endpoint. This could be a network issue, an incorrect function name in supabase.functions.invoke(), or the function not being deployed yet.
TypeError: Deno.env.get(...) is undefinedThe Edge Function is trying to read an environment variable that has not been set in Lovable Secrets. Go to Cloud tab, then Secrets, and add the missing secret with the correct name.
Before you start
- A Lovable project with Supabase Edge Functions
- Access to the Cloud tab (click + next to Preview)
- The name of the Edge Function that is returning 500 errors
- The browser console open (F12) to see the 500 response
How to fix it
Check Cloud tab Logs for the actual error message
The browser only shows '500' — the real error message with the file, line number, and cause is in the server logs
Check Cloud tab Logs for the actual error message
The browser only shows '500' — the real error message with the file, line number, and cause is in the server logs
Click the + button next to Preview to open additional panels. Select Cloud tab, then navigate to Logs. Look for red error entries that correspond to the time your 500 error occurred. The log entry will show the Edge Function name, the error message, and often a stack trace pointing to the exact line that failed. Copy this error message — it is the key to fixing the issue. If the Logs section shows nothing, the function may not have reached execution (check that the function name matches exactly).
// Browser console only shows:// POST https://xxx.supabase.co/functions/v1/my-function 500// Error: Internal Server Error// This tells you nothing about the actual cause// Cloud tab → Logs shows the real error:// Error: TypeError: Cannot read properties of undefined (reading 'split')// at handler (file:///src/index.ts:15:32)//// Now you know: line 15 in the Edge Function is calling .split()// on a value that is undefined — probably a missing env variableExpected result: You can see the exact error message, function name, and line number that caused the 500 error.
Verify all required Secrets are set
Missing environment variables are the number one cause of Edge Function 500 errors in Lovable projects
Verify all required Secrets are set
Missing environment variables are the number one cause of Edge Function 500 errors in Lovable projects
Open the Cloud tab and navigate to Secrets. Check that every secret your Edge Function references is present and has a value. Common secrets that need to be set: API keys for third-party services (OPENAI_API_KEY, STRIPE_SECRET_KEY), database connection strings (EXTERNAL_DB_URL), and service credentials. If a secret is missing, click Add Secret and enter the name and value. The secret name in Lovable Secrets must match exactly what the Edge Function code references in Deno.env.get().
// Edge Function code references a secret that does not existconst apiKey = Deno.env.get("OPENAI_API_KEY");// apiKey is undefined → crash when usedconst response = await fetch("https://api.openai.com/v1/...", { headers: { Authorization: `Bearer ${apiKey}` } // Sends "Bearer undefined" → API returns 401 → Edge Function crashes// 1. Add the secret in Cloud tab → Secrets:// Name: OPENAI_API_KEY// Value: sk-your-actual-key// 2. Add a guard in the Edge Function:const apiKey = Deno.env.get("OPENAI_API_KEY");if (!apiKey) { console.error("OPENAI_API_KEY secret is not set"); return new Response( JSON.stringify({ error: "Server configuration error" }), { status: 500, headers: { "Content-Type": "application/json" } } );}Expected result: The Edge Function reads the API key from Secrets successfully. The guard prevents a cryptic crash if the secret is ever removed.
Add proper error handling to the Edge Function
Unhandled exceptions crash the function and return a generic 500 — proper error handling returns useful error messages
Add proper error handling to the Edge Function
Unhandled exceptions crash the function and return a generic 500 — proper error handling returns useful error messages
Wrap the entire Edge Function handler in a try/catch block. In the catch block, log the error with console.error (so it appears in Cloud Logs) and return a JSON response with a user-friendly error message. This prevents the function from crashing with a generic 500 and gives you diagnostic information in the logs.
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";serve(async (req) => { const { query } = await req.json(); const result = await supabase.from("products").select(query); return new Response(JSON.stringify(result.data));});// Any error crashes the entire function with a generic 500import { serve } from "https://deno.land/std@0.168.0/http/server.ts";serve(async (req) => { try { const body = await req.json().catch(() => null); if (!body) { return new Response( JSON.stringify({ error: "Invalid request body — expected JSON" }), { status: 400, headers: { "Content-Type": "application/json" } } ); } const { query } = body; const result = await supabase.from("products").select(query); if (result.error) { console.error("Database query error:", result.error.message); return new Response( JSON.stringify({ error: "Database query failed" }), { status: 500, headers: { "Content-Type": "application/json" } } ); } return new Response(JSON.stringify({ data: result.data }), { headers: { "Content-Type": "application/json" }, }); } catch (error) { console.error("Edge Function error:", error.message, error.stack); return new Response( JSON.stringify({ error: "Internal server error" }), { status: 500, headers: { "Content-Type": "application/json" } } ); }});Expected result: Errors are caught, logged to Cloud Logs with full details, and returned to the frontend as structured JSON instead of a generic crash.
Handle the 'sandbox proxy failed' error
This error is often a Supabase infrastructure issue, not a code bug — it requires different troubleshooting
Handle the 'sandbox proxy failed' error
This error is often a Supabase infrastructure issue, not a code bug — it requires different troubleshooting
The 'sandbox proxy failed' error means the Supabase Edge Function runtime could not execute your function. This happens for three reasons: 1) Your function timed out (Edge Functions have a 25-second default timeout). 2) The function uses too much memory. 3) Supabase's infrastructure had a temporary issue. Check status.lovable.dev for any ongoing incidents. If the error is intermittent (works sometimes, fails sometimes), it is likely a platform issue. If it fails consistently, check for long-running operations in your function code and add timeouts. If debugging across multiple Edge Functions with intermittent sandbox failures becomes too complex, RapidDev's engineers can restructure your backend architecture to be more resilient.
// Long-running operation that exceeds the timeoutserve(async (req) => { // This fetches 10,000 rows and processes each one — may timeout const { data } = await supabase.from("logs").select("*"); const processed = data.map(row => expensiveOperation(row)); return new Response(JSON.stringify(processed));});// Paginated approach that stays within timeout limitsserve(async (req) => { try { const { page = 0, pageSize = 100 } = await req.json(); const from = page * pageSize; const to = from + pageSize - 1; const { data, error, count } = await supabase .from("logs") .select("*", { count: "exact" }) .range(from, to); if (error) throw error; return new Response( JSON.stringify({ data, total: count, page, pageSize }), { headers: { "Content-Type": "application/json" } } ); } catch (error) { console.error("Logs fetch error:", error.message); return new Response( JSON.stringify({ error: "Failed to fetch logs" }), { status: 500, headers: { "Content-Type": "application/json" } } ); }});Expected result: The Edge Function processes data in small batches that complete within the timeout limit, preventing sandbox proxy failures.
Complete code example
1import { serve } from "https://deno.land/std@0.168.0/http/server.ts";2import { createClient } from "https://esm.sh/@supabase/supabase-js@2";34serve(async (req) => {5 // CORS handling for browser requests6 if (req.method === "OPTIONS") {7 return new Response(null, {8 headers: {9 "Access-Control-Allow-Origin": "*",10 "Access-Control-Allow-Methods": "POST",11 "Access-Control-Allow-Headers": "authorization, content-type",12 },13 });14 }1516 try {17 // Verify required secrets exist before proceeding18 const supabaseUrl = Deno.env.get("SUPABASE_URL");19 const supabaseKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY");2021 if (!supabaseUrl || !supabaseKey) {22 console.error("Missing required secrets: SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY");23 return new Response(24 JSON.stringify({ error: "Server configuration error" }),25 { status: 500, headers: { "Content-Type": "application/json" } }26 );27 }2829 const supabase = createClient(supabaseUrl, supabaseKey);3031 // Parse request body safely32 const body = await req.json().catch(() => null);33 if (!body) {34 return new Response(35 JSON.stringify({ error: "Request body must be valid JSON" }),36 { status: 400, headers: { "Content-Type": "application/json" } }37 );38 }3940 // Your business logic here41 const { action, payload } = body;42 console.log("Processing action:", action);4344 const { data, error } = await supabase45 .from("items")46 .select("*")47 .limit(100);4849 if (error) {50 console.error("Database error:", error.message);51 return new Response(52 JSON.stringify({ error: "Database query failed" }),53 { status: 500, headers: { "Content-Type": "application/json" } }54 );55 }5657 return new Response(58 JSON.stringify({ data }),59 { headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" } }60 );61 } catch (error) {62 // Catch-all: log the full error for Cloud Logs63 console.error("Unhandled error:", error.message, error.stack);64 return new Response(65 JSON.stringify({ error: "Internal server error" }),66 { status: 500, headers: { "Content-Type": "application/json" } }67 );68 }69});Best practices to prevent this
- Always check Cloud tab Logs first when you see a 500 error — the browser console does not show the actual cause
- Verify all required Secrets exist before the Edge Function tries to use them — add guards with early returns
- Wrap every Edge Function in a try/catch block with console.error logging in the catch
- Parse request bodies safely using req.json().catch(() => null) to avoid crashes on malformed input
- Add CORS headers to every Edge Function response to prevent browser-side fetch failures
- Use pagination for database queries to avoid timeouts on large result sets
- Check status.lovable.dev when you see 'sandbox proxy failed' — it may be a platform issue, not your code
- Log the action being performed at the start of each function so you can trace which requests cause failures
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I am getting a 500 Internal Server Error from my Lovable (lovable.dev) Supabase Edge Function. Function name: [function-name] Error from Cloud Logs: [paste the exact error message from Cloud tab → Logs] Function code: [paste the Edge Function code] Browser shows: [paste what the browser console says] Please: 1. Explain what this specific error means 2. Identify the exact line in my function that is causing it 3. Show the corrected function code with proper error handling 4. Tell me which Secrets I need to verify in Cloud tab → Secrets 5. Add guards for all external dependencies (env vars, database, external APIs)
My Edge Function 'function-name' is returning 500 Internal Server Error. Check Cloud tab Logs for the error details. Then fix @supabase/functions/function-name/index.ts: 1) Add a try/catch block around the entire handler. 2) Add console.error logging in the catch block with the error message and stack trace. 3) Add guards for all Deno.env.get() calls — return a 500 with a descriptive message if any secret is missing. 4) Parse the request body safely with .catch() to handle malformed JSON. 5) Return proper JSON error responses for each failure case.
Frequently asked questions
What causes 500 internal server errors in Lovable?
The most common causes are: missing environment variables in Cloud tab Secrets, invalid SQL queries in Edge Functions, unhandled exceptions in server-side code, and the Supabase sandbox proxy failing due to timeouts or platform issues. Check Cloud tab Logs for the exact error message.
What does 'internal server error sandbox proxy failed' mean in Lovable?
This means the Supabase Edge Function runtime could not execute your function. Possible causes are function timeout (over 25 seconds), excessive memory usage, or a temporary Supabase infrastructure issue. Check status.lovable.dev for platform incidents. If the error is consistent, look for long-running operations in your function code.
How do I see the actual error behind a 500 response?
The browser console only shows '500 Internal Server Error' for security reasons. The actual error message is in the Cloud tab under Logs. Click the + button next to Preview, open Cloud tab, navigate to Logs, and look for red error entries matching the time of your 500 error.
Why does my Edge Function work sometimes and fail other times?
Intermittent 500 errors are usually caused by: Supabase infrastructure issues (check status.lovable.dev), database connection timeouts under load, or external API rate limits. Add retry logic for external API calls and use connection pooling for database queries.
How do I add error handling to a Lovable Edge Function?
Wrap the entire handler in a try/catch block. In the catch block, call console.error with the error message and stack trace (this appears in Cloud Logs). Return a JSON response with a user-friendly error message and a 500 status code. Also add guards for Deno.env.get() calls to catch missing secrets early.
What if I can't fix the 500 error myself?
Server-side errors can involve complex interactions between Edge Functions, database queries, authentication, and third-party APIs. RapidDev's engineers specialize in debugging Lovable backend issues and can trace 500 errors to their root cause across the full stack.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your issue.
Book a free consultation