curl --request POST \
--url https://api.chicago.global/v1/portfolio/{portfolio_key}/validate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"portfolio": [
{
"date": "2024-01-01",
"symbol": "AAPL",
"weight": 0.25
}
],
"base_currency": "USD",
"benchmark": "ACWI.OQ",
"initial_value": 10000,
"include_transaction_costs": true,
"transaction_cost_config": {}
}
'import requests
url = "https://api.chicago.global/v1/portfolio/{portfolio_key}/validate"
payload = {
"portfolio": [
{
"date": "2024-01-01",
"symbol": "AAPL",
"weight": 0.25
}
],
"base_currency": "USD",
"benchmark": "ACWI.OQ",
"initial_value": 10000,
"include_transaction_costs": True,
"transaction_cost_config": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
portfolio: [{date: '2024-01-01', symbol: 'AAPL', weight: 0.25}],
base_currency: 'USD',
benchmark: 'ACWI.OQ',
initial_value: 10000,
include_transaction_costs: true,
transaction_cost_config: {}
})
};
fetch('https://api.chicago.global/v1/portfolio/{portfolio_key}/validate', 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://api.chicago.global/v1/portfolio/{portfolio_key}/validate",
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([
'portfolio' => [
[
'date' => '2024-01-01',
'symbol' => 'AAPL',
'weight' => 0.25
]
],
'base_currency' => 'USD',
'benchmark' => 'ACWI.OQ',
'initial_value' => 10000,
'include_transaction_costs' => true,
'transaction_cost_config' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.chicago.global/v1/portfolio/{portfolio_key}/validate"
payload := strings.NewReader("{\n \"portfolio\": [\n {\n \"date\": \"2024-01-01\",\n \"symbol\": \"AAPL\",\n \"weight\": 0.25\n }\n ],\n \"base_currency\": \"USD\",\n \"benchmark\": \"ACWI.OQ\",\n \"initial_value\": 10000,\n \"include_transaction_costs\": true,\n \"transaction_cost_config\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.chicago.global/v1/portfolio/{portfolio_key}/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"portfolio\": [\n {\n \"date\": \"2024-01-01\",\n \"symbol\": \"AAPL\",\n \"weight\": 0.25\n }\n ],\n \"base_currency\": \"USD\",\n \"benchmark\": \"ACWI.OQ\",\n \"initial_value\": 10000,\n \"include_transaction_costs\": true,\n \"transaction_cost_config\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.chicago.global/v1/portfolio/{portfolio_key}/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"portfolio\": [\n {\n \"date\": \"2024-01-01\",\n \"symbol\": \"AAPL\",\n \"weight\": 0.25\n }\n ],\n \"base_currency\": \"USD\",\n \"benchmark\": \"ACWI.OQ\",\n \"initial_value\": 10000,\n \"include_transaction_costs\": true,\n \"transaction_cost_config\": {}\n}"
response = http.request(request)
puts response.read_body{
"valid": true,
"error_count": 123,
"warning_count": 123,
"errors": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
],
"warnings": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
],
"normalized": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Validate Update
Validate an update without applying changes. Accepts the same optional fields as /update and validates the resulting portfolio definition.
Credits: Free (0 credits).
curl --request POST \
--url https://api.chicago.global/v1/portfolio/{portfolio_key}/validate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"portfolio": [
{
"date": "2024-01-01",
"symbol": "AAPL",
"weight": 0.25
}
],
"base_currency": "USD",
"benchmark": "ACWI.OQ",
"initial_value": 10000,
"include_transaction_costs": true,
"transaction_cost_config": {}
}
'import requests
url = "https://api.chicago.global/v1/portfolio/{portfolio_key}/validate"
payload = {
"portfolio": [
{
"date": "2024-01-01",
"symbol": "AAPL",
"weight": 0.25
}
],
"base_currency": "USD",
"benchmark": "ACWI.OQ",
"initial_value": 10000,
"include_transaction_costs": True,
"transaction_cost_config": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
portfolio: [{date: '2024-01-01', symbol: 'AAPL', weight: 0.25}],
base_currency: 'USD',
benchmark: 'ACWI.OQ',
initial_value: 10000,
include_transaction_costs: true,
transaction_cost_config: {}
})
};
fetch('https://api.chicago.global/v1/portfolio/{portfolio_key}/validate', 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://api.chicago.global/v1/portfolio/{portfolio_key}/validate",
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([
'portfolio' => [
[
'date' => '2024-01-01',
'symbol' => 'AAPL',
'weight' => 0.25
]
],
'base_currency' => 'USD',
'benchmark' => 'ACWI.OQ',
'initial_value' => 10000,
'include_transaction_costs' => true,
'transaction_cost_config' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.chicago.global/v1/portfolio/{portfolio_key}/validate"
payload := strings.NewReader("{\n \"portfolio\": [\n {\n \"date\": \"2024-01-01\",\n \"symbol\": \"AAPL\",\n \"weight\": 0.25\n }\n ],\n \"base_currency\": \"USD\",\n \"benchmark\": \"ACWI.OQ\",\n \"initial_value\": 10000,\n \"include_transaction_costs\": true,\n \"transaction_cost_config\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.chicago.global/v1/portfolio/{portfolio_key}/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"portfolio\": [\n {\n \"date\": \"2024-01-01\",\n \"symbol\": \"AAPL\",\n \"weight\": 0.25\n }\n ],\n \"base_currency\": \"USD\",\n \"benchmark\": \"ACWI.OQ\",\n \"initial_value\": 10000,\n \"include_transaction_costs\": true,\n \"transaction_cost_config\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.chicago.global/v1/portfolio/{portfolio_key}/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"portfolio\": [\n {\n \"date\": \"2024-01-01\",\n \"symbol\": \"AAPL\",\n \"weight\": 0.25\n }\n ],\n \"base_currency\": \"USD\",\n \"benchmark\": \"ACWI.OQ\",\n \"initial_value\": 10000,\n \"include_transaction_costs\": true,\n \"transaction_cost_config\": {}\n}"
response = http.request(request)
puts response.read_body{
"valid": true,
"error_count": 123,
"warning_count": 123,
"errors": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
],
"warnings": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
],
"normalized": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Body
Request model for updating a tracked portfolio.
All fields are optional — send only what you want to change. If portfolio
is provided, holdings are fully replaced. Analytics are recomputed in the
background up to the latest trading day; extending the series through a
specific date without changing definition is /increment's job.
Optional new holdings to replace the existing portfolio definition.
Show child attributes
Show child attributes
Override base currency for this portfolio.
"USD"
Override benchmark for this portfolio.
"ACWI.OQ"
Override initial portfolio value in base currency.
10000
Override transaction cost setting for this update.
Override transaction cost config for this update.
Response
Successful Response
True when the portfolio would pass track/update validation
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Portfolio definition after weight renormalization (only when valid)