curl --request POST \
--url {protocol}://{host}:{port}/culture/{council_sage_id}/save/full \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"council_sage_id": "c3d4e5f6-7890-4abc-def0-123456789abc",
"context_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Senior Software Engineer",
"context": "We are looking for a senior software engineer...",
"role": "Software Engineer",
"role_level": "senior",
"instructions": "Focus on problem-solving",
"duration": 30,
"tone": [
"professional"
],
"intro_question": "Tell me about a challenging project",
"intro_question_results": "Evaluating depth",
"scoring_low": 50,
"scoring_exclude": [],
"scoring_include": [
3,
4,
5
],
"customizable": true
}
'import requests
url = "{protocol}://{host}:{port}/culture/{council_sage_id}/save/full"
payload = {
"council_sage_id": "c3d4e5f6-7890-4abc-def0-123456789abc",
"context_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Senior Software Engineer",
"context": "We are looking for a senior software engineer...",
"role": "Software Engineer",
"role_level": "senior",
"instructions": "Focus on problem-solving",
"duration": 30,
"tone": ["professional"],
"intro_question": "Tell me about a challenging project",
"intro_question_results": "Evaluating depth",
"scoring_low": 50,
"scoring_exclude": [],
"scoring_include": [3, 4, 5],
"customizable": True
}
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({
council_sage_id: 'c3d4e5f6-7890-4abc-def0-123456789abc',
context_id: 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
name: 'Senior Software Engineer',
context: 'We are looking for a senior software engineer...',
role: 'Software Engineer',
role_level: 'senior',
instructions: 'Focus on problem-solving',
duration: 30,
tone: ['professional'],
intro_question: 'Tell me about a challenging project',
intro_question_results: 'Evaluating depth',
scoring_low: 50,
scoring_exclude: [],
scoring_include: [3, 4, 5],
customizable: true
})
};
fetch('{protocol}://{host}:{port}/culture/{council_sage_id}/save/full', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "62437",
CURLOPT_URL => "{protocol}://{host}:{port}/culture/{council_sage_id}/save/full",
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([
'council_sage_id' => 'c3d4e5f6-7890-4abc-def0-123456789abc',
'context_id' => 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
'name' => 'Senior Software Engineer',
'context' => 'We are looking for a senior software engineer...',
'role' => 'Software Engineer',
'role_level' => 'senior',
'instructions' => 'Focus on problem-solving',
'duration' => 30,
'tone' => [
'professional'
],
'intro_question' => 'Tell me about a challenging project',
'intro_question_results' => 'Evaluating depth',
'scoring_low' => 50,
'scoring_exclude' => [
],
'scoring_include' => [
3,
4,
5
],
'customizable' => true
]),
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 := "{protocol}://{host}:{port}/culture/{council_sage_id}/save/full"
payload := strings.NewReader("{\n \"council_sage_id\": \"c3d4e5f6-7890-4abc-def0-123456789abc\",\n \"context_id\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\",\n \"name\": \"Senior Software Engineer\",\n \"context\": \"We are looking for a senior software engineer...\",\n \"role\": \"Software Engineer\",\n \"role_level\": \"senior\",\n \"instructions\": \"Focus on problem-solving\",\n \"duration\": 30,\n \"tone\": [\n \"professional\"\n ],\n \"intro_question\": \"Tell me about a challenging project\",\n \"intro_question_results\": \"Evaluating depth\",\n \"scoring_low\": 50,\n \"scoring_exclude\": [],\n \"scoring_include\": [\n 3,\n 4,\n 5\n ],\n \"customizable\": true\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("{protocol}://{host}:{port}/culture/{council_sage_id}/save/full")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"council_sage_id\": \"c3d4e5f6-7890-4abc-def0-123456789abc\",\n \"context_id\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\",\n \"name\": \"Senior Software Engineer\",\n \"context\": \"We are looking for a senior software engineer...\",\n \"role\": \"Software Engineer\",\n \"role_level\": \"senior\",\n \"instructions\": \"Focus on problem-solving\",\n \"duration\": 30,\n \"tone\": [\n \"professional\"\n ],\n \"intro_question\": \"Tell me about a challenging project\",\n \"intro_question_results\": \"Evaluating depth\",\n \"scoring_low\": 50,\n \"scoring_exclude\": [],\n \"scoring_include\": [\n 3,\n 4,\n 5\n ],\n \"customizable\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("{protocol}://{host}:{port}/culture/{council_sage_id}/save/full")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"council_sage_id\": \"c3d4e5f6-7890-4abc-def0-123456789abc\",\n \"context_id\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\",\n \"name\": \"Senior Software Engineer\",\n \"context\": \"We are looking for a senior software engineer...\",\n \"role\": \"Software Engineer\",\n \"role_level\": \"senior\",\n \"instructions\": \"Focus on problem-solving\",\n \"duration\": 30,\n \"tone\": [\n \"professional\"\n ],\n \"intro_question\": \"Tell me about a challenging project\",\n \"intro_question_results\": \"Evaluating depth\",\n \"scoring_low\": 50,\n \"scoring_exclude\": [],\n \"scoring_include\": [\n 3,\n 4,\n 5\n ],\n \"customizable\": true\n}"
response = http.request(request)
puts response.read_body{}Start full culture generation workflow
Starts a workflow run and asynchronously fires the full culture generation pipeline. Returns the workflow run payload immediately (~100ms). The actual generation happens in a background thread.
The workflow type is determined by the customizable flag:
trueor1→sageworkflow (full AI pipeline)falseor0→sage-ncworkflow (non-customizable, skips AI steps)
curl --request POST \
--url {protocol}://{host}:{port}/culture/{council_sage_id}/save/full \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"council_sage_id": "c3d4e5f6-7890-4abc-def0-123456789abc",
"context_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Senior Software Engineer",
"context": "We are looking for a senior software engineer...",
"role": "Software Engineer",
"role_level": "senior",
"instructions": "Focus on problem-solving",
"duration": 30,
"tone": [
"professional"
],
"intro_question": "Tell me about a challenging project",
"intro_question_results": "Evaluating depth",
"scoring_low": 50,
"scoring_exclude": [],
"scoring_include": [
3,
4,
5
],
"customizable": true
}
'import requests
url = "{protocol}://{host}:{port}/culture/{council_sage_id}/save/full"
payload = {
"council_sage_id": "c3d4e5f6-7890-4abc-def0-123456789abc",
"context_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"name": "Senior Software Engineer",
"context": "We are looking for a senior software engineer...",
"role": "Software Engineer",
"role_level": "senior",
"instructions": "Focus on problem-solving",
"duration": 30,
"tone": ["professional"],
"intro_question": "Tell me about a challenging project",
"intro_question_results": "Evaluating depth",
"scoring_low": 50,
"scoring_exclude": [],
"scoring_include": [3, 4, 5],
"customizable": True
}
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({
council_sage_id: 'c3d4e5f6-7890-4abc-def0-123456789abc',
context_id: 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
name: 'Senior Software Engineer',
context: 'We are looking for a senior software engineer...',
role: 'Software Engineer',
role_level: 'senior',
instructions: 'Focus on problem-solving',
duration: 30,
tone: ['professional'],
intro_question: 'Tell me about a challenging project',
intro_question_results: 'Evaluating depth',
scoring_low: 50,
scoring_exclude: [],
scoring_include: [3, 4, 5],
customizable: true
})
};
fetch('{protocol}://{host}:{port}/culture/{council_sage_id}/save/full', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "62437",
CURLOPT_URL => "{protocol}://{host}:{port}/culture/{council_sage_id}/save/full",
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([
'council_sage_id' => 'c3d4e5f6-7890-4abc-def0-123456789abc',
'context_id' => 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d',
'name' => 'Senior Software Engineer',
'context' => 'We are looking for a senior software engineer...',
'role' => 'Software Engineer',
'role_level' => 'senior',
'instructions' => 'Focus on problem-solving',
'duration' => 30,
'tone' => [
'professional'
],
'intro_question' => 'Tell me about a challenging project',
'intro_question_results' => 'Evaluating depth',
'scoring_low' => 50,
'scoring_exclude' => [
],
'scoring_include' => [
3,
4,
5
],
'customizable' => true
]),
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 := "{protocol}://{host}:{port}/culture/{council_sage_id}/save/full"
payload := strings.NewReader("{\n \"council_sage_id\": \"c3d4e5f6-7890-4abc-def0-123456789abc\",\n \"context_id\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\",\n \"name\": \"Senior Software Engineer\",\n \"context\": \"We are looking for a senior software engineer...\",\n \"role\": \"Software Engineer\",\n \"role_level\": \"senior\",\n \"instructions\": \"Focus on problem-solving\",\n \"duration\": 30,\n \"tone\": [\n \"professional\"\n ],\n \"intro_question\": \"Tell me about a challenging project\",\n \"intro_question_results\": \"Evaluating depth\",\n \"scoring_low\": 50,\n \"scoring_exclude\": [],\n \"scoring_include\": [\n 3,\n 4,\n 5\n ],\n \"customizable\": true\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("{protocol}://{host}:{port}/culture/{council_sage_id}/save/full")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"council_sage_id\": \"c3d4e5f6-7890-4abc-def0-123456789abc\",\n \"context_id\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\",\n \"name\": \"Senior Software Engineer\",\n \"context\": \"We are looking for a senior software engineer...\",\n \"role\": \"Software Engineer\",\n \"role_level\": \"senior\",\n \"instructions\": \"Focus on problem-solving\",\n \"duration\": 30,\n \"tone\": [\n \"professional\"\n ],\n \"intro_question\": \"Tell me about a challenging project\",\n \"intro_question_results\": \"Evaluating depth\",\n \"scoring_low\": 50,\n \"scoring_exclude\": [],\n \"scoring_include\": [\n 3,\n 4,\n 5\n ],\n \"customizable\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("{protocol}://{host}:{port}/culture/{council_sage_id}/save/full")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"council_sage_id\": \"c3d4e5f6-7890-4abc-def0-123456789abc\",\n \"context_id\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\",\n \"name\": \"Senior Software Engineer\",\n \"context\": \"We are looking for a senior software engineer...\",\n \"role\": \"Software Engineer\",\n \"role_level\": \"senior\",\n \"instructions\": \"Focus on problem-solving\",\n \"duration\": 30,\n \"tone\": [\n \"professional\"\n ],\n \"intro_question\": \"Tell me about a challenging project\",\n \"intro_question_results\": \"Evaluating depth\",\n \"scoring_low\": 50,\n \"scoring_exclude\": [],\n \"scoring_include\": [\n 3,\n 4,\n 5\n ],\n \"customizable\": true\n}"
response = http.request(request)
puts response.read_body{}Authorizations
User JWT token passed in Authorization header
Headers
Required JWT permission: council_sage (informational only -- enforced server-side)
Path Parameters
UUID of the council sage
Body
UUID of the council sage
UUID of the context
Display name for the sage
Role title
Experience level
Interview duration in minutes
Low scoring threshold percentage
Job description text
Interview instructions
Tone descriptors
Opening question
Evaluation criteria for intro question
Whether this is a customizable sage (true = full AI pipeline, false = non-customizable)
Language code for the interview
Response
Workflow run started, generation running asynchronously
Workflow run data from the workflow service