curl --request POST \
--url https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs \
--header 'Content-Type: application/json' \
--data '
{
"engine": "xhigh",
"research_plan": "<string>",
"struct": {},
"relentless": true,
"max_credits": 123,
"max_minutes": 725,
"dispatch_id": "<string>"
}
'import requests
url = "https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs"
payload = {
"engine": "xhigh",
"research_plan": "<string>",
"struct": {},
"relentless": True,
"max_credits": 123,
"max_minutes": 725,
"dispatch_id": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
engine: 'xhigh',
research_plan: '<string>',
struct: {},
relentless: true,
max_credits: 123,
max_minutes: 725,
dispatch_id: '<string>'
})
};
fetch('https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs', 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.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs",
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([
'engine' => 'xhigh',
'research_plan' => '<string>',
'struct' => [
],
'relentless' => true,
'max_credits' => 123,
'max_minutes' => 725,
'dispatch_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs"
payload := strings.NewReader("{\n \"engine\": \"xhigh\",\n \"research_plan\": \"<string>\",\n \"struct\": {},\n \"relentless\": true,\n \"max_credits\": 123,\n \"max_minutes\": 725,\n \"dispatch_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs")
.header("Content-Type", "application/json")
.body("{\n \"engine\": \"xhigh\",\n \"research_plan\": \"<string>\",\n \"struct\": {},\n \"relentless\": true,\n \"max_credits\": 123,\n \"max_minutes\": 725,\n \"dispatch_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"engine\": \"xhigh\",\n \"research_plan\": \"<string>\",\n \"struct\": {},\n \"relentless\": true,\n \"max_credits\": 123,\n \"max_minutes\": 725,\n \"dispatch_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"task_id": "<string>",
"status": "<string>",
"investigation": {
"id": "<string>",
"workspace_url": "<string>"
}
}{
"detail": "Invalid request body"
}{
"detail": "Invalid API key"
}{
"detail": "Insufficient API credits"
}{
"detail": "This organization no longer has access to Sixtyfour. Contact your representative at Sixtyfour."
}{
"detail": [
{
"loc": [
"body",
"target_company",
"domain"
],
"msg": "Field required",
"type": "missing",
"input": null,
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded"
}{
"detail": "Internal server error"
}{
"detail": "Could not verify the API key right now. Retry shortly."
}Continue an investigation
Run again into an investigation you already have.
The run reuses that investigation’s graph and workspace, so a follow-up builds on the earlier research instead of starting over. Resolved through the same scope as every other by-id route, so an investigation the caller may not see answers 404.
curl --request POST \
--url https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs \
--header 'Content-Type: application/json' \
--data '
{
"engine": "xhigh",
"research_plan": "<string>",
"struct": {},
"relentless": true,
"max_credits": 123,
"max_minutes": 725,
"dispatch_id": "<string>"
}
'import requests
url = "https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs"
payload = {
"engine": "xhigh",
"research_plan": "<string>",
"struct": {},
"relentless": True,
"max_credits": 123,
"max_minutes": 725,
"dispatch_id": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
engine: 'xhigh',
research_plan: '<string>',
struct: {},
relentless: true,
max_credits: 123,
max_minutes: 725,
dispatch_id: '<string>'
})
};
fetch('https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs', 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.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs",
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([
'engine' => 'xhigh',
'research_plan' => '<string>',
'struct' => [
],
'relentless' => true,
'max_credits' => 123,
'max_minutes' => 725,
'dispatch_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs"
payload := strings.NewReader("{\n \"engine\": \"xhigh\",\n \"research_plan\": \"<string>\",\n \"struct\": {},\n \"relentless\": true,\n \"max_credits\": 123,\n \"max_minutes\": 725,\n \"dispatch_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs")
.header("Content-Type", "application/json")
.body("{\n \"engine\": \"xhigh\",\n \"research_plan\": \"<string>\",\n \"struct\": {},\n \"relentless\": true,\n \"max_credits\": 123,\n \"max_minutes\": 725,\n \"dispatch_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sixtyfour.ai/v1/atlas/investigations/{investigation_id}/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"engine\": \"xhigh\",\n \"research_plan\": \"<string>\",\n \"struct\": {},\n \"relentless\": true,\n \"max_credits\": 123,\n \"max_minutes\": 725,\n \"dispatch_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"task_id": "<string>",
"status": "<string>",
"investigation": {
"id": "<string>",
"workspace_url": "<string>"
}
}{
"detail": "Invalid request body"
}{
"detail": "Invalid API key"
}{
"detail": "Insufficient API credits"
}{
"detail": "This organization no longer has access to Sixtyfour. Contact your representative at Sixtyfour."
}{
"detail": [
{
"loc": [
"body",
"target_company",
"domain"
],
"msg": "Field required",
"type": "missing",
"input": null,
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded"
}{
"detail": "Internal server error"
}{
"detail": "Could not verify the API key right now. Retry shortly."
}Headers
Path Parameters
Body
What a start or a continue may vary. Everything else about a run (the org it bills, the team it is stamped with, the identity that started it) comes from the credential, never the body.
Research engine. GET /v1/atlas/access reports which ones this organization may run, and what each costs.
xhigh, scout Direction for this run. On a continue, what to look into next.
Optional output schema. Atlas researches open-endedly into the workspace either way.
Research until the budget runs out (the Atlas default). Set false to let a run with struct stop once every field is answered, charging the turns it used (at least one unit).
How much research to buy, in credits (default: one unit of the engine price), up to 10 units. On xhigh every 250 credits buy 800 team turns, used in full unless the research stops yielding: 300 buys 960. Scout researches alone, and every 50 credits buy its 100 turns.
The longest the run may research, in minutes of working time: waits to retry a model call or an attempt do not count. When it is reached the run writes up what it found and completes, charging the credits its turns used, rounded up to the next 50, instead of the whole budget. Writing up can take a few minutes past the limit. Default: no limit.
10 <= x <= 1440Client-generated idempotency key. Reusing the same key for the same organization returns the existing run instead of starting and billing a duplicate, so a lost response is safe to retry.
8 - 128Was this page helpful?