General information 📜
Browser profiles based on the "Anty" engine support launching with DevTools Protocol enabled. This allows you to connect to a profile through a port generated at startup and automate the browser using tools like Puppeteer, Playwright, Selenium, and others.
Basic automation includes three steps:
Start a profile via API with DevTools Protocol enabled.
Connect to the profile’s port using an automation tool (Puppeteer, Playwright, Selenium, Postman, etc.).
Run your own automation script through the open connection.
ℹ️ To use Dolphin{anty} automation, the app must be running and authorized. Authorization can be done with login/password or programmatically via a token. You can create a token in your personal account.
Request parameters for token authorization:
To avoid a 401 error, you must send a request
Method: POST
URL: http://localhost:3001/v1.0/auth/login-with-token
Header: Content-Type: application/json
Body:
{ "token": "API_TOKEN"}
Replace API_TOKEN
with your actual token from your Dolphin{anty} account on our site.
ChromeDriver ⬇️
ChromeDriver is the bridge between your script (e.g., Selenium) and the Dolphin{anty} browser. The standard driver can reveal automation, so we provide our own modified ChromeDriver for each browser version.
Examples of authorization request ⚙️
JavaScript example ▶️
JavaScript example ▶️
const axios = require('axios')
const apiUrl = 'http://localhost:3001/v1.0/auth/login-with-token'
const token = 'API_TOKEN'
const requestData = {token: token}
axios.post(apiUrl, requestData, {
headers: {'Content-Type': 'application/json'}
}).then(response => {
console.log('OK ', response.data)
})
.catch(error => {
console.error('Error ', error)})
Python example 🐍
Python example 🐍
import requests
api_url = 'http://localhost:3001/v1.0/auth/login-with-token'
token = 'API_TOKEN'
request_data = {'token': token}
headers = {'Content-Type': 'application/json'}
response = requests.post(api_url, json=request_data, headers=headers)
if response.status_code == 200:
print('OK ', response.json())
else:
print('Error ', response.status_code)
Java example ☕️
Java example ☕️
import java.net.URI;
import java.net.http.*;
public class Main {
public static void main(String[] args) throws Exception {
var client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
var req = HttpRequest.newBuilder(URI.create("http://localhost:3001/v1.0/auth/login-with-token"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(
"{\"token\":\"API_TOKEN\"}"
))
.build();
var res = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println("OK " + res.statusCode());
System.out.println("Body: " + res.body());}}
GO example 🏃
GO example 🏃
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
url := "http://localhost:3001/v1.0/auth/login-with-token"
data := []byte(`{"token":"API_TOKEN"}`)
r, e := http.Post(url, "application/json", bytes.NewBuffer(data))
if e != nil {
fmt.Println("Error:", e)
return
}
defer r.Body.Close()
b, _ := io.ReadAll(r.Body)
if r.StatusCode == http.StatusOK {
fmt.Println("OK", string(b))
} else {
fmt.Println("Error", r.Status, string(b))
}}
✅ If successful, the response will be:
{"success": true}
Step 1 — Start a profile via API ▶️
To start a browser profile via API, send a GET request:
http://localhost:3001/v1.0/browser_profiles/PROFILE_ID/start?automation=1
For headless mode:
http://localhost:3001/v1.0/browser_profiles/PROFILE_ID/start?automation=1&headless=1
PROFILE_ID
- the profile’s ID (you can get it via the API or in the Dolphin{anty} app when editing a profile).automation=1
- required for automation.
Example of starting via Postman by sending a request:
⚠️ Important notes:
Local API works only if Dolphin{anty} is running.
Requests must be sent from the same machine where the browser runs.
By default, the local API uses port 3001; if busy, another port is assigned (check in the Health window in Dolphin{anty}).
On the free plan, cookie import/export via API is not available due to no cloud sync.
API Response ✅
If the profile was started successfully, the response will look approximately like this (the values of the port and wsEndpoint fields may vary):
{
"success": true,
"automation": {
"port": 50568,
"wsEndpoint": "/devtools/browser/c71c1a9d-f07c-4dd9-84a9-53a4c6df9969" }}
Step 2 — Connect to the profile 🔌
Puppeteer
Puppeteer — Popular Google library for browser UI automation and testing. Originally made for launching Chrome and verifying UI, but supports almost any browser actions. Requires JavaScript/Node.js knowledge.
Code example:
Code example:
const puppeteer = require('puppeteer-core');
(async () => {
// СЮДА ВАШ port
const port = 50568;
// СЮДА ВАШ wsEndpoint
const wsEndpoint = '/devtools/browser/c71c1a9d-f07c-4dd9-84a9-53a4c6df9969';
// НЕПОСРЕДСТВЕННО ПОДКЛЮЧЕНИЕ
const browser = await puppeteer.connect({
browserWSEndpoint: `ws://127.0.0.1:${port}${wsEndpoint}`
});
// С ЭТОГО МОМЕНТ АВТОМАТИЗИРУЕМ, ЧТО ХОТИМ
// НАПРИМЕР, СНИМАЕМ СКРИНШОТ С ГУГЛА
const page = await browser.newPage();
await page.goto('https://google.com');
await page.screenshot({ path: 'google.png' });
await browser.close();
})();
Playwright
Playwright - A newer, modern alternative to Puppeteer by Microsoft with similar API and functionality.
Code example:
Code example:
const { chromium } = require('playwright');
(async () => {
// СЮДА ВАШ port
const port = 50568;
// СЮДА ВАШ wsEndpoint
const wsEndpoint = '/devtools/browser/c71c1a9d-f07c-4dd9-84a9-53a4c6df9969';
// НЕПОСРЕДСТВЕННО ПОДКЛЮЧЕНИЕ
const browser = await chromium.connectOverCDP(`ws://127.0.0.1:${port}${wsEndpoint}`);
// С ЭТОГО МОМЕНТ АВТОМАТИЗИРУЕМ, ЧТО ХОТИМ
// НАПРИМЕР, СНИМАЕМ СКРИНШОТ С ГУГЛА
const page = await browser.contexts()[0].newPage();
await page.goto('https://google.com');
await page.screenshot({path: 'google.png'});
await browser.close();
})();
Selenium
Connecting Selenium to a running browser is described in this article. It’s worth noting that Selenium uses the standard ChromeDriver, but websites can detect automation. Therefore, we recommend using our ChromeDriver — download it and specify its path in your code to hide Selenium usage.
Step 3 — Stop a profile ⛔️
To stop a browser profile via API, send a GET request:
http://localhost:3001/v1.0/browser_profiles/PROFILE_ID/stop