curl --request GET \
--url https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest \
--header 'apikey: <api-key>'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest"
headers = {"apikey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {apikey: '<api-key>'}};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"apikey: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("apikey", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest")
.header("apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["apikey"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"trade_date": "2023-12-25",
"ticker": "<string>",
"asset_name": "<string>",
"isin": "<string>",
"sector": "<string>",
"sector_top": "<string>",
"instrument_category": "<string>",
"short_quantity": 123,
"short_value": 123,
"pct_float": 123,
"float_basis": "<string>",
"float_denominator": 123,
"days_to_cover": 123,
"adtv_value_21": 123,
"adtv_sessions": 123,
"lender_rate_pct": 123,
"borrower_rate_pct": 123,
"contracts": 123
}
]{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}short_interest
Short interest per (ticker, trade_date) from B3’s securities-lending book: balance, % of float (read float_basis — index_free_float and shares_outstanding are different denominators), days to cover vs 21-session ADTV, and lending rates in percentage points a.a. History starts when SILO began capturing: B3 retains only ~21 business days.
Paging. A GET view pages normally with limit/offset (and Range). Every response is cut at 1000 rows server-side regardless of tier; read Content-Range to detect it (0-999/* is a truncated page, and Prefer: count=exact turns the * into the total).
curl --request GET \
--url https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest \
--header 'apikey: <api-key>'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest"
headers = {"apikey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {apikey: '<api-key>'}};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"apikey: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("apikey", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest")
.header("apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/short_interest")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["apikey"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"trade_date": "2023-12-25",
"ticker": "<string>",
"asset_name": "<string>",
"isin": "<string>",
"sector": "<string>",
"sector_top": "<string>",
"instrument_category": "<string>",
"short_quantity": 123,
"short_value": 123,
"pct_float": 123,
"float_basis": "<string>",
"float_denominator": 123,
"days_to_cover": 123,
"adtv_value_21": 123,
"adtv_sessions": 123,
"lender_rate_pct": 123,
"borrower_rate_pct": 123,
"contracts": 123
}
]{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}Authorizations
The publishable key (sb_publishable_…), on every request. It is NOT a JWT — sending it as Authorization: Bearer is rejected as an invalid JWT. It identifies the project, not you, and maps to the Postgres anon role.
Query Parameters
Columns to return, comma separated. Omit for all of them.
Sort, e.g. trade_date.desc. Always order a paged read, or limit/offset walk an undefined sequence.
Rows to return. The server cuts every response at 1000 whatever you ask for.
x <= 1000Rows to skip. Pairs with limit and order to page.
PostgREST filter on trade_date — eq., neq., gt., gte., lt., lte., in., is. (e.g. trade_date=eq.<value>).
PostgREST filter on ticker — eq., neq., gt., gte., lt., lte., in., is. (e.g. ticker=eq.<value>).
PostgREST filter on asset_name — eq., neq., gt., gte., lt., lte., in., is. (e.g. asset_name=eq.<value>).
PostgREST filter on isin — eq., neq., gt., gte., lt., lte., in., is. (e.g. isin=eq.<value>).
PostgREST filter on sector — eq., neq., gt., gte., lt., lte., in., is. (e.g. sector=eq.<value>).
PostgREST filter on sector_top — eq., neq., gt., gte., lt., lte., in., is. (e.g. sector_top=eq.<value>).
PostgREST filter on instrument_category — eq., neq., gt., gte., lt., lte., in., is. (e.g. instrument_category=eq.<value>).
PostgREST filter on short_quantity — eq., neq., gt., gte., lt., lte., in., is. (e.g. short_quantity=eq.<value>).
PostgREST filter on short_value — eq., neq., gt., gte., lt., lte., in., is. (e.g. short_value=eq.<value>).
PostgREST filter on pct_float — eq., neq., gt., gte., lt., lte., in., is. (e.g. pct_float=eq.<value>).
PostgREST filter on float_basis — eq., neq., gt., gte., lt., lte., in., is. (e.g. float_basis=eq.<value>).
PostgREST filter on float_denominator — eq., neq., gt., gte., lt., lte., in., is. (e.g. float_denominator=eq.<value>).
PostgREST filter on days_to_cover — eq., neq., gt., gte., lt., lte., in., is. (e.g. days_to_cover=eq.<value>).
PostgREST filter on adtv_value_21 — eq., neq., gt., gte., lt., lte., in., is. (e.g. adtv_value_21=eq.<value>).
PostgREST filter on adtv_sessions — eq., neq., gt., gte., lt., lte., in., is. (e.g. adtv_sessions=eq.<value>).
PostgREST filter on lender_rate_pct — eq., neq., gt., gte., lt., lte., in., is. (e.g. lender_rate_pct=eq.<value>).
PostgREST filter on borrower_rate_pct — eq., neq., gt., gte., lt., lte., in., is. (e.g. borrower_rate_pct=eq.<value>).
PostgREST filter on contracts — eq., neq., gt., gte., lt., lte., in., is. (e.g. contracts=eq.<value>).
Response
Matching rows.
Was this page helpful?