Home

API Quickstart

Build an API route in less than 2 minutes.

Create your first API route by creating a table called `todos` to store tasks.

Let's create our first REST route which we can query using cURL or the browser.

We'll create a database table called todos for storing tasks. This creates a corresponding API route /rest/v1/todos which can accept GET, POST, PATCH, & DELETE requests.

1

Set up a Supabase project with a 'todos' table

Create a new project in the Supabase Dashboard.

After your project is ready, create a table in your Supabase database. You can do this with either the Table interface or the SQL Editor.


_10
-- Create a table called "todos"
_10
-- with a column to store tasks.
_10
create table todos (
_10
id serial primary key,
_10
task text
_10
);

2

Allow anonymous access

Let's turn on Row Level Security for this table and allow anonymous access.


_10
-- Turn on security
_10
alter table "todos"
_10
enable row level security;
_10
_10
-- Allow anonymous access
_10
create policy "Allow anonymous access"
_10
on todos
_10
for select
_10
to anon
_10
using (true);

3

Insert some dummy data

Now we can add some data to our table which we can access through our API.


_10
insert into todos (task)
_10
values
_10
('Create tables'),
_10
('Enable security'),
_10
('Add data'),
_10
('Fetch data from the API');

4

Fetch the data

Find your API URL and Keys in your Dashboard API Settings. You can now query your "todos" table by appending /rest/v1/todos to the API URL.

Copy this block of code, substitute <PROJECT_REF> and <ANON_KEY>, then run it from a terminal.

Terminal

_10
curl 'https://<PROJECT_REF>.supabase.co/rest/v1/todos' \
_10
-H "apikey: <ANON_KEY>" \
_10
-H "Authorization: Bearer <ANON_KEY>"

Bonus#

There are several options for accessing your data:

Browser#

You can query the route in your browser, by appending the anon key as a query parameter:

https://<PROJECT_REF>.supabase.co/rest/v1/users?apikey=<ANON_KEY>

Client libraries#

We provide a number of Client Libraries.


_10
const { data, error } = await supabase.from('todos').select()

GraphQL#

Every table can be accessed through the GraphQL API by switching /rest/v1 with /graphql/v1.


_39
import { createClient, useQuery } from 'urql'
_39
_39
const URL = '<SUPABASE_URL>/graphql/v1'
_39
const ANON_KEY = '<SUPABASE_ANON_KEY>'
_39
_39
// Prepare API key and Authorization header
_39
const headers = {
_39
apikey: `${ANON_KEY}`,
_39
authorization: `Bearer ${ANON_KEY}`,
_39
}
_39
_39
const client = createClient({
_39
url: URL,
_39
fetchOptions: function createFetchOptions() {
_39
return { headers }
_39
},
_39
})
_39
_39
// Prepare our GraphQL query
_39
const TodosQuery = `
_39
query {
_39
todosCollection {
_39
edges {
_39
node {
_39
id
_39
task
_39
}
_39
}
_39
}
_39
}
_39
`
_39
_39
// Query for the data (React)
_39
const [result, reexecuteQuery] = useQuery({
_39
query: TodosQuery,
_39
})
_39
_39
// Read the result
_39
const { data, fetching, error } = result