curl --request POST \
--url https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names \
--header 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names"
payload = {}
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({})
};
fetch('https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names', 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.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names",
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([
]),
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 := "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names"
payload := strings.NewReader("{}")
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("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"success": true,
"splitTest": {
"locationId": "loc_9f7a123",
"campaignId": "campaign_speed_to_lead_123",
"primaryAgentId": "agent_1ffdb9717444d0e77346838911",
"status": "active",
"revision": 4,
"sync": {
"status": "healthy",
"failedAt": null
},
"variants": [
{
"agentId": "agent_1ffdb9717444d0e77346838911",
"name": "Speed to Lead",
"sequence": 1,
"weight": 50,
"status": "active",
"addedAt": "2026-08-14T09:12:44.318Z",
"removedAt": null,
"isPrimary": true
},
{
"agentId": "agent_7c4e1b28f0a94d6591cc2fd340",
"name": "Speed to Lead II",
"sequence": 2,
"weight": 50,
"status": "active",
"addedAt": "2026-08-20T16:04:02.771Z",
"removedAt": null,
"isPrimary": false
}
]
}
}{
"success": false,
"error": "VALIDATION",
"message": "Weights must include every active variant exactly once."
}{
"success": false,
"error": "Unauthorized",
"message": "Authentication required."
}{
"success": false,
"error": "AccessDenied",
"message": "You do not have access to this agent."
}{
"success": false,
"error": "NOT_FOUND",
"message": "This campaign does not have an Agent Split Test."
}{
"success": false,
"error": "TooManyRequests",
"message": "Too many requests, please try again later."
}{
"success": false,
"error": "InternalError",
"message": "Unexpected server error."
}{
"success": false,
"error": "SYNC_FAILED",
"message": "Could not update variant names. Retry."
}Normalise variant names
Rename the variants back to the convention: the Primary Variant takes the agent’s current name and each active secondary takes that name with its Roman numeral suffix. Use after renaming the primary, so the arms do not read as unrelated agents.
Removed variants keep the name they had. Returns the split unchanged when the names already match.
Renaming a variant also renames the underlying agent. If that cannot be carried through, the whole operation answers 502 and nothing is committed, so the names stay as they were rather than half-applied. Retry is safe.
Required API key scope: agents:write.
curl --request POST \
--url https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names \
--header 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names"
payload = {}
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({})
};
fetch('https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names', 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.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names",
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([
]),
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 := "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names"
payload := strings.NewReader("{}")
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("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/split-test/normalize-names")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"success": true,
"splitTest": {
"locationId": "loc_9f7a123",
"campaignId": "campaign_speed_to_lead_123",
"primaryAgentId": "agent_1ffdb9717444d0e77346838911",
"status": "active",
"revision": 4,
"sync": {
"status": "healthy",
"failedAt": null
},
"variants": [
{
"agentId": "agent_1ffdb9717444d0e77346838911",
"name": "Speed to Lead",
"sequence": 1,
"weight": 50,
"status": "active",
"addedAt": "2026-08-14T09:12:44.318Z",
"removedAt": null,
"isPrimary": true
},
{
"agentId": "agent_7c4e1b28f0a94d6591cc2fd340",
"name": "Speed to Lead II",
"sequence": 2,
"weight": 50,
"status": "active",
"addedAt": "2026-08-20T16:04:02.771Z",
"removedAt": null,
"isPrimary": false
}
]
}
}{
"success": false,
"error": "VALIDATION",
"message": "Weights must include every active variant exactly once."
}{
"success": false,
"error": "Unauthorized",
"message": "Authentication required."
}{
"success": false,
"error": "AccessDenied",
"message": "You do not have access to this agent."
}{
"success": false,
"error": "NOT_FOUND",
"message": "This campaign does not have an Agent Split Test."
}{
"success": false,
"error": "TooManyRequests",
"message": "Too many requests, please try again later."
}{
"success": false,
"error": "InternalError",
"message": "Unexpected server error."
}{
"success": false,
"error": "SYNC_FAILED",
"message": "Could not update variant names. Retry."
}Authorizations
Send your API key as Authorization: Bearer YOUR_API_KEY.
Path Parameters
Agent id of the Primary Variant. Every split operation is addressed through the primary, not through a secondary variant.
1Body
Request payload. Detailed schema pending — see the route handler.
