HiAPI
Блог

Руководство

Отказ по контентной политике HiAPI (CONTENT_POLICY_VIOLATION): причины и исправление

Разбираем этот код ошибки, где его увидеть и как доработать контент до прохождения проверки

Oct 22, 2026
Отказ по контентной политике HiAPI (CONTENT_POLICY_VIOLATION): причины и исправление

При отправке задачи генерации в единый асинхронный API HiAPI, если промпт или входные материалы не прошли проверку безопасности, вы получите бизнес-код ошибки CONTENT_POLICY_VIOLATION. Официальная документация описывает его как «контент не прошёл проверку безопасности», а рекомендация по устранению — «изменить промпт или входной контент и повторить попытку». Это не проблема аутентификации, не проблема баланса или параметров — заблокирован сам контент. В этой статье разберём, как это выглядит, где его увидеть и как исправить.

I. Симптомы проблемы

Отказ по контентной политике встречается в двух формах в зависимости от того, произошла ли блокировка на этапе отправки или на этапе выполнения задачи. CONTENT_POLICY_VIOLATION — это бизнес-код ошибки единого асинхронного API; он использует тот же набор перечислений, что и синхронный error_code при создании задачи, и data.error.code в терминальном состоянии задачи (он не помечен как «только при создании», поэтому может появляться в обоих местах).

Форма A: синхронный отказ при создании. При вызове POST /v1/tasks контент не прошёл проверку, возвращается конверт ошибки, где error_code равен CONTENT_POLICY_VIOLATION. Форма конверта следующая (по официальной документации неуспешного ответа: code — HTTP-статус, error_code — бизнес-код):

{
  "code": 400,
  "message": "...",
  "data": null,
  "error_code": "CONTENT_POLICY_VIOLATION"
}

В этом случае получить taskId невозможно — задача вообще не создалась.

Форма B: терминальное состояние fail после запуска задачи. taskId уже получен, задача запущена, и только потом вынесено решение о несоответствии. При опросе GET /v1/tasks/{taskId} HTTP по-прежнему 200 (поле message конверта может быть даже success — это означает лишь «данный запрос успешен», а не успех вашей задачи), а реальная ошибка скрыта в data:

{
  "code": 200,
  "data": {
    "taskId": "tk-hiapi-...",
    "status": "fail",
    "error": { "code": "CONTENT_POLICY_VIOLATION", "message": "..." }
  },
  "message": "success"
}

Правило определения в одном предложении: не смотрите только на HTTP-статус. Читайте в три уровня — HTTP-статус (принят ли запрос) → бизнес-код ошибки (error_code / data.error.code, почему отказано) → состояние задачи (data.status, на каком шаге остановилась). Если поле code (синхронный error_code или терминальный data.error.code) равно CONTENT_POLICY_VIOLATION, это блокировка модерацией контента, и это совсем не то же самое, что таймаут, обрыв соединения или ошибка параметров. Текст message может немного отличаться в зависимости от ситуации; стабильный сигнал для определения — этот код, не пытайтесь сопоставлять текст message регулярными выражениями.

При срабатывании аналогичной блокировки в Playground / «Онлайн-попытке» на странице модели страница сразу показывает встроенное сообщение «не прошло проверку безопасности», а не передаёт вам код для самостоятельного разбора — это разница в представлении между веб-путём попытки (синхронным) и API-путём, который вы вызываете из кода.

II. Частые причины (по убыванию вероятности)

  1. В промпте есть недопустимый контент. Самое частое. NSFW / взрослый контент, откровенное насилие и кровь и т.п. блокируются проверкой безопасности. Учтите, что многие модели сами по себе явно не поддерживают NSFW-контент, а некоторые модели (например, GPT Image 2) также следуют контентной политике своего разработчика (например, контентной политике OpenAI).
  2. Входное изображение / референсный материал не прошёл проверку. В задачах вроде image-to-image (i2i) и генерации видео по референсному изображению проверяется не только промпт — загруженные или указанные вами изображения и референсные материалы тоже должны пройти проверку. Промпт чистый, но входное изображение не соответствует правилам — всё равно CONTENT_POLICY_VIOLATION.
  3. После смены модели вы наткнулись на более строгую политику. Контентные политики разных моделей различаются по строгости. Один и тот же промпт может пройти на модели A и быть отклонён на модели B — это нормально, особенно в чувствительных направлениях вроде реалистичных портретов, изображений знаменитостей, брендовых / защищённых авторским правом материалов.
  4. Отказ ошибочно принят за другую ошибку. Настоящая блокировка контента воспринимается как «сбой сервиса» и повторяется с тем же содержимым снова и снова — сколько ни повторяй одинаковый контент, он не пройдёт, вы просто зря ждёте.

III. Шаги исправления

  1. Сначала подтвердите код ошибки. Считайте точный код из синхронного ответа error_code или из терминального data.error.code. Убедитесь, что это CONTENT_POLICY_VIOLATION, а не TASK_FAILED (общий сбой, чаще всего из-за временных проблем или недоступности ссылки на входное изображение) и не INVALID_REQUEST (некорректное тело запроса). Разные коды — совершенно разные способы исправления.
  2. Почистите промпт по пунктам. Уберите формулировки NSFW / взрослого характера, откровенного насилия и т.п., замените на допустимые и отправьте снова. Изменения должны быть целенаправленными, а не случайным удалением слов.
  3. Проверьте все входные материалы. При image-to-image / генерации по референсу замените входные и референсные изображения, которые могут вызвать проверку — они, как и промпт, должны пройти модерацию.
  4. Сверьтесь с политикой целевой модели. Посмотрите на странице этой модели её ограничения (например, страница модели GPT Image 2 явно указывает «не поддерживает NSFW-контент, следует контентной политике OpenAI»); если нужно сменить модель, сравните возможности и политики моделей в маркетплейсе моделей.
  5. Повторите попытку после исправления. Рекомендация документации по этому коду — «изменить промпт или входной контент и повторить попытку». Учтите: за неуспешные задачи плата не взимается — зарезервированная при создании сумма полностью возвращается после перехода задачи в терминальное состояние fail, так что сама заблокированная задача не стоит денег; но повторная отправка того же нарушающего контента без изменений не пройдёт — сначала измените, потом отправляйте.

IV. Минимальный пример проверки

Если хотите сначала исключить «проблему с моим ключом / подключением», отправьте один запрос POST /v1/tasks с явно допустимым промптом и посмотрите, получается ли нормально taskId (model — голый id gpt-image-2):

curl -s -X POST "https://api.hiapi.ai/v1/tasks" \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2",
    "input": { "prompt": "a cozy coffee shop storefront at sunrise, warm light" }
  }'
  • Возвращает {"code":200,"data":{"taskId":"tk-hiapi-..."}} → ваш ключ и подключение в порядке; значит, проблема в том отклонённом запросе — в контенте, вернитесь к разделу III и почистите промпт / входное изображение.
  • Возвращает HTTP 401 + {"error":{"code":"permission_denied",...}} → это проблема аутентификации (неверный ключ / не передан Authorization: Bearer), а не контентная политика.
  • Даже допустимый промпт возвращает error_code: "CONTENT_POLICY_VIOLATION" → бывает редко; пересмотрите, нет ли в промпте упущенных вами чувствительных слов, или попробуйте более нейтральное описание.

V. Дополнительное чтение

VI. FAQ

Вопрос: В чём разница между CONTENT_POLICY_VIOLATION и TASK_FAILED? Ответ: Первый — контент не прошёл проверку безопасности, способ исправления — изменить промпт / входные материалы; второй — общий сбой, чаще всего из-за недоступности URL входного изображения / видео или временных колебаний, способ исправления — исправить URL / повторить. Это разные бизнес-коды ошибок, не путайте. Различить можно, прочитав error.code.

Вопрос: Спишутся ли с меня деньги, если задача отклонена по контентной политике? Ответ: Нет. Согласно документации, после перехода задачи в терминальное состояние fail зарезервированная при создании сумма возвращается полностью. Сама заблокированная задача не создаёт расходов.

Вопрос: Почему для одного и того же промпта на веб-странице «Онлайн-попытка» видно явное сообщение «не прошло проверку», а через API я получаю только код? Ответ: Веб-попытка — синхронный путь, результат проверки отображается сразу встроенным сообщением; API-путь передаёт результат в теле ответа в error_code / data.error.code, и ваш код должен его прочитать и обработать. Информация одинакова, различается только способ представления.

Вопрос: Я изменил только промпт, входное изображение не трогал — почему всё равно отказ? Ответ: Проверка безопасности охватывает входные материалы, а не только промпт. При image-to-image / генерации по референсу сначала замените входные и референсные изображения, которые могут вызвать проверку.

Вопрос: Есть ли у HiAPI публичная страница «Контентная политика», где это можно посмотреть? Ответ: Отдельной страницы контентной политики нет. Контентные ограничения каждой модели указаны на странице этой модели (например, «не поддерживает NSFW-контент»), а условия на уровне платформы — в Условиях обслуживания и Политике конфиденциальности.

Вопрос: Можно ли «проскочить» повторными попытками? Ответ: Нет. Сколько ни повторяй одинаковый нарушающий контент, он не пройдёт — только зря потратите опросы. Сначала измените контент по разделу III, потом отправляйте.

Похожие статьи

Все статьи →

Начните работать с постоянными артефактами ИИ

Получите API-ключ и вызывайте модели изображений, видео и аудио через один API на основе tasks.

Читать документацию API