pypi / supabase
supabase
What changed in supabase 2, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-31.
4 breaking1 security2 new APIs and options5 behavior and defaults30 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initsupabase 242 changes
Breaking changes 4
x-relay-error responses now raise FunctionsRelayError.
Relay errors are saved as text instead of being parsed as JSON.
UserDoesntExist no longer includes the raw JWT.
Raises AuthInvalidJwtError when the JWT has no exp claim.
Security 1
invoke copies headers to prevent them from leaking across calls.
New APIs and options 2
Function invocation no longer leaks options and supports specifying the HTTP method and sending a bytes body.
Support for new realtime features was added.
Behavior and default changes 5
delete now returns a select builder, allowing callers to chain a selection.
insert now returns a select builder, allowing callers to chain a selection.
update now returns a select builder, allowing callers to chain a selection.
upsert now returns a select builder, allowing callers to chain a selection.
X-Client-Info now uses structured semicolon-delimited metadata.
Fixes and other changes 30
channel() returns the existing channel for a topic when one already exists.
A caller-provided content-type is no longer overwritten.
verify is passed as a keyword argument in create_client.
Headers are handled case-insensitively with httpx.Headers.
Quoted values in in filters are escaped.
The session is kept after refreshing it during initialization.
neq, gt, gte, lt and lte filter values are serialized like eq.
OAuth query params are no longer mutated.
set_auth updates channel join payloads.
Listeners can now unsubscribe during notification.
Vector index creation time is preserved.
Vector object metadata is JSON.
Connection params are included in the WebSocket URL.
Sort parameters are sent in camelCase.
Non-string values in array filters are coerced.
Raises AuthWeakPasswordError for responses that do not include an error code.
Every client-sent channel event now includes join_ref.
Array-literal elements are escaped for these filters.
Filter values are serialized in eq().
Non-standard and non-JSON error responses are handled without raising AttributeError.
Transient failures are retried for HEAD requests.
Boolean values are normalized to lowercase literals.
The key parameter is now optional for the storage list_v2 method.
PostgREST RPC maybe_single behavior is aligned with select.
Negation is preserved for or filters.
Every key in a presence diff's leaves is processed.
Boolean client options set to False are now honored when replacing options.
Storage cache-control header handling and retry safety were fixed.
Negation is preserved for text search filters.
pyiceberg is now an optional dependency.