curl --request POST \
--url https://openrouter.ai/api/v1/private-providers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Acme",
"base_url": "https://inference.example.com/v1",
"data_policy": {
"prompt_retention_days": null,
"retains_prompts": false,
"training": false
},
"display_name": "Acme",
"slug": "acme"
}
'import requests
url = "https://openrouter.ai/api/v1/private-providers"
payload = {
"name": "Acme",
"base_url": "https://inference.example.com/v1",
"data_policy": {
"prompt_retention_days": None,
"retains_prompts": False,
"training": False
},
"display_name": "Acme",
"slug": "acme"
}
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({
name: 'Acme',
base_url: 'https://inference.example.com/v1',
data_policy: {prompt_retention_days: null, retains_prompts: false, training: false},
display_name: 'Acme',
slug: 'acme'
})
};
fetch('https://openrouter.ai/api/v1/private-providers', 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://openrouter.ai/api/v1/private-providers",
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([
'name' => 'Acme',
'base_url' => 'https://inference.example.com/v1',
'data_policy' => [
'prompt_retention_days' => null,
'retains_prompts' => false,
'training' => false
],
'display_name' => 'Acme',
'slug' => 'acme'
]),
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://openrouter.ai/api/v1/private-providers"
payload := strings.NewReader("{\n \"name\": \"Acme\",\n \"base_url\": \"https://inference.example.com/v1\",\n \"data_policy\": {\n \"prompt_retention_days\": null,\n \"retains_prompts\": false,\n \"training\": false\n },\n \"display_name\": \"Acme\",\n \"slug\": \"acme\"\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://openrouter.ai/api/v1/private-providers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Acme\",\n \"base_url\": \"https://inference.example.com/v1\",\n \"data_policy\": {\n \"prompt_retention_days\": null,\n \"retains_prompts\": false,\n \"training\": false\n },\n \"display_name\": \"Acme\",\n \"slug\": \"acme\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/private-providers")
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 \"name\": \"Acme\",\n \"base_url\": \"https://inference.example.com/v1\",\n \"data_policy\": {\n \"prompt_retention_days\": null,\n \"retains_prompts\": false,\n \"training\": false\n },\n \"display_name\": \"Acme\",\n \"slug\": \"acme\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"base_url": "https://inference.example.com/v1",
"created_at": "2026-10-06T12:00:00.000Z",
"data_policy": {
"prompt_retention_days": null,
"retains_prompts": false,
"training": false
},
"display_name": "Acme",
"name": "Acme",
"slug": "acme"
}
}{
"error": {
"code": 400,
"message": "Invalid request parameters"
}
}{
"error": {
"code": 401,
"message": "Missing Authentication header"
}
}{
"error": {
"code": 403,
"message": "Only management keys can perform this operation"
}
}{
"error": {
"code": 404,
"message": "Resource not found"
}
}{
"error": {
"code": 408,
"message": "Operation timed out. Please try again later."
}
}{
"error": {
"code": 409,
"message": "Resource conflict. Please try again later."
}
}{
"error": {
"code": 422,
"message": "Invalid argument"
}
}{
"error": {
"code": 429,
"message": "Rate limit exceeded"
}
}{
"error": {
"code": 500,
"message": "Internal Server Error"
}
}{
"error": {
"code": 502,
"message": "Provider returned error"
}
}Create a private provider
Create a private, bring-your-own-key provider visible only to your organization. Use its slug as provider_slug when creating private endpoints. Requires both the private endpoints and the private providers entitlements. Management key required.
curl --request POST \
--url https://openrouter.ai/api/v1/private-providers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Acme",
"base_url": "https://inference.example.com/v1",
"data_policy": {
"prompt_retention_days": null,
"retains_prompts": false,
"training": false
},
"display_name": "Acme",
"slug": "acme"
}
'import requests
url = "https://openrouter.ai/api/v1/private-providers"
payload = {
"name": "Acme",
"base_url": "https://inference.example.com/v1",
"data_policy": {
"prompt_retention_days": None,
"retains_prompts": False,
"training": False
},
"display_name": "Acme",
"slug": "acme"
}
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({
name: 'Acme',
base_url: 'https://inference.example.com/v1',
data_policy: {prompt_retention_days: null, retains_prompts: false, training: false},
display_name: 'Acme',
slug: 'acme'
})
};
fetch('https://openrouter.ai/api/v1/private-providers', 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://openrouter.ai/api/v1/private-providers",
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([
'name' => 'Acme',
'base_url' => 'https://inference.example.com/v1',
'data_policy' => [
'prompt_retention_days' => null,
'retains_prompts' => false,
'training' => false
],
'display_name' => 'Acme',
'slug' => 'acme'
]),
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://openrouter.ai/api/v1/private-providers"
payload := strings.NewReader("{\n \"name\": \"Acme\",\n \"base_url\": \"https://inference.example.com/v1\",\n \"data_policy\": {\n \"prompt_retention_days\": null,\n \"retains_prompts\": false,\n \"training\": false\n },\n \"display_name\": \"Acme\",\n \"slug\": \"acme\"\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://openrouter.ai/api/v1/private-providers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Acme\",\n \"base_url\": \"https://inference.example.com/v1\",\n \"data_policy\": {\n \"prompt_retention_days\": null,\n \"retains_prompts\": false,\n \"training\": false\n },\n \"display_name\": \"Acme\",\n \"slug\": \"acme\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/private-providers")
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 \"name\": \"Acme\",\n \"base_url\": \"https://inference.example.com/v1\",\n \"data_policy\": {\n \"prompt_retention_days\": null,\n \"retains_prompts\": false,\n \"training\": false\n },\n \"display_name\": \"Acme\",\n \"slug\": \"acme\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"base_url": "https://inference.example.com/v1",
"created_at": "2026-10-06T12:00:00.000Z",
"data_policy": {
"prompt_retention_days": null,
"retains_prompts": false,
"training": false
},
"display_name": "Acme",
"name": "Acme",
"slug": "acme"
}
}{
"error": {
"code": 400,
"message": "Invalid request parameters"
}
}{
"error": {
"code": 401,
"message": "Missing Authentication header"
}
}{
"error": {
"code": 403,
"message": "Only management keys can perform this operation"
}
}{
"error": {
"code": 404,
"message": "Resource not found"
}
}{
"error": {
"code": 408,
"message": "Operation timed out. Please try again later."
}
}{
"error": {
"code": 409,
"message": "Resource conflict. Please try again later."
}
}{
"error": {
"code": 422,
"message": "Invalid argument"
}
}{
"error": {
"code": 429,
"message": "Rate limit exceeded"
}
}{
"error": {
"code": 500,
"message": "Internal Server Error"
}
}{
"error": {
"code": 502,
"message": "Provider returned error"
}
}Authorizations
API key as bearer token in Authorization header
Body
Provider name, shown in your activity, logs and Broadcast output. 2-64 letters, numbers, spaces, dots, underscores or hyphens. Cannot be changed later. Neither the name nor its slug may match a public provider name or slug (case-insensitive); other customers may use the same name.
2 - 64^[A-Za-z0-9][A-Za-z0-9 ._-]*$"Acme"
HTTPS base URL of an OpenAI-compatible API, used by private endpoints under this provider that set no URL of their own. Without it, each endpoint must set its own. Private, internal, metadata and OpenRouter hosts are rejected.
1"https://inference.example.com/v1"
Defaults to training on and retaining prompts, the most conservative declaration. Your own declaration; it applies to your own traffic and OpenRouter does not verify it.
Show child attributes
Show child attributes
{
"prompt_retention_days": null,
"retains_prompts": false,
"training": false
}
Defaults to name.
1 - 80"Acme"
2-64 lowercase letters and numbers, separated by single hyphens. Cannot be changed later. Defaults to the name lowercased, with every run of other characters replaced by a hyphen (Acme Inference becomes acme-inference).
2 - 64^[a-z0-9]+(?:-[a-z0-9]+)*$"acme"
Response
The provider was created
Show child attributes
Show child attributes
{
"base_url": "https://inference.example.com/v1",
"created_at": "2026-10-06T12:00:00.000Z",
"data_policy": {
"prompt_retention_days": null,
"retains_prompts": false,
"training": false
},
"display_name": "Acme",
"name": "Acme",
"slug": "acme"
}
Was this page helpful?