JavaScript API Reference | Supabase Docs
1
import { createClient } from '@supabase/supabase-js'
2
3
// Create a single supabase client for interacting with your database
4
const supabase = createClient('https://xyzcompany.supabase.co', 'publishable-or-anon-key')
select(columns?, options?)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
insert(values, options?)
1
const { error } = await supabase
2
.from('countries')
3
.insert({ id: 1, name: 'Mordor' })
update(values, options)
1
const { error } = await supabase
2
.from('instruments')
3
.update({ name: 'piano' })
4
.eq('id', 1)
upsert(values, options?)
1
const { data, error } = await supabase
2
.from('instruments')
3
.upsert({ id: 1, name: 'piano' })
4
.select()
delete(options)
1
const response = await supabase
2
.from('countries')
3
.delete()
4
.eq('id', 1)
rpc(fn, args, options)
1
const { data, error } = await supabase.rpc('hello_world')
1
const { data, error } = await supabase
2
.from('instruments')
3
.select('name, section_id')
4
.eq('name', 'violin') // Correct
5
6
const { data, error } = await supabase
7
.from('instruments')
8
.eq('name', 'violin') // Incorrect
9
.select('name, section_id')
eq(column, value)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.eq('name', 'Leia')
neq(column, value)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.neq('name', 'Leia')
gt(column, value)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.gt('id', 2)
gte(column, value)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.gte('id', 2)
lt(column, value)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.lt('id', 2)
lte(column, value)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.lte('id', 2)
like(column, pattern)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.like('name', '%Lu%')
ilike(column, pattern)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.ilike('name', '%lu%')
is(column, value)
1
const { data, error } = await supabase
2
.from('countries')
3
.select()
4
.is('name', null)
in(column, values)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.in('name', ['Leia', 'Han'])
contains(column, value)
1
const { data, error } = await supabase
2
.from('issues')
3
.select()
4
.contains('tags', ['is:open', 'priority:low'])
containedBy(column, value)
1
const { data, error } = await supabase
2
.from('classes')
3
.select('name')
4
.containedBy('days', ['monday', 'tuesday', 'wednesday', 'friday'])
rangeGt(column, range)
1
const { data, error } = await supabase
2
.from('reservations')
3
.select()
4
.rangeGt('during', '[2000-01-02 08:00, 2000-01-02 09:00)')
rangeGte(column, range)
1
const { data, error } = await supabase
2
.from('reservations')
3
.select()
4
.rangeGte('during', '[2000-01-02 08:30, 2000-01-02 09:30)')
rangeLt(column, range)
1
const { data, error } = await supabase
2
.from('reservations')
3
.select()
4
.rangeLt('during', '[2000-01-01 15:00, 2000-01-01 16:00)')
rangeLte(column, range)
1
const { data, error } = await supabase
2
.from('reservations')
3
.select()
4
.rangeLte('during', '[2000-01-01 14:00, 2000-01-01 16:00)')
rangeAdjacent(column, range)
1
const { data, error } = await supabase
2
.from('reservations')
3
.select()
4
.rangeAdjacent('during', '[2000-01-01 12:00, 2000-01-01 13:00)')
overlaps(column, value)
1
const { data, error } = await supabase
2
.from('issues')
3
.select('title')
4
.overlaps('tags', ['is:closed', 'severity:high'])
textSearch(column, query, options?)
1
const result = await supabase
2
.from("texts")
3
.select("content")
4
.textSearch("content", `'eggs' & 'ham'`, {
5
config: "english",
6
});
match(query)
1
const { data, error } = await supabase
2
.from('characters')
3
.select('name')
4
.match({ id: 2, name: 'Leia' })
not(column, operator, value)
1
const { data, error } = await supabase
2
.from('countries')
3
.select()
4
.not('name', 'is', null)
or(filters, options)
1
const { data, error } = await supabase
2
.from('characters')
3
.select('name')
4
.or('id.eq.2,name.eq.Han')
filter(column, operator, value)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.filter('name', 'in', '("Han","Yoda")')
select(columns?)
1
const { data, error } = await supabase
2
.from('characters')
3
.upsert({ id: 1, name: 'Han Solo' })
4
.select()
order(column, options?)
1
const { data, error } = await supabase
2
.from('characters')
3
.select('id, name')
4
.order('id', { ascending: false })
limit(count, options)
1
const { data, error } = await supabase
2
.from('characters')
3
.select('name')
4
.limit(1)
range(from, to, options)
1
const { data, error } = await supabase
2
.from('characters')
3
.select('name')
4
.range(0, 1)
abortSignal(signal)
1
const ac = new AbortController()
2
ac.abort()
3
const { data, error } = await supabase
4
.from('very_big_table')
5
.select()
6
.abortSignal(ac.signal)
single()
1
const { data, error } = await supabase
2
.from('characters')
3
.select('name')
4
.limit(1)
5
.single()
maybeSingle()
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.eq('name', 'Katniss')
5
.maybeSingle()
csv()
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.csv()
returns()
1
const { data } = await supabase
2
.from('countries')
3
.select()
4
.returns<Array<MyType>>()
overrideTypes()
1
const { data } = await supabase
2
.from('countries')
3
.select()
4
.overrideTypes<Array<MyType>, { merge: false }>()
explain(options)
1
const { data, error } = await supabase
2
.from('characters')
3
.select()
4
.explain()
1
import { createClient } from '@supabase/supabase-js'
2
3
const supabase = createClient(supabase_url, anon_key)
signUp(credentials)
1
const { data, error } = await supabase.auth.signUp({
2
email: 'example@email.com',
3
password: 'example-password',
4
})
onAuthStateChange(callback)
1
const { data } = supabase.auth.onAuthStateChange((event, session) => {
2
console.log(event, session)
3
4
if (event === 'INITIAL_SESSION') {
5
// handle initial session
6
} else if (event === 'SIGNED_IN') {
7
// handle sign in event
8
} else if (event === 'SIGNED_OUT') {
9
// handle sign out event
10
} else if (event === 'PASSWORD_RECOVERY') {
11
// handle password recovery event
12
} else if (event === 'TOKEN_REFRESHED') {
13
// handle token refreshed event
14
} else if (event === 'USER_UPDATED') {
15
// handle user updated event
16
}
17
})
18
19
// call unsubscribe to remove the callback
20
data.subscription.unsubscribe()
signInAnonymously(credentials?)
1
const { data, error } = await supabase.auth.signInAnonymously({
2
options: {
3
captchaToken
4
}
5
});
signInWithPassword(credentials)
1
const { data, error } = await supabase.auth.signInWithPassword({
2
email: 'example@email.com',
3
password: 'example-password',
4
})
signInWithIdToken(credentials)
1
const { data, error } = await supabase.auth.signInWithIdToken({
2
provider: 'google',
3
token: 'your-id-token'
4
})
signInWithOtp(credentials)
1
const { data, error } = await supabase.auth.signInWithOtp({
2
email: 'example@email.com',
3
options: {
4
emailRedirectTo: 'https://example.com/welcome'
5
}
6
})
signInWithOAuth(credentials)
1
const { data, error } = await supabase.auth.signInWithOAuth({
2
provider: 'github'
3
})
signInWithSSO(params)
1
// You can extract the user's email domain and use it to trigger the
2
// authentication flow with the correct identity provider.
3
4
const { data, error } = await supabase.auth.signInWithSSO({
5
domain: 'company.com'
6
})
7
8
if (data?.url) {
9
// redirect the user to the identity provider's authentication flow
10
window.location.href = data.url
11
}
signInWithWeb3(credentials)
1
// uses window.ethereum for the wallet
2
const { data, error } = await supabase.auth.signInWithWeb3({
3
chain: 'ethereum',
4
statement: 'I accept the Terms of Service at https://example.com/tos'
5
})
6
7
// uses window.solana for the wallet
8
const { data, error } = await supabase.auth.signInWithWeb3({
9
chain: 'solana',
10
statement: 'I accept the Terms of Service at https://example.com/tos'
11
})
getClaims(jwt?, options)
1
const { data, error } = await supabase.auth.getClaims()
signOut(options)
1
const { error } = await supabase.auth.signOut()
resetPasswordForEmail(email, options)
1
const { data, error } = await supabase.auth.resetPasswordForEmail(email, {
2
redirectTo: 'https://example.com/update-password',
3
})
verifyOtp(params)
1
const { data, error } = await supabase.auth.verifyOtp({ email, token, type: 'email'})
getSession()
1
const { data, error } = await supabase.auth.getSession()
refreshSession(currentSession?)
1
const { data, error } = await supabase.auth.refreshSession()
2
const { session, user } = data
getUser(jwt?)
1
const { data: { user } } = await supabase.auth.getUser()
updateUser(attributes, options)
1
const { data, error } = await supabase.auth.updateUser({
2
email: 'new@email.com'
3
})
getUserIdentities()
1
const { data, error } = await supabase.auth.getUserIdentities()
linkIdentity(credentials)
1
const { data, error } = await supabase.auth.linkIdentity({
2
provider: 'github'
3
})
unlinkIdentity(identity)
1
// retrieve all identities linked to a user
2
const identities = await supabase.auth.getUserIdentities()
3
4
// find the google identity
5
const googleIdentity = identities.find(
6
identity => identity.provider === 'google'
7
)
8
9
// unlink the google identity
10
const { error } = await supabase.auth.unlinkIdentity(googleIdentity)
reauthenticate()
1
const { error } = await supabase.auth.reauthenticate()
resend(credentials)
1
const { error } = await supabase.auth.resend({
2
type: 'signup',
3
email: 'email@example.com',
4
options: {
5
emailRedirectTo: 'https://example.com/welcome'
6
}
7
})
setSession(currentSession)
1
const { data, error } = await supabase.auth.setSession({
2
access_token,
3
refresh_token
4
})
exchangeCodeForSession(authCode)
1
supabase.auth.exchangeCodeForSession('34e770dd-9ff9-416c-87fa-43b31d7ef225')
startAutoRefresh()
1
import { AppState } from 'react-native'
2
3
// make sure you register this only once!
4
AppState.addEventListener('change', (state) => {
5
if (state === 'active') {
6
supabase.auth.startAutoRefresh()
7
} else {
8
supabase.auth.stopAutoRefresh()
9
}
10
})
stopAutoRefresh()
1
import { AppState } from 'react-native'
2
3
// make sure you register this only once!
4
AppState.addEventListener('change', (state) => {
5
if (state === 'active') {
6
supabase.auth.startAutoRefresh()
7
} else {
8
supabase.auth.stopAutoRefresh()
9
}
10
})
initialize()
enroll(params)
1
const { data, error } = await supabase.auth.mfa.enroll({
2
factorType: 'totp',
3
friendlyName: 'your_friendly_name'
4
})
5
6
// Use the id to create a challenge.
7
// The challenge can be verified by entering the code generated from the authenticator app.
8
// The code will be generated upon scanning the qr_code or entering the secret into the authenticator app.
9
const { id, type, totp: { qr_code, secret, uri }, friendly_name } = data
10
const challenge = await supabase.auth.mfa.challenge({ factorId: id });
challenge(params)
1
const { data, error } = await supabase.auth.mfa.challenge({
2
factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225'
3
})
verify(params)
1
const { data, error } = await supabase.auth.mfa.verify({
2
factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225',
3
challengeId: '4034ae6f-a8ce-4fb5-8ee5-69a5863a7c15',
4
code: '123456'
5
})
challengeAndVerify(params)
1
const { data, error } = await supabase.auth.mfa.challengeAndVerify({
2
factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225',
3
code: '123456'
4
})
unenroll(params)
1
const { data, error } = await supabase.auth.mfa.unenroll({
2
factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225',
3
})
getAuthenticatorAssuranceLevel(jwt?)
1
const { data, error } = await supabase.auth.mfa.getAuthenticatorAssuranceLevel()
2
const { currentLevel, nextLevel, currentAuthenticationMethods } = data
listFactors()
listGrants()
revokeGrant(options)
1
import { createClient } from '@supabase/supabase-js'
2
3
const supabase = createClient(supabase_url, service_role_key, {
4
auth: {
5
autoRefreshToken: false,
6
persistSession: false
7
}
8
})
9
10
// Access auth admin api
11
const adminAuthClient = supabase.auth.admin
getUserById(uid)
1
const { data, error } = await supabase.auth.admin.getUserById(1)
listUsers(params?)
1
const { data: { users }, error } = await supabase.auth.admin.listUsers()
createUser(attributes)
1
const { data, error } = await supabase.auth.admin.createUser({
2
email: 'user@email.com',
3
password: 'password',
4
user_metadata: { name: 'Yoda' }
5
})
deleteUser(id, shouldSoftDelete)
1
const { data, error } = await supabase.auth.admin.deleteUser(
2
'715ed5db-f090-4b8c-a067-640ecee36aa0'
3
)
inviteUserByEmail(email, options)
1
const { data, error } = await supabase.auth.admin.inviteUserByEmail('email@example.com')
generateLink(params)
1
const { data, error } = await supabase.auth.admin.generateLink({
2
type: 'signup',
3
email: 'email@example.com',
4
password: 'secret'
5
})
updateUserById(uid, attributes)
1
const { data: user, error } = await supabase.auth.admin.updateUserById(
2
'11111111-1111-1111-1111-111111111111',
3
{ email: 'new@email.com' }
4
)
signOut(jwt, scope)
deleteFactor(params)
1
const { data, error } = await supabase.auth.admin.mfa.deleteFactor({
2
id: '34e770dd-9ff9-416c-87fa-43b31d7ef225',
3
userId: 'a89baba7-b1b7-440f-b4bb-91026967f66b',
4
})
listFactors(params)
1
const { data, error } = await supabase.auth.admin.mfa.listFactors()
listClients(params?)
getClient(clientId)
createClient(params)
updateClient(clientId, params)
deleteClient(clientId)
regenerateClientSecret(clientId)
invoke(functionName, options)
1
const { data, error } = await supabase.functions.invoke('hello', {
2
body: { foo: 'bar' }
3
})
1
import { corsHeaders } from '@supabase/supabase-js/cors'
2
3
Deno.serve(async (req) => {
4
if (req.method === 'OPTIONS') {
5
return new Response('ok', { headers: corsHeaders })
6
}
7
8
return new Response(
9
JSON.stringify({ data: 'Hello' }),
10
{ headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
11
)
12
})
setAuth(token)
1
functions.setAuth(session.access_token)
on(type, filter, callback)
1
const channel = supabase.channel("room1")
2
3
channel.on("broadcast", { event: "cursor-pos" }, (payload) => {
4
console.log("Cursor position received!", payload);
5
}).subscribe((status) => {
6
if (status === "SUBSCRIBED") {
7
channel.send({
8
type: "broadcast",
9
event: "cursor-pos",
10
payload: { x: Math.random(), y: Math.random() },
11
});
12
}
13
});
removeChannel(channel)
1
supabase.removeChannel(myChannel)
removeAllChannels()
1
supabase.removeAllChannels()
getChannels()
1
const channels = supabase.getChannels()
send(args, opts)
1
supabase
2
.channel('room1')
3
.subscribe((status) => {
4
if (status === 'SUBSCRIBED') {
5
channel.send({
6
type: 'broadcast',
7
event: 'cursor-pos',
8
payload: { x: Math.random(), y: Math.random() },
9
})
10
}
11
})
setAuth(token)
1
// Use a manual token (preserved across resubscribes, ignores accessToken callback)
2
client.realtime.setAuth('my-custom-jwt')
3
4
// Switch back to using the accessToken callback
5
client.realtime.setAuth()
from(id)
1
const avatars = supabase.storage.from('avatars')
listBuckets(options?)
1
const { data, error } = await supabase
2
.storage
3
.listBuckets()
getBucket(id)
1
const { data, error } = await supabase
2
.storage
3
.getBucket('avatars')
createBucket(id, options)
1
const { data, error } = await supabase
2
.storage
3
.createBucket('avatars', {
4
public: false,
5
allowedMimeTypes: ['image/png'],
6
fileSizeLimit: 1024
7
})
emptyBucket(id)
1
const { data, error } = await supabase
2
.storage
3
.emptyBucket('avatars')
updateBucket(id, options)
1
const { data, error } = await supabase
2
.storage
3
.updateBucket('avatars', {
4
public: false,
5
allowedMimeTypes: ['image/png'],
6
fileSizeLimit: 1024
7
})
deleteBucket(id)
1
const { data, error } = await supabase
2
.storage
3
.deleteBucket('avatars')
upload(path, fileBody, fileOptions?)
1
const avatarFile = event.target.files[0]
2
const { data, error } = await supabase
3
.storage
4
.from('avatars')
5
.upload('public/avatar1.png', avatarFile, {
6
cacheControl: '3600',
7
upsert: false
8
})
update(path, fileBody, fileOptions?)
1
const avatarFile = event.target.files[0]
2
const { data, error } = await supabase
3
.storage
4
.from('avatars')
5
.update('public/avatar1.png', avatarFile, {
6
cacheControl: '3600',
7
upsert: true
8
})
move(fromPath, toPath, options?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.move('public/avatar1.png', 'private/avatar2.png')
copy(fromPath, toPath, options?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.copy('public/avatar1.png', 'private/avatar2.png')
createSignedUrl(path, expiresIn, options?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.createSignedUrl('folder/avatar1.png', 60)
createSignedUrls(paths, expiresIn, options?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.createSignedUrls(['folder/avatar1.png', 'folder/avatar2.png'], 60)
createSignedUploadUrl(path, options?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.createSignedUploadUrl('folder/cat.jpg')
uploadToSignedUrl(path, token, fileBody, fileOptions?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.uploadToSignedUrl('folder/cat.jpg', 'token-from-createSignedUploadUrl', file)
getPublicUrl(path, options?)
1
const { data } = supabase
2
.storage
3
.from('public-bucket')
4
.getPublicUrl('folder/avatar1.png')
download(path, options?, parameters?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.download('folder/avatar1.png')
remove(paths)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.remove(['folder/avatar1.png'])
list(path?, options?, parameters?)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.list('folder', {
5
limit: 100,
6
offset: 0,
7
sortBy: { column: 'name', order: 'asc' },
8
})
exists(path)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.exists('folder/avatar1.png')
info(path)
1
const { data, error } = await supabase
2
.storage
3
.from('avatars')
4
.info('folder/avatar1.png')
listV2(options?, parameters?)
toBase64(data)
1
const client = new StorageAnalyticsClient(url, headers)
createBucket(name)
1
const { data, error } = await supabase
2
.storage
3
.analytics
4
.createBucket('analytics-data')
listBuckets(options?)
1
const { data, error } = await supabase
2
.storage
3
.analytics
4
.listBuckets({
5
limit: 10,
6
offset: 0,
7
sortColumn: 'created_at',
8
sortOrder: 'desc'
9
})
deleteBucket(bucketName)
1
const { data, error } = await supabase
2
.storage
3
.analytics
4
.deleteBucket('analytics-data')
from(vectorBucketName)
1
const bucket = supabase.storage.vectors.from('embeddings-prod')
createBucket(vectorBucketName)
1
const { data, error } = await supabase
2
.storage
3
.vectors
4
.createBucket('embeddings-prod')
deleteBucket(vectorBucketName)
1
const { data, error } = await supabase
2
.storage
3
.vectors
4
.deleteBucket('embeddings-old')
getBucket(vectorBucketName)
1
const { data, error } = await supabase
2
.storage
3
.vectors
4
.getBucket('embeddings-prod')
5
6
console.log('Bucket created:', data?.vectorBucket.creationTime)
listBuckets(options)
1
const { data, error } = await supabase
2
.storage
3
.vectors
4
.listBuckets({ prefix: 'embeddings-' })
5
6
data?.vectorBuckets.forEach(bucket => {
7
console.log(bucket.vectorBucketName)
8
})
createIndex(options)
1
const bucket = supabase.storage.vectors.from('embeddings-prod')
2
await bucket.createIndex({
3
indexName: 'documents-openai',
4
dataType: 'float32',
5
dimension: 1536,
6
distanceMetric: 'cosine',
7
metadataConfiguration: {
8
nonFilterableMetadataKeys: ['raw_text']
9
}
10
})
deleteIndex(indexName)
1
const bucket = supabase.storage.vectors.from('embeddings-prod')
2
await bucket.deleteIndex('old-index')
getIndex(indexName)
1
const bucket = supabase.storage.vectors.from('embeddings-prod')
2
const { data } = await bucket.getIndex('documents-openai')
3
console.log('Dimension:', data?.index.dimension)
listIndexes(options)
1
const bucket = supabase.storage.vectors.from('embeddings-prod')
2
const { data } = await bucket.listIndexes({ prefix: 'documents-' })
VectorBucketScope(indexName)
1
const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')
2
3
// Insert vectors
4
await index.putVectors({
5
vectors: [
6
{ key: 'doc-1', data: { float32: [...] }, metadata: { title: 'Intro' } }
7
]
8
})
9
10
// Query similar vectors
11
const { data } = await index.queryVectors({
12
queryVector: { float32: [...] },
13
topK: 5
14
})
deleteVectors(options)
1
const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')
2
await index.deleteVectors({
3
keys: ['doc-1', 'doc-2', 'doc-3']
4
})
getVectors(options)
1
const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')
2
const { data } = await index.getVectors({
3
keys: ['doc-1', 'doc-2'],
4
returnMetadata: true
5
})
listVectors(options)
1
const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')
2
const { data } = await index.listVectors({
3
maxResults: 500,
4
returnMetadata: true
5
})
putVectors(options)
1
const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')
2
await index.putVectors({
3
vectors: [
4
{
5
key: 'doc-1',
6
data: { float32: [0.1, 0.2, ...] },
7
metadata: { title: 'Introduction', page: 1 }
8
}
9
]
10
})
queryVectors(options)
1
const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')
2
const { data } = await index.queryVectors({
3
queryVector: { float32: [0.1, 0.2, ...] },
4
topK: 5,
5
filter: { category: 'technical' },
6
returnDistance: true,
7
returnMetadata: true
8
})