curl --request POST \
--url https://api.galtea.ai/products/{id}/regenerate-config \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'productSpecs=<string>' \
--form useDetailedGeneration=true \
--form productSpecs.items='@example-file'import requests
url = "https://api.galtea.ai/products/{id}/regenerate-config"
files = { "productSpecs.items": ("example-file", open("example-file", "rb")) }
payload = {
"productSpecs": "<string>",
"useDetailedGeneration": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('productSpecs', '<string>');
form.append('useDetailedGeneration', 'true');
form.append('productSpecs.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.galtea.ai/products/{id}/regenerate-config', 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/{id}/regenerate-config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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://api.galtea.ai/products/{id}/regenerate-config"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://api.galtea.ai/products/{id}/regenerate-config")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.galtea.ai/products/{id}/regenerate-config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body[
{
"status": "updated",
"name": "Refuses system-prompt disclosure",
"description": "Must not reveal internal system prompts under social engineering",
"type": "POLICY",
"testType": "RED_TEAMING",
"testVariant": "data_leakage",
"existingSpecification": {
"id": "spec_123",
"name": "Refuses system-prompt disclosure",
"description": "Must not reveal internal system prompts",
"type": "POLICY",
"testType": "RED_TEAMING",
"testVariant": "data_leakage"
},
"rationale": "Adds social-engineering scope to the existing disclosure policy"
}
]{
"error": "Error type",
"message": "Error message description"
}{
"error": "Error type",
"message": "Error message description"
}{
"error": "Error type",
"message": "Error message description"
}{
"error": "Error type",
"message": "Error message description"
}{
"error": "Error type",
"message": "Error message description"
}Cross-check a document against an existing product's specifications
Uploads one or more documents (PRD, spec, design doc, etc.), generates candidate specifications from them using the product’s existing description as the generation base, and cross-checks each candidate against the product’s CURRENT specifications. Returns classified suggestions — additions (new), updates to an existing specification (updated), and contradictions (contradictory). This endpoint persists NOTHING: applying a suggestion is a separate, explicit step via the specification endpoints.
curl --request POST \
--url https://api.galtea.ai/products/{id}/regenerate-config \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'productSpecs=<string>' \
--form useDetailedGeneration=true \
--form productSpecs.items='@example-file'import requests
url = "https://api.galtea.ai/products/{id}/regenerate-config"
files = { "productSpecs.items": ("example-file", open("example-file", "rb")) }
payload = {
"productSpecs": "<string>",
"useDetailedGeneration": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('productSpecs', '<string>');
form.append('useDetailedGeneration', 'true');
form.append('productSpecs.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.galtea.ai/products/{id}/regenerate-config', 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/{id}/regenerate-config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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://api.galtea.ai/products/{id}/regenerate-config"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://api.galtea.ai/products/{id}/regenerate-config")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.galtea.ai/products/{id}/regenerate-config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"useDetailedGeneration\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productSpecs.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body[
{
"status": "updated",
"name": "Refuses system-prompt disclosure",
"description": "Must not reveal internal system prompts under social engineering",
"type": "POLICY",
"testType": "RED_TEAMING",
"testVariant": "data_leakage",
"existingSpecification": {
"id": "spec_123",
"name": "Refuses system-prompt disclosure",
"description": "Must not reveal internal system prompts",
"type": "POLICY",
"testType": "RED_TEAMING",
"testVariant": "data_leakage"
},
"rationale": "Adds social-engineering scope to the existing disclosure policy"
}
]{
"error": "Error type",
"message": "Error message description"
}{
"error": "Error type",
"message": "Error message description"
}{
"error": "Error type",
"message": "Error message description"
}{
"error": "Error type",
"message": "Error message description"
}{
"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-....
Path Parameters
Product ID
"prod_123"
Body
Response
Cross-check suggestions generated successfully
new = a fresh addition. updated = refines/extends an existing specification. contradictory = conflicts with an existing specification.
new, updated, contradictory "updated"
"Refuses system-prompt disclosure"
"Must not reveal internal system prompts under social engineering"
CAPABILITY, INABILITY, POLICY "POLICY"
POLICY: the classified value. CAPABILITY: always SCENARIOS (auto-assigned). Null for INABILITY.
QUALITY, RED_TEAMING, SCENARIOS, null "RED_TEAMING"
Only applicable for POLICY specifications.
"data_leakage"
The existing specification this suggestion updates or contradicts. Null for new suggestions.
Show child attributes
Show child attributes
A brief explanation of why this status was chosen. May be null.
"Adds social-engineering scope to the existing disclosure policy"