API
Подключите Audience Help к ИИ-агенту
Установите скилл
Распакуйте архив в
~/.agents/skills/, сохранив папкуaudience-help. В следующем сообщении вызовите$audience-help.Другой ИИ-агент
Передайте агенту ссылку на инструкции Audience Help. Для работы ему нужен доступ к HTTP-запросам с API-ключом.
Подключите API-ключ
Получите ключ в своём аккаунте Audience Help и добавьте его в защищённое окружение агента как
AUDIENCE_HELP_KEY. Анализы используют лимит вашего аккаунта.Дайте первую задачу
Портрет аудитории
$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.
Как это работает
POST /domain-jobs/илиPOST /keyword-jobs/— создать задание, в ответеjob_id.GET …/{job_id}/— статус:queued→processing→succeeded. Сайт — обычно 3–7 минут, ключевые фразы — 10–35.GET …/{job_id}/result/— результат. Вместо опроса можно получить уведомление наcallback_url.
URL
https://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.