curl --request POST \
--url https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/curve \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"p_curve": "PRE",
"p_trade_date": null
}
'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/curve"
payload = {
"p_curve": "PRE",
"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_curve: 'PRE', p_trade_date: null})
};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/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/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_curve' => 'PRE',
'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/curve"
payload := strings.NewReader("{\n \"p_curve\": \"PRE\",\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/curve")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"p_curve\": \"PRE\",\n \"p_trade_date\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/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_curve\": \"PRE\",\n \"p_trade_date\": null\n}"
response = http.request(request)
puts response.read_body[
{
"trade_date": "2023-12-25",
"curve": "<string>",
"calendar_days": 123,
"business_days": 123,
"rate": 123,
"rate_basis": "<string>",
"vertex_type": "<string>",
"vertex_code": "<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>"
}curve
One B3 reference curve on one session (B3 reference rates, TaxaSwap.txt, b3_reference_rate, from 2008-01-02), shortest vertex first, every vertex as published: calendar_days, business_days, rate, and whether the vertex is FIXED (vertex_type F, its nominal tenor in vertex_code) or MOVING (M, a contract maturity). PRE is DI x pré (% a.a., compounded on 252 business days; its moving vertices include every DI1 maturity at that contract’s settlement rate); DOC is the clean onshore dollar coupon (% a.a., LINEAR on 360 calendar days); DPL is the clean IPCA coupon, a real rate (% a.a., 252 business days), and B3’s implied inflation is (1 + PRE) / (1 + DPL) − 1 at the same tenor. rate_basis rides on every row. PAST THE LAST MATURITY OF THE CONTRACT THAT ANCHORS A CURVE (DI1 for PRE, DDI for DOC, DAP for DPL) B3 EXTRAPOLATES the last forward rate, so the long vertices are not prices (B3 Manual de Curvas v21). DPL’s shortest vertices lean on the current month’s IPCA projection. p_curve is PRE, DOC or DPL and anything else raises 22023 listing them; p_trade_date NULL = the newest session held, and a date with no session returns no rows. Nothing is interpolated. More than 1000 rows RAISES 22023; a session holds about 300 vertices per curve.
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/curve \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"p_curve": "PRE",
"p_trade_date": null
}
'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/curve"
payload = {
"p_curve": "PRE",
"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_curve: 'PRE', p_trade_date: null})
};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/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/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_curve' => 'PRE',
'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/curve"
payload := strings.NewReader("{\n \"p_curve\": \"PRE\",\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/curve")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"p_curve\": \"PRE\",\n \"p_trade_date\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/rest/v1/rpc/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_curve\": \"PRE\",\n \"p_trade_date\": null\n}"
response = http.request(request)
puts response.read_body[
{
"trade_date": "2023-12-25",
"curve": "<string>",
"calendar_days": 123,
"business_days": 123,
"rate": 123,
"rate_basis": "<string>",
"vertex_type": "<string>",
"vertex_code": "<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, shortest vertex first. An unknown id is an empty array, not a 404 and never a guessed value.
Was this page helpful?