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?)


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)


unlinkIdentity(identity)


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()



getAuthorizationDetails(authorizationId)


approveAuthorization(authorizationId, options?)


denyAuthorization(authorizationId, options?)


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')



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

})