curl --request GET \
--url https://api.galtea.ai/products \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.galtea.ai/products"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.galtea.ai/products', 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.galtea.ai/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.galtea.ai/products"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.galtea.ai/products")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.galtea.ai/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"id": "prod_123",
"organizationId": "org_123",
"userId": "user_123",
"name": "Sample Product",
"description": "Sample product description",
"riskLevel": "HIGH",
"operatorType": "PROVIDER",
"capabilities": "Can process and analyze data",
"inabilities": "Cannot process sensitive financial data",
"policies": "Must comply with data protection regulations",
"otelOutputSourceRule": {
"spanName": "ExecuteActivity:save_reply",
"attribute": "app.arguments",
"path": "$[0].message.content",
"predicate": {
"path": "$[0].message.role",
"equals": "assistant"
}
},
"autoCloseScope": "PRODUCTION",
"autoCloseInactivityMinutes": 30,
"closedSessionInferenceCreationPolicy": "REOPEN_AND_REEVALUATE",
"tags": [
"internal",
"beta"
],
"source": "banking",
"createdAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
]{
"error": "Error type",
"message": "Error message description"
}Get products
Get list of products with pagination and filtering options. See Products.
curl --request GET \
--url https://api.galtea.ai/products \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.galtea.ai/products"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.galtea.ai/products', 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.galtea.ai/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.galtea.ai/products"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.galtea.ai/products")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.galtea.ai/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"id": "prod_123",
"organizationId": "org_123",
"userId": "user_123",
"name": "Sample Product",
"description": "Sample product description",
"riskLevel": "HIGH",
"operatorType": "PROVIDER",
"capabilities": "Can process and analyze data",
"inabilities": "Cannot process sensitive financial data",
"policies": "Must comply with data protection regulations",
"otelOutputSourceRule": {
"spanName": "ExecuteActivity:save_reply",
"attribute": "app.arguments",
"path": "$[0].message.content",
"predicate": {
"path": "$[0].message.role",
"equals": "assistant"
}
},
"autoCloseScope": "PRODUCTION",
"autoCloseInactivityMinutes": 30,
"closedSessionInferenceCreationPolicy": "REOPEN_AND_REEVALUATE",
"tags": [
"internal",
"beta"
],
"source": "banking",
"createdAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
]{
"error": "Error type",
"message": "Error message description"
}Authorizations
API key authorization. Pass your API key in the Authorization header as a Bearer token. Both new (gsk_*) and legacy (gsk-) API keys are accepted, e.g. Authorization: Bearer gsk_... or Authorization: Bearer gsk-....
Query Parameters
Filter by product IDs
Filter by organization IDs
Filter by product names (exact match, multiple)
Filter by product name (partial match)
Filter by tags (returns products with at least one matching tag)
Filter by product origin: true returns demo/cloned products (source is not null), false returns user-created products (source is null). Combine with limit=0 to read only the matching count from the Content-Range header.
Filter products created at or after this timestamp (ISO 8601 format)
Filter products created at or before this timestamp (ISO 8601 format)
Sort parameters
Maximum number of results to return
Number of results to skip
Response
Products retrieved successfully
"prod_123"
"org_123"
"user_123"
"Sample Product"
"Sample product description"
EU AI Act risk classification. PROHIBITED: banned AI use cases. GPAI: general-purpose AI. GPAI_SYSTEMIC: GPAI with systemic risk. HIGH: high-risk AI system. SPECIAL_SYSTEM: special-category system.
PROHIBITED, GPAI, GPAI_SYSTEMIC, HIGH, SPECIAL_SYSTEM "HIGH"
EU AI Act operator role classification.
AUTHORISED_REPRESENTATIVE, DEPLOYER, DISTRIBUTER, IMPORTER, PRODUCT_MANUFACTURER, PROVIDER "PROVIDER"
"Can process and analyze data"
"Cannot process sensitive financial data"
"Must comply with data protection regulations"
Recover a turn's user-visible output for templated or non-LLM replies whose final answer lives on a non-LLM span. Set per product or version (version wins). Applied only when no LLM output is present.
Show child attributes
Show child attributes
{
"spanName": "ExecuteActivity:save_reply",
"attribute": "app.arguments",
"path": "$[0].message.content",
"predicate": {
"path": "$[0].message.role",
"equals": "assistant"
}
}
Which sessions the product-level auto-close sweep considers. PRODUCTION (default) closes only production sessions; DEVELOPMENT only test sessions; ALL both; NONE disables auto-close.
NONE, DEVELOPMENT, PRODUCTION, ALL "PRODUCTION"
Minutes of inactivity after which an eligible session is auto-closed.
x >= 130
What happens when a new trace is created for an already-closed session. REOPEN_AND_REEVALUATE (the default) stores the trace, returns the session to PENDING and marks its existing monitor evaluations OUTDATED so a monitor scores the session again once it closes for good (production sessions only; a development session is dropped like IGNORE). IGNORE drops the trace silently. REJECT returns an error.
REJECT, IGNORE, REOPEN_AND_REEVALUATE "REOPEN_AND_REEVALUATE"
Free-form labels for organizing products. Normalized to lowercase and trimmed on save.
["internal", "beta"]
Demo key the product was cloned from (e.g. "banking"); null for user-created products. Server-stamped on demo-clone; not client-writable.
"banking"