APIAPIs and integrationsShardX Launcher APIFolders

Folders

List folders

GEThttp://127.0.0.1:40325/folders

Distinct, non-empty folder tags across persistent profiles.

Authorizations
bearerAuth
Authorizationstringrequired

Permanent JWT from Settings → Automation API.

Responses
200Folder names.application/json
401Missing or invalid Bearer token.
GET/folders
GET /folders HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
curl -X GET 'http://127.0.0.1:40325/folders' \
  -H 'Authorization: Bearer YOUR_SECRET_TOKEN'
import requests

# Permanent JWT from Settings → Automation API.
token = "YOUR_SECRET_TOKEN"

url = "http://127.0.0.1:40325/folders"
headers = {
    "Authorization": f"Bearer {token}",
}

response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)
// Permanent JWT from Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";

const url = "http://127.0.0.1:40325/folders";

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() {
	// Permanent JWT from Settings → Automation API.
	token := "YOUR_SECRET_TOKEN"

	url := "http://127.0.0.1:40325/folders"

	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>> {
    // Permanent JWT from Settings → Automation API.
    let token = "YOUR_SECRET_TOKEN";

    let client = reqwest::Client::new();
    let response = client
        .get("http://127.0.0.1:40325/folders")
        .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()
    {
        // Permanent JWT from 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/folders");

        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() {
    // Permanent JWT from 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/folders");
    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;
}
200Folder names.
[
  "work",
  "scrapers"
]

Rename a folder

PATCHhttp://127.0.0.1:40325/folders/{folder}

Retags every profile in the folder. Returns the count.

Authorizations
bearerAuth
Authorizationstringrequired

Permanent JWT from Settings → Automation API.

Path parameters
folderstringrequired
Body
application/json
namestringrequired

New folder name.

Responses
200Renamed.application/json
renamed_tostringoptional
profilesintegeroptional

Profiles retagged.

401Missing or invalid Bearer token.
PATCH/folders/text
PATCH /folders/text HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*

{
  "name": "text"
}
curl -X PATCH 'http://127.0.0.1:40325/folders/text' \
  -H 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"name":"text"}'
import requests

# Permanent JWT from Settings → Automation API.
token = "YOUR_SECRET_TOKEN"

url = "http://127.0.0.1:40325/folders/text"
headers = {
    "Authorization": f"Bearer {token}",
}
payload = {
    "name": "text",
}

response = requests.patch(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)
// Permanent JWT from Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";

const url = "http://127.0.0.1:40325/folders/text";
const payload = {
  "name": "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() {
	// Permanent JWT from Settings → Automation API.
	token := "YOUR_SECRET_TOKEN"

	url := "http://127.0.0.1:40325/folders/text"
	body := bytes.NewBufferString(`{
  "name": "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>> {
    // Permanent JWT from Settings → Automation API.
    let token = "YOUR_SECRET_TOKEN";

    let client = reqwest::Client::new();
    let response = client
        .patch("http://127.0.0.1:40325/folders/text")
        .header("Authorization", format!("Bearer {token}"))
        .json(&serde_json::json!({
          "name": "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()
    {
        // Permanent JWT from 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/folders/text");
        request.Content = new StringContent("""
            {
              "name": "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() {
    // Permanent JWT from 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"
})json";

    std::string response;
    curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:40325/folders/text");
    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;
}
200Renamed.
{
  "renamed_to": "text",
  "profiles": 1
}

Delete a folder

DELhttp://127.0.0.1:40325/folders/{folder}

Deletes the folder tag. With delete_profiles=true the profiles in it are deleted too; otherwise they're unfiled (moved to "All").

Authorizations
bearerAuth
Authorizationstringrequired

Permanent JWT from Settings → Automation API.

Path parameters
folderstringrequired
Query parameters
delete_profilesboolean· default: falseoptional

Delete the profiles in the folder (default false = unfile).

Responses
200Deleted.application/json
deleted_folderstringoptional
delete_profilesbooleanoptional
profilesintegeroptional

Profiles affected.

401Missing or invalid Bearer token.
DEL/folders/text
DELETE /folders/text HTTP/1.1
Host: 127.0.0.1:40325
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
curl -X DELETE 'http://127.0.0.1:40325/folders/text' \
  -H 'Authorization: Bearer YOUR_SECRET_TOKEN'
import requests

# Permanent JWT from Settings → Automation API.
token = "YOUR_SECRET_TOKEN"

url = "http://127.0.0.1:40325/folders/text"
headers = {
    "Authorization": f"Bearer {token}",
}

response = requests.delete(url, headers=headers, timeout=30)
response.raise_for_status()
print(response.status_code)
print(response.text)
// Permanent JWT from Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";

const url = "http://127.0.0.1:40325/folders/text";

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() {
	// Permanent JWT from Settings → Automation API.
	token := "YOUR_SECRET_TOKEN"

	url := "http://127.0.0.1:40325/folders/text"

	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>> {
    // Permanent JWT from Settings → Automation API.
    let token = "YOUR_SECRET_TOKEN";

    let client = reqwest::Client::new();
    let response = client
        .delete("http://127.0.0.1:40325/folders/text")
        .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()
    {
        // Permanent JWT from 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/folders/text");

        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() {
    // Permanent JWT from 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/folders/text");
    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;
}
200Deleted.
{
  "deleted_folder": "text",
  "delete_profiles": true,
  "profiles": 1
}

Create a profile in a folder

POSThttp://127.0.0.1:40325/folders/{folder}/profiles

Same as POST /profiles, but the folder comes from the path (overriding any folder in the body).

Authorizations
bearerAuth
Authorizationstringrequired

Permanent JWT from Settings → Automation API.

Path parameters
folderstringrequired
Body
application/json
namestringoptional
notesstringoptional
proxy_idstringoptional

Bind a proxy already in the store (by id).

proxystringoptional

Attach a proxy by string (host:port:user:pass or scheme://user:pass@host:port). On a persistent profile it is added to the proxy store (deduped by endpoint) and full-tested (UDP + geo), then bound by id; so it appears in the proxy list and QUIC/WebRTC gating has a cached result. On a temporary profile it is attached inline (not stored). Ignored if proxy_id is set.

folderstringoptional

Folder tag (ignored on /folders/{folder}/profiles, which wins).

colorstringoptional

Accent for the profile's window icon and for the pill carrying its name in the omnibox. Omit it and the icon derives a colour from the name while the pill keeps the browser's own toolbar colour.

extensionsstring[]optional

Extension-library ids (GET /extensions), loaded at launch. An id the library does not hold is a 400 rather than a profile that silently starts without it.

refresh_rateinteger· min: 24· max: 480optional

Claimed display refresh rate, written into screen.refresh_rate. No web API reports it; a page measures it by timing requestAnimationFrame, which is why leaving it out is not neutral; absent means 60, what most machines report, rather than whatever the host's own screen does. Frames can only be slowed, so the effective rate is the closest whole division of the host's panel at or under this.

fingerprintobject · Fingerprintrequired

Stored verbatim. Get one from /fingerprint/new and edit as needed.

Show propertiesHide properties
namestringoptional
notesstringoptional
seedintegeroptional

0 = overrides-only mode (the common case).

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

How often the claimed display refreshes. Absent means 60. See the refresh_rate field on the create/edit requests.

client_hintsobjectoptional

Sec-CH-UA family (browser.vision calls this hints).

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

WebRTC handling mode.

Possible values:autotcp_onlyblock
noiseobject · NoisePrefsoptional

Per-vector anti-fingerprint noise. Each block is {enabled, seed} (+ feature-specific knobs). enabled:false = pass-through.

Show propertiesHide properties
canvasobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Per-profile entropy; 0 = derive automatically.

webglobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Per-profile entropy; 0 = derive automatically.

intensitynumberoptional
audioobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Per-profile entropy; 0 = derive automatically.

intensitynumberoptional
client_rectsobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Per-profile entropy; 0 = derive automatically.

max_offsetnumberoptional
sensorsobject · NoiseBlockoptional
Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Per-profile entropy; 0 = derive automatically.

fontsobject · NoiseBlockoptional

enabled:true hides a small deterministic per-profile subset of non-essential fonts (real host fonts otherwise pass through).

Show propertiesHide properties
enabledbooleanoptional
seedintegeroptional

Per-profile entropy; 0 = derive automatically.

networkobjectoptional
Show propertiesHide properties
blocked_portsinteger[]optional

Local-network port-scan defense (ports_protection).

timezonestringoptional

IANA name, or "auto" to resolve from the bound proxy at launch.

Responses
200Created profile metadata.application/json

Launcher-facing profile metadata (returned by create).

idstring · uuidoptional
namestringoptional
notesstringoptional
proxy_idstring· nullableoptional
last_launched_atstring· nullableoptional

ISO-8601 or null.

created_atstring· nullableoptional
pinnedbooleanoptional
folderstringoptional
colorstring· nullableoptional

Icon accent as #rrggbb; null means it is derived from the name, which is what the browser does when nothing is chosen.

extensionsstring[]optional

Extension-library ids loaded at launch.

400Missing/!object `fingerprint`, or an unparseable proxy string.application/json
errorstringrequired
401Missing or invalid Bearer token.
POST/folders/text/profiles
POST /folders/text/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/folders/text/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

# Permanent JWT from Settings → Automation API.
token = "YOUR_SECRET_TOKEN"

url = "http://127.0.0.1:40325/folders/text/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)
// Permanent JWT from Settings → Automation API.
const token = "YOUR_SECRET_TOKEN";

const url = "http://127.0.0.1:40325/folders/text/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() {
	// Permanent JWT from Settings → Automation API.
	token := "YOUR_SECRET_TOKEN"

	url := "http://127.0.0.1:40325/folders/text/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>> {
    // Permanent JWT from Settings → Automation API.
    let token = "YOUR_SECRET_TOKEN";

    let client = reqwest::Client::new();
    let response = client
        .post("http://127.0.0.1:40325/folders/text/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()
    {
        // Permanent JWT from 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/folders/text/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() {
    // Permanent JWT from 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/folders/text/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"
}

Last updated on

On this page