curl --request POST \
--url https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"p_root": "DI1",
"p_trade_date": null
}
'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve"
payload = {
"p_root": "DI1",
"p_trade_date": None
}
headers = {
"apikey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({p_root: 'DI1', p_trade_date: null})
};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve', 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/rpc/future_curve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'p_root' => 'DI1',
'p_trade_date' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve"
payload := strings.NewReader("{\n \"p_root\": \"DI1\",\n \"p_trade_date\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("apikey", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"p_root\": \"DI1\",\n \"p_trade_date\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["apikey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"p_root\": \"DI1\",\n \"p_trade_date\": null\n}"
response = http.request(request)
puts response.read_body[
{
"trade_date": "2023-12-25",
"ticker": "<string>",
"contract_month": "2023-12-25",
"settlement_rate": 123,
"settlement_price": 123,
"prev_settlement_rate": 123,
"open_interest": 123,
"contracts": 123,
"trades": 123,
"notional_brl": 123,
"open_px": 123,
"low_px": 123,
"high_px": 123,
"avg_px": 123,
"close_px": 123,
"settlement_status": "<string>",
"source": "<string>"
}
]{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}{
"code": "22023",
"message": "<string>",
"details": "<string>",
"hint": "<string>"
}future_curve
Every outright DI1 futures contract on one B3 session (B3 Price Report BVBG.086.01, b3_futures_settlement), nearest maturity first, as published: settlement_rate (% a.a., 252 business days) and settlement_price (the PU, R$; 100,000 at maturity), the previous settlement rate, open_interest, contracts traded, trades, notional_brl and the session’s open/low/high/avg/close — which for DI1 are RATES, because B3 quotes DI1 in rate (the low rate is the high price). contract_month is the one derived column: the first day of the month the ticker names, read with B3’s month letters (F = January … Z = December); the contract matures on that month’s first business day. p_root is DI1 (the only root held); p_trade_date NULL = the newest session held, and a date with no session (a holiday, or before 2018-01-02, when B3’s Price Report history starts) returns no rows. More than 1000 rows RAISES 22023 (never trimmed); one session holds about 50.
Row cap. A window producing more than 1000 rows raises SQLSTATE 22023 naming this function. Nothing is trimmed to fit — PostgREST would silently cut the response at 1000 and a cut-short series is indistinguishable from one that simply ends. This function does not page — narrow the window instead.
curl --request POST \
--url https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"p_root": "DI1",
"p_trade_date": null
}
'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve"
payload = {
"p_root": "DI1",
"p_trade_date": None
}
headers = {
"apikey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({p_root: 'DI1', p_trade_date: null})
};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve', 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/rpc/future_curve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'p_root' => 'DI1',
'p_trade_date' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve"
payload := strings.NewReader("{\n \"p_root\": \"DI1\",\n \"p_trade_date\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("apikey", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"p_root\": \"DI1\",\n \"p_trade_date\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/future_curve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["apikey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"p_root\": \"DI1\",\n \"p_trade_date\": null\n}"
response = http.request(request)
puts response.read_body[
{
"trade_date": "2023-12-25",
"ticker": "<string>",
"contract_month": "2023-12-25",
"settlement_rate": 123,
"settlement_price": 123,
"prev_settlement_rate": 123,
"open_interest": 123,
"contracts": 123,
"trades": 123,
"notional_brl": 123,
"open_px": 123,
"low_px": 123,
"high_px": 123,
"avg_px": 123,
"close_px": 123,
"settlement_status": "<string>",
"source": "<string>"
}
]{
"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.
Body
Response
The result set, nearest maturity first. An unknown id is an empty array, not a 404 and never a guessed value.
Was this page helpful?