[{"data":1,"prerenderedAt":701},["ShallowReactive",2],{"blog-es-where-to-find-supabase-api-keys":3,"blog-index-es":561},{"id":4,"title":5,"body":6,"category":514,"cover":515,"coverAlt":516,"description":517,"draft":518,"extension":519,"faq":520,"image":539,"keywords":540,"meta":548,"navigation":549,"ogTitle":550,"path":551,"published":552,"seo":553,"stem":554,"tldr":555,"updated":559,"__hash__":560},"blog_es\u002Fblog\u002Fwhere-to-find-supabase-api-keys.md","Dónde están tus claves API de Supabase: anon, service_role y URL",{"type":7,"value":8,"toc":500},"minimark",[9,22,25,28,33,41,56,59,63,66,77,80,106,109,113,116,231,237,240,244,252,255,275,282,285,289,302,305,323,326,335,339,342,345,357,361,364,367,380,398,403,410,414,417,423,441,451,455,488],[10,11,12,13,17,18,21],"p",{},"Algo te ha pedido tu clave de Supabase. Una guía de instalación, un hilo de\nsoporte, o una IA a la que le dijiste que arreglara tu app. Abres el panel,\nencuentras una página con una dirección y dos o tres claves con nombres como\n",[14,15,16],"code",{},"anon"," y ",[14,19,20],{},"service_role",", y todas parecen poder ser la respuesta.",[10,23,24],{},"O es la otra versión de esto. Alguien abrió tu sitio, pulsó F12 y te dijo que\nuna clave estaba expuesta. Ahora quieres mirar la clave que encontró, y no sabes\ndónde vive.",[10,26,27],{},"La mayoría de las guías empiezan en la página de claves API. Eso da por hecho\nque ya sabes cuál es tu proyecto de Supabase, y ese es precisamente el paso que\nun builder hizo por ti y nunca te explicó.",[29,30,32],"h2",{"id":31},"dónde-están-las-claves-api-de-supabase","¿Dónde están las claves API de Supabase?",[10,34,35,36,40],{},"En el panel, dentro de tu proyecto, en ",[37,38,39],"strong",{},"Settings → API Keys",".",[10,42,43,44,47,48,51,52,55],{},"El camino completo: entra en supabase.com, elige tu proyecto de la lista, abre\n",[37,45,46],{},"Settings"," en la barra lateral izquierda y luego ",[37,49,50],{},"API Keys",". Casi todas las\nguías y capturas que encuentres llaman a esa página ",[37,53,54],{},"Settings → API",", porque\nasí se llamaba hasta hace poco. Es la misma página y son los mismos valores.",[10,57,58],{},"Todo lo que hay en ella es una de dos cosas. Una dirección, que dice dónde vive\ntu proyecto. O una clave, que decide qué puede hacer una petición una vez llega.\nLa página las lista juntas, en una sola columna, con la misma tipografía.",[29,60,62],{"id":61},"nunca-configuré-supabase-cuál-es-mi-proyecto","Nunca configuré Supabase. ¿Cuál es mi proyecto?",[10,64,65],{},"Lee la dirección que tu app ya está usando. La respuesta está dentro.",[10,67,68,69,72,73,76],{},"Cada proyecto de Supabase tiene una ",[37,70,71],{},"referencia",": una cadena corta y aleatoria\nque además es la primera parte de la dirección del proyecto,\n",[14,74,75],{},"https:\u002F\u002Fyourreference.supabase.co",". Tu app envía una petición a esa dirección\nen cada carga de página, así que la cadena ya está en tu app, y es la misma con\nla que el panel identifica tu proyecto.",[10,78,79],{},"Tres sitios donde encontrarla sin preguntar a nadie:",[81,82,83,90,100],"ul",{},[84,85,86,89],"li",{},[37,87,88],{},"En tu builder."," Lovable, Bolt, v0 y los demás muestran el proyecto de\nSupabase conectado en algún lugar de los ajustes o del panel de integraciones\nde tu proyecto.",[84,91,92,95,96,99],{},[37,93,94],{},"En tu navegador."," Abre tu app en producción, pulsa F12, ve a la pestaña\nNetwork y recarga la página. Las peticiones que salen hacia algo con\n",[14,97,98],{},".supabase.co"," llevan la referencia en su dirección.",[84,101,102,105],{},[37,103,104],{},"En el código fuente de la página",", si tu app escribe la dirección en el\nHTML en lugar de en un archivo de script.",[10,107,108],{},"Después entra en supabase.com y compara esa referencia con tu lista de\nproyectos. Los builders conectan Supabase a través de tu propia cuenta, así que\nel proyecto suele estar en un panel en el que te registraste una vez y nunca\nusaste. Una vez dentro de un proyecto la referencia aparece en la barra de\ndirecciones del navegador, y así confirmas que estás en el correcto antes de\ncopiar nada de él.",[29,110,112],{"id":111},"las-cuatro-cosas-de-esa-página","Las cuatro cosas de esa página",[10,114,115],{},"Una dirección y tres claves. Dos van en tu app y dos no salen nunca del panel.",[117,118,119,138],"table",{},[120,121,122],"thead",{},[123,124,125,129,132,135],"tr",{},[126,127,128],"th",{},"Lo que ves",[126,130,131],{},"Qué es",[126,133,134],{},"Adónde va",[126,136,137],{},"Si se filtra",[139,140,141,165,189,213],"tbody",{},[123,142,143,149,155,162],{},[144,145,146],"td",{},[37,147,148],{},"Project URL",[144,150,151,152,154],{},"La dirección de tu proyecto, ",[14,153,75],{},". Dice dónde, nunca quién.",[144,156,157],{},[158,159,161],"key-verdict",{"type":160},"safe","En tu app",[144,163,164],{},"Nada. Ya viaja a cada visitante en cada carga de página.",[123,166,167,176,182,186],{},[144,168,169,172,173],{},[37,170,171],{},"Publishable key"," ",[14,174,175],{},"sb_publishable_…",[144,177,178,179,181],{},"Nombra el proyecto y no lleva permisos propios. Se llama ",[14,180,16],{}," en un proyecto antiguo.",[144,183,184],{},[158,185,161],{"type":160},[144,187,188],{},"Nada por sí sola. Lee exactamente lo que permiten tus reglas de Row Level Security.",[123,190,191,199,204,210],{},[144,192,193,172,196],{},[37,194,195],{},"Secret key",[14,197,198],{},"sb_secret_…",[144,200,201,202,181],{},"Lee y escribe cada fila de cada tabla, digan lo que digan tus reglas. Se llama ",[14,203,20],{},[144,205,206],{},[158,207,209],{"type":208},"danger","Solo servidor",[144,211,212],{},"Cada fila de cada tabla, para quien la haya encontrado.",[123,214,215,220,223,228],{},[144,216,217],{},[37,218,219],{},"JWT secret",[144,221,222],{},"Firma los tokens que dicen quién ha iniciado sesión. Se llama JWT signing keys en un proyecto nuevo.",[144,224,225],{},[158,226,227],{"type":208},"Se queda en Supabase",[144,229,230],{},"Alguien puede emitir un token que afirme ser cualquiera de tus usuarios, incluido un administrador.",[232,233],"diagram",{"alt":234,"caption":235,"src":236},"Un panel de ajustes con cuatro filas. La URL y la clave anon están marcadas con un tick y sus valores se ven enteros. Bajo una línea gruesa, la clave service_role y el valor JWT están tachados y sus valores cubiertos por puntos.","Cuatro valores, una página. Supabase no traza ninguna línea entre ellos, y la máscara sobre los dos de abajo es la única pista que te da.","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Ffour-values-one-page-1600x720.png",[10,238,239],{},"Hay un atajo en la propia página. Supabase imprime la URL del proyecto y la\nclave publicable donde puedes leerlas, y cubre la clave secreta y el valor JWT\ncon puntos hasta que pides verlos. Los dos que tapa son justo los dos que nunca\nvan en tu app.",[29,241,243],{"id":242},"dónde-está-la-url-de-mi-proyecto-de-supabase","¿Dónde está la URL de mi proyecto de Supabase?",[10,245,246,247,249,250,40],{},"En dos sitios, y probablemente ya tengas uno delante. El panel la imprime arriba\ndel todo en ",[37,248,39],{},", con la etiqueta Project URL. La barra de\ndirecciones de tu navegador muestra esa misma cadena cada vez que tu app habla\ncon Supabase, con la forma ",[14,251,75],{},[10,253,254],{},"En el código lleva uno de tres nombres, y los tres guardan esa misma cadena:",[81,256,257,263,269],{},[84,258,259,262],{},[14,260,261],{},"VITE_SUPABASE_URL"," en una app construida con Vite, que cubre la mayoría de lo\nque producen Lovable y Bolt",[84,264,265,268],{},[14,266,267],{},"NEXT_PUBLIC_SUPABASE_URL"," en una app de Next.js",[84,270,271,274],{},[14,272,273],{},"SUPABASE_URL"," en un servidor, en una edge function o en un script",[10,276,277,278,281],{},"El trozo del medio, ",[14,279,280],{},"yourreference",", es la referencia de tu proyecto. Es la\ncadena por la que el panel identifica tu proyecto, y la que hay que comparar\ncuando tienes varios proyectos y ni idea de cuál pertenece a esta app.",[10,283,284],{},"Es una dirección más que un secreto, y por eso está a la vista junto a la clave\npublicable.",[29,286,288],{"id":287},"dónde-está-la-clave-service_role-y-qué-es-supabase_service_role_key","¿Dónde está la clave service_role, y qué es SUPABASE_SERVICE_ROLE_KEY?",[10,290,291,292,294,295,297,298,301],{},"En la misma página que todo lo demás. Abre ",[37,293,39],{}," y busca la\nfila ",[14,296,20],{},", o ",[14,299,300],{},"secret"," en un proyecto creado hace poco. A diferencia de\nla URL y la clave publicable, su valor queda detrás de un control de revelado\nhasta que lo pides.",[10,303,304],{},"Ese control es la única pista que te da el panel de que esta es distinta, y\nmerece tomarse en serio: Supabase tapa exactamente los valores que nunca deben\nllegar a un navegador.",[10,306,307,310,311,314,315,318,319,322],{},[14,308,309],{},"SUPABASE_SERVICE_ROLE_KEY"," es un nombre de variable más que una segunda clave:\ndetrás está el valor que acabas de revelar. Te lo encontrarás en un archivo\n",[14,312,313],{},".env",", en los ajustes de entorno de tu hosting, o en los secretos de una edge\nfunction. Lo que importa es el prefijo que lleva delante. Una variable llamada\n",[14,316,317],{},"VITE_SUPABASE_SERVICE_ROLE_KEY"," o ",[14,320,321],{},"NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY"," se\ncompila dentro del JavaScript que descargan tus visitantes, así que la clave es\npública en cuanto despliegas. Esos prefijos son instrucciones de publicar, no\ndescuidos.",[10,324,325],{},"Donde sí encaja es en una edge function, un manejador de webhooks, una tarea\nprogramada o un script de migración: en cualquier sitio donde el código corra en\nuna máquina que controlas y ningún visitante pueda abrir el archivo. Esta es la\nclave que ignora Row Level Security por completo, así que lee cada fila de cada\ntabla digan lo que digan tus reglas.",[10,327,328,329,334],{},"Si no tienes claro que la tuya se quedó en el servidor, nuestro\n",[330,331,333],"a",{"href":332},"\u002Fsecurity-scanner","escáner de seguridad web gratis"," lee tu sitio en vivo desde\nfuera y nombra las claves que encuentra, en unos 20 segundos.",[29,336,338],{"id":337},"qué-clave-necesita-mi-app","¿Qué clave necesita mi app?",[10,340,341],{},"La URL del proyecto y la clave publicable. Nada más, nunca.",[10,343,344],{},"Tu app se ejecuta en el navegador de tus visitantes y habla con Supabase desde\nahí, así que esos dos valores viajan a cada visitante por diseño. Eso no es una\nfiltración y nunca lo fue. Lo que impide que un desconocido lea toda tu base de\ndatos con una clave publicable es Row Level Security: las reglas que deciden,\nfila a fila, quién puede ver qué.",[10,346,347,348,352,353,40],{},"Así que esas reglas son lo que hay que revisar cuando te preocupas, y\n",[330,349,351],{"href":350},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","activarlas no es lo mismo que estar protegido",".\nLa versión larga de por qué una clave es segura en público está en\n",[330,354,356],{"href":355},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","qué claves API son seguras en tu frontend",[29,358,360],{"id":359},"cómo-sé-qué-clave-llevó-realmente-mi-app","¿Cómo sé qué clave llevó realmente mi app?",[10,362,363],{},"Desde el panel no puedes saberlo. Lista las claves que tiene tu proyecto, no la\nque acabó dentro de tu app.",[10,365,366],{},"Son dos preguntas distintas, y solo la segunda puede hacerte daño. Un proyecto\npuede tener una página de ajustes completamente normal y aun así tener su clave\nsecreta pegada en un archivo que cualquiera puede abrir. Para responderla hay\nque leer la clave que está de verdad en la app.",[10,368,369,172,372,375,376,379],{},[37,370,371],{},"En un proyecto nuevo, lee los primeros caracteres.",[14,373,374],{},"sb_publishable_"," es la\nque va ahí. ",[14,377,378],{},"sb_secret_"," es la que hay que atender hoy.",[10,381,382,172,385,387,388,390,391,394,395,40],{},[37,383,384],{},"En un proyecto antiguo, tienes que mirar dentro de la clave.",[14,386,16],{}," y\n",[14,389,20],{}," son JWT: tres bloques separados por puntos, y el del medio se\ndescodifica en texto perfectamente legible. Lleva un campo ",[14,392,393],{},"role",", y esa sola\npalabra es toda la diferencia entre las dos.\n",[330,396,397],{"href":355},"Cómo leerlo",[232,399],{"alt":400,"caption":401,"src":402},"A la izquierda, la página de ajustes con cuatro valores y las filas anon y service_role resaltadas. Dos líneas discontinuas salen de esas dos filas y convergen en un único hueco resaltado dentro de un bloque de código a la derecha, marcado con un signo de interrogación.","El panel te enseña qué claves existen. Cuál de ellas llevó tu app es una pregunta que solo tu app puede responder.","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fwhat-exists-vs-what-shipped-1600x700.png",[10,404,405,406,40],{},"Si prefieres no revisar tu app a mano, nuestro escaneo gratuito lee tu sitio en\nproducción desde fuera y nombra las claves que ve, además de si tus tablas\nresponden a un desconocido que pregunta. Tarda unos 20 segundos y no necesita\ncuenta: ",[330,407,409],{"href":408},"\u002F#scan","escanear tu app",[29,411,413],{"id":412},"y-si-la-clave-secreta-ya-está-en-mi-app","¿Y si la clave secreta ya está en mi app?",[10,415,416],{},"Ocúpate de la clave antes de tocar nada de código, y en Supabase eso puede que\nno signifique lo que esperas.",[10,418,419,420,422],{},"El consejo habitual es rotar: generas una clave nueva, revocas la vieja y el\nvalor que se filtró deja de funcionar. Eso sigue valiendo para las claves\nnuevas. Un proyecto puede tener varias claves ",[14,421,378],{}," a la vez y\nrevocarlas de una en una, así que sustituir una ya no implica un minuto en el\nque todo lo que la usaba está roto.",[10,424,425,426,432,433,435,436,440],{},"Para el par original no vale en absoluto. Las propias notas de resolución de\nproblemas de Supabase dicen que\n",[330,427,431],{"href":428,"rel":429},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Frotating-anon-service-and-jwt-secrets-1Jq6yd",[430],"nofollow","ya no es posible rotar los antiguos secretos anon, service_role y JWT",".\nInutilizar una clave ",[14,434,20],{}," antigua que se ha filtrado pasa por crear\nlas claves nuevas, mover tu app y tu código de servidor a ellas, y después\ndesactivar el par viejo. ",[330,437,439],{"href":438},"\u002Fblog\u002Fsupabase-new-api-keys","Lo que implica esa migración","\nson unos cuantos pasos en el panel y un valor cambiado en tu app, bastante más\nllevadero una tarde tranquila que el día en que lo necesitas.",[442,443,445],"callout",{"type":444},"warn",[10,446,447,450],{},[37,448,449],{},"Borrar la clave de tu código no cierra la puerta."," El valor viejo sigue en tu\nhistorial de versiones, en cualquier despliegue que no hayas reconstruido desde\nentonces, y en la copia en caché de tu página que tiene todo el que la cargó\nmientras la clave estaba activa. Quien haya guardado una de esas copias puede\nusarla mañana contra tu base de datos.",[29,452,454],{"id":453},"qué-hacer-ahora","Qué hacer ahora",[456,457,458],"key-takeaways",{},[81,459,460,469,472,482,485],{},[84,461,462,463,465,466,468],{},"Abre ",[37,464,39],{}," dentro de tu proyecto. Si no encuentras el proyecto, saca la referencia de ",[14,467,75],{}," y compárala con la lista de tu panel.",[84,470,471],{},"Pon la URL del proyecto y la clave publicable en tu app. Esas dos, y nada más.",[84,473,474,475,477,478,481],{},"Lee la clave que tu app llevó de verdad. ",[14,476,378],{}," al principio, o ",[14,479,480],{},"\"role\": \"service_role\""," dentro de una antigua, es el hallazgo que hay que atender hoy.",[84,483,484],{},"Si hay una clave secreta en tu frontend, inutilízala antes de editar nada. En un proyecto antiguo eso significa crear las claves nuevas y desactivar el par viejo, y no hay un solo botón para hacerlo.",[84,486,487],{},"Mira Row Level Security ya que estás en el panel. Una clave publicable solo es segura gracias a esas reglas, y sin ellas lee toda tu base de datos.",[10,489,490,491,495,496,40],{},"Si prefieres recorrer esto como una lista, la\n",[330,492,494],{"href":493},"\u002Fchecklist","checklist de seguridad de 10 minutos"," cubre esto y las otras cosas\nque conviene apagar en una app recién lanzada, y tenemos una guía en lenguaje\nclaro para ",[330,497,499],{"href":498},"\u002Fis-your-supabase-app-safe","apps de Supabase",{"title":501,"searchDepth":502,"depth":502,"links":503},"",3,[504,506,507,508,509,510,511,512,513],{"id":31,"depth":505,"text":32},2,{"id":61,"depth":505,"text":62},{"id":111,"depth":505,"text":112},{"id":242,"depth":505,"text":243},{"id":287,"depth":505,"text":288},{"id":337,"depth":505,"text":338},{"id":359,"depth":505,"text":360},{"id":412,"depth":505,"text":413},{"id":453,"depth":505,"text":454},"Fundamentos de seguridad","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcover-1200x630.png","Un panel de ajustes: una URL y una clave anon a la vista, una clave service_role y un valor JWT ocultos tras puntos.","La URL del proyecto, la clave anon y la clave service_role están en una sola página del panel. Aquí tienes dónde está, y cuál de los cuatro va en tu app.",false,"md",[521,524,527,530,533,536],{"q":522,"a":523},"¿Dónde está la clave service_role en Supabase?","En el panel, dentro de tu proyecto, en Settings → API Keys. En un proyecto antiguo aparece con el nombre service_role y está oculta tras un botón para mostrarla; en uno nuevo es una clave secreta que empieza por sb_secret_. Las guías más antiguas llaman a esa misma página Settings → API.",{"q":525,"a":526},"¿Qué aspecto tiene una clave anon de Supabase?","En un proyecto nuevo es una cadena larga que empieza por sb_publishable_. En uno antiguo es un JWT: tres bloques de caracteres separados por puntos, que empiezan por eyJ, y de unos cientos de caracteres en total. La clave service_role tiene exactamente el mismo aspecto, y por eso se confunden.",{"q":528,"a":529},"¿La URL de mi proyecto de Supabase es secreta?","No. Es la dirección a la que tu app envía cada petición, así que viaja a cada visitante por diseño y no existe ninguna versión de tu app en la que esté escondida. Encontrarla no es un hallazgo. Lo que decide si un desconocido puede leer tus datos es Row Level Security, no si conoce tu dirección.",{"q":531,"a":532},"Mi app la construyeron por mí y nunca he abierto Supabase. ¿Cómo entro?","Busca primero la referencia de tu proyecto: la cadena corta y aleatoria que hay en la dirección que tu app ya llama, https:\u002F\u002Fyourreference.supabase.co. Los builders conectan Supabase a través de tu propia cuenta, así que el proyecto suele estar en un panel en el que te registraste una vez y nunca usaste. Entra en supabase.com con esa cuenta y compara la referencia con la lista de proyectos.",{"q":534,"a":535},"¿Puedo rotar una clave service_role filtrada?","Solo si es una de las nuevas claves sb_secret_, de las que puedes tener varias y revocarlas de una en una. Supabase ha dicho que ya no es posible rotar los antiguos secretos anon, service_role y JWT. Inutilizar una clave antigua filtrada pasa por crear las claves nuevas, mover tu app y tu código de servidor a ellas, y después desactivar el par viejo.",{"q":537,"a":538},"¿Qué es SUPABASE_SERVICE_ROLE_KEY?","Es el nombre de variable de entorno con el que tu código guarda la clave secreta, la que aparece como service_role en un proyecto antiguo y como sb_secret_ en uno nuevo. Su sitio es solo la configuración del lado del servidor: una edge function, un manejador de webhooks, una tarea programada. Cualquier cosa con prefijo VITE_ o NEXT_PUBLIC_ se compila dentro del bundle del navegador, así que una clave service_role detrás de uno de esos nombres es pública en cuanto despliegas.","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",[541,542,543,544,545,546,547],"dónde está la clave service_role de supabase","encontrar clave service_role supabase","encontrar clave anon supabase","claves api supabase","formato clave anon supabase","url del proyecto supabase","cómo obtener clave supabase",{},true,"¿Dónde está la clave service_role de Supabase?","\u002Fblog\u002Fwhere-to-find-supabase-api-keys","2026-08-28",{"title":5,"description":517},"blog\u002Fwhere-to-find-supabase-api-keys",[556,557,558],"Todas las claves de Supabase, service_role incluida, están en una página: abre tu proyecto en el panel y luego Settings → API Keys.","Allí hay cuatro valores. La URL del proyecto y la clave publicable van en tu app; la clave secreta y el valor JWT nunca.","Esa página te dice qué claves existen. No te dice cuál acabó en tu app, y solo la segunda pregunta puede hacerte daño.","2026-09-05","ARc38yZ6r3KnwR68da5griyS6wTvM6bDNXeTk2TPyfU",[562,568,573,579,585,591,598,604,610,616,617,623,629,635,641,647,653,659,665,670,675,681,686,691,697],{"path":563,"title":564,"description":565,"published":566,"category":514,"image":567,"draft":518},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: haz tú mismo las cinco comprobaciones","Un Supabase security checker lee tu app publicada en lugar de la configuración de tu proyecto. Estas son las cinco comprobaciones y cómo hacer cada una.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":569,"title":570,"description":571,"published":559,"category":514,"image":572,"draft":518},"\u002Fblog\u002Fvibe-coding-security-scanner","Escáner de seguridad para vibe coding: qué se le escapa","Un escáner de seguridad para vibe coding lee tu app en vivo desde fuera. Qué cubre eso, las cuatro cosas que no puede ver y cómo leer el resultado.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":574,"title":575,"description":576,"published":577,"category":514,"image":578,"draft":518},"\u002Fblog\u002Fmissing-security-headers","Faltan cabeceras de seguridad: cuándo importa de verdad","Que falten cabeceras de seguridad es el hallazgo que más imprime nuestro escáner. Contra qué protegen y cuándo son la línea menos urgente de tu informe.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":580,"title":581,"description":582,"published":583,"category":514,"image":584,"draft":518},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Tu clave de API de OpenAI está expuesta en tu frontend. Rótala.","Una clave de API de OpenAI expuesta en tu frontend no admite ninguna restricción de dominio. Es un token al portador, y quien la encuentre gasta tu dinero.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":586,"title":587,"description":588,"published":589,"category":514,"image":590,"draft":518},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Clave de API expuesta en el frontend: qué llevan 30.998 apps","Una clave de API expuesta en tu frontend suele ser una clave de Google Maps. Escaneamos 30.998 apps vibe-coded y contamos qué secretos se filtran de verdad.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":592,"title":593,"description":594,"published":595,"category":596,"image":597,"draft":518},"\u002Fblog\u002Fsupabase-backup-tools-compared","Herramientas de backup de Supabase comparadas, la nuestra incluida","Cuatro tipos de herramienta de backup de Supabase, qué copia cada una y cuándo una GitHub Action gratuita le gana a pagar a cualquiera, nosotros incluidos.","2026-09-01","Backups","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":599,"title":600,"description":601,"published":602,"category":514,"image":603,"draft":518},"\u002Fblog\u002Freplit-secrets-explained","Cómo usar secrets en Replit, y qué se publica de todos modos","Cómo usar secrets en Replit y el caso que la herramienta no cubre: una clave que lee tu código de navegador se publica junto con tu aplicación.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":605,"title":606,"description":607,"published":608,"category":596,"image":609,"draft":518},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups del plan gratuito de Supabase: cómo hacer uno sin terminal","No hay backups en el plan gratuito de Supabase: la copia tienes que hacerla tú. Cómo sacarla desde el panel y qué deja fuera la vía CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":611,"title":612,"description":613,"published":614,"category":514,"image":615,"draft":518},"\u002Fblog\u002Fis-supabase-secure","¿Supabase es seguro? Sí. Tu proyecto es otra pregunta","¿Supabase es seguro? La plataforma está auditada, cifrada y sometida a pentests. Su propia documentación dice dónde termina eso y empiezan tus ajustes.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":551,"title":5,"description":517,"published":552,"category":514,"image":539,"draft":518},{"path":618,"title":619,"description":620,"published":621,"category":514,"image":622,"draft":518},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy en Supabase. ¿Y ahora?","\"New row violates row-level security policy\" significa que Supabase rechazó una escritura. El arreglo rápido vuelve a abrir la tabla para cualquiera.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":624,"title":625,"description":626,"published":627,"category":514,"image":628,"draft":518},"\u002Fblog\u002Fcors-wildcard-security-risk","¿Es un comodín CORS un riesgo de seguridad? Casi nunca.","¿Es un comodín CORS un riesgo de seguridad? Casi siempre es el ajuste por defecto de tu builder y no entrega nada que tu servidor no diera ya a cualquiera.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":630,"title":631,"description":632,"published":633,"category":596,"image":634,"draft":518},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase branching no es un backup. Solo va hacia adelante.","Por qué el branching de Supabase no es un backup: una rama arranca sin tus datos y un merge solo mueve el esquema. Para qué sirve y qué usar en su lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":636,"title":637,"description":638,"published":639,"category":596,"image":640,"draft":518},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Cómo restaurar un backup de Supabase, y qué se rompe después","Cómo restaurar un backup de Supabase desde el panel o desde un archivo de volcado, qué reemplaza la restauración y por qué tu app puede seguir rota al terminar.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":514,"image":646,"draft":518},"\u002Fblog\u002Fsupabase-storage-bucket-public","Tu bucket de Supabase Storage es público. ¿Es un problema?","Un bucket público de Supabase Storage significa que quien tenga la URL de un archivo puede abrirlo. No significa que alguien pueda listar lo que hay dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":514,"image":652,"draft":518},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","¿Es un problema una clave de API de Google en tu frontend?","Una clave de API de Google en tu frontend es la clave que más encuentra nuestro escáner, y casi siempre no pasa nada. Un ajuste gratuito decide cuál es cuál.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":596,"image":658,"draft":518},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agente de IA borró mis datos de Supabase. ¿Qué puedo recuperar?","Un agente de IA borró datos de tu base. Lo que puedes recuperar ya estaba decidido antes de que se ejecutara, y los próximos minutos deciden el resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":514,"image":664,"draft":518},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","¿Puede cualquiera leer tu base de datos Supabase? 3.680 apps","¿Puede cualquiera leer tu base de datos Supabase sin iniciar sesión? Escaneamos 30.998 apps activas hechas con builders de IA y medimos cuántas dicen que sí.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":663,"category":514,"image":669,"draft":518},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source maps expuestos: tu app está publicando su código original","Un source map expuesto deja que cualquiera lea el código original de tu app, comentarios incluidos. La comprobación de 30 segundos y lo que de verdad importa.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":438,"title":671,"description":672,"published":673,"category":514,"image":674,"draft":518},"Las nuevas claves de API de Supabase: ¿cuál va en tu app?","Supabase sustituyó anon y service_role por claves publicables y secretas. ¿Cuál pertenece a tu app y cuál no debe estar nunca?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":676,"title":677,"description":678,"published":679,"category":596,"image":680,"draft":518},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","¿Supabase respalda mi base de datos? Depende de tu plan.","¿Supabase respalda tu base de datos? A diario en los planes de pago, y nada en el gratuito. Cómo saber cuál tienes y qué es lo que esa copia no cubre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":350,"title":682,"description":683,"published":684,"category":514,"image":685,"draft":518},"Supabase Row Level Security está activado. Tu tabla sigue pública.","Activar Supabase Row Level Security no protege una tabla. Lo hacen tus políticas, y la que arregló tu app rota puede dejar entrar a cualquiera.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":687,"title":688,"description":689,"published":684,"category":596,"image":690,"draft":518},"\u002Fblog\u002Fversion-history-is-not-a-backup","El historial de versiones no es un backup. No recupera una tabla.","Lovable y Bolt guardan un historial de versiones de tu código. Tu base de datos es un servicio aparte, y volver atrás no te devuelve tus datos.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":692,"title":693,"description":694,"published":695,"category":596,"image":696,"draft":518},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Tres formas de respaldar una base Supabase, y qué falta en cada una","El panel, pg_dump y un servicio gestionado. Qué guarda de verdad cada uno, qué deja fuera sin avisar y cuál sobrevive a perder la cuenta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":355,"title":698,"description":699,"published":695,"category":514,"image":700,"draft":518},"Qué claves de API son seguras en el navegador y cuáles no","Tu clave anon de Supabase está pensada para ser pública. Tu clave service_role no, y se salta todas las reglas que pongas. Cómo distinguirlas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1788681839325]