curl --request POST \
--url https://openrouter.ai/api/v1/observability/destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"config": {
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
},
"name": "Production Langfuse",
"type": "langfuse"
}
'import requests
url = "https://openrouter.ai/api/v1/observability/destinations"
payload = {
"config": {
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
},
"name": "Production Langfuse",
"type": "langfuse"
}
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({
config: {
baseUrl: 'https://us.cloud.langfuse.com',
publicKey: 'pk-l...EfGh',
secretKey: 'sk-l...AbCd'
},
name: 'Production Langfuse',
type: 'langfuse'
})
};
fetch('https://openrouter.ai/api/v1/observability/destinations', 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/observability/destinations",
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([
'config' => [
'baseUrl' => 'https://us.cloud.langfuse.com',
'publicKey' => 'pk-l...EfGh',
'secretKey' => 'sk-l...AbCd'
],
'name' => 'Production Langfuse',
'type' => 'langfuse'
]),
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/observability/destinations"
payload := strings.NewReader("{\n \"config\": {\n \"baseUrl\": \"https://us.cloud.langfuse.com\",\n \"publicKey\": \"pk-l...EfGh\",\n \"secretKey\": \"sk-l...AbCd\"\n },\n \"name\": \"Production Langfuse\",\n \"type\": \"langfuse\"\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/observability/destinations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"baseUrl\": \"https://us.cloud.langfuse.com\",\n \"publicKey\": \"pk-l...EfGh\",\n \"secretKey\": \"sk-l...AbCd\"\n },\n \"name\": \"Production Langfuse\",\n \"type\": \"langfuse\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/observability/destinations")
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 \"config\": {\n \"baseUrl\": \"https://us.cloud.langfuse.com\",\n \"publicKey\": \"pk-l...EfGh\",\n \"secretKey\": \"sk-l...AbCd\"\n },\n \"name\": \"Production Langfuse\",\n \"type\": \"langfuse\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"api_key_hashes": null,
"broadcast_generation_cost": false,
"broadcast_generation_identity": false,
"broadcast_generation_request_context": false,
"config": {
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
},
"created_at": "2025-08-24T10:30:00Z",
"enabled": true,
"filter_rules": null,
"id": "99999999-aaaa-bbbb-cccc-dddddddddddd",
"name": "Production Langfuse",
"privacy_mode": false,
"sampling_rate": 1,
"type": "langfuse",
"updated_at": "2025-08-24T15:45:00Z",
"workspace_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"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": 409,
"message": "Resource conflict. Please try again later."
}
}{
"error": {
"code": 500,
"message": "Internal Server Error"
}
}Create an observability destination
Create a new observability destination. A maximum of 5 destinations per type is allowed. Defaults to the authenticated entity’s default workspace; use the workspace_id body field to scope to a different workspace. Management key required.
curl --request POST \
--url https://openrouter.ai/api/v1/observability/destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"config": {
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
},
"name": "Production Langfuse",
"type": "langfuse"
}
'import requests
url = "https://openrouter.ai/api/v1/observability/destinations"
payload = {
"config": {
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
},
"name": "Production Langfuse",
"type": "langfuse"
}
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({
config: {
baseUrl: 'https://us.cloud.langfuse.com',
publicKey: 'pk-l...EfGh',
secretKey: 'sk-l...AbCd'
},
name: 'Production Langfuse',
type: 'langfuse'
})
};
fetch('https://openrouter.ai/api/v1/observability/destinations', 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/observability/destinations",
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([
'config' => [
'baseUrl' => 'https://us.cloud.langfuse.com',
'publicKey' => 'pk-l...EfGh',
'secretKey' => 'sk-l...AbCd'
],
'name' => 'Production Langfuse',
'type' => 'langfuse'
]),
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/observability/destinations"
payload := strings.NewReader("{\n \"config\": {\n \"baseUrl\": \"https://us.cloud.langfuse.com\",\n \"publicKey\": \"pk-l...EfGh\",\n \"secretKey\": \"sk-l...AbCd\"\n },\n \"name\": \"Production Langfuse\",\n \"type\": \"langfuse\"\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/observability/destinations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"baseUrl\": \"https://us.cloud.langfuse.com\",\n \"publicKey\": \"pk-l...EfGh\",\n \"secretKey\": \"sk-l...AbCd\"\n },\n \"name\": \"Production Langfuse\",\n \"type\": \"langfuse\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openrouter.ai/api/v1/observability/destinations")
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 \"config\": {\n \"baseUrl\": \"https://us.cloud.langfuse.com\",\n \"publicKey\": \"pk-l...EfGh\",\n \"secretKey\": \"sk-l...AbCd\"\n },\n \"name\": \"Production Langfuse\",\n \"type\": \"langfuse\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"api_key_hashes": null,
"broadcast_generation_cost": false,
"broadcast_generation_identity": false,
"broadcast_generation_request_context": false,
"config": {
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
},
"created_at": "2025-08-24T10:30:00Z",
"enabled": true,
"filter_rules": null,
"id": "99999999-aaaa-bbbb-cccc-dddddddddddd",
"name": "Production Langfuse",
"privacy_mode": false,
"sampling_rate": 1,
"type": "langfuse",
"updated_at": "2025-08-24T15:45:00Z",
"workspace_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"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": 409,
"message": "Resource conflict. Please try again later."
}
}{
"error": {
"code": 500,
"message": "Internal Server Error"
}
}Authorizations
API key as bearer token in Authorization header
Body
Provider-specific configuration. The shape depends on type and is validated server-side.
Show child attributes
Show child attributes
{
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
}
Human-readable name for the destination.
"Production Langfuse"
The destination type. Only stable destination types are accepted.
arize, braintrust, clickhouse, datadog, grafana, langfuse, langsmith, newrelic, opik, otel-collector, posthog, ramp, s3, sentry, snowflake, weave, webhook "langfuse"
Optional allowlist of OpenRouter API key hashes whose traffic is forwarded. null or omitted means all keys. Must contain at least one hash if provided.
1null
When true, include cost and billing generation metadata.
false
When true, include identity generation metadata.
false
When true, include request-context generation metadata.
false
Whether this destination should be enabled immediately.
true
Optional structured filter rules controlling which events are forwarded.
Show child attributes
Show child attributes
null
When true, request/response bodies are not forwarded — only metadata.
false
Sampling rate between 0.0001 and 1 (1 = 100%).
1
Optional workspace ID. Defaults to the authenticated entity's default workspace.
"550e8400-e29b-41d4-a716-446655440000"
Response
Destination created successfully
The newly created observability destination.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
- Option 11
- Option 12
- Option 13
- Option 14
- Option 15
- Option 16
- Option 17
Show child attributes
Show child attributes
{
"api_key_hashes": null,
"broadcast_generation_cost": false,
"broadcast_generation_identity": false,
"broadcast_generation_request_context": false,
"config": {
"baseUrl": "https://us.cloud.langfuse.com",
"publicKey": "pk-l...EfGh",
"secretKey": "sk-l...AbCd"
},
"created_at": "2025-08-24T10:30:00Z",
"enabled": true,
"filter_rules": null,
"id": "99999999-aaaa-bbbb-cccc-dddddddddddd",
"name": "Production Langfuse",
"privacy_mode": false,
"sampling_rate": 1,
"type": "langfuse",
"updated_at": "2025-08-24T15:45:00Z",
"workspace_id": "550e8400-e29b-41d4-a716-446655440000"
}