curl --request GET \
--url https://api.getbluejay.ai/v1/custom-metric/{metric_id} \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://api.getbluejay.ai/v1/custom-metric/{metric_id}"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://api.getbluejay.ai/v1/custom-metric/{metric_id}', 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.getbluejay.ai/v1/custom-metric/{metric_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-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"
"net/http"
"io"
)
func main() {
url := "https://api.getbluejay.ai/v1/custom-metric/{metric_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getbluejay.ai/v1/custom-metric/{metric_id}")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getbluejay.ai/v1/custom-metric/{metric_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"response_type": "pass_fail",
"created_at": "2023-11-07T05:31:56Z",
"bluejay_as_code_id": "<string>",
"prompt": "<string>",
"description": "<string>",
"summary": "<string>",
"metric_type": "llm_judge",
"eval_method": "llm_judge",
"settings": {},
"eval_segment": "all",
"scope": "all",
"agent_ids": [
123
],
"min_value": 123,
"max_value": 123,
"category": "<string>",
"tags": [
"<string>"
],
"scoring_guidance": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"created_by": "<string>",
"eval_modality": "AUDIO",
"model": "<string>",
"audio_model": "<string>",
"temperature": 123,
"enum_options": [
"<string>"
],
"tool_names": [
"<string>"
],
"json_schema": {},
"allow_not_applicable": false,
"eval_modality_auto_selected": false,
"template_id": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Custom Metric
Get a specific custom metric by ID.
curl --request GET \
--url https://api.getbluejay.ai/v1/custom-metric/{metric_id} \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://api.getbluejay.ai/v1/custom-metric/{metric_id}"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://api.getbluejay.ai/v1/custom-metric/{metric_id}', 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.getbluejay.ai/v1/custom-metric/{metric_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-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"
"net/http"
"io"
)
func main() {
url := "https://api.getbluejay.ai/v1/custom-metric/{metric_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getbluejay.ai/v1/custom-metric/{metric_id}")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getbluejay.ai/v1/custom-metric/{metric_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"response_type": "pass_fail",
"created_at": "2023-11-07T05:31:56Z",
"bluejay_as_code_id": "<string>",
"prompt": "<string>",
"description": "<string>",
"summary": "<string>",
"metric_type": "llm_judge",
"eval_method": "llm_judge",
"settings": {},
"eval_segment": "all",
"scope": "all",
"agent_ids": [
123
],
"min_value": 123,
"max_value": 123,
"category": "<string>",
"tags": [
"<string>"
],
"scoring_guidance": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"created_by": "<string>",
"eval_modality": "AUDIO",
"model": "<string>",
"audio_model": "<string>",
"temperature": 123,
"enum_options": [
"<string>"
],
"tool_names": [
"<string>"
],
"json_schema": {},
"allow_not_applicable": false,
"eval_modality_auto_selected": false,
"template_id": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}# Bluejay — Testing & Monitoring Platform for Conversational AI Agents
You are a senior backend engineer integrating the Bluejay API. Think step-by-step: first understand the endpoint, then plan the integration, then implement with minimal changes.
## Get Custom Metric — GET /v1/custom-metric/{metric_id}
> **What this endpoint does:** Get a specific custom metric by ID.
**Endpoint:** GET `https://api.getbluejay.ai/v1/custom-metric/{metric_id}`
**Auth:** `X-API-Key` header
### Required Parameters
| Name | Type | Description |
|------|------|-------------|
| metric_id | string | |
| X-API-Key | string | API key required to authenticate requests. |
### Example
**Simple GET:**
```python
import requests
def get_custom_metric(metric_id: str, api_key: str) -> dict:
url = f"https://api.getbluejay.ai/v1/custom-metric/{metric_id}"
headers = {"X-API-Key": api_key}
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.json()
```
### Constraints
- Minimal changes — only add/change files needed for this integration.
- Match existing codebase patterns (naming, file structure, error handling).
- Include error handling for 422: Validation Error.
### Integration Checklist
Before writing code, verify:
1. Which module/service owns this API domain in the codebase?
2. What HTTP client and error-handling patterns does the project use?
3. Are there existing types/interfaces to extend?
Then implement the integration, export it, and confirm it compiles/passes lint.
Path Parameters
Response
Successful Response
Response model for custom metric operations
Unique identifier for the custom metric
Name of the custom metric
Type of response expected
pass_fail, yes_no, qualitative, quantitative, json, enum, int, float, boolean, tool_call When this metric was created
Stable code-addressable identifier (same as id for custom metrics)
LLM-judge system prompt for this metric (null for non-judge types)
Deprecated: same value as prompt
Short plain-English description of the metric (LLM-generated)
Specific metric kind
Evaluation category (llm_judge|statistical|ml_model|deterministic)
Type-specific config
Which side of the conversation is evaluated (agent|user|all)
Which pipeline runs this metric (observability|simulations|all)
List of agent IDs this metric belongs to
Minimum value for quantitative metrics
Maximum value for quantitative metrics
Category for organizing metrics
Tags for categorizing the metric
Guidance on how to score this metric
When this metric was last updated
User who last updated this metric
User who created this metric
Evaluation modality AUTO/TEXT/AUDIO
AUDIO, TEXT, AUTO Model to use for text evaluation of the metric
Model to use for audio evaluation of the metric
Temperature for evaluating the metric
Options for enum metrics
Deprecated: mirror of settings.tool_names for tool_call metrics
JSON Schema describing the object the judge must return (json metrics only)
Whether this metric allows 'not applicable' responses.
Deprecated: always false (column removed).
Library template this metric was created from