API — Пул портов

Открывайте пулы портов и управляйте ими — это партии портов, открываемых из списка прокси для крупных параллельных задач, — а затем экспортируйте результаты.

Открытие пула

ПримечаниеЭндпоинты Пула портов находятся по пути /scraper для обратной совместимости — это та же функция, что и кнопка + Пул портов в дашборде.
POST/api/v1/scraper/tasksТребуется авторизация

Открывает пул портов из списка прокси.

ПараметрТипОбязательныйОписание
namestringДаИмя пула.
sourceobjectДаОткуда берётся список прокси: kind — "file", "url" или "inline"; location — путь или ссылка; content несёт сам список для "inline". Необязательный refresh_interval перечитывает источник и задаётся целым числом НАНОСЕКУНД: 10 минут — это 600000000000, минута — 60000000000, 30 секунд — 30000000000. По умолчанию 10 мин; всё, что меньше 30 с, молча поднимается до 30 с и в ответе никак не отмечается — присланное 600 означает 600 наносекунд, и источник, в том числе внешний URL, будет перечитываться каждые 30 секунд. Поле default_scheme применяется к записям вида host:port без схемы (по умолчанию socks5).
targetintДаСколько портов должен открыть пул.
port_lointНетНижняя граница диапазона локальных портов, которым пул может пользоваться.
port_hiintНетВерхняя граница диапазона.
protocolstringНетПротокол портов пула: "socks5" (по умолчанию) или "http".
up_policyobjectНетКак часто порт меняет выходящий прокси. mode — "requests" (каждые n соединений), "minutes" (каждые n минут) или "on_error" (держать прокси, пока клиенту не будет отдана ошибка). По умолчанию — на каждом запросе. 🔴 При js_solver: true расписание НЕ ДЕЙСТВУЕТ: и up_policy, и fp_policy принудительно заменяются на «без частоты». Порт берёт выходящий прокси на первом соединении и держит его вместе с личностью всё время жизни порта; смена выхода происходит только внеочередно, после ошибки соединения (личность при этом не меняется). Единственное исключение — mode: on_error: он принуждение переживает и работает как описано.
fp_policyobjectНетКак часто порт меняет личность — тот же вид и те же три режима. По умолчанию — каждые 10 запросов. 🔴 То же принуждение при js_solver: true, см. up_policy выше: личность порта не меняется по расписанию совсем — кроме режима on_error.
devicestringНетСемейство браузера для личностей пула, например "chrome". Список — в GET /api/v1/scraper/device_matrix.
device_osstringНетОперационная система для личностей пула, например "windows".
profile_sourcestringНетОткуда берутся личности: "auto" генерирует их на лету, "db" берёт из выверенной базы.
auto_uaboolНетВыбирать личность по User-Agent запроса, а не по настройке пула.
spoof_headersboolНетПереписывать исходящие заголовки под текущий браузер. Рекомендуется для скраперов, включено по умолчанию.
connect_timeout_secondsintНетПотолок одной попытки набора для каждого порта пула, в секундах. По умолчанию 5.
request_timeout_secondsintНетБюджет молчания для каждого порта пула, в секундах: фаза набора вместе с повторами, затем ожидание первого байта. По умолчанию 30, значение 0 снимает ограничение.
idle_timeout_secintНетТаймаут простоя соединения на порте пула, в секундах: соединение закрывается, если столько времени в нём нет байтов. По умолчанию 60. Не путать с idle_seconds — тот закрывает сам порт. Прежнее имя request_timeout_sec по-прежнему принимается при чтении пула, сохранённого более ранней версией.
idle_secondsintНетВремя жизни порта, в секундах. Пул по умолчанию держит свои порты открытыми (0).
Пример (curl)
curl -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"tiktok-pool","target":100,"port_lo":20000,"port_hi":30000,
        "protocol":"socks5",
        "source":{"kind":"file","location":"C:/proxies.txt"},
        "up_policy":{"mode":"requests","n":1},
        "fp_policy":{"mode":"requests","n":10},
        "connect_timeout_seconds":5,"request_timeout_seconds":30}' \
  http://127.0.0.1:8891/api/v1/scraper/tasks
Ответ
{
  "id": "pool-7f3a",
  "export_token": "3b91c0d4e5f6",
  "warnings": null
}

🔴 id и export_token берутся ОТСЮДА: id подставляется в /scraper/tasks/{id}/…, а export_token — в адрес выгрузки /export/{token}/proxies.txt. Другого места, где их видно, нет — кроме GET /api/v1/scraper/tasks. warnings несёт РОВНО ОДНО замечание — «opened N of M ports (range LO-HI too small or ports busy)», если удалось открыть меньше портов, чем просили в target; если открылись все, поле приходит как null. Про источник прокси warnings не сообщает НИЧЕГО: ни сколько записей не разобралось, ни того, что источник вовсе не прочитался (404 или таймаут по URL, отсутствующий файл). В этом случае пул всё равно поднимается — с пустым списком выходов — и отвечает 200, а узнать о беде можно только по отказам трафика. Проверять источник надо ЗАРАНЕЕ, отдельной ручкой POST /api/v1/scraper/probe: она возвращает total (пригодных записей) и bad (битых).

403 «the scraper port pool requires a Pro license (single-thread Lite cannot open a port pool)» на тарифе Lite; 503 «scraper manager not configured», если пул в этой сборке не поднят; 400 с объяснением, если конфигурация не сходится: port_lo больше port_hi, target меньше 1, неизвестное значение profile_source, up_policy.mode, fp_policy.mode или vdns_mode, неизвестная либо несовместимая пара device и device_os. 🔴 Диапазон, которого не хватает на target, отказом НЕ является: пул открывает столько портов, сколько поместилось — в том числе НИ ОДНОГО, если все они заняты, — отвечает 200 и кладёт в warnings строку вида «opened 11 of 100 ports (range 20000-20010 too small or ports busy)». Поэтому проверяйте warnings, а не только код ответа.

Два умолчания ставятся на СОЗДАНИИ, а не хранятся в конфигурации: protocol, если он не задан, становится socks5 (чтобы работали UDP и HTTP/3), а vdns_mode — forced, то есть имя цели резолвится на стороне выхода и не утекает в DNS вашей сети. Явное "off" остаётся выключением.

ПримечаниеРежим on_error держит выходящий прокси и личность столько, сколько они работают, и меняет их, как только клиенту отдан ответ 4xx или 5xx. Ответы 2xx и 3xx считаются успехом, поэтому редиректы и ответы из кэша ротацию не вызывают. Решает статус, который получил ИМЕННО ВАШ клиент: если запрос встретил защиту и она была обработана так, что клиенту ушёл 200, ошибки не было. Пачка отказов одного умирающего прокси стоит одной смены, а не одной на каждый запрос. Режим доступен только пулу портов и требует порта, который разбирает трафик: на порте, открытом с tls_passthrough, статуса HTTP просто нет.

Продвинутые настройки портов пула

Пул открывает свои порты сам, поэтому настройка, не доехавшая до него, останется умолчанием — а форма при этом будет выглядеть применённой. Поля ниже кладутся на каждый порт пула.

ПолеТипЧто делает
js_solverboolChallenge Breaker на каждом порте пула: запросы, упёршиеся в проверку, уходят в пул решателя. Требует вскрытия TLS — несовместим с tls_passthrough. 🔴 Делает порт липким: up_policy и fp_policy пула перестают действовать по расписанию — один выходящий IP и одна личность на порт на всё время его жизни (исключения: режим on_error и внеочередная смена выхода после ошибки соединения). Так задумано: сессия, добытая разбором защиты, привязана к паре «выход + отпечаток», и смена любого из них посреди сессии её выбрасывает. Разнообразие выходов даёт ЧИСЛО портов пула, а не частота ротации — увеличивайте target и диапазон портов. Заметить подмену по API нельзя: GET /api/v1/scraper/tasks/{id}/config вернёт исходные up_policy и fp_policy, потому что принуждение применяется к работающему порту, а не к сохранённой конфигурации.
captcha_actionstringЧто делать, когда попалась капча, а не проверка без участия человека: rotate_retry (по умолчанию) — сменить личность и повторить; return_to_script — отдать челлендж вашему коду.
captcha_max_attemptsintСколько раз повторять со сменой личности при rotate_retry. По умолчанию 3.
keep_sessionsboolКаждый порт пула держит свою банку кук по доменам: впитывает Set-Cookie, подставляет куки и идёт по перенаправлениям. От js_solver не зависит.
cache_modestringРежим кэша на портах пула: normal, hard, hard-media или hard-autowarm.
cache_ignore_no_cacheboolКэшировать вопреки заголовку no-cache.
vdns_modestringВиртуальный DNS: off, on_leak или forced. 🔴 У НОВОГО пула, если поле не задано, ставится forced — имя цели резолвится на стороне выхода и не утекает в DNS вашей сети.
leak_guardstringПредстартовая проверка утечек для портов пула: off, warn или enforce.
force_ipv4boolВыходить только по IPv4.
tls_passthroughboolПропускать TLS насквозь. Тогда ни кэш, ни журнал, ни Challenge Breaker на портах пула не работают: содержимое не читается.
tls_mirrorboolПовторять наружу снятый отпечаток самого клиента вместо профиля.
h2_spoofingboolПодменять параметры HTTP/2 под профиль браузера.
spoof_user_agentboolПодменять User-Agent. Выключено — заголовок вашего клиента идёт байт в байт.
enable_http3boolПереоткрывать соединение по HTTP/3 там, где сайт предлагает h3.
upstream_tls_insecureboolСнять проверку сертификата у https-прокси. Только для своего прокси с самоподписанным сертификатом.
allow_mitm_upstreamboolРазрешить выход, который сам вскрывает TLS. По умолчанию запрещено: такой выход стирает отпечаток.
max_concurrentintПредел одновременных запросов на КАЖДОМ порте пула; 0 — без предела.
sem_timeoutintСколько секунд запрос ждёт места в этом пределе.
skip_retryboolНе повторять запрос после сетевой ошибки.
retry_delay_msintПауза между повторами, миллисекунды.
Примечаниеjs_solver и keep_sessions — ровно то, ради чего пул чаще всего и строят: обход заслонов и собственная сессия на каждый порт. Первое требует вскрытия TLS, поэтому вместе с tls_passthrough не работает.

Список и остановка пулов

GET/api/v1/scraper/tasksТребуется авторизация

Снимок всех пулов: сколько портов открыто, какие именно и в каком диапазоне они выданы.

Пример (curl)
curl -H "X-API-Key: YOUR_API_KEY" \
  http://127.0.0.1:8891/api/v1/scraper/tasks
Ответ
[
  {
    "id": "pool-7f3a",
    "name": "catalogue-pool",
    "target": 100,
    "ports_up": 98,
    "ports": [20000, 20001, 20002],
    "export_token": "3b91c0d4e5f6",
    "port_lo": 20000,
    "port_hi": 30000
  }
]
  • Пустой массив означает, что ни одного пула сейчас нет — это не ошибка. 503 «scraper manager not configured», если пул в этой сборке не поднят.
  • Числа прокси в источнике и состояния ротации в ответе НЕТ: сколько записей в источнике — отвечает POST /api/v1/scraper/probe (поле total), а какая ротация настроена — GET /api/v1/scraper/tasks/{id}/config (up_policy и fp_policy). Поле ports_up — счётчик поднятых портов, а ports — их номера.
DELETE/api/v1/scraper/tasks/{id}Требуется авторизация

Останавливает пул и закрывает все его порты. Трафик, идущий через них, обрывается.

Пример (curl)
curl -X DELETE -H "X-API-Key: YOUR_API_KEY" \
  http://127.0.0.1:8891/api/v1/scraper/tasks/pool-7f3a
Ответ
{
  "ok": true
}
  • 404 с текстом менеджера, если пула с таким идентификатором нет.
POST/api/v1/scraper/tasks/{id}/testТребуется авторизация

Прогоняет полную проверку порта пула — ту же, что POST /api/v1/port/{port}/test, — на одном из живых портов и возвращает, какой порт проверялся.

Пример (curl)
curl -X POST -H "X-API-Key: YOUR_API_KEY" \
  http://127.0.0.1:8891/api/v1/scraper/tasks/pool-7f3a/test
Ответ
{
  "port": 20134,
  "report": { "leak": { "…": "…" }, "fingerprint": { "match": true },
                "udp": { "supported": true }, "ok": true }
}
  • 409 «scraper task has no open ports yet», пока пул не поднял ни одного порта, и 409 «scraper task ports are not live», если порты уже не работают. 404, если пула нет.
GET/api/v1/scraper/tasks/{id}/configТребуется авторизация

Возвращает сохранённую конфигурацию пула в том самом виде, который принимает POST /api/v1/scraper/tasks: правку делают остановкой и повторным запуском.

Пример (curl)
curl -H "X-API-Key: YOUR_API_KEY" \
  http://127.0.0.1:8891/api/v1/scraper/tasks/pool-7f3a/config
Ответ
{
  "id": "pool-7f3a",
  "name": "catalogue-pool",
  "port_lo": 20000,
  "port_hi": 30000,
  "target": 100,
  "protocol": "socks5",
  "source": { "kind": "file", "location": "C:/proxies.txt" },
  "up_policy": { "mode": "requests", "n": 1 },
  "fp_policy": { "mode": "requests", "n": 10 },
  "vdns_mode": "forced",
  "export_token": "3b91c0d4e5f6"
}
  • 404 «task not found». Конфигурация несёт и продвинутые поля, которых нет в таблице открытия: cache_mode, leak_guard, js_solver, keep_sessions, captcha_action и три тайм-аута порта.
GET/api/v1/scraper/device_matrixТребуется авторизация

Перечисляет сочетания браузера и операционной системы, из которых можно собрать пул.

Пример (curl)
curl -H "X-API-Key: YOUR_API_KEY" \
  http://127.0.0.1:8891/api/v1/scraper/device_matrix
Ответ
{
  "chrome": ["windows", "macos", "linux", "android", "ios"],
  "edge": ["windows", "macos", "linux", "android", "ios"],
  "firefox": ["windows", "macos", "linux", "android", "ios"],
  "safari": ["macos", "ios"]
}
  • Значения отсюда кладут в поля device и device_os при открытии пула.
  • Единственное, чего не бывает, — Safari вне техники Apple. Таблица описывает, что примет проверка при ЯВНОМ выборе; device: random тянет более узкий набор — без iOS у Chrome, Firefox и Edge и без Android у Firefox и Edge, — на такие пары попадают только явным указанием.
POST/api/v1/scraper/probeТребуется авторизация

Скачивает и разбирает источник прокси, НЕ запуская пул: сколько записей пригодно, сколько битых, какие схемы встречаются и случайная выборка для собственной проверки связности.

ПараметрТипОбязательныйОписание
sourceobjectДаТот же объект источника, что у открытия пула: kind (file, url или inline), location и content.
Тело запроса
{ "source": { "kind": "url", "location": "https://example.com/proxies.txt" } }
Пример (curl)
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"source":{"kind":"url","location":"https://example.com/proxies.txt"}}' \
  http://127.0.0.1:8891/api/v1/scraper/probe
Ответ
{
  "total": 13045,
  "bad": 210,
  "by_scheme": { "socks5": 12835, "http": 210 },
  "sample": ["socks5://203.0.113.10:1080", "socks5://203.0.113.11:1080"]
}
  • 400 с объяснением, если источник не скачался или не разобрался. Тело ограничено 32 МиБ — столько весит список, вставленный целиком; проверка ограничена 35 секундами.
  • 403 при неактивной лицензии: ручка за лицензией, как и остальные проверки выхода.

Экспорт результатов

GET/export/{token}/proxies.txtБез авторизации

Скачивает порты пула в виде списка прокси в текстовом формате. Доступ предоставляется по токену в URL, поэтому API-ключ не требуется.

Пример (curl)
curl http://127.0.0.1:8891/export/TASK_TOKEN/proxies.txt