curl --request GET \
--url https://neo.api.projectdiscovery.io/api/v1/tasks/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://neo.api.projectdiscovery.io/api/v1/tasks/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://neo.api.projectdiscovery.io/api/v1/tasks/{id}', 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://neo.api.projectdiscovery.io/api/v1/tasks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://neo.api.projectdiscovery.io/api/v1/tasks/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://neo.api.projectdiscovery.io/api/v1/tasks/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://neo.api.projectdiscovery.io/api/v1/tasks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"messages": [
{}
],
"task": {
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "active",
"title": "<string>",
"visibility": "private",
"completion_delivery": "webhook",
"created_by": "jsmith@example.com",
"is_isolated": true,
"is_scheduled": true,
"model": "<string>",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"redact_phrases": [
"<string>"
],
"sandbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"schedule_info": {
"execution_count": 123,
"schedule_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"schedule_status": "active",
"schedule_type": "recurring",
"execution_info": {
"execution_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduled_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"status": "pending",
"completed_at": "2023-11-07T05:31:56Z"
},
"last_executed_at": "2023-11-07T05:31:56Z",
"next_execution_at": "2023-11-07T05:31:56Z",
"scan_frequency": "hourly",
"schedule_name": "<string>",
"start_time": "<string>"
},
"secret_names": [
"<string>"
],
"source": "web",
"updated_at": "2023-11-07T05:31:56Z"
},
"blocked_reason": "<string>",
"can_continue": true,
"read_only": true,
"stream": {
"hasStream": true,
"failureCause": "<string>",
"last_seq": 123,
"run_config": {
"agent_id": "<string>",
"agent_ids": [
"<string>"
],
"ask_question": true,
"auto_execute": true,
"max_iterations": 2,
"max_steps": 102,
"memory_off": true,
"mode": "agent",
"model": "<string>",
"sandbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"streamId": "<string>",
"streamStatus": "<string>"
},
"streamUrls": [
{
"streamId": "<string>",
"url": "<string>",
"status": "<string>"
}
],
"streams": [
{
"created_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"stream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"completed_at": "2023-11-07T05:31:56Z",
"run_config": {
"agent_id": "<string>",
"agent_ids": [
"<string>"
],
"ask_question": true,
"auto_execute": true,
"max_iterations": 2,
"max_steps": 102,
"memory_off": true,
"mode": "agent",
"model": "<string>",
"sandbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
]
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>",
"turnstile_site_key": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>",
"turnstile_site_key": "<string>"
}Get task details
Retrieve task metadata and all messages for a specific task
curl --request GET \
--url https://neo.api.projectdiscovery.io/api/v1/tasks/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://neo.api.projectdiscovery.io/api/v1/tasks/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://neo.api.projectdiscovery.io/api/v1/tasks/{id}', 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://neo.api.projectdiscovery.io/api/v1/tasks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://neo.api.projectdiscovery.io/api/v1/tasks/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://neo.api.projectdiscovery.io/api/v1/tasks/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://neo.api.projectdiscovery.io/api/v1/tasks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"messages": [
{}
],
"task": {
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "active",
"title": "<string>",
"visibility": "private",
"completion_delivery": "webhook",
"created_by": "jsmith@example.com",
"is_isolated": true,
"is_scheduled": true,
"model": "<string>",
"project_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"redact_phrases": [
"<string>"
],
"sandbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"schedule_info": {
"execution_count": 123,
"schedule_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"schedule_status": "active",
"schedule_type": "recurring",
"execution_info": {
"execution_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduled_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"status": "pending",
"completed_at": "2023-11-07T05:31:56Z"
},
"last_executed_at": "2023-11-07T05:31:56Z",
"next_execution_at": "2023-11-07T05:31:56Z",
"scan_frequency": "hourly",
"schedule_name": "<string>",
"start_time": "<string>"
},
"secret_names": [
"<string>"
],
"source": "web",
"updated_at": "2023-11-07T05:31:56Z"
},
"blocked_reason": "<string>",
"can_continue": true,
"read_only": true,
"stream": {
"hasStream": true,
"failureCause": "<string>",
"last_seq": 123,
"run_config": {
"agent_id": "<string>",
"agent_ids": [
"<string>"
],
"ask_question": true,
"auto_execute": true,
"max_iterations": 2,
"max_steps": 102,
"memory_off": true,
"mode": "agent",
"model": "<string>",
"sandbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"streamId": "<string>",
"streamStatus": "<string>"
},
"streamUrls": [
{
"streamId": "<string>",
"url": "<string>",
"status": "<string>"
}
],
"streams": [
{
"created_at": "2023-11-07T05:31:56Z",
"status": "<string>",
"stream_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"completed_at": "2023-11-07T05:31:56Z",
"run_config": {
"agent_id": "<string>",
"agent_ids": [
"<string>"
],
"ask_question": true,
"auto_execute": true,
"max_iterations": 2,
"max_steps": 102,
"memory_off": true,
"mode": "agent",
"model": "<string>",
"sandbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
]
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>",
"turnstile_site_key": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>",
"turnstile_site_key": "<string>"
}Authorizations
JWT authentication token
Path Parameters
Task ID
Response
Task details with messages
Array of task messages
Show child attributes
Show child attributes
Stable machine-readable reason why can_continue is false. Omitted when continuation is allowed. Current values include read_only, isolated_workspace_purged, free_usage_exhausted, and free_task_budget_exhausted.
Whether the current viewer should be offered another run in this task. This is additive advisory metadata; task creation remains the authoritative admission check.
True when viewer has read-only access (e.g. team member viewing a team task)
Show child attributes
Show child attributes
Presigned URLs for stream content
Show child attributes
Show child attributes
Each agent run for this task, oldest first. Run settings are included when available.
Show child attributes
Show child attributes

