Schedule Cron Jobs to Call API with Supabase
I recently needed Cron jobs for a project and was, as usual, happily surprised by how easy Supabase made it.
To run Cron jobs on Supabase, you must first enable the pg_cron
extension.
In your SQL editor in Supabase (which can be found at https://supabase.com/dashboard/project/YOUR_PROJECT_ID/sql/new
) you can run the following:
-- Example: enable the "pg_cron" extension create extension pg_cron with schema extensions; grant usage on schema cron to postgres; grant all privileges on all tables in schema cron to postgres; -- Example: disable the "pg_cron" extension drop extension if exists pg_cron;
This will enable pg_cron
.
Next, we can set up a Cron that will call an API endpoint; in this example, I'll use a Supabase Edge function (but it could be any endpoint you want).
Set up your Cron
There are a few values here to be careful with, as you'll need to update them for your use case.
The Cron name is 'invoke-function-every-minute'
; you can alter this to whatever is suitable for you.
To understand how Cron timing works and generate the syntax, I recommend using something like crontab.guru, which will make the
* * * * *
syntax understandable.I also pass an auth token with each request to confirm on the server side that it has permission to do whatever it's trying to do (you'll see that in
"Authorization": "Bearer YOUR_ANON_KEY"
).The URL you try to hit can be altered under the URL string. Currently, we have
'https://YOUR_PROJECT_ID.supabase.co/functions/v1/some-function'
. This needs to be updated to be an actual endpoint you can hit.
select cron.schedule( 'invoke-function-every-minute', '* * * * *', -- every minute $$ select net.http_post( url:='https://YOUR_PROJECT_ID.supabase.co/functions/v1/some-function', headers:='{"Content-Type": "application/json", "Authorization": "Bearer YOUR_ANON_KEY"}'::jsonb, body:=concat('{"time": "', now(), '"}')::jsonb ) as request_id; $$ );
Unschedule
To unschedule, we need to unscheduled by our Cron name, in this case 'invoke-function-every-minute'
:
select cron.unschedule('invoke-function-every-minute');
Notes
The Supabase docs are some of the best, so if you get stuck, check out this page.