curl --request POST \
--url https://api.egp.scale.com/v5/agent_configs \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"system_prompt": "<string>",
"model": "<string>",
"description": "<string>",
"allowed_tools": [],
"persistent_workspace": false,
"repos": [
{
"url": "<string>",
"path": "<string>",
"depth": 2
}
]
}
'import requests
url = "https://api.egp.scale.com/v5/agent_configs"
payload = {
"name": "<string>",
"system_prompt": "<string>",
"model": "<string>",
"description": "<string>",
"allowed_tools": [],
"persistent_workspace": False,
"repos": [
{
"url": "<string>",
"path": "<string>",
"depth": 2
}
]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
system_prompt: '<string>',
model: '<string>',
description: '<string>',
allowed_tools: [],
persistent_workspace: false,
repos: [{url: '<string>', path: '<string>', depth: 2}]
})
};
fetch('https://api.egp.scale.com/v5/agent_configs', 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.egp.scale.com/v5/agent_configs",
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([
'name' => '<string>',
'system_prompt' => '<string>',
'model' => '<string>',
'description' => '<string>',
'allowed_tools' => [
],
'persistent_workspace' => false,
'repos' => [
[
'url' => '<string>',
'path' => '<string>',
'depth' => 2
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.egp.scale.com/v5/agent_configs"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"model\": \"<string>\",\n \"description\": \"<string>\",\n \"allowed_tools\": [],\n \"persistent_workspace\": false,\n \"repos\": [\n {\n \"url\": \"<string>\",\n \"path\": \"<string>\",\n \"depth\": 2\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.egp.scale.com/v5/agent_configs")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"model\": \"<string>\",\n \"description\": \"<string>\",\n \"allowed_tools\": [],\n \"persistent_workspace\": false,\n \"repos\": [\n {\n \"url\": \"<string>\",\n \"path\": \"<string>\",\n \"depth\": 2\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.egp.scale.com/v5/agent_configs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"model\": \"<string>\",\n \"description\": \"<string>\",\n \"allowed_tools\": [],\n \"persistent_workspace\": false,\n \"repos\": [\n {\n \"url\": \"<string>\",\n \"path\": \"<string>\",\n \"depth\": 2\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"system_prompt": "<string>",
"harness": "<string>",
"allowed_tools": [
"<string>"
],
"model": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"object": "agent_config",
"description": "<string>",
"persistent_workspace": false,
"repos": [
{
"url": "<string>",
"path": "<string>",
"depth": 2
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Create Agent Config
Create a reusable agent configuration (system prompt, harness, model, allowed tools) under the caller’s account.
The config is a template that a chat session or a non-chat trigger later turns
into task params; creating one does not start any task. persistent_workspace
opts tasks made from this config into a durable /workspace that survives
sandbox death (off by default, and fixed once a task starts), and repos
overrides which repositories provisioning clones into that workspace — omit it
(null) to use the deployment default, or pass an empty list to clone nothing.
A repos override is rejected with a 422 on the model-agnostic (litellm)
harness unless persistent_workspace is also true, because non-persistent
litellm tasks run in a pre-cloned warm-pool sandbox where the override would be
ignored. allowed_tools may name MCP servers (Slack, Linear, GitHub, …)
alongside harness tools, and granting an MCP server name authorizes every tool
it exposes.
curl --request POST \
--url https://api.egp.scale.com/v5/agent_configs \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"system_prompt": "<string>",
"model": "<string>",
"description": "<string>",
"allowed_tools": [],
"persistent_workspace": false,
"repos": [
{
"url": "<string>",
"path": "<string>",
"depth": 2
}
]
}
'import requests
url = "https://api.egp.scale.com/v5/agent_configs"
payload = {
"name": "<string>",
"system_prompt": "<string>",
"model": "<string>",
"description": "<string>",
"allowed_tools": [],
"persistent_workspace": False,
"repos": [
{
"url": "<string>",
"path": "<string>",
"depth": 2
}
]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
system_prompt: '<string>',
model: '<string>',
description: '<string>',
allowed_tools: [],
persistent_workspace: false,
repos: [{url: '<string>', path: '<string>', depth: 2}]
})
};
fetch('https://api.egp.scale.com/v5/agent_configs', 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.egp.scale.com/v5/agent_configs",
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([
'name' => '<string>',
'system_prompt' => '<string>',
'model' => '<string>',
'description' => '<string>',
'allowed_tools' => [
],
'persistent_workspace' => false,
'repos' => [
[
'url' => '<string>',
'path' => '<string>',
'depth' => 2
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.egp.scale.com/v5/agent_configs"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"model\": \"<string>\",\n \"description\": \"<string>\",\n \"allowed_tools\": [],\n \"persistent_workspace\": false,\n \"repos\": [\n {\n \"url\": \"<string>\",\n \"path\": \"<string>\",\n \"depth\": 2\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.egp.scale.com/v5/agent_configs")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"model\": \"<string>\",\n \"description\": \"<string>\",\n \"allowed_tools\": [],\n \"persistent_workspace\": false,\n \"repos\": [\n {\n \"url\": \"<string>\",\n \"path\": \"<string>\",\n \"depth\": 2\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.egp.scale.com/v5/agent_configs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"model\": \"<string>\",\n \"description\": \"<string>\",\n \"allowed_tools\": [],\n \"persistent_workspace\": false,\n \"repos\": [\n {\n \"url\": \"<string>\",\n \"path\": \"<string>\",\n \"depth\": 2\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"system_prompt": "<string>",
"harness": "<string>",
"allowed_tools": [
"<string>"
],
"model": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"object": "agent_config",
"description": "<string>",
"persistent_workspace": false,
"repos": [
{
"url": "<string>",
"path": "<string>",
"depth": 2
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Headers
Body
1 - 2551 - 100000Harness strategy. See Harness enum for supported values.
claude-code, codex, litellm 1 - 2552000Tools enabled for this config. See AllowedTool enum for the catalogue.
Tools an agent config may be granted.
Granting an MCP server name (Slack, Linear, etc.) authorizes every tool exposed by that server, scoped via the agent's credentials.
Read, Write, Edit, Bash, Glob, Grep, List, WebFetch, WebSearch, Task, TodoWrite, NotebookEdit, ExitPlanMode, Slack, Linear, GitHub, Confluence, Notion, Datadog, PagerDuty, Salesforce, Figma, Granola, Jira, Gmail, GoogleCalendar, GoogleDrive, GoogleDocs, GoogleSheets, GoogleSlides, Snowflake, Redash, Tableau, Metabase, Gong, ZoomInfo, Clay Give tasks a persistent /workspace that survives sandbox death. Fixed for a task's life; defaults off.
Per-config repo override. None uses the deployment default; an empty list clones nothing.
Show child attributes
Show child attributes
Response
Successful Response
"agent_config"Show child attributes
Show child attributes

