Содержание
Быстрый стартАутентификацияСоздание задания Получение результатаБалансТипы заданий Коды ошибокЛимитыОграничение по IP Примеры кодаЧастые вопросы
Для разработчиков

Документация API

Базовый адрес: https://api.privateproxy.ru — все запросы POST, тело в JSON.

Быстрый старт

Порядок работы: зарегистрируйтесь, подтвердите почту, создайте ключ в кабинете, пополните баланс — и отправляйте задания.

Схема простая: отправили задание → получили идентификатор → опрашиваете результат. Деньги списываются только за успешный ответ.

Аутентификация

Ключ передаётся в теле запроса полем app_id. Дополнительно поддерживаются поле key и заголовок X-API-Key — используйте любой удобный.

// любой из трёх вариантов
{"app_id": "cpx_ваш_ключ", ...}
{"key":    "cpx_ваш_ключ", ...}
// или заголовком
X-API-Key: cpx_ваш_ключ

Ключ показывается полностью только один раз при создании. В базе он хранится в виде хеша, восстановить его нельзя — потеряли, создайте новый.

Создание задания

POST https://api.privateproxy.ru/create

ПолеТипОписание
typestringТип задания: SmartCaptcha или TextCaptcha
app_idstringВаш API-ключ
clickbase64Изображение поля с иконками. Только для SmartCaptcha
taskbase64Полоса-задание (SmartCaptcha) либо картинка с текстом (TextCaptcha)
curl -X POST https://api.privateproxy.ru/create \
  -H 'Content-Type: application/json' \
  -d '{"type":"SmartCaptcha","app_id":"cpx_ваш_ключ","click":"iVBORw0K...","task":"iVBORw0K..."}'

Ответ:

{"status": 1, "response": "8f2c1e5a4b9d..."}

response — идентификатор задания, по нему забирается результат. При ошибке status равен 0, а в response текст ошибки.

Получение результата

POST https://api.privateproxy.ru/result

curl -X POST https://api.privateproxy.ru/result \
  -H 'Content-Type: application/json' \
  -d '{"id":"8f2c1e5a4b9d...","app_id":"cpx_ваш_ключ"}'
ОтветЗначение
{"status":1,"response":"coordinates:x=52.4,y=118.0"}Готово, вот ответ
{"status":-1,"response":"CAPCHA_NOT_READY"}Ещё решается — опросите снова
{"status":0,"response":"ERROR:..."}Решить не удалось, деньги не списаны

Как опрашивать правильно. Первый запрос результата делайте через 1 секунду после создания, дальше — раз в 300–500 мс. Не опрашивайте чаще: это тратит ваш лимит запросов и не ускоряет ответ. Типичное время решения SmartCaptcha — около 100 мс, текстовой — до секунды.

Формат ответа SmartCaptcha

Координаты точек для клика, в том порядке, в котором нужно кликать:

coordinates:x=52.4,y=118.0;x=140.9,y=61.2;x=205.7,y=143.5

Координаты — в пикселях относительно левого верхнего угла присланного изображения поля.

Баланс

POST https://api.privateproxy.ru/balance с полем app_id.

{"status": 1, "response": "1250.00"}  // rubli

Типы заданий

КодЧто решаетПоляЦена за 1000
SmartCaptchaKliknut nuzhnye ikonki na kartinke v zadannom poryadke click + task 70 ₽ / 1000
TextCaptchaRaspoznat tekst s kartinki task 55 ₽ / 1000

Коды ошибок

КодЧто означает и что делать
ERROR_KEY_DOES_NOT_EXISTКлюч не найден. Проверьте, что передаёте его в app_id без лишних пробелов
ERROR_IP_BANNEDIP заблокирован. Обычно — следствие множества запросов с неверным ключом. Снимается в кабинете или поддержкой
ERROR_ZERO_BALANCEНедостаточно средств, пополните баланс
ERROR_NO_SLOT_AVAILABLEПревышен лимит одновременных заданий по ключу
CAPCHA_NOT_READYНе ошибка: задание ещё решается
ERROR:solve_failedРешить не удалось. Деньги не списываются, отправьте задание заново
Важно про блокировку. Если слать запросы с неверным ключом, после 50 неудачных попыток IP уходит в бан на 3 часа. Поэтому при получении ERROR_KEY_DOES_NOT_EXIST остановите отправку и проверьте ключ, а не повторяйте в цикле.

Лимиты

Для каждого ключа в кабинете настраиваются: запросов в минуту, одновременных заданий, потолок расходов в сутки и в месяц. По умолчанию — 600 запросов в минуту и 100 одновременных заданий.

Ограничение по IP

К ключу можно привязать список адресов, с которых разрешены запросы. Поддерживаются одиночные адреса и подсети, IPv4 и IPv6:

192.0.2.10
192.0.2.0/24
2001:db8::10
2001:db8::/48

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

Примеры кода

Python

import base64, time, requests

API = "https://api.privateproxy.ru"
KEY = "cpx_ваш_ключ"

def b64(p): return base64.b64encode(open(p,"rb").read()).decode()

r = requests.post(f"{API}/create", json={
    "type": "SmartCaptcha", "app_id": KEY,
    "click": b64("field.png"), "task": b64("strip.png")}).json()
if r["status"] != 1:
    raise SystemExit(r["response"])
tid = r["response"]

time.sleep(1)
for _ in range(40):
    a = requests.post(f"{API}/result", json={"id": tid, "app_id": KEY}).json()
    if a["status"] == 1:
        print(a["response"]); break
    if a["status"] == 0:
        print("не решено:", a["response"]); break
    time.sleep(0.4)

Node.js

const fs = require('fs');
const API = 'https://api.privateproxy.ru', KEY = 'cpx_ваш_ключ';
const b64 = p => fs.readFileSync(p).toString('base64');
const post = (u,b) => fetch(API+u,{method:'POST',
  headers:{'Content-Type':'application/json'},body:JSON.stringify(b)}).then(r=>r.json());

const c = await post('/create',{type:'SmartCaptcha',app_id:KEY,
  click:b64('field.png'),task:b64('strip.png')});
if (c.status !== 1) throw new Error(c.response);

await new Promise(r=>setTimeout(r,1000));
for (let i=0;i<40;i++){
  const a = await post('/result',{id:c.response,app_id:KEY});
  if (a.status === 1){ console.log(a.response); break; }
  if (a.status === 0){ console.log('не решено:',a.response); break; }
  await new Promise(r=>setTimeout(r,400));
}

PHP

$api = 'https://api.privateproxy.ru'; $key = 'cpx_ваш_ключ';
function post($url, $data){
  $c = curl_init($url);
  curl_setopt_array($c, [CURLOPT_POST=>1, CURLOPT_RETURNTRANSFER=>1,
    CURLOPT_HTTPHEADER=>['Content-Type: application/json'],
    CURLOPT_POSTFIELDS=>json_encode($data)]);
  return json_decode(curl_exec($c), true);
}
$r = post("$api/create", ['type'=>'SmartCaptcha', 'app_id'=>$key,
  'click'=>base64_encode(file_get_contents('field.png')),
  'task'=>base64_encode(file_get_contents('strip.png'))]);
$id = $r['response'];
sleep(1);
for ($i=0; $i<40; $i++){
  $a = post("$api/result", ['id'=>$id, 'app_id'=>$key]);
  if ($a['status'] == 1){ echo $a['response']; break; }
  if ($a['status'] == 0){ echo 'не решено'; break; }
  usleep(400000);
}

Частые вопросы

Списываются ли деньги за нерешённые задания? Нет. Тарифицируется только успешный ответ.

Что если ответ неверный? Отправьте жалобу из кабинета в разделе «Задания» — при подтверждении стоимость вернём на баланс.

Сколько ключей можно создать? Сколько нужно. Удобно заводить отдельный ключ на каждый проект — так статистика и лимиты считаются раздельно.

Что будет при исчерпании баланса? Новые задания перестанут приниматься. Уже принятые будут доведены до конца.