ДокументацияРазработчикам

API TaskerData

Размещайте кампании, получайте и проверяйте работы исполнителей из своего кода или подключите внешний квалификационный тест. Каждый запрос аутентифицируется вашим API-ключом.

Обзор

API кампаний позволяет вашему коду делать то же, что вы делаете в панели заказчика: создавать кампании, следить за их ходом, скачивать отправленные работы с подтверждениями, одобрять и отклонять их. Эндпоинты внешних квалификационных тестов позволяют тесту на вашем сайте сообщать TaskerData, прошёл ли его каждый исполнитель.

Все запросы отправляются на https://taskerdata.com по HTTPS. Данные передаются и возвращаются в формате JSON.

Кампании, созданные через API, стоят столько же и подчиняются тем же правилам, что и в панели. TaskerData проверяет их перед запуском (у доверенных заказчиков они запускаются сразу), а деньги резервируются и выплачиваются так же.

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

Откройте панель заказчика и перейдите в раздел API. Там вы найдёте два ключа:

  • API-ключ: для реальных запросов. API кампаний берёт его из заголовка Authorization. Эндпоинт квалификации принимает его как api_token.
  • Тестовый API-ключ: только для тестового эндпоинта квалификации, чтобы вы могли проверить эту интеграцию, не затрагивая реальных исполнителей.

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

Важно: Храните API-ключ в секрете. Используйте его только на своём сервере и никогда — на веб-странице или в приложении, доступном посетителям.

Передавайте API-ключ в каждом запросе к API кампаний:

Authorization: Bearer YOUR_API_KEY

Можно отправлять до 120 запросов к API кампаний в минуту. Заголовок X-RateLimit-Remaining показывает, сколько осталось. После этого вы получите статус 429, а заголовок Retry-After подскажет, сколько секунд нужно подождать.

API кампаний

Создавайте кампании и обрабатывайте поступающие работы из своего кода.

Список кампаний

GET/api/v1/campaigns

Ваши кампании, сначала новые. total — сколько кампаний подходит под условия, чтобы вы могли листать их с помощью limit и offset.

Параметры запроса

ПараметрОписание
status Только кампании с этим статусом: pending, in review, active, paused, completed, terminated или rejected
limit Сколько вернуть, от 1 до 100 (по умолчанию 20)
offset Сколько пропустить, для постраничного вывода (по умолчанию 0)
curl "https://taskerdata.com/api/v1/campaigns?status=active&limit=20" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

Ответ · 200

{
  "success": true,
  "campaigns": [
    {
      "id": "Ab12…-Cd34…-Ef56…",
      "title": "Test our sign-up page",
      "status": "active",
      "category": "Website Testing",
      "type": "instructions",
      "url": "https://example.com/signup",
      "payment": 0.5,
      "positions": 50,
      "filled_positions": 12,
      "time_to_complete": 10,
      "time_to_rate": 3,
      "cost": 34.06,
      "proof": {
        "text": "What went wrong?",
        "images": [
          "Screenshot after signing up"
        ],
        "video": null
      },
      "qualification_id": null,
      "created_at": "2026-10-16T09:30:00.000Z"
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

Пример ошибки

// status 401
{
  "success": false,
  "error": {
    "code": "invalid_api_key",
    "message": "Invalid API key."
  }
}

Данные кампании

GET/api/v1/campaigns/{id}

Одна кампания с её настройками и количеством работ: ожидающих проверки, ожидающих доработки, одобренных и отклонённых. Используйте, чтобы следить за ходом кампании.

В адресе

ПараметрОписание
id обязательноID кампании (id в списке кампаний)
curl "https://taskerdata.com/api/v1/campaigns/CAMPAIGN_ID" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

Ответ · 200

{
  "success": true,
  "campaign": {
    "id": "Ab12…-Cd34…-Ef56…",
    "title": "Test our sign-up page",
    "status": "active",
    "category": "Website Testing",
    "type": "instructions",
    "url": "https://example.com/signup",
    "payment": 0.5,
    "positions": 50,
    "filled_positions": 12,
    "time_to_complete": 10,
    "time_to_rate": 3,
    "cost": 34.06,
    "proof": {
      "text": "What went wrong?",
      "images": [
        "Screenshot after signing up"
      ],
      "video": null
    },
    "qualification_id": null,
    "created_at": "2026-10-16T09:30:00.000Z",
    "submissions": {
      "total": 14,
      "to_review": 3,
      "revision_requested": 1,
      "approved": 9,
      "rejected": 1
    }
  }
}

Пример ошибки

// status 404
{
  "success": false,
  "error": {
    "code": "not_found",
    "message": "Campaign not found."
  }
}

Создание кампании

POST/api/v1/campaigns

Размещает новую кампанию и резервирует всю её стоимость с доступного баланса — точно так же, как в панели. В ответе есть id кампании, её стоимость и статус: pending, пока TaskerData её проверяет, или сразу active, если вы доверенный заказчик.

Тело JSON

ПараметрОписание
title обязательноНазвание кампании, до 100 символов
category обязательноКатегория из GET /api/v1/options. Не указывайте её, если используете шаблон
instructions обязательноЧто должны сделать исполнители, до 5,000 символов
url Ссылка, которую открывают исполнители. Обязательна для категорий, где needs_url равно true
payment обязательноОплата за задание в USD, не меньше 0.12
positions обязательноКоличество исполнителей, не меньше 10. При шаблоне с файлом данных рассчитывается по числу строк
time_to_complete обязательноСколько минут у исполнителя на выполнение, от 1 до 120
time_to_rate обязательноСколько дней у вас на проверку каждой работы, от 1 до 30. После этого она одобряется автоматически
proof.text Запросить текстовый ответ: напишите, что исполнитель должен указать
proof.images Запросить скриншоты или фото: по одному описанию на каждое изображение
proof.video Запросить видео или запись: что на ней должно быть видно
targeting.region international (по умолчанию), usa, west-europe, east-europe, latin-america или asia-africa
targeting.exclude_countries Названия стран, которые нужно исключить из региона
targeting.min_success_rate Минимальная доля одобренных у исполнителя: 75 (по умолчанию), 80, 85, 90, 95 или 100
targeting.type, targeting.group_id Укажите type равным "group", а в group_id — одну из ваших групп исполнителей, чтобы задание видела только эта группа
qualification_id Задание смогут взять только исполнители, прошедшие этот квалификационный тест
template Используйте один из своих шаблонов вместо инструкций: id, а также data со столбцами (columns) и строками (rows), которые заполняют его метки, по одной строке на задание. answers_per_row (от 1 до 5) и rows_per_task (от 1 до 50) необязательны
drip_feed Выдавать задание исполнителям партиями: min_workers и max_workers (от 1 до 50) и interval_minutes (15, 30, 60, 120, 180, 360, 720 или 1440)
location Для «Полевых заданий на месте» и «Тайного покупателя»: lat, lng, radius_m (от 50 до 50,000) и необязательный address

Пока что кампании в категориях, где нужно загружать файлы (например, «Транскрибация аудио» или «Разметка изображений тегами»), видеозадания и кампании с образцами изображений можно создать только в панели. Как рассчитывается цена, описано в руководстве «Стоимость и комиссии».

curl -X POST "https://taskerdata.com/api/v1/campaigns" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Test our sign-up page",
    "category": "Website Testing",
    "url": "https://example.com/signup",
    "instructions": "Open the page, create an account and tell us anything that went wrong.",
    "payment": 0.5,
    "positions": 50,
    "time_to_complete": 10,
    "time_to_rate": 3,
    "proof": {
      "text": "What went wrong?",
      "images": [
        "Screenshot after signing up"
      ]
    },
    "targeting": {
      "region": "international",
      "min_success_rate": 90
    }
  }'

Ответ · 201

{
  "success": true,
  "campaign": {
    "id": "Ab12…-Cd34…-Ef56…",
    "title": "Test our sign-up page",
    "status": "pending",
    "category": "Website Testing",
    "type": "instructions",
    "url": "https://example.com/signup",
    "payment": 0.5,
    "positions": 50,
    "filled_positions": 0,
    "time_to_complete": 10,
    "time_to_rate": 3,
    "cost": 34.06,
    "proof": {
      "text": "What went wrong?",
      "images": [
        "Screenshot after signing up"
      ],
      "video": null
    },
    "qualification_id": null,
    "created_at": "2026-10-16T09:30:00.000Z"
  },
  "balance": {
    "available": 65.94,
    "reserved": 34.06
  }
}

Пример ошибки

// status 402
{
  "success": false,
  "error": {
    "code": "insufficient_balance",
    "message": "Insufficient balance"
  }
}

Получение работ

GET/api/v1/campaigns/{id}/submissions

Работы, которые исполнители отправили по одной кампании, сначала старые, с подтверждениями: текстовый ответ, ссылки на изображения и видео, ответы по шаблону (answers), строка данных, с которой работал исполнитель, и, для полевых заданий, его местоположение.

В адресе

ПараметрОписание
id обязательноID кампании (id в списке кампаний)

Параметры запроса

ПараметрОписание
status to_review (pending и resubmitted), pending, resubmitted, revision_requested, approved или rejected
since Только работы, отправленные в это время или позже, например 2026-10-01T00:00:00Z
after_id Для постраничного вывода: только работы с большим id. Используйте next_after_id из предыдущей страницы
limit Сколько вернуть, от 1 до 100 (по умолчанию 50)

Чтобы регулярно забирать новые работы, сохраняйте последний полученный id и передавайте его в следующий раз как after_id. В raw содержится всё, что отправил исполнитель, — на случай, если вам нужно что-то, чего нет в списке.

curl "https://taskerdata.com/api/v1/campaigns/CAMPAIGN_ID/submissions?status=to_review&after_id=0" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

Ответ · 200

{
  "success": true,
  "submissions": [
    {
      "id": 1842,
      "campaign_id": "Ab12…-Cd34…-Ef56…",
      "worker_id": "wK3…",
      "status": "pending",
      "started_at": "2026-10-16 10:02:11",
      "submitted_at": "2026-10-16 10:09:45",
      "revision_count": 0,
      "revision_note": null,
      "rejection_reason": null,
      "payment": 0.5,
      "proof": {
        "text": "The confirm button did nothing on mobile.",
        "image_urls": [
          "https://storage.taskerdata.com/…/proof_0.png"
        ],
        "video_url": null
      },
      "answers": null,
      "data_row": null,
      "data_row_number": null,
      "items": null,
      "location": null,
      "raw": {
        "textProof": "…"
      }
    }
  ],
  "has_more": false,
  "next_after_id": null
}

Пример ошибки

// status 400
{
  "success": false,
  "error": {
    "code": "invalid_status",
    "message": "status must be one of: to_review, pending, resubmitted, revision_requested, approved, rejected."
  }
}

Проверка работы

POST/api/v1/submissions/{id}/review

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

В адресе

ПараметрОписание
id обязательноID отправленной работы

Тело JSON

ПараметрОписание
action обязательноapprove, reject или revision
reason При reject: причина, которую увидит исполнитель
note При revision (обязательно): что исполнитель должен исправить

Проверить работу можно, только пока она ожидает проверки (pending или resubmitted). Количество доработок ограничено лимитом доработок кампании; после этого работу можно только одобрить или отклонить.

curl -X POST "https://taskerdata.com/api/v1/submissions/1842/review" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "revision",
    "note": "Please add a screenshot of the error message."
  }'

Ответ · 200

{
  "success": true,
  "submission": {
    "id": 1842,
    "status": "revision_requested"
  },
  "balance": {
    "available": 65.94,
    "reserved": 34.06
  }
}

Пример ошибки

// status 409
{
  "success": false,
  "error": {
    "code": "already_reviewed",
    "message": "Submission already reviewed"
  }
}

Проверка баланса

GET/api/v1/balance

available — сумма, которую можно потратить на новые кампании, reserved — сумма, зарезервированная под активные кампании, а spent — сколько вы уже заплатили исполнителям.

curl "https://taskerdata.com/api/v1/balance" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

Ответ · 200

{
  "success": true,
  "balance": {
    "available": 65.94,
    "reserved": 34.06,
    "spent": 212.4
  }
}

Опции и ID

GET/api/v1/options

Возвращает категории, доступные через API (needs_url и needs_location показывают, для каких нужны ссылка или местоположение), допустимые значения таргетинга и постепенной выдачи, а также ID ваших шаблонов, групп исполнителей и квалификационных тестов.

curl "https://taskerdata.com/api/v1/options" \
  -H "Authorization: Bearer $TASKERDATA_API_KEY"

Ответ · 200

{
  "success": true,
  "categories": [
    {
      "name": "Website Testing",
      "needs_url": true,
      "needs_location": false
    },
    "…"
  ],
  "regions": [
    "international",
    "usa",
    "west-europe",
    "east-europe",
    "latin-america",
    "asia-africa"
  ],
  "min_success_rates": [
    75,
    80,
    85,
    90,
    95,
    100
  ],
  "drip_feed_intervals": [
    15,
    30,
    60,
    120,
    180,
    360,
    720,
    1440
  ],
  "templates": [
    {
      "id": 12,
      "title": "Sentiment check"
    }
  ],
  "worker_groups": [
    {
      "id": 3,
      "name": "Trusted testers",
      "workers": 25
    }
  ],
  "qualifications": [
    {
      "id": "Qa1…",
      "title": "English test",
      "status": "active"
    }
  ]
}

Ошибки

API кампаний использует коды статуса HTTP. Если что-то пошло не так, success равно false, а в error есть code для проверки в вашем коде и message, который можно показать или записать в лог. Проверки кампаний используют те же сообщения, что и панель.

Статусerror.codeЧто это значит
400invalid_body, invalid_campaign, invalid_region, category_needs_files, invalid_status, invalid_since, invalid_action, note_requiredВ запросе чего-то не хватает или что-то недопустимо. В message указано, что именно.
401missing_api_key, invalid_api_keyAPI-ключ не передан, неверный или был заменён новым.
402insufficient_balanceДоступного баланса не хватает на кампанию. Пополните баланс и повторите попытку.
403test_key_not_allowed, account_suspendedИспользуйте рабочий API-ключ. Заблокированный аккаунт не может пользоваться API.
404not_foundВ вашем аккаунте нет кампании или работы с таким ID.
409already_reviewed, review_refusedРабота уже проверена, или проверить её сейчас нельзя, например потому что достигнут лимит доработок.
429rate_limitedБольше 120 запросов в минуту. Подождите столько секунд, сколько указано в Retry-After.
500internal_errorПроблема на нашей стороне. Повторите попытку, а если ошибка не исчезает, обратитесь в поддержку.

Внешние квалификационные тесты

Для квалификационных тестов, которые проходят на вашем сайте.

Передача результата теста Работает

GET/api/worker/external_qualification/data

Для квалификационных тестов, отмеченных как внешние. Исполнитель открывает ваш тест из квалификации и вводит свой токен исполнителя на вашем сайте. Когда он закончит, вызовите этот эндпоинт со значением approve или reject.

ПараметрОписание
qualification_id обязательноID вашего квалификационного теста
worker_token обязательноТокен, который исполнитель ввёл на вашем сайте
api_token обязательноВаш API-ключ (для тестового эндпоинта — тестовый ключ)
decision обязательноapprove или reject

Если за прохождение теста положен бонус, а на балансе заказчика не хватает средств, работа сохраняется со статусом «на проверке»: вы сможете пополнить баланс и одобрить её в панели.

Исполнителя можно оценить только один раз за тест. Тест должен быть активным и отмеченным как внешний, а API-ключ должен принадлежать владельцу теста.

curl -G "https://taskerdata.com/api/worker/external_qualification/data" \
  --data-urlencode "qualification_id=QUAL_ID" \
  --data-urlencode "worker_token=WORKER_TOKEN" \
  --data-urlencode "api_token=YOUR_API_KEY" \
  --data-urlencode "decision=approve"

Ответ · 200

{
  "success": true
}

Пример ошибки

{
  "success": false,
  "error": "This worker has already been evaluated for this qualification"
}

Проверка интеграции

POST/api/worker/external_qualification/data_test

Отправьте те же поля в формате JSON на тестовый эндпоинт вместе с тестовым API-ключом. Ничего не сохраняется, и исполнители не затрагиваются: проверяется только ваш запрос.

ПараметрОписание
qualification_id обязательноID вашего квалификационного теста
worker_token обязательноТокен, который исполнитель ввёл на вашем сайте
api_token обязательноВаш API-ключ (для тестового эндпоинта — тестовый ключ)
decision обязательноapprove или reject

При неверном тестовом ключе возвращается статус 401; при отсутствующих полях или неверном значении decision — статус 400.

curl -X POST "https://taskerdata.com/api/worker/external_qualification/data_test" \
  -H "Content-Type: application/json" \
  -d '{
    "qualification_id": "QUAL_ID",
    "worker_token": "WORKER_TOKEN",
    "api_token": "YOUR_TEST_API_KEY",
    "decision": "approve"
  }'

Ответ · 200

{
  "success": true
}

Пример ошибки

// status 401
{
  "statusCode": 401,
  "statusMessage": "Invalid API test key"
}

Ошибки результатов теста

Эндпоинт результатов всегда отвечает статусом 200. Проверяйте success: если он равен false, в error указана причина:

errorЧто это значит
Missing required parameters: qualification_id, worker_token, api_token, decisionНе передан один из четырёх параметров.
Decision must be 'approve' or 'reject'У decision другое значение.
Invalid API tokenAPI-ключ неверный или был заменён новым.
Worker token not found for this qualificationТокен не относится к этому тесту. Попросите исполнителя проверить его.
API token does not belong to the qualification ownerИспользуйте ключ аккаунта, создавшего тест.
This qualification is not configured for external submissionsТест не отмечен как внешний.
This qualification is no longer activeТест приостановлен или завершён.
This worker has already been evaluated for this qualificationКаждый исполнитель получает только один результат за тест.
Worker account is suspendedИсполнитель сейчас не может проходить тесты.
No remaining positions for this qualificationВсе места в тесте заняты.