Short answer
Yes, if row-level security is on. Supabase calls the anon key the legacy version of the publishable key, which it says is safe to expose online, and anyone can read it in your code. Row-level security decides what that key can reach, so turn it on for every table and give each table policies. The key that must never be public is the secret or service_role key.
What to check
01
Which key it is
“Safe to expose online: web page, mobile or desktop app, GitHub actions, CLIs, source code.” Supabase, Understanding API keys
Publishable keys start with sb_publishable_, and the legacy anon key is a JWT whose role is anon. Both are public-facing keys: Supabase calls anon the legacy version of publishable keys, and its docs treat browsers and apps as public. A key starting with sb_secret_, or a JWT whose role is service_role, doesn’t: treat that one as leaked.
02
Row-level security on every table
“Row Level Security decides what this client can reach, so enable it on every table before you deploy.” Supabase, Understanding API keys
Without row-level security, a table in the public schema can be read and changed by anyone holding the public key, through Supabase’s API. In the dashboard, check that every table in the public schema has RLS enabled, with policies that limit each row to the people it belongs to.
03
Policies that let too much through
“Not all information present in the JWT should be used in RLS policies.” Supabase, Row Level Security
RLS can be on and still open: a policy with using (true) for the anon role lets any visitor read every row, and a policy that trusts user_metadata can let users give themselves access, because signed-in users can edit their own metadata. The free RLS policy checker reads a migration and flags both. Then run the free AI app check on the whole app.
04
A secret key next to it
“Never put one in a browser, a shipped application, or source control.” Supabase, Understanding API keys
If the same code also holds a secret or service_role key, that one skips row-level security entirely. Move those calls to the server and replace the key.
Checked against the vendor’s docs on : Supabase docs: Understanding API keys; Supabase docs: Row Level Security.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way.See scope and start
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
Related: Free Supabase RLS policy checker · Free AI app check · Supabase service_role key exposed · Supabase RLS fixes