APIAPI та інтеграціїAPI ShardX LauncherProfiles

Profiles

Список профілів

GEThttp://127.0.0.1:40325/profiles

Повертає постійні профілі (тимчасові приховані), від нових до старих, закріплені; вгорі. Кожен запис доповнено актуальним станом запуску.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Responses
200Список профілів.application/json

Метадані профілю в лаунчері (повертаються при створенні).

idstring · uuidoptional
namestringoptional
notesstringoptional
proxy_idstring· nullableoptional
last_launched_atstring· nullableoptional

ISO-8601 або null.

created_atstring· nullableoptional
pinnedbooleanoptional
folderstringoptional
colorstring· nullableoptional

Акцентний колір значка у форматі #rrggbb; null означає, що колір визначається за назвою, як у браузері, коли колір не вибрано.

extensionsstring[]optional

Ідентифікатори бібліотеки розширень завантажуються під час запуску.

runningbooleanoptional
pidinteger · int64· nullableoptional
cdpobject · CdpInfo· nullableoptional

CDP-ендпоінт запущеного профілю.

Show propertiesHide properties
portintegeroptional

Порт remote-debugging

http_urlstringoptional

REST-база (/json, /json/version).

web_socket_debugger_urlstringoptional

WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.

401Відсутній або недійсний Bearer-токен.
GET/profiles
GET /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;
}
200Список профілів.
[
  {
    "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-..."
    }
  }
]

Створити профіль

POSThttp://127.0.0.1:40325/profiles

Зберігає профіль із переданого клієнтом об'єкта fingerprint точно як є (повторна рандомізація не виконується; унікалізація вже відбулася в /fingerprint/new). Використовуйте folder, щоб розмістити профіль у папці; прив'яжіть проксі за proxy_id зі сховища або інлайн через proxy (рядок, не зберігається у сховищі проксі).

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Body
application/json
namestringoptional
notesstringoptional
proxy_idstringoptional

Прив'язати проксі зі сховища (за id).

proxystringoptional

Прив'язати проксі рядком (host:port:user:pass або scheme://user:pass@host:port). Для постійного профілю проксі додається у сховище (дедуплікація за ендпоінтом) та проходить повний тест (UDP + гео), потім прив'язується за id; відображається у списку проксі, результат QUIC/WebRTC кешується. Для тимчасового профілю проксі прикріплюється інлайн (не зберігається). Ігнорується, якщо задано proxy_id.

folderstringoptional

Тег папки (ігнорується для /folders/{folder}/profiles; там пріоритет у шляху).

colorstringoptional

Акцентний колір піктограми вікна профілю та мітки з його назвою в адресному рядку. Якщо поле не вказано, колір піктограми визначається за назвою, а мітка зберігає колір панелі інструментів браузера.

extensionsstring[]optional

Ідентифікатори бібліотеки розширень (GET /extensions), завантажуються під час запуску. Бібліотека не має ідентифікатора 400, а не профілю, який автоматично запускається без нього.

refresh_rateinteger· min: 24· max: 480optional

Заявлена частота оновлення екрана, записана в screen.refresh_rate. Жоден веб-API не повідомляє це значення; сторінка оцінює його за часом виконання requestAnimationFrame. Якщо поле не вказано, використовується 60, а не частота екрана хоста. Кадри можна лише сповільнювати, тому фактична частота є найближчим цілим дільником частоти панелі хоста, що не перевищує вказане значення.

fingerprintobject · Fingerprintrequired

Зберігається дослівно. Отримайте з /fingerprint/new та за потреби відредагуйте.

Show propertiesHide properties
namestringoptional
notesstringoptional
seedintegeroptional

0 = режим лише перевизначень (типовий випадок).

navigatorobjectoptional
Show propertiesHide properties
user_agentstringoptional
platformstringoptional
hardware_concurrencyintegeroptional
device_memoryinteger · enumoptional
Possible values:81632
languagestringoptional
do_not_trackbooleanoptional
screenobjectoptional
Show propertiesHide properties
widthintegeroptional
heightintegeroptional
avail_widthintegeroptional
avail_heightintegeroptional
color_depthintegeroptional
device_pixel_rationumberoptional
color_gamutstring · enumoptional
Possible values:srgbp3rec2020
refresh_rateinteger· min: 24· max: 480optional

Заявлена частота оновлення екрана. Якщо поле не вказано, використовується 60. Див. поле refresh_rate у запитах створення та редагування.

client_hintsobjectoptional

Сімейство Sec-CH-UA (у browser.vision називається hints).

Show propertiesHide properties
platformstringoptional
platform_versionstringoptional
architecturestringoptional
bitnessstringoptional
mobilebooleanoptional
webglobjectoptional
Show propertiesHide properties
unmasked_vendorstringoptional
unmasked_rendererstringoptional
webgpuobjectoptional
webrtcstring · enumoptional

Режим обробки WebRTC.

Possible values:autotcp_onlyblock
noiseobject · NoisePrefsoptional

Налаштування антифінгерпринт-шуму за векторами. Кожен блок: {enabled, seed} (+ специфічні параметри). enabled:false = наскрізна передача.

Show propertiesHide properties
canvasobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

webglobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

intensitynumberoptional
audioobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

intensitynumberoptional
client_rectsobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

max_offsetnumberoptional
sensorsobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

fontsobject · NoiseBlockoptional

enabled:true приховує невелике детерміноване підмножество несуттєвих шрифтів для кожного профілю (решта реальних шрифтів хоста проходять наскрізь).

Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

networkobjectoptional
Show propertiesHide properties
blocked_portsinteger[]optional

Захист від сканування портів локальної мережі (ports_protection).

timezonestringoptional

Ім'я за IANA або "auto"; буде визначено через прив'язаний проксі при запуску.

Responses
200Метадані створеного профілю.application/json

Метадані профілю в лаунчері (повертаються при створенні).

idstring · uuidoptional
namestringoptional
notesstringoptional
proxy_idstring· nullableoptional
last_launched_atstring· nullableoptional

ISO-8601 або null.

created_atstring· nullableoptional
pinnedbooleanoptional
folderstringoptional
colorstring· nullableoptional

Акцентний колір значка у форматі #rrggbb; null означає, що колір визначається за назвою, як у браузері, коли колір не вибрано.

extensionsstring[]optional

Ідентифікатори бібліотеки розширень завантажуються під час запуску.

400Відсутній або не є об'єктом `fingerprint`, або нерозбірлива строка проксі.application/json
errorstringrequired
401Відсутній або недійсний Bearer-токен.
POST/profiles
POST /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"
}

Створити тимчасовий профіль

POSThttp://127.0.0.1:40325/profiles/temporary

Створює профіль із випадкового (або вказаного) відбитка бібліотеки, унікалізованого як в /fingerprint/new і збереженого дослівно, з прапорцем temporary: прихований зі списків і автоматично видаляється після закриття браузера (або при наступному запуску після краша). Використовуйте разом із POST /profiles/{id}/start.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Body
application/json
fingerprint_idstringoptional

Запис бібліотеки, на основі якого створюється профіль; якщо не вказано, обирається випадковий запис для platform.

platformstring · enumoptional

Використовується для вибору випадкового відбитка, якщо не вказано fingerprint_id; якщо не вказано жодного з них, береться ОС хоста.

Possible values:WindowsmacOSLinux
proxystringoptional

Інлайн-рядок проксі (не зберігається у сховищі).

namestringoptional
folderstringoptional
refresh_rateinteger· min: 24· max: 480optional

Заявлена частота оновлення екрана, записана в 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
canvasanyoptional
webglanyoptional
audioanyoptional
client_rectsanyoptional
sensorsanyoptional
fontsanyoptional
Responses
200Створений тимчасовий профіль.application/json
idstring · uuidoptional
namestringoptional
fingerprint_idstringoptional

Запис бібліотеки, на основі якого згенеровано профіль.

temporarybooleanoptional
proxy_inlinebooleanoptional

Чи був прикріплений інлайн-проксі.

400Нерозбірливий рядок проксі або невідомий вектор шуму.application/json
errorstringrequired
401Відсутній або недійсний Bearer-токен.
404Підходящий відбиток не знайдено / порожня бібліотека.application/json
errorstringrequired
POST/profiles/temporary
POST /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"
}

Отримати профіль

GEThttp://127.0.0.1:40325/profiles/{id}

Повертає повний збережений профіль: оболонку _meta плюс розгорнутий FingerprintConfig. Якщо профіль запущений; додаються running та cdp.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Path parameters
idstring · uuidrequired

UUID профілю.

Responses
200Збережений профіль.application/json

Повний профіль на диску: оболонка _meta плюс розгорнутий FingerprintConfig (всі поля Fingerprint на верхньому рівні). running/cdp присутні лише під час роботи профілю.

_metaobjectoptional
Show propertiesHide properties
idstring · uuidoptional
proxy_idstring· nullableoptional
inline_proxyobject · ProxyEntry· nullableoptional

Повний запис проксі (як вбудовано в _meta.inline_proxy).

Show propertiesHide properties
idstringoptional
namestringoptional
kindstring · enumoptional
Possible values:socks5httphttps
hoststringoptional
portintegeroptional
usernamestringoptional
passwordstringoptional
countrystringoptional
notesstringoptional
last_launched_atstring· nullableoptional
created_atstring· nullableoptional
pinnedbooleanoptional
folderstringoptional
temporarybooleanoptional
revintegeroptional

Кожен запис збільшує номер версії. Редактор робочого столу передає номер версії, на якому було відкрито профіль, тому збереження поверх зміни, внесеної через цей API, відхиляється, а не скасовується автоматично. Зміни через API не відхиляються: профіль читається і записується назад за один крок.

runningbooleanoptional
cdpobject · CdpInfo· nullableoptional

CDP-ендпоінт запущеного профілю.

Show propertiesHide properties
portintegeroptional

Порт remote-debugging

http_urlstringoptional

REST-база (/json, /json/version).

web_socket_debugger_urlstringoptional

WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.

401Відсутній або недійсний Bearer-токен.
404Профіль не знайдено.application/json
errorstringrequired
GET/profiles/123e4567-e89b-12d3-a456-426614174000
GET /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"
}

Видалити профіль

DELhttp://127.0.0.1:40325/profiles/{id}

Переміщує профіль до кошика, де його можна відновити протягом 7 днів. Після цього запис видаляється. До архіву входять облікові дані, cookies, логіни, вебдані, налаштування, Local Storage та IndexedDB, але не кеш. Початкові конфігурація й каталог даних користувача видаляються після створення архіву.

Тимчасові профілі видаляються трекером процесів після закриття браузера і до кошика не потрапляють.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Path parameters
idstring · uuidrequired

UUID профілю.

Responses
200Профіль переміщено в кошик.application/json
deletedbooleanoptional
idstring · uuidoptional
trashedbooleanoptional

Можна відновити з кошика протягом 7 днів.

401Відсутній або недійсний Bearer-токен.
500Помилка при видаленні.application/json
errorstringrequired
DEL/profiles/123e4567-e89b-12d3-a456-426614174000
DELETE /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"
}

Редагувати профіль

PATCHhttp://127.0.0.1:40325/profiles/{id}

Оновлює лише передані поля. Якщо передано fingerprint; він ЗАМІНЮЄ збережений дослівно (без перерандомізації). folder: "" прибирає профіль з папки; proxy_id: "" від'єднує проксі; рядок proxy зберігається (дедуплікація) + проходить повний тест, потім прив'язується. Повертає оновлений профіль.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Path parameters
idstring · uuidrequired

UUID профілю.

Body
application/json
namestringoptional
notesstringoptional
folderstringoptional

"" прибирає профіль з папки (переводить до «Усі»).

proxy_idstringoptional

"" від'єднує проксі.

proxystringoptional

Рядок проксі; зберігається (дедуплікація) + повний тест, потім прив'язується.

colorstringoptional

#rrggbb; "" повертається до кольору, похідного від назви.

extensionsstring[]optional

Замінює весь список; [] не завантажує нічого.

refresh_rateinteger· min: 24· max: 480optional

Заявлена частота оновлення екрана, застосована ПІСЛЯ fingerprint і записана в screen.refresh_rate. Жоден веб-API не повідомляє це значення; сторінка оцінює його за часом виконання requestAnimationFrame. Якщо поле не вказано, використовується 60, а не частота екрана хоста. Кадри можна лише сповільнювати, тому фактична частота є найближчим цілим дільником частоти панелі хоста, що не перевищує вказане значення.

fingerprintobject · Fingerprintoptional

При наявності ЗАМІНЮЄ збережений відбиток дослівно.

Show propertiesHide properties
namestringoptional
notesstringoptional
seedintegeroptional

0 = режим лише перевизначень (типовий випадок).

navigatorobjectoptional
Show propertiesHide properties
user_agentstringoptional
platformstringoptional
hardware_concurrencyintegeroptional
device_memoryinteger · enumoptional
Possible values:81632
languagestringoptional
do_not_trackbooleanoptional
screenobjectoptional
Show propertiesHide properties
widthintegeroptional
heightintegeroptional
avail_widthintegeroptional
avail_heightintegeroptional
color_depthintegeroptional
device_pixel_rationumberoptional
color_gamutstring · enumoptional
Possible values:srgbp3rec2020
refresh_rateinteger· min: 24· max: 480optional

Заявлена частота оновлення екрана. Якщо поле не вказано, використовується 60. Див. поле refresh_rate у запитах створення та редагування.

client_hintsobjectoptional

Сімейство Sec-CH-UA (у browser.vision називається hints).

Show propertiesHide properties
platformstringoptional
platform_versionstringoptional
architecturestringoptional
bitnessstringoptional
mobilebooleanoptional
webglobjectoptional
Show propertiesHide properties
unmasked_vendorstringoptional
unmasked_rendererstringoptional
webgpuobjectoptional
webrtcstring · enumoptional

Режим обробки WebRTC.

Possible values:autotcp_onlyblock
noiseobject · NoisePrefsoptional

Налаштування антифінгерпринт-шуму за векторами. Кожен блок: {enabled, seed} (+ специфічні параметри). enabled:false = наскрізна передача.

Show propertiesHide properties
canvasobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

webglobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

intensitynumberoptional
audioobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

intensitynumberoptional
client_rectsobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

max_offsetnumberoptional
sensorsobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

fontsobject · NoiseBlockoptional

enabled:true приховує невелике детерміноване підмножество несуттєвих шрифтів для кожного профілю (решта реальних шрифтів хоста проходять наскрізь).

Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Ентропія на профіль; 0 = обчислити автоматично.

networkobjectoptional
Show propertiesHide properties
blocked_portsinteger[]optional

Захист від сканування портів локальної мережі (ports_protection).

timezonestringoptional

Ім'я за IANA або "auto"; буде визначено через прив'язаний проксі при запуску.

Responses
200Оновлений збережений профіль.application/json

Повний профіль на диску: оболонка _meta плюс розгорнутий FingerprintConfig (всі поля Fingerprint на верхньому рівні). running/cdp присутні лише під час роботи профілю.

_metaobjectoptional
Show propertiesHide properties
idstring · uuidoptional
proxy_idstring· nullableoptional
inline_proxyobject · ProxyEntry· nullableoptional

Повний запис проксі (як вбудовано в _meta.inline_proxy).

Show propertiesHide properties
idstringoptional
namestringoptional
kindstring · enumoptional
Possible values:socks5httphttps
hoststringoptional
portintegeroptional
usernamestringoptional
passwordstringoptional
countrystringoptional
notesstringoptional
last_launched_atstring· nullableoptional
created_atstring· nullableoptional
pinnedbooleanoptional
folderstringoptional
temporarybooleanoptional
revintegeroptional

Кожен запис збільшує номер версії. Редактор робочого столу передає номер версії, на якому було відкрито профіль, тому збереження поверх зміни, внесеної через цей API, відхиляється, а не скасовується автоматично. Зміни через API не відхиляються: профіль читається і записується назад за один крок.

runningbooleanoptional
cdpobject · CdpInfo· nullableoptional

CDP-ендпоінт запущеного профілю.

Show propertiesHide properties
portintegeroptional

Порт remote-debugging

http_urlstringoptional

REST-база (/json, /json/version).

web_socket_debugger_urlstringoptional

WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.

400Невірний fingerprint (не об'єкт) або нерозбірливий проксі.application/json
errorstringrequired
401Відсутній або недійсний Bearer-токен.
404Профіль не знайдено.application/json
errorstringrequired
PATCH/profiles/123e4567-e89b-12d3-a456-426614174000
PATCH /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)

POSThttp://127.0.0.1:40325/profiles/{id}/start

Запускає ShardX-браузер для профілю з увімкненим remote-debugging, підставляє часовий пояс/локаль/гео з auto-полів через прив'язаний проксі та повертає CDP-ендпоінт після того, як Chrome записав DevToolsActivePort. CDP вмикається лише при запуску через API (запуски з UI не відкривають налагоджувальний порт; антидетект не страждає). cdp дорівнює null, якщо ендпоінт не вдалося прочитати протягом таймауту. Працює для звичайних та тимчасових профілів.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Path parameters
idstring · uuidrequired

UUID профілю.

Body
application/json

Необов'язково. Порожнє тіло запускає у графічному режимі.

headlessboolean· default: falseoptional

Запустити в headless-режимі (--headless=new).

Responses
200Запущено.application/json
profile_idstringoptional
pidinteger · int64optional

PID процесу ОС.

headlessbooleanoptional
cdpobject · CdpInfo· nullableoptional

CDP-ендпоінт запущеного профілю.

Show propertiesHide properties
portintegeroptional

Порт remote-debugging

http_urlstringoptional

REST-база (/json, /json/version).

web_socket_debugger_urlstringoptional

WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.

cdp_errorstring· nullableoptional

Чому cdp має значення null, коли воно є. В іншому випадку відсутні.

401Відсутній або недійсний Bearer-токен.
500Бінарний файл не налаштований / не вдалося запустити процес.application/json
errorstringrequired
POST/profiles/123e4567-e89b-12d3-a456-426614174000/start
POST /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"
}

Зупинити профіль

POSThttp://127.0.0.1:40325/profiles/{id}/stop

Відправляє браузеру сигнал graceful shutdown (SIGTERM на Unix; 5 секунд очікування, потім SIGKILL). Тимчасові профілі видаляються в процесі закриття. stopped дорівнює false, якщо профіль не був запущений.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Path parameters
idstring · uuidrequired

UUID профілю.

Responses
200Команда зупинки відправлена.application/json
profile_idstringoptional
stoppedbooleanoptional
401Відсутній або недійсний Bearer-токен.
POST/profiles/123e4567-e89b-12d3-a456-426614174000/stop
POST /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;
}
200Команда зупинки відправлена.
{
  "profile_id": "text",
  "stopped": true
}

Експортувати cookies

GEThttp://127.0.0.1:40325/profiles/{id}/cookies

Читає сховище cookies Chromium профілю та повертає всі cookies у розшифрованому вигляді. Працює як для запущеного, так і для зупиненого профілю. Порожній масив, якщо профіль жодного разу не запускався.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Path parameters
idstring · uuidrequired

UUID профілю.

Responses
200Печиво.application/json
cookiesobject · Cookie[]optional
Show propertiesHide properties
domainstringrequired

Хост cookie (Chromium host_key), наприклад ".example.com".

namestringrequired
valuestringrequired
pathstring· default: "/"optional
expiresnumber· nullableoptional

Unix-секунди; null/відсутній = сесійний cookie.

secureboolean· default: falseoptional
http_onlyboolean· default: falseoptional
same_sitestring · enumoptional

Регістронезалежно при імпорті.

Possible values:StrictLaxNoneunspecified
401Відсутній або недійсний Bearer-токен.
500Помилка читання або розшифрування БД cookies.application/json
errorstringrequired
GET/profiles/123e4567-e89b-12d3-a456-426614174000/cookies
GET /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

POSThttp://127.0.0.1:40325/profiles/{id}/cookies

Записує cookies у сховище профілю (повторно шифруючи за схемою Chromium v10). Профіль повинен бути зупинений; запущений браузер перезапише сховище при виході та затре імпорт.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Path parameters
idstring · uuidrequired

UUID профілю.

Body
application/json
cookiesobject · Cookie[]required
Show propertiesHide properties
domainstringrequired

Хост cookie (Chromium host_key), наприклад ".example.com".

namestringrequired
valuestringrequired
pathstring· default: "/"optional
expiresnumber· nullableoptional

Unix-секунди; null/відсутній = сесійний cookie.

secureboolean· default: falseoptional
http_onlyboolean· default: falseoptional
same_sitestring · enumoptional

Регістронезалежно при імпорті.

Possible values:StrictLaxNoneunspecified
Responses
200Імпортовано.application/json
importedintegeroptional

Кількість записаних cookies.

401Відсутній або недійсний Bearer-токен.
409Профіль запущений; спочатку зупиніть його.application/json
errorstringrequired
500Помилка запису БД cookies.application/json
errorstringrequired
POST/profiles/123e4567-e89b-12d3-a456-426614174000/cookies
POST /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"
}

Список запущених профілів

GEThttp://127.0.0.1:40325/running

Профілі з живим процесом браузера, включаючи CDP-ендпоінт при запуску через API.

Authorizations
bearerAuth
Authorizationstringrequired

Постійний JWT з Settings → Automation API.

Responses
200Запущені профілі.application/json
profile_idstringoptional
pidinteger · int64optional
cdpobject · CdpInfo· nullableoptional

CDP-ендпоінт запущеного профілю.

Show propertiesHide properties
portintegeroptional

Порт remote-debugging

http_urlstringoptional

REST-база (/json, /json/version).

web_socket_debugger_urlstringoptional

WS-ендпоінт рівня браузера для Puppeteer/Playwright connect.

401Відсутній або недійсний Bearer-токен.
GET/running
GET /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;
}
200Запущені профілі.
[
  {
    "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-..."
    }
  }
]

Оновлено

На цій сторінці