API

Подключите Audience Help к ИИ-агенту

  1. Установите скилл

    Распакуйте архив в ~/.agents/skills/, сохранив папку audience-help. В следующем сообщении вызовите $audience-help.

    Другой ИИ-агент

    Передайте агенту ссылку на инструкции Audience Help. Для работы ему нужен доступ к HTTP-запросам с API-ключом.

  2. Подключите API-ключ

    Получите ключ в своём аккаунте Audience Help и добавьте его в защищённое окружение агента как AUDIENCE_HELP_KEY. Анализы используют лимит вашего аккаунта.

  3. Дайте первую задачу

    Портрет аудитории

    $audience-help Проанализируй аудиторию example.com за 30 дней. Составь портрет и предложи идеи для маркетинга.

    Сравнение сайтов

    $audience-help Сравни аудитории example.com и example.org за 30 дней. Покажи портреты, главные различия и идеи для маркетинга.

    Замените домены в примере своими.

    Подключение по ссылке

    Используй https://audience.help/apidocs: найди Audience Help Skill, прочитай инструкции и проанализируй аудиторию example.com за 30 дней. Составь портрет и предложи идеи для маркетинга. API-ключ настроен в окружении как AUDIENCE_HELP_KEY.
Перейти к методам API

Как это работает

  1. POST /domain-jobs/ или POST /keyword-jobs/ — создать задание, в ответе job_id.
  2. GET …/{job_id}/ — статус: queued → processing → succeeded. Сайт — обычно 3–7 минут, ключевые фразы — 10–35.
  3. GET …/{job_id}/result/ — результат. Вместо опроса можно получить уведомление на callback_url.
URLhttps://audience.help/api/v2

Авторизация

Authorization: Bearer <ключ>
  • Ключ выдаётся на этой странице после входа в кабинет. Задания по нему расходуют анализы аккаунта.
  • Запросы и ответы — JSON: Content-Type: application/json. Даты — ISO 8601 в UTC: 2026-09-28T08:45:00Z.
  • Ключ видит только свои задания: чужое — 404 JOB_NOT_FOUND.
  • Без ключа открыта только схема /api/v2/openapi.json.

Задание по сайту

POST/api/v2/domain-jobs/
curl -X POST https://audience.help/api/v2/domain-jobs/ \ -H "Authorization: Bearer $AUDIENCE_HELP_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: order-123" \ -d '{"domain": "example.com", "period_days": 30, "data_blocks": {"geo": "cities", "demography": true}}'
ПолеТипНужноЗначения
domain
строка
да
Домен или адрес страницы: example.com, https://example.com/path, сайт.рф
period_days
число
нет
3, 7, 14, 30, 60 дней, по умолчанию 30
data_blocks
объект
нет
Блоки результата: ниже
external_id
строка
нет
Ваш номер задания, до 255 знаков. Нужен он или заголовок Idempotency-Key
callback_url
строка
нет
Адрес уведомлений: публичный HTTPS, до 2048 знаков
metadata
объект
нет
Ваши данные до 16 КБ, хранятся с заданием

Ответ 202

{
  "job_id": "job_7kQ2xV9mNc4LpR8sT1wZyB3dFa",
  "kind": "domain",
  "external_id": "",
  "domain": "example.com",
  "status": "queued",
  "created_at": "2026-09-28T08:45:00Z",
  "started_at": null,
  "finished_at": null,
  "expired_at": null,
  "retry_at": null,
  "estimated_ready_at": "2026-09-28T08:48:00Z",
  "estimated_duration_seconds": 180,
  "links": {
    "self": "https://audience.help/api/v2/domain-jobs/job_7kQ2xV9mNc4LpR8sT1wZyB3dFa/",
    "result": "https://audience.help/api/v2/domain-jobs/job_7kQ2xV9mNc4LpR8sT1wZyB3dFa/result/"
  }
}

Задание по ключевым фразам

POST/api/v2/keyword-jobs/
curl -X POST https://audience.help/api/v2/keyword-jobs/ \ -H "Authorization: Bearer $AUDIENCE_HELP_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: topic-bani" \ -d '{"phrases": ["купить баню", "баня из бруса"], "stop_phrases": ["своими руками"], "period_days": 30, "data_blocks": {"geo": "cities", "interests": true}}'
ПолеТипНужноЗначения
phrases
массив строк
да
1–200 фраз по 2–100 знаков. Повторы без учёта регистра убираются; запятая, ; и перенос строки внутри фразы — ошибка
stop_phrases
массив строк
нет
Минус-фразы: люди, искавшие их, исключаются. До 200
period_days
число
нет
От 1 до 30 дней, по умолчанию 30
data_blocks
объект
нет
Блоки результата: ниже
external_id, callback_url, metadata
—
нет
Как у задания по сайту
  • Ответ 202 — как у сайта, вместо domain — phrases_count, kind: keywords.
  • Людей по фразам слишком мало — задание завершится статусом failed с кодом KEYWORDS_NOT_MATCHED.

Блоки результата

БлокЗначенияПо умолчаниюСайтКлючевые фразы
geo
none, cities, regions
cities
cities — крупные города, regions — все регионы
none, cities
demography
true, false
true
Пол, возраст, пол × возраст
Пол и возраст
interests
true, false
false
Интересы
Интересы и социальные группы
behavior
true, false
false
Устройства, занятость, поведение
Нет: UNSUPPORTED_DATA_BLOCK
  • Незапрошенного блока нет в result.
  • Запрошен, но данных нет — пустой массив и предупреждение SOME_DATA_UNAVAILABLE в warnings.

Статус задания

GET/api/v2/domain-jobs/{job_id}/
GET/api/v2/keyword-jobs/{job_id}/
JOB_ID=job_7kQ2xV9mNc4LpR8sT1wZyB3dFa curl https://audience.help/api/v2/domain-jobs/$JOB_ID/ \ -H "Authorization: Bearer $AUDIENCE_HELP_KEY"
СтатусЧто значит
queued
В очереди
processing
Выполняется
retrying
Отложено из-за временного ограничения, повтор в retry_at
succeeded
Результат готов и хранится 30 дней
failed
Ошибка, причина — в error
cancelled
Отменено вами
expired
Результат удалён по сроку
  • estimated_ready_at — ориентир готовности, не гарантия.
  • Опрашивайте статус не чаще раза в 15 секунд для сайта и раза в минуту для фраз.

Результат

GET/api/v2/domain-jobs/{job_id}/result/
curl https://audience.help/api/v2/domain-jobs/$JOB_ID/result/ \ -H "Authorization: Bearer $AUDIENCE_HELP_KEY"

Ответ 200

{
  "job_id": "job_7kQ2xV9mNc4LpR8sT1wZyB3dFa",
  "kind": "domain",
  "external_id": "",
  "domain": "example.com",
  "status": "succeeded",
  "summary": {
    "analysis_type": "domain_audience",
    "source": "domain",
    "domain": "example.com",
    "domain_matched": true,
    "period_days": 30,
    "audience_size": 1245000,
    "base_audience_size": 52957461,
    "result_rows_total": 36,
    "blocks_returned": {"geo": "cities", "demography": true,
                        "interests": false, "behavior": false}
  },
  "input": {"domain": "example.com", "period_days": 30,
            "data_blocks": {"geo": "cities", "demography": true,
                            "interests": false, "behavior": false}},
  "result": {
    "geo": [
      {"code": "geo:city:moskva", "name": "Москва", "type": "city",
       "category": "География", "audience": 420000, "share": 0.337349,
       "base_audience": 2937064, "affinity_index": 143.0,
       "reliability": "ok"}
    ],
    "demography": [
      {"code": "demography:gender:female:zhenshchiny", "name": "Женщины",
       "type": "gender", "category": "Демография", "audience": 810000,
       "share": 0.650602, "base_audience": 27800000,
       "affinity_index": 23.9, "reliability": "ok"}
    ]
  },
  "warnings": []
}

Строка результата

ПолеЧто значит
code
Постоянный код строки для вашей системы
name
Название для показа
type
city, region, gender, age_group, sex_age_group, interest, device, employment, behavior
category
Группа строки: «География», «Демография», тема интереса
audience
Людей в сегменте
share
Доля от summary.audience_size, от 0 до 1
base_audience
Людей в сегменте базы сравнения
affinity_index
Аффинити в процентах: +100 — вдвое чаще, чем в базе; −50 — вдвое реже
reliability
Можно ли опираться на строку: ниже

Надёжность строки

ЗначениеЧто значитАффинити
ok
Данных достаточно
число
low_audience
В сегменте меньше 1 000 человек: аффинити неустойчиво
число
low_base
База сегмента меньше 30 000: аффинити неустойчиво
число
no_base
Нет базы сравнения, например у возрастных групп
null
no_data
Людей в сегменте нет
null
inconsistent_base
Сегмент и база не согласованы
null
  • Пока задание не готово — 425 RESULT_NOT_READY; после ошибки или отмены — 409; после срока хранения — 410 RESULT_EXPIRED.
  • Порядок строк не гарантирован.

Отмена и повтор

curl -X POST https://audience.help/api/v2/domain-jobs/$JOB_ID/cancel/ \ -H "Authorization: Bearer $AUDIENCE_HELP_KEY" \ -H "Content-Type: application/json" curl -X POST https://audience.help/api/v2/domain-jobs/$JOB_ID/retry/ \ -H "Authorization: Bearer $AUDIENCE_HELP_KEY" \ -H "Content-Type: application/json"
  • Отменить можно задание в статусе queued, processing или retrying.
  • Повтор создаёт новое задание с теми же параметрами для failed, cancelled и expired; в ответе — parent_job_id.
  • Повтор — новое задание: расходует анализ аккаунта.

Повторная отправка

  • Запрос создания несёт заголовок Idempotency-Key или поле external_id, иначе — 422 IDEMPOTENCY_KEY_REQUIRED.
  • Тот же ключ и тот же запрос — прежнее задание и "idempotent_replay": true, новое не создаётся.
  • Тот же ключ с другим запросом — 409 IDEMPOTENCY_CONFLICT. Фразы сравниваются без учёта порядка и регистра.

Уведомления

СобытиеКогда
domain_job.succeeded, keyword_job.succeeded
Результат готов
domain_job.failed, keyword_job.failed
Ошибка, причина — в error
domain_job.retrying, keyword_job.retrying
Отложено до retry_at
domain_job.cancelled, keyword_job.cancelled
Отменено

Пример

{
  "event_id": "evt_RXLtdMb6W8r0y3BcWz2HSmi3vc",
  "event_type": "keyword_job.succeeded",
  "job_id": "job_7kQ2xV9mNc4LpR8sT1wZyB3dFa",
  "kind": "keywords",
  "external_id": "",
  "phrases_count": 2,
  "status": "succeeded",
  "created_at": "2026-09-28T08:45:00Z",
  "finished_at": "2026-09-28T08:57:10Z",
  "links": {
    "self": "https://audience.help/api/v2/keyword-jobs/job_7kQ2xV9mNc4LpR8sT1wZyB3dFa/",
    "result": "https://audience.help/api/v2/keyword-jobs/job_7kQ2xV9mNc4LpR8sT1wZyB3dFa/result/"
  }
}

Проверка подписи

import hashlib import hmac def signed(headers, body: bytes, api_key: str) -> bool: stamp = headers["X-Audience-Help-Timestamp"] mac = hmac.new(api_key.encode(), stamp.encode() + b"." + body, hashlib.sha256) expected = "sha256=" + mac.hexdigest() received = headers["X-Audience-Help-Signature"] return hmac.compare_digest(expected, received)
  • Подпись — HMAC-SHA256 от <X-Audience-Help-Timestamp>.<тело> вашим ключом API, в заголовке X-Audience-Help-Signature.
  • Ответ 2xx — доставлено; 5xx, 408, 429 и таймаут 5 секунд — повтор через 1, 3, 10 и 30 минут.
  • event_id одного события не меняется: по нему отбрасывайте дубли.

Ошибки

{
  "error": {
    "code": "INVALID_PERIOD",
    "message": "Allowed period_days values: 1..30.",
    "request_id": "req_3f2a9c1b7d4e",
    "retryable": false
  }
}
HTTPКодКогда
400
INVALID_JSON, EMPTY_BODY
Неверный JSON или пустое тело
401
UNAUTHORIZED, INVALID_TOKEN
Нет ключа или ключ неверный
403
CLIENT_DISABLED
Ключ отключён
403
ANALYSIS_LIMIT_REACHED
На аккаунте закончились анализы
403
JOB_LIMIT_REACHED
Исчерпан лимит заданий, заданный ключу
404
JOB_NOT_FOUND
Задания нет или оно чужое
409
IDEMPOTENCY_CONFLICT
Ключ повтора использован с другим запросом
409
JOB_FAILED, JOB_CANCELLED
У задания нет результата
409
JOB_CANNOT_BE_CANCELLED, JOB_CANNOT_BE_RETRIED
Действие недоступно в этом статусе
410
RESULT_EXPIRED
Результат удалён по сроку
413
REQUEST_TOO_LARGE
Тело больше 1 МБ
415
UNSUPPORTED_MEDIA_TYPE
Не application/json
422
VALIDATION_ERROR, IDEMPOTENCY_KEY_REQUIRED, DOMAIN_REQUIRED, INVALID_DOMAIN, INVALID_PERIOD, INVALID_DATA_BLOCK, INVALID_DATA_BLOCK_VALUE, UNSUPPORTED_DATA_BLOCK, PHRASES_REQUIRED, INVALID_PHRASE, TOO_MANY_PHRASES
Неверные поля запроса
425
RESULT_NOT_READY
Результат ещё не готов
429
RATE_LIMITED, PARALLEL_LIMIT_EXCEEDED
Превышен лимит запросов или заданий одновременно
503
SERVICE_UNAVAILABLE
Временно недоступно, повторите позже

В статусе задания

СтатусКодКогда
retrying
DAILY_ANALYSIS_LIMIT_REACHED
Исчерпан суточный лимит обработки, повтор позже
retrying
ANALYSIS_TEMPORARILY_UNAVAILABLE
Временная недоступность, повтор позже
failed
DOMAIN_ANALYSIS_FAILED, KEYWORD_ANALYSIS_FAILED
Анализ не удался
failed
KEYWORDS_NOT_MATCHED
По фразам слишком мало людей
failed
ANALYSIS_RESULT_NOT_FOUND
Результат не найден
  • retryable: true — запрос можно повторить позже.

Лимиты

ЛимитЗначение
Анализов на задание
1
Запросов в минуту
60
Запросов в сутки
1 000
Заданий одновременно
5
Размер запроса
1 МБ
Хранение результата
30 дней
  • Задание расходует анализ аккаунта, как задание в кабинете; без результата (ошибка, мало посетителей, отмена) анализ возвращается.
  • Больше анализов — по тарифам, свои лимиты запросов — по запросу на info@audience.help.