Database

pg_net: Async Networking

caution

The pg_net API is in alpha. Functions signatures may change.

pg_net is a PostgreSQL extension exposing a SQL interface for async networking with a focus on scalability and UX.

It differs from the http extension in that it is asynchronous by default. This makes it useful in blocking functions (like triggers).

Enable the extension#

  1. Go to the Database page in the Dashboard.
  2. Click on Extensions in the sidebar.
  3. Search for "pg_net" and enable the extension.

http_get#

Creates an HTTP GET request returning the request's ID. HTTP requests are not started until the transaction is committed.

Signature #

caution

This is a Postgres SECURITY DEFINER function.

net.http_get(
-- url for the request
url text,
-- key/value pairs to be url encoded and appended to the `url`
params jsonb default '{}'::jsonb,
-- key/values to be included in request headers
headers jsonb default '{}'::jsonb,
-- WARNING: this is currently ignored, so there is no timeout
-- the maximum number of milliseconds the request may take before being cancelled
timeout_milliseconds int default 1000
)
-- request_id reference
returns bigint

strict
volatile
parallel safe
language plpgsql

Usage #

select net.http_get('https://news.ycombinator.com') as request_id;
request_id
----------
1
(1 row)

After triggering http_get, use http_get_result to get the result of the request.

http_post#

Creates an HTTP POST request with a JSON body, returning the request's ID. HTTP requests are not started until the transaction is committed.

The body's character set encoding matches the database's server_encoding setting.

Signature #

caution

This is a Postgres SECURITY DEFINER function

net.http_post(
-- url for the request
url text,
-- body of the POST request
body jsonb default '{}'::jsonb,
-- key/value pairs to be url encoded and appended to the `url`
params jsonb default '{}'::jsonb,
-- key/values to be included in request headers
headers jsonb default '{"Content-Type": "application/json"}'::jsonb,
-- WARNING: this is currently ignored, so there is no timeout
-- the maximum number of milliseconds the request may take before being cancelled
timeout_milliseconds int default 1000
)
-- request_id reference
returns bigint

volatile
parallel safe
language plpgsql

Usage #

select
net.http_post(
url:='https://httpbin.org/post',
body:='{"hello": "world"}'::jsonb
) as request_id;
request_id
----------
1
(1 row)

After triggering http_post, use http_get_result to get the result of the request.

Examples#

Invoke a Supabase Edge Function#

Make a POST request to a Supabase Edge Function with auth header and JSON body payload:

select
net.http_post(
url:='https://project-ref.supabase.co/functions/v1/function-name',
headers:='{"Content-Type": "application/json", "Authorization": "Bearer YOUR_ANON_KEY"}'::jsonb,
body:='{"name": "pg_net"}'::jsonb
) as request_id;

Resources#


We only collect analytics essential to ensuring smooth operation of our services.

Learn more