curl --request POST \
--url 'https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data action=sagescreen_save_culture \
--data 'nonce=<string>' \
--data sage_id=123 \
--data 'role_title=<string>' \
--data 'instructions=<string>' \
--data 'intro_question=<string>' \
--data 'intro_reasoning=<string>' \
--data hire_threshold=123 \
--data-urlencode 'exclude%5B%5D=<string>' \
--data-urlencode 'include%5B%5D=<string>' \
--data-urlencode 'tone%5B%5D=<string>' \
--data 'evaluation_guideline=<string>' \
--data 'elevenlabs_voice_id=<string>' \
--data 'sage_language=<string>'import requests
url = "https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture"
payload = {
"action": "sagescreen_save_culture",
"nonce": "<string>",
"sage_id": "123",
"role_title": "<string>",
"instructions": "<string>",
"intro_question": "<string>",
"intro_reasoning": "<string>",
"hire_threshold": "123",
"exclude[]": "<string>",
"include[]": "<string>",
"tone[]": "<string>",
"evaluation_guideline": "<string>",
"elevenlabs_voice_id": "<string>",
"sage_language": "<string>"
}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: new URLSearchParams({
action: 'sagescreen_save_culture',
nonce: '<string>',
sage_id: '123',
role_title: '<string>',
instructions: '<string>',
intro_question: '<string>',
intro_reasoning: '<string>',
hire_threshold: '123',
'exclude[]': '<string>',
'include[]': '<string>',
'tone[]': '<string>',
evaluation_guideline: '<string>',
elevenlabs_voice_id: '<string>',
sage_language: '<string>'
})
};
fetch('https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture', 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://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E",
CURLOPT_HTTPHEADER => [
"Content-Type: application/x-www-form-urlencoded"
],
]);
$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://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture"
payload := strings.NewReader("action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture")
.header("Content-Type", "application/x-www-form-urlencoded")
.body("action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E")
.asString();require 'uri'
require 'net/http'
url = URI("https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/x-www-form-urlencoded'
request.body = "action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E"
response = http.request(request)
puts response.read_bodySave culture configuration (step 2 → 3)
Updates the council sage post with culture/evaluation settings. Duration is NOT updatable here — it comes from the base sage.
Permission: user must have ss_council_sage capability (or
ss_admin_all) and belong to the same council as the sage.
Non-customizable (system) sages cannot be edited and will return an error.
Registered as wp_ajax_sagescreen_save_culture — login required.
curl --request POST \
--url 'https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data action=sagescreen_save_culture \
--data 'nonce=<string>' \
--data sage_id=123 \
--data 'role_title=<string>' \
--data 'instructions=<string>' \
--data 'intro_question=<string>' \
--data 'intro_reasoning=<string>' \
--data hire_threshold=123 \
--data-urlencode 'exclude%5B%5D=<string>' \
--data-urlencode 'include%5B%5D=<string>' \
--data-urlencode 'tone%5B%5D=<string>' \
--data 'evaluation_guideline=<string>' \
--data 'elevenlabs_voice_id=<string>' \
--data 'sage_language=<string>'import requests
url = "https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture"
payload = {
"action": "sagescreen_save_culture",
"nonce": "<string>",
"sage_id": "123",
"role_title": "<string>",
"instructions": "<string>",
"intro_question": "<string>",
"intro_reasoning": "<string>",
"hire_threshold": "123",
"exclude[]": "<string>",
"include[]": "<string>",
"tone[]": "<string>",
"evaluation_guideline": "<string>",
"elevenlabs_voice_id": "<string>",
"sage_language": "<string>"
}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: new URLSearchParams({
action: 'sagescreen_save_culture',
nonce: '<string>',
sage_id: '123',
role_title: '<string>',
instructions: '<string>',
intro_question: '<string>',
intro_reasoning: '<string>',
hire_threshold: '123',
'exclude[]': '<string>',
'include[]': '<string>',
'tone[]': '<string>',
evaluation_guideline: '<string>',
elevenlabs_voice_id: '<string>',
sage_language: '<string>'
})
};
fetch('https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture', 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://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E",
CURLOPT_HTTPHEADER => [
"Content-Type: application/x-www-form-urlencoded"
],
]);
$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://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture"
payload := strings.NewReader("action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture")
.header("Content-Type", "application/x-www-form-urlencoded")
.body("action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E")
.asString();require 'uri'
require 'net/http'
url = URI("https://{domain}/wp-json/sagescreen/v1/wp-admin/admin-ajax.php?nonce=&action=sagescreen_save_culture")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/x-www-form-urlencoded'
request.body = "action=sagescreen_save_culture&nonce=%3Cstring%3E&sage_id=123&role_title=%3Cstring%3E&instructions=%3Cstring%3E&intro_question=%3Cstring%3E&intro_reasoning=%3Cstring%3E&hire_threshold=123&exclude%5B%5D=%3Cstring%3E&include%5B%5D=%3Cstring%3E&tone%5B%5D=%3Cstring%3E&evaluation_guideline=%3Cstring%3E&elevenlabs_voice_id=%3Cstring%3E&sage_language=%3Cstring%3E"
response = http.request(request)
puts response.read_bodyAuthorizations
WordPress AJAX nonce (passed as form field, verified per-action)
Body
"sagescreen_save_culture"WP nonce for sagescreen_frontend_nonce
"abc123def456"
WordPress post ID of the council sage
1234
Role title (required)
"Senior Software Engineer"
Custom instructions for the sage
"Focus on system design and architecture."
Opening question
"Tell me about your experience with distributed systems."
Reasoning behind the intro question
"Assesses distributed systems knowledge."
Minimum hire score (0-100)
75
Category IDs to exclude
["2"]
Category IDs to include
["1", "3"]
Tone attributes
["professional", "friendly"]
Evaluation strictness
"relaxed"
ElevenLabs voice ID
"EXAVITQu4vr4xnSDxMaL"
ISO language code
"en"