>_ Black Engine

Error 400 en Supabase: qué significa y códigos comunes

Por Black Engine · 6 de noviembre de 2026

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

  1. En tu app: clic derecho → Inspeccionar → Network.
  2. Repite la acción que falla.
  3. Da clic en la petición en rojo con estado 400.
  4. 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 message ya 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 NULL por 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 apikey o 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:

  1. Compara el nombre de la columna en el código y en Table Editor.
  2. Revisa si la IA creó una migración que no se aplicó. Ver migraciones de Lovable y Supabase.
  3. 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.

Pide ayuda por WhatsApp