curl --request POST \
--url https://cp.xenovia.io/api/v1/providers/models/draft \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"provider": "<string>",
"model": "<string>",
"params": {},
"api_token": "<string>",
"provider_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://cp.xenovia.io/api/v1/providers/models/draft"
payload = {
"provider": "<string>",
"model": "<string>",
"params": {},
"api_token": "<string>",
"provider_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
provider: '<string>',
model: '<string>',
params: {},
api_token: '<string>',
provider_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://cp.xenovia.io/api/v1/providers/models/draft', 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://cp.xenovia.io/api/v1/providers/models/draft",
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([
'provider' => '<string>',
'model' => '<string>',
'params' => [
],
'api_token' => '<string>',
'provider_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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://cp.xenovia.io/api/v1/providers/models/draft"
payload := strings.NewReader("{\n \"provider\": \"<string>\",\n \"model\": \"<string>\",\n \"params\": {},\n \"api_token\": \"<string>\",\n \"provider_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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://cp.xenovia.io/api/v1/providers/models/draft")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"<string>\",\n \"model\": \"<string>\",\n \"params\": {},\n \"api_token\": \"<string>\",\n \"provider_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cp.xenovia.io/api/v1/providers/models/draft")
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 \"provider\": \"<string>\",\n \"model\": \"<string>\",\n \"params\": {},\n \"api_token\": \"<string>\",\n \"provider_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"models": [
{
"id": "<string>",
"name": "<string>"
}
],
"source": "live",
"error": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}List Draft Provider Models Route
The models an unsaved provider form can call (the runtime lists them, else the catalog suggests them). Validated like the draft test; stores nothing.
curl --request POST \
--url https://cp.xenovia.io/api/v1/providers/models/draft \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"provider": "<string>",
"model": "<string>",
"params": {},
"api_token": "<string>",
"provider_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://cp.xenovia.io/api/v1/providers/models/draft"
payload = {
"provider": "<string>",
"model": "<string>",
"params": {},
"api_token": "<string>",
"provider_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
provider: '<string>',
model: '<string>',
params: {},
api_token: '<string>',
provider_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://cp.xenovia.io/api/v1/providers/models/draft', 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://cp.xenovia.io/api/v1/providers/models/draft",
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([
'provider' => '<string>',
'model' => '<string>',
'params' => [
],
'api_token' => '<string>',
'provider_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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://cp.xenovia.io/api/v1/providers/models/draft"
payload := strings.NewReader("{\n \"provider\": \"<string>\",\n \"model\": \"<string>\",\n \"params\": {},\n \"api_token\": \"<string>\",\n \"provider_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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://cp.xenovia.io/api/v1/providers/models/draft")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"<string>\",\n \"model\": \"<string>\",\n \"params\": {},\n \"api_token\": \"<string>\",\n \"provider_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cp.xenovia.io/api/v1/providers/models/draft")
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 \"provider\": \"<string>\",\n \"model\": \"<string>\",\n \"params\": {},\n \"api_token\": \"<string>\",\n \"provider_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"models": [
{
"id": "<string>",
"name": "<string>"
}
],
"source": "live",
"error": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer token: an organization API key (ak_…) created under Settings → API Keys, or a dashboard user session token. Agent keys (xe_…) are not accepted here. Endpoints marked as user-only in their description reject organization keys with 403.
Body
The draft connection test's body, for listing the models an unsaved form can call. The model is not needed to list them.
Response
Successful Response
The models a provider can call. live is the upstream's own list
(through the runtime, or OpenRouter's public list); directory is the
public model directory's list for the entry (models.dev), answered when
no live list can be had (no key yet, no discovery, a failed or
unconfigured runtime); catalog is the catalog's suggestions, when the
entry has no directory list or the directory cannot be reached. error
says why a live list was refused (the runtime's fixed message), or is
null.