Capture a browser session's open tabs into its manifest
curl --request POST \
--url https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tabs": [
{
"url": "<string>",
"active": true,
"title": "<string>"
}
]
}
'import requests
url = "https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs"
payload = { "tabs": [
{
"url": "<string>",
"active": True,
"title": "<string>"
}
] }
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({tabs: [{url: '<string>', active: true, title: '<string>'}]})
};
fetch('https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs', 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/browser/sessions/{session_ref}/tabs",
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([
'tabs' => [
[
'url' => '<string>',
'active' => true,
'title' => '<string>'
]
]
]),
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://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs"
payload := strings.NewReader("{\n \"tabs\": [\n {\n \"url\": \"<string>\",\n \"active\": true,\n \"title\": \"<string>\"\n }\n ]\n}")
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://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tabs\": [\n {\n \"url\": \"<string>\",\n \"active\": true,\n \"title\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs")
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 = "{\n \"tabs\": [\n {\n \"url\": \"<string>\",\n \"active\": true,\n \"title\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"captured": 123,
"error": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>"
}Browser
Capture a browser session's open tabs into its manifest
Persist the session’s open-tab working set (URLs, titles, active tab) into its sandbox-resident manifest. Used at task handoff and while the user has the session open, so a cloud session that resumes to about:blank can be restored to the tabs the user actually had open.
When tabs is omitted the sandbox captures the live set itself from
the session’s daemon. Tab URLs never leave the user’s sandbox.
POST
/
api
/
v1
/
browser
/
sessions
/
{session_ref}
/
tabs
Capture a browser session's open tabs into its manifest
curl --request POST \
--url https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tabs": [
{
"url": "<string>",
"active": true,
"title": "<string>"
}
]
}
'import requests
url = "https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs"
payload = { "tabs": [
{
"url": "<string>",
"active": True,
"title": "<string>"
}
] }
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({tabs: [{url: '<string>', active: true, title: '<string>'}]})
};
fetch('https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs', 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/browser/sessions/{session_ref}/tabs",
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([
'tabs' => [
[
'url' => '<string>',
'active' => true,
'title' => '<string>'
]
]
]),
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://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs"
payload := strings.NewReader("{\n \"tabs\": [\n {\n \"url\": \"<string>\",\n \"active\": true,\n \"title\": \"<string>\"\n }\n ]\n}")
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://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tabs\": [\n {\n \"url\": \"<string>\",\n \"active\": true,\n \"title\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://neo.api.projectdiscovery.io/api/v1/browser/sessions/{session_ref}/tabs")
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 = "{\n \"tabs\": [\n {\n \"url\": \"<string>\",\n \"active\": true,\n \"title\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"captured": 123,
"error": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>"
}{
"error": "Bad request",
"code": "user_spending_cap_reached",
"error_id": "<string>",
"kind": "forbidden request",
"message": "<string>"
}Authorizations
BearerAuthApiKeyAuth
JWT authentication token
Path Parameters
Opaque browser session reference (brs_)
Query Parameters
Optional project ID for project sandbox scope (requires membership)
Body
application/json
Explicit tab set to persist (e.g. from the UI's live stream). Omit to have the sandbox capture the live set from the session's daemon.
Show child attributes
Show child attributes
⌘I

