curl --request PATCH \
--url https://x.invalid/api/v1/tilts/{tilt_uuid} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"base_revision": "2026-09-29T14:32:10Z",
"assignment_expression": "quality = 2 * revenue_growth_3y + roe",
"filter_expression": "market_cap > 5000 and fcf_margin > 0.08",
"score_expression": "quality",
"weight_expression": "free_float_market_cap",
"rules": {
"max_constituents": 20,
"rebalancing_period": "QUARTERLY",
"capping_methodology": "THRESHOLD_BASED",
"max_position_weight": "0.10",
"top_n_position_threshold": "0.045",
"top_n_position_weight": "0.45"
}
}
'import requests
url = "https://x.invalid/api/v1/tilts/{tilt_uuid}"
payload = {
"base_revision": "2026-09-29T14:32:10Z",
"assignment_expression": "quality = 2 * revenue_growth_3y + roe",
"filter_expression": "market_cap > 5000 and fcf_margin > 0.08",
"score_expression": "quality",
"weight_expression": "free_float_market_cap",
"rules": {
"max_constituents": 20,
"rebalancing_period": "QUARTERLY",
"capping_methodology": "THRESHOLD_BASED",
"max_position_weight": "0.10",
"top_n_position_threshold": "0.045",
"top_n_position_weight": "0.45"
}
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
base_revision: '2026-09-29T14:32:10Z',
assignment_expression: 'quality = 2 * revenue_growth_3y + roe',
filter_expression: 'market_cap > 5000 and fcf_margin > 0.08',
score_expression: 'quality',
weight_expression: 'free_float_market_cap',
rules: {
max_constituents: 20,
rebalancing_period: 'QUARTERLY',
capping_methodology: 'THRESHOLD_BASED',
max_position_weight: '0.10',
top_n_position_threshold: '0.045',
top_n_position_weight: '0.45'
}
})
};
fetch('https://x.invalid/api/v1/tilts/{tilt_uuid}', 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://x.invalid/api/v1/tilts/{tilt_uuid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'base_revision' => '2026-09-29T14:32:10Z',
'assignment_expression' => 'quality = 2 * revenue_growth_3y + roe',
'filter_expression' => 'market_cap > 5000 and fcf_margin > 0.08',
'score_expression' => 'quality',
'weight_expression' => 'free_float_market_cap',
'rules' => [
'max_constituents' => 20,
'rebalancing_period' => 'QUARTERLY',
'capping_methodology' => 'THRESHOLD_BASED',
'max_position_weight' => '0.10',
'top_n_position_threshold' => '0.045',
'top_n_position_weight' => '0.45'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <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://x.invalid/api/v1/tilts/{tilt_uuid}"
payload := strings.NewReader("{\n \"base_revision\": \"2026-09-29T14:32:10Z\",\n \"assignment_expression\": \"quality = 2 * revenue_growth_3y + roe\",\n \"filter_expression\": \"market_cap > 5000 and fcf_margin > 0.08\",\n \"score_expression\": \"quality\",\n \"weight_expression\": \"free_float_market_cap\",\n \"rules\": {\n \"max_constituents\": 20,\n \"rebalancing_period\": \"QUARTERLY\",\n \"capping_methodology\": \"THRESHOLD_BASED\",\n \"max_position_weight\": \"0.10\",\n \"top_n_position_threshold\": \"0.045\",\n \"top_n_position_weight\": \"0.45\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-Api-Key", "<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.patch("https://x.invalid/api/v1/tilts/{tilt_uuid}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"base_revision\": \"2026-09-29T14:32:10Z\",\n \"assignment_expression\": \"quality = 2 * revenue_growth_3y + roe\",\n \"filter_expression\": \"market_cap > 5000 and fcf_margin > 0.08\",\n \"score_expression\": \"quality\",\n \"weight_expression\": \"free_float_market_cap\",\n \"rules\": {\n \"max_constituents\": 20,\n \"rebalancing_period\": \"QUARTERLY\",\n \"capping_methodology\": \"THRESHOLD_BASED\",\n \"max_position_weight\": \"0.10\",\n \"top_n_position_threshold\": \"0.045\",\n \"top_n_position_weight\": \"0.45\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://x.invalid/api/v1/tilts/{tilt_uuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"base_revision\": \"2026-09-29T14:32:10Z\",\n \"assignment_expression\": \"quality = 2 * revenue_growth_3y + roe\",\n \"filter_expression\": \"market_cap > 5000 and fcf_margin > 0.08\",\n \"score_expression\": \"quality\",\n \"weight_expression\": \"free_float_market_cap\",\n \"rules\": {\n \"max_constituents\": 20,\n \"rebalancing_period\": \"QUARTERLY\",\n \"capping_methodology\": \"THRESHOLD_BASED\",\n \"max_position_weight\": \"0.10\",\n \"top_n_position_threshold\": \"0.045\",\n \"top_n_position_weight\": \"0.45\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"tilt_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version_group_sqid": "<string>",
"revision": "2023-11-07T05:31:56Z",
"universe_preset": "<string>",
"assignment_expression": "<string>",
"filter_expression": "<string>",
"score_expression": "<string>",
"weight_expression": "<string>",
"included_tickers": [
{
"tilt_asset_id": "<string>",
"symbol": "<string>",
"name": "<string>",
"exchange": "<string>"
}
],
"excluded_tickers": [
{
"tilt_asset_id": "<string>",
"symbol": "<string>",
"name": "<string>",
"exchange": "<string>"
}
],
"rules": {
"rebalancing_period": "MONTHLY",
"capping_methodology": "NONE",
"max_position_weight": "<string>",
"top_n_positions": 123,
"top_n_position_weight": "<string>",
"top_n_position_threshold": "<string>",
"max_constituents": 2
},
"evaluation": {
"as_of_date": "2023-12-25",
"total_constituents": 123,
"total_weight": 123,
"top_constituents": [
{
"ticker": "<string>",
"score": 123,
"weight": 0.5
}
]
},
"size_segment_base_date": "2023-12-25"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "revision_conflict",
"message": "The Tilt changed after this edit started. Reload it and apply the edit again."
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"unknown_columns": [
"<string>"
],
"closest_matches": [
"<string>"
],
"unresolved_tickers": [
{}
],
"ambiguous_tickers": [
{}
]
}Apply construction
Save and evaluate a Tilt methodology atomically.
curl --request PATCH \
--url https://x.invalid/api/v1/tilts/{tilt_uuid} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"base_revision": "2026-09-29T14:32:10Z",
"assignment_expression": "quality = 2 * revenue_growth_3y + roe",
"filter_expression": "market_cap > 5000 and fcf_margin > 0.08",
"score_expression": "quality",
"weight_expression": "free_float_market_cap",
"rules": {
"max_constituents": 20,
"rebalancing_period": "QUARTERLY",
"capping_methodology": "THRESHOLD_BASED",
"max_position_weight": "0.10",
"top_n_position_threshold": "0.045",
"top_n_position_weight": "0.45"
}
}
'import requests
url = "https://x.invalid/api/v1/tilts/{tilt_uuid}"
payload = {
"base_revision": "2026-09-29T14:32:10Z",
"assignment_expression": "quality = 2 * revenue_growth_3y + roe",
"filter_expression": "market_cap > 5000 and fcf_margin > 0.08",
"score_expression": "quality",
"weight_expression": "free_float_market_cap",
"rules": {
"max_constituents": 20,
"rebalancing_period": "QUARTERLY",
"capping_methodology": "THRESHOLD_BASED",
"max_position_weight": "0.10",
"top_n_position_threshold": "0.045",
"top_n_position_weight": "0.45"
}
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
base_revision: '2026-09-29T14:32:10Z',
assignment_expression: 'quality = 2 * revenue_growth_3y + roe',
filter_expression: 'market_cap > 5000 and fcf_margin > 0.08',
score_expression: 'quality',
weight_expression: 'free_float_market_cap',
rules: {
max_constituents: 20,
rebalancing_period: 'QUARTERLY',
capping_methodology: 'THRESHOLD_BASED',
max_position_weight: '0.10',
top_n_position_threshold: '0.045',
top_n_position_weight: '0.45'
}
})
};
fetch('https://x.invalid/api/v1/tilts/{tilt_uuid}', 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://x.invalid/api/v1/tilts/{tilt_uuid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'base_revision' => '2026-09-29T14:32:10Z',
'assignment_expression' => 'quality = 2 * revenue_growth_3y + roe',
'filter_expression' => 'market_cap > 5000 and fcf_margin > 0.08',
'score_expression' => 'quality',
'weight_expression' => 'free_float_market_cap',
'rules' => [
'max_constituents' => 20,
'rebalancing_period' => 'QUARTERLY',
'capping_methodology' => 'THRESHOLD_BASED',
'max_position_weight' => '0.10',
'top_n_position_threshold' => '0.045',
'top_n_position_weight' => '0.45'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <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://x.invalid/api/v1/tilts/{tilt_uuid}"
payload := strings.NewReader("{\n \"base_revision\": \"2026-09-29T14:32:10Z\",\n \"assignment_expression\": \"quality = 2 * revenue_growth_3y + roe\",\n \"filter_expression\": \"market_cap > 5000 and fcf_margin > 0.08\",\n \"score_expression\": \"quality\",\n \"weight_expression\": \"free_float_market_cap\",\n \"rules\": {\n \"max_constituents\": 20,\n \"rebalancing_period\": \"QUARTERLY\",\n \"capping_methodology\": \"THRESHOLD_BASED\",\n \"max_position_weight\": \"0.10\",\n \"top_n_position_threshold\": \"0.045\",\n \"top_n_position_weight\": \"0.45\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-Api-Key", "<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.patch("https://x.invalid/api/v1/tilts/{tilt_uuid}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"base_revision\": \"2026-09-29T14:32:10Z\",\n \"assignment_expression\": \"quality = 2 * revenue_growth_3y + roe\",\n \"filter_expression\": \"market_cap > 5000 and fcf_margin > 0.08\",\n \"score_expression\": \"quality\",\n \"weight_expression\": \"free_float_market_cap\",\n \"rules\": {\n \"max_constituents\": 20,\n \"rebalancing_period\": \"QUARTERLY\",\n \"capping_methodology\": \"THRESHOLD_BASED\",\n \"max_position_weight\": \"0.10\",\n \"top_n_position_threshold\": \"0.045\",\n \"top_n_position_weight\": \"0.45\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://x.invalid/api/v1/tilts/{tilt_uuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"base_revision\": \"2026-09-29T14:32:10Z\",\n \"assignment_expression\": \"quality = 2 * revenue_growth_3y + roe\",\n \"filter_expression\": \"market_cap > 5000 and fcf_margin > 0.08\",\n \"score_expression\": \"quality\",\n \"weight_expression\": \"free_float_market_cap\",\n \"rules\": {\n \"max_constituents\": 20,\n \"rebalancing_period\": \"QUARTERLY\",\n \"capping_methodology\": \"THRESHOLD_BASED\",\n \"max_position_weight\": \"0.10\",\n \"top_n_position_threshold\": \"0.045\",\n \"top_n_position_weight\": \"0.45\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"tilt_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version_group_sqid": "<string>",
"revision": "2023-11-07T05:31:56Z",
"universe_preset": "<string>",
"assignment_expression": "<string>",
"filter_expression": "<string>",
"score_expression": "<string>",
"weight_expression": "<string>",
"included_tickers": [
{
"tilt_asset_id": "<string>",
"symbol": "<string>",
"name": "<string>",
"exchange": "<string>"
}
],
"excluded_tickers": [
{
"tilt_asset_id": "<string>",
"symbol": "<string>",
"name": "<string>",
"exchange": "<string>"
}
],
"rules": {
"rebalancing_period": "MONTHLY",
"capping_methodology": "NONE",
"max_position_weight": "<string>",
"top_n_positions": 123,
"top_n_position_weight": "<string>",
"top_n_position_threshold": "<string>",
"max_constituents": 2
},
"evaluation": {
"as_of_date": "2023-12-25",
"total_constituents": 123,
"total_weight": 123,
"top_constituents": [
{
"ticker": "<string>",
"score": 123,
"weight": 0.5
}
]
},
"size_segment_base_date": "2023-12-25"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "revision_conflict",
"message": "The Tilt changed after this edit started. Reload it and apply the edit again."
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"unknown_columns": [
"<string>"
],
"closest_matches": [
"<string>"
],
"unresolved_tickers": [
{}
],
"ambiguous_tickers": [
{}
]
}Authorizations
Path Parameters
Body
Recommended optimistic-concurrency token from the latest read or apply.
Omit to preserve. Valid IDs come from the universe presets endpoint; null is not accepted.
1Historical anchor for size-segment eligibility, not the evaluation date.
One named derived-field assignment per line. Null clears all assignments.
Boolean eligibility expression. Use True for no additional filter.
1Ranking expression. Null clears ranking and requires max_constituents to be null.
Relative sizing expression. Null sizes by score, or equally when score is also null.
Complete replacement for always-included listings. An empty array clears it.
1Complete replacement for always-excluded listings. An empty array clears it.
1Show child attributes
Show child attributes
Response
The effective methodology and its evaluation were committed.
Authoritative version UUID for subsequent reads.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes