Profiles
Список профілів
http://127.0.0.1:40325/profilesПовертає постійні профілі (тимчасові приховані), від нових до старих, закріплені; вгорі. Кожен запис доповнено актуальним станом запуску.
Постійний JWT з Settings → Automation API.
200Список профілів.application/json
Метадані профілю в лаунчері (повертаються при створенні).
ISO-8601 або null.
Акцентний колір значка у форматі #rrggbb; null означає, що колір визначається за назвою, як у браузері, коли колір не вибрано.
Ідентифікатори бібліотеки розширень завантажуються під час запуску.
cdpobject · CdpInfo· nullableoptionalCDP-ендпоінт запущеного профілю.
Show propertiesHide properties
CDP-ендпоінт запущеного профілю.
Порт remote-debugging
REST-база (/json, /json/version).
WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.
401Відсутній або недійсний Bearer-токен.
/profilesGET /profiles HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/profiles' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/profiles")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/profiles");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"proxy_id": "text",
"last_launched_at": "text",
"created_at": "text",
"pinned": true,
"folder": "text",
"color": "text",
"extensions": [
"text"
],
"running": true,
"pid": 1,
"cdp": {
"port": 1,
"http_url": "http://127.0.0.1:53217",
"web_socket_debugger_url": "ws://127.0.0.1:53217/devtools/browser/ab12-..."
}
}
]Створити профіль
http://127.0.0.1:40325/profilesЗберігає профіль із переданого клієнтом об'єкта fingerprint точно
як є (повторна рандомізація не виконується; унікалізація вже
відбулася в /fingerprint/new). Використовуйте folder, щоб розмістити
профіль у папці; прив'яжіть проксі за proxy_id зі сховища або
інлайн через proxy (рядок, не зберігається у сховищі проксі).
Постійний JWT з Settings → Automation API.
Прив'язати проксі зі сховища (за id).
Прив'язати проксі рядком (host:port:user:pass або
scheme://user:pass@host:port). Для постійного профілю проксі
додається у сховище (дедуплікація за ендпоінтом) та проходить
повний тест (UDP + гео), потім прив'язується за id; відображається
у списку проксі, результат QUIC/WebRTC кешується. Для тимчасового
профілю проксі прикріплюється інлайн (не зберігається). Ігнорується,
якщо задано proxy_id.
Тег папки (ігнорується для /folders/{folder}/profiles; там пріоритет у шляху).
Акцентний колір піктограми вікна профілю та мітки з його назвою в адресному рядку. Якщо поле не вказано, колір піктограми визначається за назвою, а мітка зберігає колір панелі інструментів браузера.
Ідентифікатори бібліотеки розширень (GET /extensions), завантажуються під час запуску. Бібліотека не має ідентифікатора 400, а не профілю, який автоматично запускається без нього.
Заявлена частота оновлення екрана, записана в screen.refresh_rate. Жоден веб-API не повідомляє це значення; сторінка оцінює його за часом виконання requestAnimationFrame. Якщо поле не вказано, використовується 60, а не частота екрана хоста. Кадри можна лише сповільнювати, тому фактична частота є найближчим цілим дільником частоти панелі хоста, що не перевищує вказане значення.
fingerprintobject · FingerprintrequiredЗберігається дослівно. Отримайте з /fingerprint/new та за потреби відредагуйте.
Show propertiesHide properties
Зберігається дослівно. Отримайте з /fingerprint/new та за потреби відредагуйте.
0 = режим лише перевизначень (типовий випадок).
navigatorobjectoptionalShow propertiesHide properties
81632screenobjectoptionalShow propertiesHide properties
srgbp3rec2020Заявлена частота оновлення екрана. Якщо поле не вказано, використовується 60. Див. поле refresh_rate у запитах створення та редагування.
client_hintsobjectoptionalСімейство Sec-CH-UA (у browser.vision називається hints).
Show propertiesHide properties
Сімейство Sec-CH-UA (у browser.vision називається hints).
webglobjectoptionalShow propertiesHide properties
Режим обробки WebRTC.
autotcp_onlyblocknoiseobject · NoisePrefsoptionalНалаштування антифінгерпринт-шуму за векторами. Кожен блок: {enabled, seed}
(+ специфічні параметри). enabled:false = наскрізна передача.
Show propertiesHide properties
Налаштування антифінгерпринт-шуму за векторами. Кожен блок: {enabled, seed}
(+ специфічні параметри). enabled:false = наскрізна передача.
canvasobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
webglobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
audioobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
client_rectsobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
sensorsobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
fontsobject · NoiseBlockoptionalenabled:true приховує невелике детерміноване підмножество
несуттєвих шрифтів для кожного профілю (решта реальних шрифтів
хоста проходять наскрізь).
Show propertiesHide properties
enabled:true приховує невелике детерміноване підмножество
несуттєвих шрифтів для кожного профілю (решта реальних шрифтів
хоста проходять наскрізь).
Ентропія на профіль; 0 = обчислити автоматично.
networkobjectoptionalShow propertiesHide properties
Захист від сканування портів локальної мережі (ports_protection).
Ім'я за IANA або "auto"; буде визначено через прив'язаний проксі при запуску.
200Метадані створеного профілю.application/json
Метадані профілю в лаунчері (повертаються при створенні).
ISO-8601 або null.
Акцентний колір значка у форматі #rrggbb; null означає, що колір визначається за назвою, як у браузері, коли колір не вибрано.
Ідентифікатори бібліотеки розширень завантажуються під час запуску.
400Відсутній або не є об'єктом `fingerprint`, або нерозбірлива строка проксі.application/json
401Відсутній або недійсний Bearer-токен.
/profilesPOST /profiles HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"name": "text",
"notes": "text",
"proxy_id": "text",
"proxy": "socks5://user:[email protected]:1080",
"folder": "text",
"color": "#2FCB80",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}curl -X POST 'http://127.0.0.1:40325/profiles' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"name":"text","notes":"text","proxy_id":"text","proxy":"socks5://user:[email protected]:1080","folder":"text","color":"#2FCB80","extensions":["text"],"refresh_rate":60,"fingerprint":{"name":"text","notes":"text","seed":1,"navigator":{"user_agent":"text","platform":"Win32","hardware_concurrency":12,"device_memory":16,"language":"text","do_not_track":true},"screen":{"width":1,"height":1,"avail_width":1,"avail_height":1,"color_depth":24,"device_pixel_ratio":2,"color_gamut":"","refresh_rate":60},"client_hints":{"platform":"text","platform_version":"text","architecture":"x86","bitness":"64","mobile":true},"webgl":{"unmasked_vendor":"text","unmasked_renderer":"text"},"webgpu":{},"webrtc":"auto","noise":{"canvas":{"enabled":true,"seed":1},"webgl":{"enabled":true,"seed":1,"intensity":1},"audio":{"enabled":true,"seed":1,"intensity":1},"client_rects":{"enabled":true,"seed":1,"max_offset":1},"sensors":{"enabled":true,"seed":1},"fonts":{"enabled":true,"seed":1}},"network":{"blocked_ports":[1]},"timezone":"text"}}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"name": "text",
"notes": "text",
"proxy_id": "text",
"proxy": "socks5://user:[email protected]:1080",
"folder": "text",
"color": "#2FCB80",
"extensions": [
"text",
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": True,
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60,
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": True,
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text",
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": True,
"seed": 1,
},
"webgl": {
"enabled": True,
"seed": 1,
"intensity": 1,
},
"audio": {
"enabled": True,
"seed": 1,
"intensity": 1,
},
"client_rects": {
"enabled": True,
"seed": 1,
"max_offset": 1,
},
"sensors": {
"enabled": True,
"seed": 1,
},
"fonts": {
"enabled": True,
"seed": 1,
},
},
"network": {
"blocked_ports": [
1,
],
},
"timezone": "text",
},
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles";
const payload = {
"name": "text",
"notes": "text",
"proxy_id": "text",
"proxy": "socks5://user:[email protected]:1080",
"folder": "text",
"color": "#2FCB80",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
};
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles"
body := bytes.NewBufferString(`{
"name": "text",
"notes": "text",
"proxy_id": "text",
"proxy": "socks5://user:[email protected]:1080",
"folder": "text",
"color": "#2FCB80",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/profiles")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"name": "text",
"notes": "text",
"proxy_id": "text",
"proxy": "socks5://user:[email protected]:1080",
"folder": "text",
"color": "#2FCB80",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/profiles");
request.Content = new StringContent("""
{
"name": "text",
"notes": "text",
"proxy_id": "text",
"proxy": "socks5://user:[email protected]:1080",
"folder": "text",
"color": "#2FCB80",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"name": "text",
"notes": "text",
"proxy_id": "text",
"proxy": "socks5://user:[email protected]:1080",
"folder": "text",
"color": "#2FCB80",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"notes": "text",
"proxy_id": "text",
"last_launched_at": "text",
"created_at": "text",
"pinned": true,
"folder": "text",
"color": "text",
"extensions": [
"text"
]
}{
"error": "text"
}Створити тимчасовий профіль
http://127.0.0.1:40325/profiles/temporaryСтворює профіль із випадкового (або вказаного) відбитка бібліотеки,
унікалізованого як в /fingerprint/new і збереженого дослівно,
з прапорцем temporary: прихований зі списків і автоматично видаляється
після закриття браузера (або при наступному запуску після краша).
Використовуйте разом із POST /profiles/{id}/start.
Постійний JWT з Settings → Automation API.
Запис бібліотеки, на основі якого створюється профіль; якщо не вказано, обирається випадковий запис для platform.
Використовується для вибору випадкового відбитка, якщо не вказано fingerprint_id; якщо не вказано жодного з них, береться ОС хоста.
WindowsmacOSLinuxІнлайн-рядок проксі (не зберігається у сховищі).
Заявлена частота оновлення екрана, записана в screen.refresh_rate. Жоден веб-API не повідомляє це значення; сторінка оцінює його за часом виконання requestAnimationFrame. Якщо поле не вказано, використовується 60, а не частота екрана хоста. Кадри можна лише сповільнювати, тому фактична частота є найближчим цілим дільником частоти панелі хоста, що не перевищує вказане значення.
noiseobjectoptionalШум відбитка для кожного вектора. Вектори, яких немає в запиті, зберігають значення за замовчуванням (вимкнені).
Можна поєднати два формати в одному запиті:
скорочений: `{"canvas": true, "webgl": true}`; для `webgl` і `client_rects` також застосовується інтенсивність, яку використовує інтерфейс;
повний об’єкт: {"canvas": {"enabled": true, "seed": 42}}, у форматі відповіді GET /profiles/{id}.
Поля об’єднуються з налаштуваннями вектора, а не замінюють їх. Наприклад, {"webgl": {"intensity": 0.001}} не змінює enabled. Якщо seed дорівнює 0 або не вказаний, стабільне значення виводиться з ідентифікатора профілю, щоб два тимчасові профілі не отримали однаковий відбиток.
Show propertiesHide properties
Шум відбитка для кожного вектора. Вектори, яких немає в запиті, зберігають значення за замовчуванням (вимкнені).
Можна поєднати два формати в одному запиті:
скорочений: `{"canvas": true, "webgl": true}`; для `webgl` і `client_rects` також застосовується інтенсивність, яку використовує інтерфейс;
повний об’єкт: {"canvas": {"enabled": true, "seed": 42}}, у форматі відповіді GET /profiles/{id}.
Поля об’єднуються з налаштуваннями вектора, а не замінюють їх. Наприклад, {"webgl": {"intensity": 0.001}} не змінює enabled. Якщо seed дорівнює 0 або не вказаний, стабільне значення виводиться з ідентифікатора профілю, щоб два тимчасові профілі не отримали однаковий відбиток.
200Створений тимчасовий профіль.application/json
Запис бібліотеки, на основі якого згенеровано профіль.
Чи був прикріплений інлайн-проксі.
400Нерозбірливий рядок проксі або невідомий вектор шуму.application/json
401Відсутній або недійсний Bearer-токен.
404Підходящий відбиток не знайдено / порожня бібліотека.application/json
/profiles/temporaryPOST /profiles/temporary HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"fingerprint_id": "text",
"platform": "Windows",
"proxy": "text",
"name": "text",
"folder": "text",
"refresh_rate": 60,
"noise": {
"canvas": true,
"webgl": {
"enabled": true,
"intensity": 0.0005
},
"fonts": true
}
}curl -X POST 'http://127.0.0.1:40325/profiles/temporary' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"fingerprint_id":"text","platform":"Windows","proxy":"text","name":"text","folder":"text","refresh_rate":60,"noise":{"canvas":true,"webgl":{"enabled":true,"intensity":0.0005},"fonts":true}}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/temporary"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"fingerprint_id": "text",
"platform": "Windows",
"proxy": "text",
"name": "text",
"folder": "text",
"refresh_rate": 60,
"noise": {
"canvas": True,
"webgl": {
"enabled": True,
"intensity": 0.0005,
},
"fonts": True,
},
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/temporary";
const payload = {
"fingerprint_id": "text",
"platform": "Windows",
"proxy": "text",
"name": "text",
"folder": "text",
"refresh_rate": 60,
"noise": {
"canvas": true,
"webgl": {
"enabled": true,
"intensity": 0.0005
},
"fonts": true
}
};
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/temporary"
body := bytes.NewBufferString(`{
"fingerprint_id": "text",
"platform": "Windows",
"proxy": "text",
"name": "text",
"folder": "text",
"refresh_rate": 60,
"noise": {
"canvas": true,
"webgl": {
"enabled": true,
"intensity": 0.0005
},
"fonts": true
}
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/profiles/temporary")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"fingerprint_id": "text",
"platform": "Windows",
"proxy": "text",
"name": "text",
"folder": "text",
"refresh_rate": 60,
"noise": {
"canvas": true,
"webgl": {
"enabled": true,
"intensity": 0.0005
},
"fonts": true
}
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/profiles/temporary");
request.Content = new StringContent("""
{
"fingerprint_id": "text",
"platform": "Windows",
"proxy": "text",
"name": "text",
"folder": "text",
"refresh_rate": 60,
"noise": {
"canvas": true,
"webgl": {
"enabled": true,
"intensity": 0.0005
},
"fonts": true
}
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"fingerprint_id": "text",
"platform": "Windows",
"proxy": "text",
"name": "text",
"folder": "text",
"refresh_rate": 60,
"noise": {
"canvas": true,
"webgl": {
"enabled": true,
"intensity": 0.0005
},
"fonts": true
}
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/temporary");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"fingerprint_id": "text",
"temporary": true,
"proxy_inline": true
}{
"error": "text"
}{
"error": "text"
}Отримати профіль
http://127.0.0.1:40325/profiles/{id}Повертає повний збережений профіль: оболонку _meta плюс
розгорнутий FingerprintConfig. Якщо профіль запущений; додаються
running та cdp.
Постійний JWT з Settings → Automation API.
UUID профілю.
200Збережений профіль.application/json
Повний профіль на диску: оболонка _meta плюс розгорнутий
FingerprintConfig (всі поля Fingerprint на верхньому рівні).
running/cdp присутні лише під час роботи профілю.
_metaobjectoptionalShow propertiesHide properties
inline_proxyobject · ProxyEntry· nullableoptionalПовний запис проксі (як вбудовано в _meta.inline_proxy).
Show propertiesHide properties
Повний запис проксі (як вбудовано в _meta.inline_proxy).
socks5httphttpsКожен запис збільшує номер версії. Редактор робочого столу передає номер версії, на якому було відкрито профіль, тому збереження поверх зміни, внесеної через цей API, відхиляється, а не скасовується автоматично. Зміни через API не відхиляються: профіль читається і записується назад за один крок.
cdpobject · CdpInfo· nullableoptionalCDP-ендпоінт запущеного профілю.
Show propertiesHide properties
CDP-ендпоінт запущеного профілю.
Порт remote-debugging
REST-база (/json, /json/version).
WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.
401Відсутній або недійсний Bearer-токен.
404Профіль не знайдено.application/json
/profiles/123e4567-e89b-12d3-a456-426614174000GET /profiles/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"_meta": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"proxy_id": "text",
"inline_proxy": {
"id": "text",
"name": "text",
"kind": "socks5",
"host": "text",
"port": 1,
"username": "text",
"password": "text",
"country": "text",
"notes": "text"
},
"last_launched_at": "text",
"created_at": "text",
"pinned": true,
"folder": "text",
"temporary": true,
"rev": 1
},
"running": true,
"cdp": {
"port": 1,
"http_url": "http://127.0.0.1:53217",
"web_socket_debugger_url": "ws://127.0.0.1:53217/devtools/browser/ab12-..."
}
}{
"error": "text"
}Видалити профіль
http://127.0.0.1:40325/profiles/{id}Переміщує профіль до кошика, де його можна відновити протягом 7 днів. Після цього запис видаляється. До архіву входять облікові дані, cookies, логіни, вебдані, налаштування, Local Storage та IndexedDB, але не кеш. Початкові конфігурація й каталог даних користувача видаляються після створення архіву.
Тимчасові профілі видаляються трекером процесів після закриття браузера і до кошика не потрапляють.
Постійний JWT з Settings → Automation API.
UUID профілю.
200Профіль переміщено в кошик.application/json
Можна відновити з кошика протягом 7 днів.
401Відсутній або недійсний Bearer-токен.
500Помилка при видаленні.application/json
/profiles/123e4567-e89b-12d3-a456-426614174000DELETE /profiles/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X DELETE 'http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.delete(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000";
const response = await fetch(url, {
method: "DELETE",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000"
req, err := http.NewRequest("DELETE", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.delete("http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Delete, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"deleted": true,
"id": "123e4567-e89b-12d3-a456-426614174000",
"trashed": true
}{
"error": "text"
}Редагувати профіль
http://127.0.0.1:40325/profiles/{id}Оновлює лише передані поля. Якщо передано fingerprint; він
ЗАМІНЮЄ збережений дослівно (без перерандомізації).
folder: "" прибирає профіль з папки; proxy_id: "" від'єднує проксі;
рядок proxy зберігається (дедуплікація) + проходить повний тест,
потім прив'язується. Повертає оновлений профіль.
Постійний JWT з Settings → Automation API.
UUID профілю.
"" прибирає профіль з папки (переводить до «Усі»).
"" від'єднує проксі.
Рядок проксі; зберігається (дедуплікація) + повний тест, потім прив'язується.
#rrggbb; "" повертається до кольору, похідного від назви.
Замінює весь список; [] не завантажує нічого.
Заявлена частота оновлення екрана, застосована ПІСЛЯ fingerprint і записана в screen.refresh_rate. Жоден веб-API не повідомляє це значення; сторінка оцінює його за часом виконання requestAnimationFrame. Якщо поле не вказано, використовується 60, а не частота екрана хоста. Кадри можна лише сповільнювати, тому фактична частота є найближчим цілим дільником частоти панелі хоста, що не перевищує вказане значення.
fingerprintobject · FingerprintoptionalПри наявності ЗАМІНЮЄ збережений відбиток дослівно.
Show propertiesHide properties
При наявності ЗАМІНЮЄ збережений відбиток дослівно.
0 = режим лише перевизначень (типовий випадок).
navigatorobjectoptionalShow propertiesHide properties
81632screenobjectoptionalShow propertiesHide properties
srgbp3rec2020Заявлена частота оновлення екрана. Якщо поле не вказано, використовується 60. Див. поле refresh_rate у запитах створення та редагування.
client_hintsobjectoptionalСімейство Sec-CH-UA (у browser.vision називається hints).
Show propertiesHide properties
Сімейство Sec-CH-UA (у browser.vision називається hints).
webglobjectoptionalShow propertiesHide properties
Режим обробки WebRTC.
autotcp_onlyblocknoiseobject · NoisePrefsoptionalНалаштування антифінгерпринт-шуму за векторами. Кожен блок: {enabled, seed}
(+ специфічні параметри). enabled:false = наскрізна передача.
Show propertiesHide properties
Налаштування антифінгерпринт-шуму за векторами. Кожен блок: {enabled, seed}
(+ специфічні параметри). enabled:false = наскрізна передача.
canvasobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
webglobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
audioobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
client_rectsobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
sensorsobject · NoiseBlockoptionalShow propertiesHide properties
Ентропія на профіль; 0 = обчислити автоматично.
fontsobject · NoiseBlockoptionalenabled:true приховує невелике детерміноване підмножество
несуттєвих шрифтів для кожного профілю (решта реальних шрифтів
хоста проходять наскрізь).
Show propertiesHide properties
enabled:true приховує невелике детерміноване підмножество
несуттєвих шрифтів для кожного профілю (решта реальних шрифтів
хоста проходять наскрізь).
Ентропія на профіль; 0 = обчислити автоматично.
networkobjectoptionalShow propertiesHide properties
Захист від сканування портів локальної мережі (ports_protection).
Ім'я за IANA або "auto"; буде визначено через прив'язаний проксі при запуску.
200Оновлений збережений профіль.application/json
Повний профіль на диску: оболонка _meta плюс розгорнутий
FingerprintConfig (всі поля Fingerprint на верхньому рівні).
running/cdp присутні лише під час роботи профілю.
_metaobjectoptionalShow propertiesHide properties
inline_proxyobject · ProxyEntry· nullableoptionalПовний запис проксі (як вбудовано в _meta.inline_proxy).
Show propertiesHide properties
Повний запис проксі (як вбудовано в _meta.inline_proxy).
socks5httphttpsКожен запис збільшує номер версії. Редактор робочого столу передає номер версії, на якому було відкрито профіль, тому збереження поверх зміни, внесеної через цей API, відхиляється, а не скасовується автоматично. Зміни через API не відхиляються: профіль читається і записується назад за один крок.
cdpobject · CdpInfo· nullableoptionalCDP-ендпоінт запущеного профілю.
Show propertiesHide properties
CDP-ендпоінт запущеного профілю.
Порт remote-debugging
REST-база (/json, /json/version).
WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.
400Невірний fingerprint (не об'єкт) або нерозбірливий проксі.application/json
401Відсутній або недійсний Bearer-токен.
404Профіль не знайдено.application/json
/profiles/123e4567-e89b-12d3-a456-426614174000PATCH /profiles/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"name": "text",
"notes": "text",
"folder": "text",
"proxy_id": "text",
"proxy": "text",
"color": "text",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}curl -X PATCH 'http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"name":"text","notes":"text","folder":"text","proxy_id":"text","proxy":"text","color":"text","extensions":["text"],"refresh_rate":60,"fingerprint":{"name":"text","notes":"text","seed":1,"navigator":{"user_agent":"text","platform":"Win32","hardware_concurrency":12,"device_memory":16,"language":"text","do_not_track":true},"screen":{"width":1,"height":1,"avail_width":1,"avail_height":1,"color_depth":24,"device_pixel_ratio":2,"color_gamut":"","refresh_rate":60},"client_hints":{"platform":"text","platform_version":"text","architecture":"x86","bitness":"64","mobile":true},"webgl":{"unmasked_vendor":"text","unmasked_renderer":"text"},"webgpu":{},"webrtc":"auto","noise":{"canvas":{"enabled":true,"seed":1},"webgl":{"enabled":true,"seed":1,"intensity":1},"audio":{"enabled":true,"seed":1,"intensity":1},"client_rects":{"enabled":true,"seed":1,"max_offset":1},"sensors":{"enabled":true,"seed":1},"fonts":{"enabled":true,"seed":1}},"network":{"blocked_ports":[1]},"timezone":"text"}}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"name": "text",
"notes": "text",
"folder": "text",
"proxy_id": "text",
"proxy": "text",
"color": "text",
"extensions": [
"text",
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": True,
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60,
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": True,
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text",
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": True,
"seed": 1,
},
"webgl": {
"enabled": True,
"seed": 1,
"intensity": 1,
},
"audio": {
"enabled": True,
"seed": 1,
"intensity": 1,
},
"client_rects": {
"enabled": True,
"seed": 1,
"max_offset": 1,
},
"sensors": {
"enabled": True,
"seed": 1,
},
"fonts": {
"enabled": True,
"seed": 1,
},
},
"network": {
"blocked_ports": [
1,
],
},
"timezone": "text",
},
}
response = requests.patch(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000";
const payload = {
"name": "text",
"notes": "text",
"folder": "text",
"proxy_id": "text",
"proxy": "text",
"color": "text",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
};
const response = await fetch(url, {
method: "PATCH",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000"
body := bytes.NewBufferString(`{
"name": "text",
"notes": "text",
"folder": "text",
"proxy_id": "text",
"proxy": "text",
"color": "text",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}`)
req, err := http.NewRequest("PATCH", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.patch("http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"name": "text",
"notes": "text",
"folder": "text",
"proxy_id": "text",
"proxy": "text",
"color": "text",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Patch, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000");
request.Content = new StringContent("""
{
"name": "text",
"notes": "text",
"folder": "text",
"proxy_id": "text",
"proxy": "text",
"color": "text",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"name": "text",
"notes": "text",
"folder": "text",
"proxy_id": "text",
"proxy": "text",
"color": "text",
"extensions": [
"text"
],
"refresh_rate": 60,
"fingerprint": {
"name": "text",
"notes": "text",
"seed": 1,
"navigator": {
"user_agent": "text",
"platform": "Win32",
"hardware_concurrency": 12,
"device_memory": 16,
"language": "text",
"do_not_track": true
},
"screen": {
"width": 1,
"height": 1,
"avail_width": 1,
"avail_height": 1,
"color_depth": 24,
"device_pixel_ratio": 2,
"color_gamut": "",
"refresh_rate": 60
},
"client_hints": {
"platform": "text",
"platform_version": "text",
"architecture": "x86",
"bitness": "64",
"mobile": true
},
"webgl": {
"unmasked_vendor": "text",
"unmasked_renderer": "text"
},
"webgpu": {},
"webrtc": "auto",
"noise": {
"canvas": {
"enabled": true,
"seed": 1
},
"webgl": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"audio": {
"enabled": true,
"seed": 1,
"intensity": 1
},
"client_rects": {
"enabled": true,
"seed": 1,
"max_offset": 1
},
"sensors": {
"enabled": true,
"seed": 1
},
"fonts": {
"enabled": true,
"seed": 1
}
},
"network": {
"blocked_ports": [
1
]
},
"timezone": "text"
}
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"_meta": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"proxy_id": "text",
"inline_proxy": {
"id": "text",
"name": "text",
"kind": "socks5",
"host": "text",
"port": 1,
"username": "text",
"password": "text",
"country": "text",
"notes": "text"
},
"last_launched_at": "text",
"created_at": "text",
"pinned": true,
"folder": "text",
"temporary": true,
"rev": 1
},
"running": true,
"cdp": {
"port": 1,
"http_url": "http://127.0.0.1:53217",
"web_socket_debugger_url": "ws://127.0.0.1:53217/devtools/browser/ab12-..."
}
}{
"error": "text"
}{
"error": "text"
}Запустити профіль (з CDP)
http://127.0.0.1:40325/profiles/{id}/startЗапускає ShardX-браузер для профілю з увімкненим remote-debugging,
підставляє часовий пояс/локаль/гео з auto-полів через прив'язаний
проксі та повертає CDP-ендпоінт після того, як Chrome записав
DevToolsActivePort. CDP вмикається лише при запуску через API
(запуски з UI не відкривають налагоджувальний порт; антидетект не страждає).
cdp дорівнює null, якщо ендпоінт не вдалося прочитати протягом
таймауту. Працює для звичайних та тимчасових профілів.
Постійний JWT з Settings → Automation API.
UUID профілю.
Необов'язково. Порожнє тіло запускає у графічному режимі.
Запустити в headless-режимі (--headless=new).
200Запущено.application/json
PID процесу ОС.
cdpobject · CdpInfo· nullableoptionalCDP-ендпоінт запущеного профілю.
Show propertiesHide properties
CDP-ендпоінт запущеного профілю.
Порт remote-debugging
REST-база (/json, /json/version).
WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.
Чому cdp має значення null, коли воно є. В іншому випадку відсутні.
401Відсутній або недійсний Bearer-токен.
500Бінарний файл не налаштований / не вдалося запустити процес.application/json
/profiles/123e4567-e89b-12d3-a456-426614174000/startPOST /profiles/123e4567-e89b-12d3-a456-426614174000/start HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"headless": false
}curl -X POST 'http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/start' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"headless":false}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/start"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"headless": False,
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/start";
const payload = {
"headless": false
};
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/start"
body := bytes.NewBufferString(`{
"headless": false
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/start")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"headless": false
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/start");
request.Content = new StringContent("""
{
"headless": false
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"headless": false
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/start");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"profile_id": "text",
"pid": 1,
"headless": true,
"cdp": {
"port": 1,
"http_url": "http://127.0.0.1:53217",
"web_socket_debugger_url": "ws://127.0.0.1:53217/devtools/browser/ab12-..."
},
"cdp_error": "text"
}{
"error": "text"
}Зупинити профіль
http://127.0.0.1:40325/profiles/{id}/stopВідправляє браузеру сигнал graceful shutdown (SIGTERM на Unix; 5 секунд
очікування, потім SIGKILL). Тимчасові профілі видаляються в процесі закриття.
stopped дорівнює false, якщо профіль не був запущений.
Постійний JWT з Settings → Automation API.
UUID профілю.
200Команда зупинки відправлена.application/json
401Відсутній або недійсний Bearer-токен.
/profiles/123e4567-e89b-12d3-a456-426614174000/stopPOST /profiles/123e4567-e89b-12d3-a456-426614174000/stop HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X POST 'http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/stop' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/stop"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.post(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/stop";
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/stop"
req, err := http.NewRequest("POST", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/stop")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/stop");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/stop");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"profile_id": "text",
"stopped": true
}Експортувати cookies
http://127.0.0.1:40325/profiles/{id}/cookiesЧитає сховище cookies Chromium профілю та повертає всі cookies у розшифрованому вигляді. Працює як для запущеного, так і для зупиненого профілю. Порожній масив, якщо профіль жодного разу не запускався.
Постійний JWT з Settings → Automation API.
UUID профілю.
200Печиво.application/json
cookiesobject · Cookie[]optionalShow propertiesHide properties
Хост cookie (Chromium host_key), наприклад ".example.com".
Unix-секунди; null/відсутній = сесійний cookie.
Регістронезалежно при імпорті.
StrictLaxNoneunspecified401Відсутній або недійсний Bearer-токен.
500Помилка читання або розшифрування БД cookies.application/json
/profiles/123e4567-e89b-12d3-a456-426614174000/cookiesGET /profiles/123e4567-e89b-12d3-a456-426614174000/cookies HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": false,
"http_only": false,
"same_site": "Strict"
}
]
}{
"error": "text"
}Імпортувати cookies
http://127.0.0.1:40325/profiles/{id}/cookiesЗаписує cookies у сховище профілю (повторно шифруючи за схемою Chromium v10). Профіль повинен бути зупинений; запущений браузер перезапише сховище при виході та затре імпорт.
Постійний JWT з Settings → Automation API.
UUID профілю.
cookiesobject · Cookie[]requiredShow propertiesHide properties
Хост cookie (Chromium host_key), наприклад ".example.com".
Unix-секунди; null/відсутній = сесійний cookie.
Регістронезалежно при імпорті.
StrictLaxNoneunspecified200Імпортовано.application/json
Кількість записаних cookies.
401Відсутній або недійсний Bearer-токен.
409Профіль запущений; спочатку зупиніть його.application/json
500Помилка запису БД cookies.application/json
/profiles/123e4567-e89b-12d3-a456-426614174000/cookiesPOST /profiles/123e4567-e89b-12d3-a456-426614174000/cookies HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
{
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": false,
"http_only": false,
"same_site": "Strict"
}
]
}curl -X POST 'http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"cookies":[{"domain":"text","name":"text","value":"text","path":"/","expires":1,"secure":false,"http_only":false,"same_site":"Strict"}]}'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies"
headers = {
"Authorization": f"Bearer {token}",
}
payload = {
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": False,
"http_only": False,
"same_site": "Strict",
},
],
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies";
const payload = {
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": false,
"http_only": false,
"same_site": "Strict"
}
]
};
const response = await fetch(url, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());package main
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies"
body := bytes.NewBufferString(`{
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": false,
"http_only": false,
"same_site": "Strict"
}
]
}`)
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.post("http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies")
.header("Authorization", format!("Bearer {token}"))
.json(&serde_json::json!({
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": false,
"http_only": false,
"same_site": "Strict"
}
]
}))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Post, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies");
request.Content = new StringContent("""
{
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": false,
"http_only": false,
"same_site": "Strict"
}
]
}
""", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
headers = curl_slist_append(headers, "Content-Type: application/json");
const std::string body = R"json({
"cookies": [
{
"domain": "text",
"name": "text",
"value": "text",
"path": "/",
"expires": 1,
"secure": false,
"http_only": false,
"same_site": "Strict"
}
]
})json";
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/profiles/123e4567-e89b-12d3-a456-426614174000/cookies");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, static_cast<long>(body.size()));
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}{
"imported": 1
}{
"error": "text"
}{
"error": "text"
}Список запущених профілів
http://127.0.0.1:40325/runningПрофілі з живим процесом браузера, включаючи CDP-ендпоінт при запуску через API.
Постійний JWT з Settings → Automation API.
200Запущені профілі.application/json
cdpobject · CdpInfo· nullableoptionalCDP-ендпоінт запущеного профілю.
Show propertiesHide properties
CDP-ендпоінт запущеного профілю.
Порт remote-debugging
REST-база (/json, /json/version).
WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.
401Відсутній або недійсний Bearer-токен.
/runningGET /running HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl -X GET 'http://127.0.0.1:40325/running' \
-H 'Authorization: Bearer YOUR_SECRET_TOKEN'import requests
# Постійний JWT з Settings → Automation API.
token = "YOUR_SECRET_TOKEN"
url = "http://127.0.0.1:40325/running"
headers = {
"Authorization": f"Bearer {token}",
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)// Постійний JWT з Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";
const url = "http://127.0.0.1:40325/running";
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`,
},
});
console.log(response.status);
console.log(await response.text());package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
// Постійний JWT з Settings → Automation API.
token := "YOUR_SECRET_TOKEN"
url := "http://127.0.0.1:40325/running"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(out))
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Постійний JWT з Settings → Automation API.
let token = "YOUR_SECRET_TOKEN";
let client = reqwest::Client::new();
let response = client
.get("http://127.0.0.1:40325/running")
.header("Authorization", format!("Bearer {token}"))
.send()
.await?;
println!("{}", response.status());
println!("{}", response.text().await?);
Ok(())
}using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Постійний JWT з Settings → Automation API.
var token = "YOUR_SECRET_TOKEN";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var request = new HttpRequestMessage(HttpMethod.Get, "http://127.0.0.1:40325/running");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}// build: c++ -std=c++17 main.cpp -lcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) {
static_cast<std::string *>(userdata)->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
// Постійний JWT з Settings → Automation API.
const std::string token = "YOUR_SECRET_TOKEN";
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = curl_easy_init();
if (!curl) {
std::cerr << "curl_easy_init failed\n";
curl_global_cleanup();
return 1;
}
struct curl_slist *headers = nullptr;
headers = curl_slist_append(headers, ("Authorization: Bearer " + token).c_str());
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/running");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
const CURLcode rc = curl_easy_perform(curl);
if (rc != CURLE_OK) {
std::cerr << curl_easy_strerror(rc) << "\n";
} else {
long status = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
std::cout << status << "\n" << response << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return rc == CURLE_OK ? 0 : 1;
}[
{
"profile_id": "text",
"pid": 1,
"cdp": {
"port": 1,
"http_url": "http://127.0.0.1:53217",
"web_socket_debugger_url": "ws://127.0.0.1:53217/devtools/browser/ab12-..."
}
}
]Оновлено