Error 400 en Supabase: qué significa y códigos comunes
El error 400 en Supabase (Bad Request) significa que la petición llegó, pero algo en ella está mal: un filtro mal escrito, una columna que no existe, un dato con formato incorrecto o un campo obligatorio vacío. El número 400 por sí solo no dice cuál; la respuesta trae un código (como PGRST204, 23502 o invalid_credentials) que te dice exactamente qué pasó. Aquí te enseñamos a leerlo y a corregir los casos más comunes.
Paso 1: encuentra el código del error
- En tu app: clic derecho → Inspeccionar → Network.
- Repite la acción que falla.
- Da clic en la petición en rojo con estado
400. - Abre Response. Verás algo así:
{
"code": "PGRST204",
"details": null,
"hint": null,
"message": "Could not find the 'telefono' column of 'clientes' in the schema cache"
}
Mira la URL de la petición:
/rest/v1/...→ base de datos (API de datos, basada en PostgREST)./auth/v1/...→ autenticación (login, registro)./storage/v1/...→ archivos.
Supabase error codes: base de datos (/rest/v1)
La API de datos de Supabase usa PostgREST, que documenta sus códigos en su referencia de errores. Los que dan 400 con más frecuencia:
| Código | Qué significa | Cómo se arregla |
|---|---|---|
PGRST100 |
Un filtro o parámetro de la URL no se pudo interpretar | Revisa la sintaxis de .eq(), .or(), .filter() |
PGRST102 |
El cuerpo de la petición está vacío o no es JSON válido | Revisa lo que mandas en .insert() o .update() |
PGRST200 |
No hay relación entre las tablas que intentas unir | Crea la llave foránea o corrige el nombre de la tabla en select |
PGRST204 |
Columna no encontrada | Revisa el nombre exacto; si la acabas de crear, recarga la caché del esquema |
23502 |
Campo obligatorio (NOT NULL) vacío |
Manda ese campo o dale valor por defecto |
22P02 |
Formato inválido (ej. texto donde va un número o UUID) | Convierte el dato antes de enviarlo |
P0001 |
Error lanzado a propósito por una función de la base de datos | Lee el mensaje: lo escribió quien hizo la función |
Los códigos de 5 caracteres como 23502 o 22P02 vienen directamente de PostgreSQL.
Ejemplos
Columna mal escrita (PGRST204):
// Error: la columna se llama "phone", no "telefono"
await supabase.from("clientes").insert({ nombre: "Ana", telefono: "8112345678" });
Si la columna sí existe y la creaste hace poco, recarga la caché del esquema desde el editor SQL:
notify pgrst, 'reload schema';
Formato inválido (22P02):
// Error si "id" es UUID o número y le mandas texto vacío
await supabase.from("pedidos").select("*").eq("id", "");
Valida que el valor exista antes de hacer la consulta.
Relación inexistente (PGRST200):
// Falla si no hay llave foránea entre pedidos y clientes
await supabase.from("pedidos").select("*, clientes(nombre)");
Error 400 en autenticación (/auth/v1)
En login y registro, Supabase devuelve códigos propios. Los más comunes (lista completa en la documentación de errores de Auth):
| Código | Qué significa |
|---|---|
invalid_credentials |
Correo o contraseña incorrectos |
email_not_confirmed |
El usuario no ha confirmado su correo |
weak_password |
La contraseña no cumple los requisitos |
user_already_exists / email_exists |
Ya hay una cuenta con ese correo |
validation_failed |
Los datos no tienen el formato esperado |
email_address_invalid |
Dominios de ejemplo o prueba no permitidos |
Si el problema es que los correos no llegan, ver error sending confirmation email.
400 vs. otros errores de Supabase
- 401: falta la llave o la sesión venció.
- 403: no tienes permiso; casi siempre reglas RLS. Ver new row violates row-level security.
- 404: la tabla o la ruta no existe (o no está expuesta en la API).
- 409: conflicto, por ejemplo un valor duplicado en una columna única (
23505). - 429: demasiadas peticiones o correos. Ver email rate limit exceeded.
Casos frecuentes que no son obvios
El 400 viene de una Edge Function. Si la URL es /functions/v1/..., el 400 no lo genera la base de datos sino el código de tu función: alguien escribió que devolviera 400 cuando falta un dato. Revisa los logs de esa función en el panel (Edge Functions → tu función → Logs) y compara lo que manda tu app con lo que la función espera.
Fechas y números con formato local. Mandar "06/11/2026" a una columna date o "1,250.00" a una columna numérica suele dar 22P02 o 22007. Envía fechas en formato ISO (2026-11-06) y números sin comas ni signo de pesos.
Un .or() con espacios o comas mal puestas. La sintaxis de filtros combinados es estricta; un paréntesis o una coma de más da PGRST100. Prueba el filtro con un solo valor y ve agregando condiciones.
Funciona en tu computadora y falla publicado. Si en producción la base de datos es otra (otro proyecto de Supabase), puede que ahí falte la columna o la migración. Compara los dos esquemas. Ver también variables de entorno en Vite y React para confirmar a qué proyecto apunta cada versión.
Errores comunes al depurar un 400
- Leer solo el número y no la respuesta: el código y el
messageya traen la causa. - Reintentar en bucle: un 400 no se arregla solo; repetir la petición no cambia nada.
- Quitar validaciones para “que pase”: si una columna es
NOT NULLpor algo, borrar la regla solo mueve el problema a datos incompletos. - Pegar llaves en el chat de la IA: al compartir el error, borra cualquier
apikeyo token que venga en la petición.
Qué revisar si tu app la hizo una IA
Las herramientas como Lovable o Bolt a veces cambian el nombre de una columna en el código pero no en la base de datos (o al revés). Si el 400 empezó después de un prompt:
- Compara el nombre de la columna en el código y en Table Editor.
- Revisa si la IA creó una migración que no se aplicó. Ver migraciones de Lovable y Supabase.
- Pégale a la IA la respuesta completa del error, no solo “error 400”.
Si los errores de Supabase se acumulan y ya no sabes qué cambió, en Black Engine revisamos tu base de datos y tu código contigo por WhatsApp.
Preguntas frecuentes
¿Qué significa el error 400 en Supabase?
Bad Request: Supabase recibió la petición pero algo en ella está mal: un filtro mal escrito, una columna que no existe, un dato con formato incorrecto o un campo obligatorio vacío.
¿Dónde veo el detalle del error 400?
En el navegador: Inspeccionar → Network → la petición en rojo → Response. Ahí vienen el código y el mensaje. También en Logs del panel de Supabase.
¿Qué es PGRST204?
Que pediste una columna que la API no encuentra: no existe, está mal escrita o la caché del esquema no se ha actualizado después de un cambio.
¿Un 400 en el login qué significa?
En autenticación, un 400 suele venir con códigos como invalid_credentials, email_not_confirmed o weak_password. El código te dice exactamente cuál es.