curl --request PATCH \
--url https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok \
--header 'Content-Type: application/json' \
--data '
{
"model_preference": "<string>",
"allow_platform_fallback": true
}
'import requests
url = "https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok"
payload = {
"model_preference": "<string>",
"allow_platform_fallback": True
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({model_preference: '<string>', allow_platform_fallback: true})
};
fetch('https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok', 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-staging.kitefrost.ai/v1/projects/{project_id}/byok",
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([
'model_preference' => '<string>',
'allow_platform_fallback' => true
]),
CURLOPT_HTTPHEADER => [
"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-staging.kitefrost.ai/v1/projects/{project_id}/byok"
payload := strings.NewReader("{\n \"model_preference\": \"<string>\",\n \"allow_platform_fallback\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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://api-staging.kitefrost.ai/v1/projects/{project_id}/byok")
.header("Content-Type", "application/json")
.body("{\n \"model_preference\": \"<string>\",\n \"allow_platform_fallback\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model_preference\": \"<string>\",\n \"allow_platform_fallback\": true\n}"
response = http.request(request)
puts response.read_body{
"project_id": "<string>",
"has_key": true,
"source": "<string>",
"provider": "<string>",
"key_preview": "<string>",
"model_preference": "<string>",
"allow_platform_fallback": true,
"probe_status": "<string>",
"model_warning": "<string>"
}{
"error": "Unauthorized",
"code": "unauthorized",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "No valid API key was supplied.",
"doc_url": "https://docs.kitefrost.ai/errors/unauthorized"
}{
"error": "Forbidden",
"code": "forbidden",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "Your API key does not have the required scope.",
"doc_url": "https://docs.kitefrost.ai/errors/forbidden"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": "Rate limit exceeded",
"code": "rate_limited",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "You have exceeded the rate limit for your plan.",
"doc_url": "https://docs.kitefrost.ai/errors/rate_limited"
}{
"error": "Internal server error",
"code": "internal_error",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "An unexpected error occurred.",
"doc_url": "https://docs.kitefrost.ai/errors/internal_error"
}Update BYOK preferences
Update routing preferences for an existing tenant-supplied BYOK key without requiring the raw API key to be submitted again. Paid plans only (Pro and above). Free-tier treatment tenants who have already attached a key via PUT may also update preferences.
curl --request PATCH \
--url https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok \
--header 'Content-Type: application/json' \
--data '
{
"model_preference": "<string>",
"allow_platform_fallback": true
}
'import requests
url = "https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok"
payload = {
"model_preference": "<string>",
"allow_platform_fallback": True
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({model_preference: '<string>', allow_platform_fallback: true})
};
fetch('https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok', 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-staging.kitefrost.ai/v1/projects/{project_id}/byok",
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([
'model_preference' => '<string>',
'allow_platform_fallback' => true
]),
CURLOPT_HTTPHEADER => [
"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-staging.kitefrost.ai/v1/projects/{project_id}/byok"
payload := strings.NewReader("{\n \"model_preference\": \"<string>\",\n \"allow_platform_fallback\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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://api-staging.kitefrost.ai/v1/projects/{project_id}/byok")
.header("Content-Type", "application/json")
.body("{\n \"model_preference\": \"<string>\",\n \"allow_platform_fallback\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.kitefrost.ai/v1/projects/{project_id}/byok")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model_preference\": \"<string>\",\n \"allow_platform_fallback\": true\n}"
response = http.request(request)
puts response.read_body{
"project_id": "<string>",
"has_key": true,
"source": "<string>",
"provider": "<string>",
"key_preview": "<string>",
"model_preference": "<string>",
"allow_platform_fallback": true,
"probe_status": "<string>",
"model_warning": "<string>"
}{
"error": "Unauthorized",
"code": "unauthorized",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "No valid API key was supplied.",
"doc_url": "https://docs.kitefrost.ai/errors/unauthorized"
}{
"error": "Forbidden",
"code": "forbidden",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "Your API key does not have the required scope.",
"doc_url": "https://docs.kitefrost.ai/errors/forbidden"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": "Rate limit exceeded",
"code": "rate_limited",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "You have exceeded the rate limit for your plan.",
"doc_url": "https://docs.kitefrost.ai/errors/rate_limited"
}{
"error": "Internal server error",
"code": "internal_error",
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"message": "An unexpected error occurred.",
"doc_url": "https://docs.kitefrost.ai/errors/internal_error"
}Path Parameters
Body
PATCH /v1/projects/{project_id}/byok
An omitted field is left unchanged (it used to be reset: omitting
allow_platform_fallback re-enabled platform fallback); an explicit
null clears model_preference and is a 422 on allow_platform_fallback.
Optional specific model the tenant prefers from their provider. Null clears it; omit to keep it.
When False, requests that cannot be satisfied by the tenant's BYOK key fail with an explicit error instead of silently falling back to the platform's shared key. Omit to keep the stored value; null is rejected (422).
Response
BYOK preferences updated