Is my Supabase key exposed? Free checker
Paste your app’s URL. We scan the public HTML and JavaScript for Supabase, Stripe and AI keys, then tell you which are meant to be public and which are critical.
Results
Found a critical key? Get it fixed
We remove the key from your frontend, move the logic to the server and help you rotate it in the right order.
A safe key only matters if your RLS rules are right
The Audit reviews every table, grant and policy within 24 hours.
Email me the full report + what to do next
What this checker does, and what it never does
It loads your page once, follows at most 3 redirects, and reads up to 25 of the JavaScript files your site sends to every visitor (including code-split chunks one level deep). It looks for key patterns in that text, decodes legacy Supabase keys locally to read their role, and masks every key before showing it.
It never: contacts your Supabase project, uses a key it finds, queries your database or tests your RLS. RLS can only be checked with access to your project. That’s what the $49 Audit does.
Supabase keys explained in 30 seconds
| Key | Looks like | In frontend code? |
|---|---|---|
| Publishable key | sb_publishable_… | Yes, it’s meant to be public |
| anon key (legacy) | long JWT starting eyJ, role anon | Yes, but it’s being retired |
| Secret key | sb_secret_… | Never: server only |
| service_role key (legacy) | long JWT starting eyJ, role service_role | Never: server only |
Is it safe to have my Supabase key in my frontend code? Only the publishable key (sb_publishable_…) or the legacy anon key belongs in frontend code. It’s designed to be public, and Row Level Security decides what it can reach. A secret key (sb_secret_…) or legacy service_role key in your JavaScript is critical: it bypasses all RLS, giving anyone full access to your data. Rotate it immediately.
Found a secret key? What it means
Assume someone already has it. Supabase blocks secret keys sent from a browser, but that doesn’t make a leaked one harmless: it still works from any script or server. The order matters (remove the cause, then rotate), and we cover it step by step in what to do if you leaked your service_role key.
Why a “safe” key isn’t the whole story
A publishable or anon key is public by design. What protects your data is Row Level Security on every table. If a table has RLS off, or a policy that’s too open, anyone with your public key can read it. See how to tell if your app is leaking data and why RLS sometimes returns an empty array. We can’t see RLS from outside; the $49 Audit reviews it.
Supabase is retiring legacy keys (end of 2026)
Supabase is deprecating the anon and service_role keys by the end of 2026 in favour of publishable and secret keys. If the checker reports a legacy anon key, plan the switch. Separately, from October 30, 2026 new tables need explicit grants before your app can reach them: see the 5-minute checklist.
Other secrets we flag
- Stripe: live secret (
sk_live_), live restricted (rk_live_) and organization (sk_org_) keys are critical; test secret keys (sk_test_,rk_test_) are a warning. Publishable keys (pk_) are meant for the browser, so we ignore them. - AI providers: keys that look like OpenAI (
sk-proj-) or Anthropic keys are critical. OpenAI doesn’t publish an exact key format, so we say “looks like”. - Plus Stripe webhook secrets, AWS, GitHub, Slack and SendGrid keys, and private keys.
Privacy
We fetch your page and its JavaScript files once, scan them in memory and throw them away. We don’t store your files or any key we find, and keys are masked before they leave our server. To stop abuse we count checks per hashed IP address and per checked domain in server memory for up to 24 hours; nothing about a check is written to disk or a database by us. If you ask for the email report, we store your email, the URL and the types of findings (never the keys themselves) to send it, plus one follow-up if you opt in. We never use a found key or access your database. Full details in our privacy policy.
FAQ
Is my Supabase anon key supposed to be public?
Yes. The legacy anon key and the newer publishable key are designed to be public. Row Level Security protects your data.
What happens if my service_role or secret key is exposed?
It bypasses all Row Level Security, so anyone who has it gets full read and write access to your data. Remove the cause first, then rotate the key. See what to do if you leaked a key.
Does this tool access my database?
No. It never uses a key, never queries your database and never tests RLS. It only reads the public HTML and JavaScript your site sends to every visitor.
Can it tell me if my RLS is secure?
No. That needs access to your project. The $49 Audit reviews every table, grant and policy.
Why didn’t it find my key?
Keys loaded after login, fetched from a server, or kept in files we can’t reach aren’t visible to us. A clean result isn’t a guarantee.
Do you store the keys you find?
No. Keys are masked before anything leaves our server, and we never store them. See Privacy above.
How is this different from the health check?
The health check also covers HTTPS, security headers and source maps. This tool goes deeper on keys: which Supabase key type you ship, whether it’s a legacy key, and in which file we saw it.
Get the free full scan by email
Want us to check the parts this tool can’t see? Send your repo and we’ll email you the top issues we find.