curl --request POST \
--url https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"names": [
"ITAU RF DI"
]
}
'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio"
payload = { "names": ["ITAU RF DI"] }
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({names: ['ITAU RF DI']})
};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio', 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/functions/v1/silo-api/v2/portfolio",
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([
'names' => [
'ITAU RF DI'
]
]),
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/functions/v1/silo-api/v2/portfolio"
payload := strings.NewReader("{\n \"names\": [\n \"ITAU RF DI\"\n ]\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/functions/v1/silo-api/v2/portfolio")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"names\": [\n \"ITAU RF DI\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio")
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 \"names\": [\n \"ITAU RF DI\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
"<unknown>"
],
"meta": {
"resource": "<string>",
"kind": "<string>",
"request": {},
"id_known": true,
"endpoint": "<string>"
},
"next_page_url": "<string>"
}{
"error": {
"code": "bad_request",
"message": "<string>",
"target": "<string>",
"innererror": {
"sqlstate": "<string>",
"hint": "<string>",
"details": "<string>"
}
}
}v2 portfolio
silo-api.Diagnose a portfolio: resolve statement lines, fees, look-through, movement (POST).
Example: POST /v2/portfolio?kind=resolve {"names": ["ITAU RF DI"]}
Kinds:
resolve: api.portfolio_resolve: up to 5 ranked candidate funds per statement line (a printed CNPJ wins, then an ETF ticker, an exact name, a trigram match).fees: api.portfolio_fees: the disclosed fee and the fee estimated from the balancete, never mixed.fee_peers: api.portfolio_fee_peers: the admin fee against funds and ETFs of the same filed class, one row per CNPJ.lookthrough: api.portfolio_lookthrough: one CDA month, holdings followed through fund quotas up to max_depth levels.movement: api.portfolio_movement: the fund’s monthly quota return against its filed class (movimento incomum).instruments: api.portfolio_instruments: CRA, CRI and debenture codes matched to their series, one line per code.fund_terms: api.portfolio_fund_terms: manager, administrator and redemption terms as filed, one line per CNPJ.equivalents: api.portfolio_equivalents: the active ETFs tracking an index the owner-reviewed list maps to each filed class.debenture_returns: api.portfolio_debenture_returns: 13 month-ends of median fund marks (CDA block 4) per debenture ticker; marks, not trades. Needs month.
A data call is a POST: kind, month and the hidden parameters go in the query string, the lists go in a JSON body (see body). ?help stays a GET. Read-only: every kind is one api.portfolio_* function.
Each list is capped by its function (200 entries, 70 for debenture_returns, 50 classes for equivalents) and refused above it, never trimmed.
Not served: portfolio_credit_returns (held back with the ANBIMA-linked endpoints). The class in fees, fee_peers, movement and equivalents is the ANBIMA class label as filed in the CVM Extrato; no ANBIMA table is read.
GET /v2/portfolio?help describes the main parameters, ?help=all adds the hidden ones.
curl --request POST \
--url https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio \
--header 'Content-Type: application/json' \
--header 'apikey: <api-key>' \
--data '
{
"names": [
"ITAU RF DI"
]
}
'import requests
url = "https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio"
payload = { "names": ["ITAU RF DI"] }
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({names: ['ITAU RF DI']})
};
fetch('https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio', 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/functions/v1/silo-api/v2/portfolio",
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([
'names' => [
'ITAU RF DI'
]
]),
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/functions/v1/silo-api/v2/portfolio"
payload := strings.NewReader("{\n \"names\": [\n \"ITAU RF DI\"\n ]\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/functions/v1/silo-api/v2/portfolio")
.header("apikey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"names\": [\n \"ITAU RF DI\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://zcjbtpxuhdekpwcxmepn.supabase.co/functions/v1/silo-api/v2/portfolio")
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 \"names\": [\n \"ITAU RF DI\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
"<unknown>"
],
"meta": {
"resource": "<string>",
"kind": "<string>",
"request": {},
"id_known": true,
"endpoint": "<string>"
},
"next_page_url": "<string>"
}{
"error": {
"code": "bad_request",
"message": "<string>",
"target": "<string>",
"innererror": {
"sqlstate": "<string>",
"hint": "<string>",
"details": "<string>"
}
}
}Authorizations
The public publishable key. It identifies the project, not you, and is the anonymous tier.
Query Parameters
resolve: statement lines to candidate funds. fees: estimated and disclosed fees. fee_peers: the admin fee against its filed class. lookthrough: holdings through fund quotas. movement: the month's quota return against its class. instruments: CRA, CRI and debenture codes. fund_terms: manager, administrator, redemption terms. equivalents: the ETFs that track a class's index. debenture_returns: 13 month-ends of debenture marks. Default: resolve.
resolve, fees, fee_peers, lookthrough, movement, instruments, fund_terms, equivalents, debenture_returns Any day of the month. fees, lookthrough, movement: the month read. debenture_returns: the window's last month. Default: the latest complete month, as each function defines it (fees: each fund's newest balancete; lookthrough: the last complete CDA month; movement: the last complete FI month). debenture_returns has no default month and needs one.
The page size. More rows than one page come through next_page_url, never cut silently; a call stops at the tier's rows-per-call cap with meta.tier_cap_reached. Default: the tier's page maximum (10 anonymous, 100 signed in); a larger value is coerced to it.
x >= 1The opaque cursor from a previous next_page_url. It carries every other parameter: send it alone (another parameter with a different value is bad_request). Default: none: the first page.
Hidden parameter (?help=all lists it). lookthrough: fund-quota levels looked through, 1..6 (the SQL default is 4). Default: 4.
x >= 0Hidden parameter (?help=all lists it). fee_peers: dates the comparison and excludes later documents; it reads the latest Extrato, so it is not a historical backtest. equivalents: snapshots dated after it are not read. Default: today (the SQL default).
Hidden parameter (?help=all lists it). debenture_returns: a monthly PU drop beyond this is flagged queda_pu_possivel_evento. Default: none: every decrease is flagged limite_pendente (the threshold is the owner's to set).
x >= 0Body
A JSON object of lists. Every other parameter goes in the query string.
The list: fund CNPJs (fees, fee_peers, lookthrough, movement, fund_terms; resolve: the CNPJ each line prints, parallel to names), instrument codes (instruments), filed ANBIMA class labels (equivalents) or debenture tickers (debenture_returns). Null entries are allowed where the function takes them. Default: none: required by every kind except resolve.
resolve: one statement line each, the fund name as printed. Default: none: required by resolve.
resolve: the quota value each line prints, parallel to names, for the tie-break. Default: none.
resolve: the date each quota refers to, parallel to names. Default: none.
Was this page helpful?