[{"data":1,"prerenderedAt":1109},["ShallowReactive",2],{"blog-uk-supabase-email-rate-limit-exceeded":3,"blog-index-uk":579},{"id":4,"title":5,"body":6,"category":534,"cover":535,"coverAlt":536,"description":537,"draft":538,"extension":539,"faq":540,"image":559,"keywords":560,"meta":568,"navigation":569,"ogTitle":5,"path":570,"published":571,"seo":572,"stem":573,"tldr":574,"updated":571,"__hash__":578},"blog_uk\u002Fblog\u002Fsupabase-email-rate-limit-exceeded.md","Supabase \"Email Rate Limit Exceeded\": два ліміти, один код помилки",{"type":7,"value":8,"toc":521},"minimark",[9,18,28,31,43,48,51,54,73,91,110,116,123,127,130,187,199,206,211,215,218,233,236,240,248,251,257,264,286,290,293,317,320,345,352,356,363,369,372,383,388,392,395,401,411,415,418,427,445,454,474,478,515],[10,11,12,13,17],"p",{},"Ви перевіряєте форму реєстрації, перш ніж показати застосунок людям.\nРеєструєтеся зі своєю адресою, потім із ",[14,15,16],"code",{},"vy+2@gmail.com",", потім ще раз, щоб\nподивитися, чи гарно виглядає лист підтвердження. Одна з цих спроб зупиняється\nна цьому:",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","AuthApiError: email rate limit exceeded\n","text",[14,26,23],{"__ignoreMap":27},"",[10,29,30],{},"Supabase \"Email Rate Limit Exceeded\" означає, що ваш проєкт вичерпав свою квоту\nлистів на годину, тож Supabase Auth, частина Supabase, яка відповідає за вхід\nлюдей, відмовився надсилати ще один. На поштовому сервісі, з яким стартує кожен\nпроєкт, ця квота становить два листи на годину на весь проєкт.",[10,32,33,34,38,39,42],{},"Ось що легко зрозуміти навпаки: ",[35,36,37],"strong",{},"код помилки охоплює два різні ліміти."," Власний\nсписок кодів помилок Auth від Supabase описує ",[14,40,41],{},"over_email_send_rate_limit"," як \"Too\nmany emails have been sent to this email address.\" Це правда для одного з них.\nТой самий код повертається й тоді, коли квоту вичерпав увесь проєкт, хоч би кому\nбув адресований лист, тож спроба з іншою адресою нічого не змінить. А звична\nпорада \"підключіть власний SMTP\" дає лише половину рішення, бо Supabase запускає\nщойно підключений поштовий сервер із лімітом 30 листів на годину.",[44,45,47],"h2",{"id":46},"що-означає-email-rate-limit-exceeded-у-supabase","Що означає \"Email rate limit exceeded\" у Supabase?",[10,49,50],{},"Що ваш проєкт уже надіслав за цю годину стільки листів, скільки дозволяє\nSupabase Auth, і наступний відхилено.",[10,52,53],{},"Уявіть квоту як аркуш поштових марок. Supabase дає кожному проєкту фіксовану\nкількість марок на годину, і кожен лист, який надсилає Supabase Auth, витрачає\nодну, хоч би який це був лист і хоч би кому він ішов:",[55,56,57,61,64,67,70],"ul",{},[58,59,60],"li",{},"посилання для підтвердження після реєстрації",[58,62,63],{},"magic link або одноразовий код для входу",[58,65,66],{},"скидання пароля",[58,68,69],{},"запрошення, яке ви надсилаєте зі сторінки Users",[58,71,72],{},"підтвердження, коли хтось змінює свою адресу email",[10,74,75,76,78,79,82,83,90],{},"Коли аркуш порожній, Supabase Auth відповідає HTTP 429, що означає \"забагато\nзапитів\", кодом ",[14,77,41],{}," і повідомленням ",[14,80,81],{},"email rate limit exceeded",". Ці слова взято\n",[84,85,89],"a",{"href":86,"rel":87},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fapi\u002Fmail.go",[88],"nofollow","з коду самого сервера Supabase Auth",".",[10,92,93,94,97,98,103,104,109],{},"На вбудованому відправнику, поштовому сервісі, з яким стартує новий проєкт, на\nаркуші ",[35,95,96],{},"дві марки на годину",". Це число зі\n",[84,99,102],{"href":100,"rel":101},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Frate-limits",[88],"сторінки лімітів Supabase"," на\nмомент, коли ми читали її 20 жовтня 2026 року, а\n",[84,105,108],{"href":106,"rel":107},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fauth-smtp",[88],"посібник Supabase про власний SMTP","\nкаже, що воно \"can change without notice\". За двох на годину одна реєстрація і\nодне скидання пароля вже становлять усю квоту години.",[111,112],"diagram",{"alt":113,"caption":114,"src":115},"Чотири види листів, для нового акаунта, посилання для входу, скидання пароля і запрошення, беруть марки з одного аркуша, на якому дві марки на годину. Два конверти йдуть із марками. Інші два зупинені біля бар'єра без марки.","Кожен лист, який надсилає Supabase Auth, витрачає марку з того самого аркуша. На вбудованому відправнику на аркуші дві марки на годину.","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fone-sheet-every-email-1600x760.png",[10,117,118,119,90],{},"Якщо ніхто взагалі не може увійти або весь застосунок порожній, справа в іншому,\nі почати варто з\n",[84,120,122],{"href":121},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase лежить чи проблема у вашому застосунку",[44,124,126],{"id":125},"два-ліміти-мають-один-код-помилки","Два ліміти мають один код помилки",[10,128,129],{},"Повідомлення каже, який ліміт ви вичерпали. Код в обох однаковий:",[131,132,133,152],"table",{},[134,135,136],"thead",{},[137,138,139,143,146,149],"tr",{},[140,141,142],"th",{},"Повідомлення",[140,144,145],{},"Що обмежено",[140,147,148],{},"Що рахується",[140,150,151],{},"Типове значення",[153,154,155,171],"tbody",{},[137,156,157,162,165,168],{},[158,159,160],"td",{},[14,161,81],{},[158,163,164],{},"Увесь проєкт",[158,166,167],{},"Кожен лист, який надсилає Supabase Auth, за годину",[158,169,170],{},"2 на годину з вбудованим відправником, 30 після підключення власного",[137,172,173,178,181,184],{},[158,174,175],{},[14,176,177],{},"For security purposes, you can only request this after N seconds.",[158,179,180],{},"Одна адреса",[158,182,183],{},"Той самий вид листа, повторно на ту саму адресу",[158,185,186],{},"Один раз на 60 секунд",[10,188,189,190,192,193,198],{},"Обидва відповідають HTTP 429 з ",[14,191,41],{},".\n",[84,194,197],{"href":195,"rel":196},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fdebugging\u002Ferror-codes",[88],"Список кодів помилок Auth","\nвід Supabase радить розпізнавати помилки за кодом і \"not string matching on error\nmessages\". Для коду вашого застосунку це правильно, але тут лишається прогалина:\nлише повідомлення каже, який ліміт вичерпано. Тож читайте повідомлення, щоб\nзрозуміти, що сталося, а застосунок нехай реагує на код.",[10,200,201,202,205],{},"Якщо застосунок пише лише \"щось пішло не так\", точне повідомлення є у відповіді\nна невдалий запит, на вкладці Мережа в інструментах розробника вашого браузера.\nКод ",[14,203,204],{},"over_request_rate_limit"," означає третій ліміт, на запити з однієї\nIP-адреси, і список Supabase каже, що він може вказувати на помилку у вашому\nзастосунку, який надсилає їх забагато.",[111,207],{"alt":208,"caption":209,"src":210},"Дві панелі. На лівій аркуш марок проєкту порожній, і три конверти для трьох різних людей зупинені. На правій одна людина вже отримала конверт, а другий для неї ж чекає біля годинника, що показує 60 секунд. Обидві панелі ведуть до того самого коду помилки, over_email_send_rate_limit, зі статусом 429.","Порожній аркуш і 60 секунд очікування є двома різними відмовами, і Supabase повідомляє про обидві тим самим кодом.","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Ftwo-refusals-one-code-1600x720.png",[44,212,214],{"id":213},"чому-там-написано-you-can-only-request-this-after-0-seconds","Чому там написано \"you can only request this after 0 seconds\"?",[10,216,217],{},"Бо з очікування лишалося менше секунди. Ліміт на адресу дозволяє один лист\nкожного виду на ту саму адресу раз на 60 секунд: одне підтвердження реєстрації,\nодне скидання пароля, один magic link чи код. Якщо запитати раніше, Supabase Auth\nпідраховує, скільки ще лишилося, і пише це в повідомленні.",[10,219,220,221,228,229,232],{},"Він рахує цілими секундами й відкидає решту. Функція сервера Auth, яка пише це\nповідомлення\n(",[84,222,225],{"href":223,"rel":224},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fapi\u002Ferrors.go",[88],[14,226,227],{},"errors.go","),\nділить залишок часу на одну секунду, тож 0,8 секунди виводиться як ",[14,230,231],{},"0",". Спробуйте\nще раз за мить, і запит пройде, якщо в годинній межі проєкту ще лишилася марка.",[10,234,235],{},"Це очікування працює так, як задумано. Саме воно не дає кнопці повторного\nнадсилання, натиснутій двадцять разів, відправити двадцять листів. Лишіть його на\n60 секундах, а пояснення нехай дає ваша форма.",[44,237,239],{"id":238},"годинна-межа-і-для-кого-вона","Годинна межа, і для кого вона",[10,241,242,243,247],{},"Вбудований відправник призначений для знайомства з Supabase, і Supabase прямо\nкаже це у своєму ",[84,244,246],{"href":106,"rel":245},[88],"посібнику з SMTP",".\nТам перелічено, для чого цей сервіс: \"Exploring and getting started with Supabase\nAuth\", \"Setting up and testing email templates with the members of the project's\nteam\" і \"Building toy projects, demos or any non-mission-critical application\".\nДо нього також іде \"No SLA guarantee on message delivery or uptime\".",[10,249,250],{},"У тому самому посібнику є друге правило, і саме воно вирішує, хто яку помилку\nбачить. Доки ви не підключили власний поштовий сервер, Supabase Auth \"will refuse\nto deliver messages to addresses that are not part of the project's team\". Клієнта,\nякий реєструється зі своєю адресою, відхиляють ще до того, як буде витрачено хоч\nодну марку, з іншим повідомленням:",[19,252,255],{"className":253,"code":254,"language":24},[22],"Email address \"customer@example.com\" cannot be used as it is not authorized\n",[14,256,254],{"__ignoreMap":27},[10,258,259,260,263],{},"Це HTTP 400 з кодом ",[14,261,262],{},"email_address_not_authorized",", і в коді сервера Auth ця\nперевірка йде перед обома лімітами. Якщо реєстрація працює, коли пробуєте ви, і\nне працює для всіх інших, причина саме в цьому.",[10,265,266,267,269,270,273,274,277,278,281,282,285],{},"Тож на вбудованому відправнику ",[14,268,81],{}," здебільшого бачите ви\nі ваша команда, коли тестуєте. Перевіряючи, чи належить адреса до вашої команди,\nсервер Auth ігнорує все між ",[14,271,272],{},"+"," і ",[14,275,276],{},"@",". Через це ",[14,279,280],{},"vy+test1@gmail.com"," і\n",[14,283,284],{},"vy+test2@gmail.com"," обидві рахуються як ви, і кожна тестова реєстрація витрачає\nодну з тих самих двох марок.",[44,287,289],{"id":288},"як-підняти-ліміт-листів-у-supabase","Як підняти ліміт листів у Supabase?",[10,291,292],{},"Підключіть власного поштового провайдера, а потім підніміть ліміт, який на нього\nставить Supabase. Це два окремі кроки, і про другий часто забувають.",[294,295,296,305,311],"ol",{},[58,297,298,301,302,90],{},[35,299,300],{},"Оберіть сервіс розсилки й візьміть його налаштування SMTP."," Посібник\nSupabase називає Resend, AWS SES, Postmark, Twilio SendGrid, ZeptoMail і\nBrevo і каже, що підійде будь-який сервіс із підтримкою SMTP. Вам потрібні\nхост, порт, ім'я користувача і пароль, а також адреса відправника на кшталт\n",[14,303,304],{},"no-reply@vashdomen.com",[58,306,307,310],{},[35,308,309],{},"Увімкніть власний SMTP"," у налаштуваннях Authentication вашого проєкту й\nвведіть ці дані. Відтоді Supabase надсилає на будь-яку адресу.",[58,312,313,316],{},[35,314,315],{},"Підніміть ліміт листів"," на сторінці Rate Limits, теж у розділі\nAuthentication. За посібником, щойно підключений сервер отримує \"a low\nrate-limit of 30 messages per hour\", щоб захистити його репутацію, і змінюють\nйого саме там. Поставте стільки, скільки дозволяє ваш провайдер і скільки\nпотрібно у вашу найзавантаженішу годину.",[10,318,319],{},"Ще три речі з того самого посібника варто зробити разом із цією зміною:",[55,321,322,328,334],{},[58,323,324,327],{},[35,325,326],{},"Налаштуйте DKIM, DMARC і SPF"," для свого домену розсилки у провайдера.\nSupabase каже, що це \"will significantly increase the deliverability of your\nmessages\".",[58,329,330,333],{},[35,331,332],{},"Увімкніть CAPTCHA для реєстрацій."," Посібник називає ботів, які реєструють\nсписки адрес, \"a common source of abuse\", і кожна така реєстрація забирає лист\nіз вашої години. CAPTCHA він називає \"the most effective way\" їх зупинити.",[58,335,336,339,340,344],{},[35,337,338],{},"Перевірте, чи ваших користувачів не викидає із системи."," За посібником,\nкороткі сесії змушують \"active users to sign in frequently, increasing the\nnumber of messages\", і якщо ваші користувачі входять за посиланням із листа,\nкожен несподіваний вихід коштує марку.\n",[84,341,343],{"href":342},"\u002Fblog\u002Fsupabase-users-logged-out","Чому користувачів Supabase викидає із системи","\nрозповідає про причини.",[10,346,347,348,90],{},"Про інші межі, на які натрапляє безплатний проєкт, читайте в\n",[84,349,351],{"href":350},"\u002Fblog\u002Fsupabase-free-plan-limits","що входить у безплатний план Supabase",[44,353,355],{"id":354},"обробка-помилки-у-формі-реєстрації","Обробка помилки у формі реєстрації",[10,357,358,359,362],{},"Ловіть її за кодом і простими словами кажіть людині, що робити. JavaScript-клієнт\nSupabase додає код сервера до помилки, яку повертає, як ",[14,360,361],{},"error.code",", тож\nперевірка займає один рядок:",[19,364,367],{"className":365,"code":366,"language":24},[22],"const { error } = await supabase.auth.signUp({ email, password })\n\nif (error?.code === 'over_email_send_rate_limit') {\n  \u002F\u002F показати: \"Не вдалося надіслати лист просто зараз. Спробуйте ще раз за хвилину.\"\n}\n",[14,368,366],{"__ignoreMap":27},[10,370,371],{},"Попросіть свій інструмент, чи то Lovable, Bolt, v0, Cursor, Claude Code чи\nReplit, про три речі:",[55,373,374,377,380],{},[58,375,376],{},"ту саму перевірку в кожній формі, що надсилає лист: реєстрація, \"забули\nпароль\", вхід за посиланням із листа і \"надіслати ще раз\"",[58,378,379],{},"повідомлення, яке просить людину спробувати трохи згодом, замість сирої\nпомилки або форми, що мовчки нічого не робить",[58,381,382],{},"кнопку повторного надсилання, вимкнену на 60 секунд після кожного надсилання,\nщоб ніхто не натискав її під час очікування для адреси",[10,384,385,386,90],{},"Обійдіться без автоматичних повторів. Поки аркуш порожній, кожен повтор\nвідхиляється, а запити на реєстрацію ще й обмежені за IP-адресою, типово 30 за 5\nхвилин. Цикл повторів може зачепити і цей ліміт, а він відповідає кодом\n",[14,387,204],{},[44,389,391],{"id":390},"чого-не-змінювати-поки-реєстрації-стоять","Чого не змінювати, поки реєстрації стоять",[10,393,394],{},"Підтвердження email і те, звідки йдуть листи. Два обхідні шляхи прибирають\nпомилку і лишають вас у гіршому становищі.",[10,396,397,400],{},[35,398,399],{},"Лишіть підтвердження email увімкненим."," Якщо вимкнути \"Confirm email\",\nреєстрації взагалі перестануть надсилати листи, і помилка зникне. Посібник\nSupabase з SMTP вносить \"Do not disable email confirmations under pressure\" до\nсвоїх засобів захисту, бо без підтвердження хтось може створити акаунт на ім'я\nіншої людини.",[10,402,403,406,407,90],{},[35,404,405],{},"Тримайте листи поза браузером."," Попросіть асистента \"просто надіслати\nпідтвердження через Resend\", і він може вставити API-ключ провайдера у фронтенд\nвашого застосунку, де кожен відвідувач може його прочитати й надсилати пошту від\nвашого імені. Надсилайте листи через налаштування SMTP у Supabase або через\nсерверну функцію, ніколи з ключем на сторінці. Якщо не впевнені, що жоден не\nпросочився, наш безплатний скан читає код, який ваш робочий застосунок надсилає\nкожному відвідувачу, і позначає секретні ключі, які там знаходить. Це займає\nблизько 20 секунд і не потребує акаунта:\n",[84,408,410],{"href":409},"\u002Fsecurity-scanner","проскануйте свій застосунок",[44,412,414],{"id":413},"стежити-за-застосунком-поки-ви-змінюєте-надсилання-листів","Стежити за застосунком, поки ви змінюєте надсилання листів",[10,416,417],{},"Дві речі можуть піти не так, поки ви переробляєте надсилання листів: ключ\nопиниться в коді застосунку, а повідомлення \"ніхто не може зареєструватися\"\nвідправить вас шукати збій.",[10,419,420],{},[35,421,422,426],{},[84,423,425],{"href":424},"\u002Fwebsite-monitoring","Reeve Monitor"," і далі перевіряє ззовні:",[55,428,429,432,435,442],{},[58,430,431],{},"чи доступний ваш застосунок, з перевіркою щохвилини, щоб ви одразу знали, чи скарга на реєстрацію означає збій, чи щось вужче",[58,433,434],{},"повну перевірку безпеки щогодини, до трьох застосунків, разом із секретними ключами в коді, який ваш застосунок надсилає відвідувачам",[58,436,437,438,441],{},"повідомлення, коли результат ",[35,439,440],{},"змінюється",", щоб ключ, який пішов із пізнішим деплоєм, дійшов до вас без того, щоб ви самі йшли дивитися",[58,443,444],{},"щомісячний звіт простою мовою про те, що він бачив",[10,446,447],{},[35,448,449,453],{},[84,450,452],{"href":451},"\u002Fsupabase-backups","Reeve Care"," зберігає копію вашої бази даних Supabase:",[55,455,456,459,462,465,468,471],{},[58,457,458],{},"зашифровану копію за розкладом, у власному сховищі Reeve в ЄС, поза вашим акаунтом Supabase",[58,460,461],{},"схему auth, де живе кожен акаунт, якому таки вдалося зареєструватися",[58,463,464],{},"кожну копію, перевірену, перш ніж вона зарахується, підрахунком рядків у кожній таблиці",[58,466,467],{},"також ваші завантажені файли, щойно ви підключите доступ до Storage",[58,469,470],{},"відновлення в один клік, перед яким робиться страхувальна копія поточного стану",[58,472,473],{},"усе, що робить Monitor",[44,475,477],{"id":476},"що-зробити-зараз","Що зробити зараз",[479,480,481],"key-takeaways",{},[55,482,483,493,500,503,506,512],{},[58,484,485,486,488,489,492],{},"Читайте повідомлення, а не лише код: ",[14,487,81],{}," означає годинну межу проєкту, а ",[14,490,491],{},"For security purposes…"," означає 60 секунд очікування для однієї адреси.",[58,494,495,496,499],{},"Якщо клієнти бачать ",[14,497,498],{},"Email address … cannot be used as it is not authorized",", ваш проєкт досі на вбудованому відправнику Supabase, який пише лише вашій команді.",[58,501,502],{},"Підключіть власного SMTP-провайдера, а потім підніміть ліміт листів на сторінці Rate Limits, де він починається з 30 на годину.",[58,504,505],{},"Налаштуйте DKIM, DMARC і SPF у провайдера й увімкніть CAPTCHA для реєстрацій.",[58,507,508,509,511],{},"Нехай кожна форма, що надсилає лист, перевіряє ",[14,510,41],{},", показує зрозуміле повідомлення і блокує кнопку повторного надсилання на 60 секунд.",[58,513,514],{},"Лишіть підтвердження email увімкненим і ніколи не кладіть ключ поштового провайдера у фронтенд.",[10,516,517,518,520],{},"Почніть із повідомлення в невдалій відповіді, бо воно каже, який із двох лімітів\nви вичерпали. А коли листи вже підуть через вашого провайдера,\n",[84,519,410],{"href":409},", щоб перевірити, що разом із ними\nне прийшов жоден ключ.",{"title":27,"searchDepth":522,"depth":522,"links":523},3,[524,526,527,528,529,530,531,532,533],{"id":46,"depth":525,"text":47},2,{"id":125,"depth":525,"text":126},{"id":213,"depth":525,"text":214},{"id":238,"depth":525,"text":239},{"id":288,"depth":525,"text":289},{"id":354,"depth":525,"text":355},{"id":390,"depth":525,"text":391},{"id":413,"depth":525,"text":414},{"id":476,"depth":525,"text":477},"Основи безпеки","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcover-1200x630.png","Аркуш марок, з якого вже вирвано всі марки, поруч зі стосом запечатаних конвертів без нічого в кутку.","Supabase \"Email Rate Limit Exceeded\" обмежує кожен лист вашого проєкту: 2 на годину з вбудованим відправником. Що враховується і як підняти ліміт.",false,"md",[541,544,547,550,553,556],{"q":542,"a":543},"Що означає \"email rate limit exceeded\" у Supabase?","Що ваш проєкт уже надіслав за цю годину стільки листів, скільки дозволяє Supabase Auth, тож наступний відхилено. Рахується кожен лист, який надсилає Auth, будь-кому: підтвердження реєстрації, magic links, скидання пароля і запрошення. З вбудованим відправником це 2 на годину. З власним SMTP-провайдером число встановлюєте ви.",{"q":545,"a":546},"Чому там написано, що повторити запит можна лише через 0 секунд?","Бо з 60 секунд очікування лишалося менше секунди. Supabase Auth рахує залишок цілими секундами й відкидає решту, тож остання секунда показується як 0. Спробуйте ще раз за мить, і лист піде, якщо в годинній межі ще є місце.",{"q":548,"a":549},"Скільки листів Supabase може надіслати за мене?","З вбудованим відправником 2 на годину на весь проєкт, і лише людям із вашої команди в Supabase. Supabase каже, що це число може змінитися без попередження. З власним SMTP-провайдером фіксованого числа немає: Supabase починає з 30 на годину, а ви піднімаєте його на сторінці Rate Limits.",{"q":551,"a":552},"Чи потрібен мені власний SMTP-провайдер?","Так, щойно хтось поза вашою командою реєструється через email. Вбудований відправник відхиляє адреси, яких немає у вашій команді, і Supabase описує його як призначений для знайомства, перевірки шаблонів і демо. Resend, AWS SES, Postmark, SendGrid, ZeptoMail і Brevo серед сервісів, які Supabase називає сумісними.",{"q":554,"a":555},"Як не дати цьому зламати форму реєстрації?","Перевіряйте код помилки, перш ніж щось потрапить на екран. Якщо це over_email_send_rate_limit, покажіть зрозуміле повідомлення з проханням спробувати за хвилину і тримайте кнопку повторного надсилання вимкненою 60 секунд після кожного надсилання, щоб ніхто не натискав її під час очікування.",{"q":557,"a":558},"Чому мої клієнти отримують \"Email address not authorized\"?","Бо ваш проєкт досі надсилає через вбудований відправник Supabase, який доставляє лише учасникам вашої організації в Supabase. Усіх інших він відхиляє з кодом email_address_not_authorized. Це виправляє підключення власного SMTP-провайдера, і та сама зміна знімає годинну межу.","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",[561,562,41,563,564,565,566,567],"email rate limit exceeded supabase","supabase email rate limit exceeded","for security purposes you can only request this after","supabase ліміт smtp","supabase не приходить лист підтвердження","supabase magic link не приходить","email address not authorized supabase",{},true,"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","2026-10-20",{"title":5,"description":537},"blog\u002Fsupabase-email-rate-limit-exceeded",[575,576,577],"Supabase \"Email Rate Limit Exceeded\" означає, що ваш проєкт уже надіслав за цю годину стільки листів, скільки йому дозволено. З вбудованим відправником це 2 на годину, і рахується кожне підтвердження реєстрації, кожен magic link і кожне скидання пароля.","Той самий код, over_email_send_rate_limit, повертається і з повідомленням \"For security purposes, you can only request this after N seconds\", тобто 60 секунд очікування для однієї адреси. Розрізняє їх лише текст повідомлення.","Власний SMTP-провайдер знімає годинну межу, коли ви також піднімаєте ліміт на сторінці Rate Limits, де він починається з 30 на годину. 60 секунд очікування лишаються, і ваша форма має це пояснювати.","La50Hw5WNWSaxS1bXUJuK_pueAmykWf-FY2msFVxCj4",[580,586,592,598,604,610,616,622,628,634,640,647,653,659,665,671,677,683,689,695,701,702,707,713,719,725,731,737,743,749,755,761,767,773,779,785,791,797,803,809,814,820,825,831,837,843,848,854,860,866,872,878,884,890,896,902,908,914,920,926,932,938,944,950,956,962,968,974,980,986,992,998,1004,1010,1016,1022,1028,1034,1040,1046,1052,1058,1064,1070,1075,1081,1087,1093,1098,1104],{"path":581,"title":582,"description":583,"published":584,"category":534,"image":585,"draft":538},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\": пояснення","Supabase \"max client connections reached\": у пулера немає місця ще для одного клієнта. Ліміт визначає порт у вашому рядку підключення.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":587,"title":588,"description":589,"published":590,"category":534,"image":591,"draft":538},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Помилка Supabase: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\": вхід через Google вимкнено у вашому проєкті Supabase. Як увімкнути та виправити redirect_uri_mismatch.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":593,"title":594,"description":595,"published":596,"category":534,"image":597,"draft":538},"\u002Fblog\u002Fviolates-foreign-key-constraint","Помилка Supabase \"violates foreign key constraint\" під час вставки","Supabase \"insert or update on table violates foreign key constraint\": ваш рядок посилається на рядок, якого немає. Який, чому і як це виправити.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":599,"title":600,"description":601,"published":602,"category":534,"image":603,"draft":538},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Помилка Supabase \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": обовʼязковий стовпець прийшов порожнім. Звідки взявся null і як це виправити.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":605,"title":606,"description":607,"published":608,"category":534,"image":609,"draft":538},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": куди поділася сесія","\"Auth session missing!\" означає, що supabase-js не знайшла жодної сесії й навіть не спитала Supabase. Куди поділася сесія і як це виправити.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":611,"title":612,"description":613,"published":614,"category":534,"image":615,"draft":538},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": ніхто не ввійшов","\"invalid claim: missing sub claim\": Supabase Auth отримав справжній токен без жодного користувача, ключ проєкту замість сесії.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":617,"title":618,"description":619,"published":620,"category":534,"image":621,"draft":538},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": справжня причина","\"Failed to send a request to the Edge Function\": браузер не отримав відповіді, яку можна прочитати. Його консоль каже, чому, і чи ваша функція запускалася.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":623,"title":624,"description":625,"published":626,"category":534,"image":627,"draft":538},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Чому Supabase перенаправляє посилання з листів на localhost:3000","Якщо Supabase перенаправляє на localhost:3000, Site URL так і не змінили або вашої адреси немає в Redirect URLs. Як виправити і якої маски уникати.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":629,"title":630,"description":631,"published":632,"category":534,"image":633,"draft":538},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" на новому посиланні","На посиланні, надісланому хвилину тому, \"Email link is invalid or has expired\" у Supabase зазвичай означає, що поштовий фільтр використав його першим.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":635,"title":636,"description":637,"published":638,"category":534,"image":639,"draft":538},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\": пояснення","Supabase \"canceling statement due to statement timeout\": запит перевищив ліміт своєї ролі, 3 секунди для відвідувача. Спершу перевірте політику RLS.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":641,"title":642,"description":643,"published":644,"category":645,"image":646,"draft":538},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" у Supabase і що зникає разом","\"Database error deleting user\" у Supabase: ваша база відмовилася видаляти. Причина в логах, а виправлення вирішує, що ще буде видалено.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":534,"image":652,"draft":538},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" у Supabase","Вебхук Stripe в Edge Function Supabase пише \"No signatures found matching the expected signature\"? Причин дві. Не вимикайте перевірку.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":534,"image":658,"draft":538},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" у Supabase: три причини","Supabase відповідає \"Invalid login credentials\" на неправильний пароль, невідому пошту й акаунт Google. Як зрозуміти, що саме.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":534,"image":664,"draft":538},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": справжня помилка","\"Edge Function returned a non-2xx status code\" означає, що ваша функція Supabase відповіла помилкою. Ось де прочитати справжню.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":534,"image":670,"draft":538},"\u002Fblog\u002Fcertificate-not-trusted","Сертифікат не довірений: три причини, крім закінчення строку","Сертифікат не довірений, хоча дата в порядку? Він називає іншу адресу, підписав сам себе або в його ланцюжку бракує ланки. Як зрозуміти, що саме.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":672,"title":673,"description":674,"published":675,"category":534,"image":676,"draft":538},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": що в лапках","Supabase \"invalid input syntax for type uuid\" означає, що застосунок надіслав щось, що не є id. Прочитайте лапки, притримайте запит, залиште колонку.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":678,"title":679,"description":680,"published":681,"category":534,"image":682,"draft":538},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\": пояснення","Supabase \"duplicate key value violates unique constraint\": значення вже зайняте. Знайдіть стовпець, оберіть виправлення й сховайте значення від очей.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":534,"image":688,"draft":538},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", хоча таблиця на місці","Supabase \"relation does not exist\" або PGRST205: жодна таблиця не має такої назви в цій схемі. Чотири перевірки, і на що зважити, відкриваючи схему.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":693,"category":534,"image":694,"draft":538},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" показує назви аргументів, які надіслав ваш застосунок. Порівняйте їх із функцією.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":699,"category":534,"image":700,"draft":538},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" зазвичай означає, що назва не збігається. Чотири перевірки і рядок для перезавантаження.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":570,"title":5,"description":537,"published":571,"category":534,"image":559,"draft":538},{"path":342,"title":703,"description":704,"published":705,"category":534,"image":706,"draft":538},"Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 причини","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" виводить ваших користувачів із системи. Три причини і як лог Auth їх розрізняє.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":708,"title":709,"description":710,"published":711,"category":534,"image":712,"draft":538},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": три причини","Supabase \"permission denied for schema public\" означає, що бракує GRANT на схему. Що його прибрало і який рядок його повертає.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":714,"title":715,"description":716,"published":717,"category":534,"image":718,"draft":538},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": три речі, які це може означати","Supabase \"Bucket not found\" означає одне з трьох: публічне посилання на приватний бакет, неточну назву або не той проєкт.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":720,"title":721,"description":722,"published":723,"category":534,"image":724,"draft":538},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: який ключ перестав працювати?","Помилка Supabase invalid JWT — це PGRST301: підписаний токен не пройшов перевірку. У новому проєкті йдеться про сесію, а не про ключ API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":726,"title":727,"description":728,"published":729,"category":534,"image":730,"draft":538},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" майже завжди означає нуль","Supabase повертає PGRST116, \"JSON object requested, multiple (or no) rows returned\", коли запит нічого не знайшов. Прихований рядок має вигляд відсутнього.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":732,"title":733,"description":734,"published":735,"category":534,"image":736,"draft":538},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" у Supabase: де шукати","\"Database error saving new user\" означає, що щось причеплене до вашої реєстрації в Supabase впало. Справжня помилка лежить у ваших логах.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":738,"title":739,"description":740,"published":741,"category":534,"image":742,"draft":538},"\u002Fblog\u002Fwhat-is-supabase","Що таке Supabase? База даних, яку обрав ваш білдер","Що таке Supabase: база даних, вхід і сховище файлів за вашим застосунком. Supabase тримає сервери, а правила про те, хто читає ваші рядки, ваші.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":744,"title":745,"description":746,"published":747,"category":534,"image":748,"draft":538},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Відкритий у фронтенді ключ AWS це не те саме, що ключ OpenAI","Ключ доступу AWS, відкритий у вашому фронтенді, читає і пише ваше сховище. Рішення зазвичай presigned URL, а не новий ключ.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":750,"title":751,"description":752,"published":753,"category":534,"image":754,"draft":538},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" при вивантаженні","\"New row violates row-level security policy for table objects\" означає, що вашому вивантаженню бракує правила insert. Публічний бакет його не додає.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":756,"title":757,"description":758,"published":759,"category":534,"image":760,"draft":538},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":762,"title":763,"description":764,"published":765,"category":534,"image":766,"draft":538},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":768,"title":769,"description":770,"published":771,"category":534,"image":772,"draft":538},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" без вимкнення RLS","\"Infinite recursion detected in policy for relation\" означає, що ваша policy запитала таблицю, яку вона захищає. Ось як розірвати коло.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":774,"title":775,"description":776,"published":777,"category":534,"image":778,"draft":538},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" у Supabase, і хибне виправлення","\"No API key found in request\" означає, що запит дійшов до Supabase без ключа. Більшість відповідей натомість вказують на правила вашої бази.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":780,"title":781,"description":782,"published":783,"category":534,"image":784,"draft":538},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":786,"title":787,"description":788,"published":789,"category":534,"image":790,"draft":538},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Сховати ключ API: перенесіть його в Supabase Edge Function","Сховати ключ API означає прибрати його з браузера, а Supabase Edge Function це найменше місце, куди його покласти. Два кроки поруч важать більше.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":792,"title":793,"description":794,"published":795,"category":534,"image":796,"draft":538},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":798,"title":799,"description":800,"published":801,"category":534,"image":802,"draft":538},"\u002Fblog\u002Fis-v0-safe","Безпека v0: усі 1 790 просканованих застосунків v0 отримали A","Безпека v0 на 1 790 живих застосунках v0: усі отримали A. Лише 17 згадували базу даних, і саме це здебільшого вимірює оцінка A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":804,"title":805,"description":806,"published":807,"category":534,"image":808,"draft":538},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":121,"title":810,"description":811,"published":812,"category":534,"image":813,"draft":538},"Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":815,"title":816,"description":817,"published":818,"category":534,"image":819,"draft":538},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Чи шифрує Supabase мої дані? Так. Ось від чого це захищає","Чи шифрує Supabase дані? Так: AES-256 у стані спокою, TLS під час передавання, SOC 2 та ISO 27001. Що покриває кожне і який витік не зупиняє жодне.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":350,"title":821,"description":822,"published":823,"category":534,"image":824,"draft":538},"Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":826,"title":827,"description":828,"published":829,"category":645,"image":830,"draft":538},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":832,"title":833,"description":834,"published":835,"category":645,"image":836,"draft":538},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":838,"title":839,"description":840,"published":841,"category":645,"image":842,"draft":538},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":844,"title":845,"description":846,"published":841,"category":534,"image":847,"draft":538},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":849,"title":850,"description":851,"published":852,"category":534,"image":853,"draft":538},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":855,"title":856,"description":857,"published":858,"category":534,"image":859,"draft":538},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":861,"title":862,"description":863,"published":864,"category":645,"image":865,"draft":538},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":867,"title":868,"description":869,"published":870,"category":534,"image":871,"draft":538},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":873,"title":874,"description":875,"published":876,"category":534,"image":877,"draft":538},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":879,"title":880,"description":881,"published":882,"category":534,"image":883,"draft":538},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":885,"title":886,"description":887,"published":888,"category":534,"image":889,"draft":538},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":891,"title":892,"description":893,"published":894,"category":534,"image":895,"draft":538},"\u002Fblog\u002Fvite-and-next-public-env-vars","Змінні оточення Vite відкриті: префікс означає опублікувати це","Змінні оточення Vite відкриті у вашому застосунку, бо так просив префікс. VITE_ і NEXT_PUBLIC_ означають опублікувати це, а ШІ, який їх додав, не знав ціни.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":897,"title":898,"description":899,"published":900,"category":534,"image":901,"draft":538},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":903,"title":904,"description":905,"published":906,"category":534,"image":907,"draft":538},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":909,"title":910,"description":911,"published":912,"category":534,"image":913,"draft":538},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":915,"title":916,"description":917,"published":918,"category":645,"image":919,"draft":538},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":921,"title":922,"description":923,"published":924,"category":645,"image":925,"draft":538},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery у Supabase: ціна та межі","Point-in-time recovery у Supabase відмотує базу на будь-яку секунду за останній тиждень. Коштує $100 на місяць понад Pro і покриває лише базу даних.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":927,"title":928,"description":929,"published":930,"category":645,"image":931,"draft":538},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":933,"title":934,"description":935,"published":936,"category":534,"image":937,"draft":538},"\u002Fblog\u002Fsafest-ai-app-builder","Який білдер застосунків з ШІ найбезпечніший? 30 998 тестів","Який білдер застосунків з ШІ найбезпечніший? Ми просканували 30 998 живих застосунків з Lovable, Base44, Replit, v0 і Bolt. Оцінку вирішує не білдер.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":939,"title":940,"description":941,"published":942,"category":534,"image":943,"draft":538},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":945,"title":946,"description":947,"published":948,"category":534,"image":949,"draft":538},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": чого не бачить попередження","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":951,"title":952,"description":953,"published":954,"category":534,"image":955,"draft":538},"\u002Fblog\u002Frotate-supabase-service-role-key","Як замінити злитий ключ service_role у Supabase","Supabase каже спершу закрити витік. Інші посібники кажуть міняти негайно. Що правильно, залежить від того, куди саме потрапив ваш ключ service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":957,"title":958,"description":959,"published":960,"category":534,"image":961,"draft":538},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Вісім інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":963,"title":964,"description":965,"published":966,"category":534,"image":967,"draft":538},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":969,"title":970,"description":971,"published":972,"category":534,"image":973,"draft":538},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":975,"title":976,"description":977,"published":978,"category":534,"image":979,"draft":538},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":981,"title":982,"description":983,"published":984,"category":534,"image":985,"draft":538},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Ваш ключ API OpenAI відкритий у фронтенді. Замініть його.","Ключ API OpenAI, відкритий у фронтенді, не можна прив'язати до домену. Замініть його сьогодні, перенесіть виклик на свій сервер і обмежте витрати.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":987,"title":988,"description":989,"published":990,"category":534,"image":991,"draft":538},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Ключ API у фронтенді: що насправді віддають 30 998 застосунків","Ключ API, відкритий у вашому фронтенді, зазвичай є ключем Google Maps. Ми просканували 30 998 vibe-coded застосунків і порахували, що витікає насправді.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":993,"title":994,"description":995,"published":996,"category":645,"image":997,"draft":538},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":999,"title":1000,"description":1001,"published":1002,"category":534,"image":1003,"draft":538},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":1005,"title":1006,"description":1007,"published":1008,"category":645,"image":1009,"draft":538},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":1011,"title":1012,"description":1013,"published":1014,"category":534,"image":1015,"draft":538},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":1017,"title":1018,"description":1019,"published":1020,"category":534,"image":1021,"draft":538},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Де знайти API-ключі Supabase: anon, service_role і URL","URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":1023,"title":1024,"description":1025,"published":1026,"category":534,"image":1027,"draft":538},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy в Supabase. Що далі?","\"New row violates row-level security policy\" означає, що Supabase відмовив у записі. Швидке виправлення знову відкриває таблицю для всіх.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":1029,"title":1030,"description":1031,"published":1032,"category":534,"image":1033,"draft":538},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":1035,"title":1036,"description":1037,"published":1038,"category":645,"image":1039,"draft":538},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching у Supabase це не бекап. Він іде тільки вперед.","Чому branching у Supabase це не бекап: гілка стартує без ваших даних, а мердж переносить саму лише схему. Для чого він потрібен і що брати замість нього.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":1041,"title":1042,"description":1043,"published":1044,"category":645,"image":1045,"draft":538},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1047,"title":1048,"description":1049,"published":1050,"category":534,"image":1051,"draft":538},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1053,"title":1054,"description":1055,"published":1056,"category":534,"image":1057,"draft":538},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1059,"title":1060,"description":1061,"published":1062,"category":645,"image":1063,"draft":538},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1065,"title":1066,"description":1067,"published":1068,"category":534,"image":1069,"draft":538},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1071,"title":1072,"description":1073,"published":1068,"category":534,"image":1074,"draft":538},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1076,"title":1077,"description":1078,"published":1079,"category":534,"image":1080,"draft":538},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: це той самий anon key?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1082,"title":1083,"description":1084,"published":1085,"category":645,"image":1086,"draft":538},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1088,"title":1089,"description":1090,"published":1091,"category":534,"image":1092,"draft":538},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1094,"title":1095,"description":1096,"published":1091,"category":645,"image":1097,"draft":538},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1099,"title":1100,"description":1101,"published":1102,"category":645,"image":1103,"draft":538},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Три способи зробити резервну копію бази Supabase, і чого бракує","Панель, pg_dump і керований сервіс. Що насправді зберігає кожен спосіб, що тихо лишає осторонь і який із них переживе втрату акаунта.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1105,"title":1106,"description":1107,"published":1102,"category":534,"image":1108,"draft":538},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213654372]