> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.beatapi.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.beatapi.io/_mcp/server.

# Moderation API

> Проверяйте текст или изображение по семи категориям контента и получайте оценки и решение allow, review или block в формате OpenAI Moderation API.

# Moderation API

Передайте один текст и до четырёх изображений, чтобы получить оценки по семи категориям от `0` до `1`, отметки превышения порога и общее решение: `allow`, `review` или `block`. API предназначен для проверки пользовательского и сгенерированного контента: комментария перед публикацией, промпта или референса перед отправкой модели, ответа или изображения перед показом пользователю.

`POST https://api.beatapi.io/v1/moderations`

Запрос и ответ соответствуют OpenAI Moderation API, поэтому официальным SDK OpenAI достаточно заменить базовый адрес и ключ. Это проверено 13 октября 2026 года с официальным Python SDK (`openai` 3.29.0) для текста и изображений.

| Модель                       | Что проверяет                                                               | Цена                         |
| ---------------------------- | --------------------------------------------------------------------------- | ---------------------------- |
| `beat-moderation-2.0`        | По умолчанию: один текст и до четырёх изображений вместе либо только текст. | \$0.08 за 1M входных токенов |
| `beat-moderation-1.0`        | Прежняя модель при явном выборе: только текст.                              | \$0.06 за 1M входных токенов |
| `beat-moderation-vision-1.0` | Прежняя модель при явном выборе: изображение с текстом или без него.        | \$0.22 за 1M входных токенов |

**Какая модель отвечает.** Поле `model` необязательно. Если `model` не указан или указано имя модели модерации OpenAI, отвечает `beat-moderation-2.0`. Модели `beat-moderation-1.0` и `beat-moderation-vision-1.0` вызываются только явно и сохраняют прежние ограничения: один текст, одно изображение либо по одному каждого типа, а также собственные пороги. Имена до 13 октября 2026 года, `beat-moderation-1` и `beat-moderation-vision-1`, также ведут к прежним моделям. Поле `model` в ответе показывает фактически ответившую модель.

> **Note**
>
> Неудачный вызов ничего не проверил. Никогда не считайте ошибку — тайм-аут, `4xx` или `503` — разрешением контента. Приостановите публикацию или повторите проверку.

## Beat Moderation 2.0

`beat-moderation-2.0` используется по умолчанию. Модель проверяет один текст и до четырёх изображений совместно за один вызов. Категория срабатывает, если относится хотя бы к одному из них: безобидная картинка не скрывает вредную подпись, а безобидная подпись — вредную картинку. Метод и форматы запроса и ответа те же, что у прежних моделей. Передавайте только текст либо текст с изображениями:

```bash
curl https://api.beatapi.io/v1/moderations \
  -H "Authorization: Bearer $BEATAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "beat-moderation-2.0",
    "input": [
      {"type": "text", "text": "Product photos for my shop listing."},
      {"type": "image_url", "image_url": {"url": "https://example.com/photo-1.jpg"}},
      {"type": "image_url", "image_url": {"url": "https://example.com/photo-2.jpg"}}
    ]
  }'
```

```python
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["BEATAPI_API_KEY"],
    base_url="https://api.beatapi.io/v1",
)

resp = client.moderations.create(
    model="beat-moderation-2.0",
    input=[
        {"type": "text", "text": "Product photos for my shop listing."},
        {"type": "image_url", "image_url": {"url": "https://example.com/photo-1.jpg"}},
        {"type": "image_url", "image_url": {"url": "https://example.com/photo-2.jpg"}},
    ],
)
print(resp.model)               # "beat-moderation-2.0"
print(resp.results[0].verdict)  # "allow", "review" or "block"
```

### Входные данные

* **Один текст и до четырёх изображений.** Не более одной текстовой части длиной до 8 000 символов и до четырёх частей `image_url`.
* **По ссылке или внутри запроса.** Изображение передаётся как общедоступная `http(s)`-ссылка до 2 048 символов, которую загружает BeatAPI, либо как base64 data URL.
* **PNG, JPEG, WebP или GIF (первый кадр), до 16 MB каждый, с любым размером в пикселях.** BeatAPI масштабирует изображения для модели и исправляет ориентацию снимков с телефона.
* Ответ 2.0 содержит `"model": "beat-moderation-2.0"` и `"policy_version": "2026-10-15"`. Если переданы изображения, `category_applied_input_types` равно `["text", "image"]`. Остальные поля описаны ниже.

### Когда возвращается 400

| Запрос                                                     | Причина                                               |
| ---------------------------------------------------------- | ----------------------------------------------------- |
| Больше четырёх изображений                                 | Допускается не больше четырёх изображений за вызов.   |
| Изображение больше 100 мегапикселей                        | Сначала уменьшите размер.                             |
| Изображение с пропорциями уже 1:5.6                        | Короткая сторона должна быть не меньше 1/5.6 длинной. |
| Data URL без base64                                        | Поддерживаются только base64 data URL.                |
| Файл, который нельзя прочитать как PNG, JPEG, WebP или GIF | HEIC и AVIF не принимаются.                           |

Частичная проверка не выполняется. Запрос, отклонённый с 400, не оплачивается.

### Пороги и решения

Категория отмечается, а итог становится `block`, при оценке `0.6`, кроме исключений ниже. Решение `verdict` становится `review` начиная с оценки на 0.25 ниже порога категории, но не ниже `0.15`.

| Запрос         | Категория           | Порог блокировки | Начало проверки человеком |
| -------------- | ------------------- | ---------------: | ------------------------: |
| Только текст   | `sexual/minors`     |            `0.3` |                    `0.15` |
| Только текст   | `harassment`        |            `0.8` |                    `0.55` |
| Только текст   | Остальные категории |            `0.6` |                    `0.35` |
| С изображением | `sexual/minors`     |           `0.35` |                    `0.15` |
| С изображением | `self-harm`         |            `0.5` |                    `0.25` |
| С изображением | Остальные категории |            `0.6` |                    `0.35` |

Если нужны более строгие или мягкие пороги, применяйте свои значения к `category_scores`.

### Цена и объём токенов

**\$0.08 за 1M входных токенов**; выход бесплатный. Измеренные объёмы:

| Запрос                                      |                              Входные токены |
| ------------------------------------------- | ------------------------------------------: |
| Короткий текст                              |                                 Около 1 200 |
| Одно изображение с коротким текстом или без | В среднем около 3 800, максимум около 5 100 |
| Каждое дополнительное изображение           |                       Ещё до примерно 4 800 |

Поле `usage.input_tokens` каждого ответа показывает точное число учтённых токенов. Ни текст, ни изображения не сохраняются в журналах.

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

```bash
curl https://api.beatapi.io/v1/moderations \
  -H "Authorization: Bearer $BEATAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input": "Forged ID cards and bank cards for sale, shipped within 24 hours. Message me for the price list."}'
```

Ниже приведён реальный ответ на этот запрос.

```json
{
  "id": "modr-task_untsppzSTLTDbt7Kw360kbf4ydPBYOAS",
  "model": "beat-moderation-2.0",
  "results": [
    {
      "flagged": true,
      "categories": {
        "sexual": false,
        "sexual/minors": false,
        "violence": false,
        "hate": false,
        "harassment": false,
        "self-harm": false,
        "illicit": true,
        "harassment/threatening": false,
        "hate/threatening": false,
        "illicit/violent": false,
        "self-harm/intent": false,
        "self-harm/instructions": false,
        "violence/graphic": false
      },
      "category_scores": {
        "sexual": 0,
        "sexual/minors": 0.01,
        "violence": 0.02,
        "hate": 0.01,
        "harassment": 0.02,
        "self-harm": 0.01,
        "illicit": 0.99,
        "harassment/threatening": 0,
        "hate/threatening": 0,
        "illicit/violent": 0,
        "self-harm/intent": 0,
        "self-harm/instructions": 0,
        "violence/graphic": 0
      },
      "category_applied_input_types": {
        "sexual": ["text"],
        "sexual/minors": ["text"],
        "violence": ["text"],
        "hate": ["text"],
        "harassment": ["text"],
        "self-harm": ["text"],
        "illicit": ["text"],
        "harassment/threatening": [],
        "hate/threatening": [],
        "illicit/violent": [],
        "self-harm/intent": [],
        "self-harm/instructions": [],
        "violence/graphic": []
      },
      "verdict": "block",
      "sexual_level": "none"
    }
  ],
  "policy_version": "2026-10-15",
  "usage": { "input_tokens": 1210 }
}
```

Категория `illicit` получила `0.99`, что выше порога `0.6`. Поэтому `categories.illicit` равно `true`, `flagged` равно `true`, а `verdict` — `block`.

### OpenAI SDK (Python)

Укажите адрес BeatAPI и вызовите `moderations.create` обычным способом. Дополнительные поля BeatAPI доступны в типизированном результате.

```python
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["BEATAPI_API_KEY"],
    base_url="https://api.beatapi.io/v1",
)

resp = client.moderations.create(
    input="Forged ID cards and bank cards for sale, shipped within 24 hours. Message me for the price list.",
)
result = resp.results[0]

# The values in the comments are the ones from the response above.
print(result.flagged)                  # True
print(result.verdict)                  # "block" (added by BeatAPI)
print(result.categories.illicit)       # True
print(result.category_scores.illicit)  # 0.99
print(result.sexual_level)             # "none" (added by BeatAPI)
print(resp.policy_version)             # "2026-10-12" (added by BeatAPI)
```

### JavaScript

```javascript
const text = "Forged ID cards and bank cards for sale, shipped within 24 hours. Message me for the price list.";

const response = await fetch("https://api.beatapi.io/v1/moderations", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BEATAPI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ input: text }),
});

if (!response.ok) {
  // A failed call judged nothing: do not let the content through.
  // On HTTP 429, wait the Retry-After seconds before retrying.
  throw new Error(`Moderation HTTP ${response.status}; Retry-After: ${response.headers.get("Retry-After")}`);
}
const moderation = await response.json();
const result = moderation.results?.[0];
if (!result || !["allow", "review", "block"].includes(result.verdict)) {
  throw new Error("Invalid moderation response; hold the content for review");
}

if (result.verdict === "block") {
  console.log("rejected", result.category_scores);
} else if (result.verdict === "review") {
  console.log("queued for a person", result.sexual_level, result.category_scores);
} else {
  console.log("allowed under policy", moderation.policy_version);
}
```

## Изображения

Изображение передаётся в массиве `input` частью `image_url`, как в OpenAI API. Отправьте его отдельно либо добавьте связанный текст — промпт или подпись — частью `text` того же массива.

```bash
curl https://api.beatapi.io/v1/moderations \
  -H "Authorization: Bearer $BEATAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": [
      {"type": "text", "text": "Remove her clothes and make it a nude photo."},
      {"type": "image_url", "image_url": {"url": "https://beatapi.io/samples/ai-ecommerce-video-demo-poster.jpg"}}
    ]
  }'
```

На изображении из запроса обычный товарный плакат. Сам по себе он разрешён, но вместе с этим промптом реальный ответ был `verdict: "block"`, с оценкой `sexual` равной `1` и `sexual_level: "explicit"`. Изображение и текст проверяются совместно, а текст также оценивается отдельно, поэтому безобидная картинка не скрывает вредный запрос о ней.

```python
resp = client.moderations.create(
    input=[
        {"type": "text", "text": "Change the background to a beach."},
        {"type": "image_url", "image_url": {"url": "https://example.com/upload.jpg"}},
    ],
)
print(resp.model)                # "beat-moderation-vision-1.0"
print(resp.results[0].verdict)   # "allow", "review" or "block"
```

* **По ссылке или внутри запроса.** Поле `image_url.url` принимает `http(s)`-ссылку либо base64 data URL, например `data:image/jpeg;base64,...`. Ссылку загружает BeatAPI, поэтому она должна быть общедоступна. Адрес частной сети будет отклонён.
* **PNG, JPEG или WebP, до 4 MB** и не больше 16 мегапикселей. Тип определяется по содержимому, а не метке data URL. Допускается base64 с переносами строк, URL-safe алфавитом или без padding.
* **Одно изображение за вызов**, при необходимости с одним текстом до 8 000 символов.
* Ответ изображения содержит `"model": "beat-moderation-vision-1.0"`, `"policy_version": "2026-10-13"` и `category_applied_input_types`, равное `["image"]` либо `["text", "image"]` при совместном тексте. Остальные поля описаны ниже.
* Вызов занимает примерно полсекунды плюс время загрузки изображения по ссылке.

## Запрос

| Поле    | Тип             | Обязательно | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ------- | --------------- | ----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `input` | string \| array |          Да | Проверяемые данные. Строка — один текст. Массив содержит один текст как строку или `{"type": "text", "text": "..."}` и до четырёх изображений (`{"type": "image_url", "image_url": {"url": "..."}}`). Максимум 8 000 символов текста. Прежние модели при явном выборе принимают один текст, одно изображение или по одному каждого типа.                                                                                                                |
| `model` | string          |         Нет | `beat-moderation-2.0`; для прежней модели — `beat-moderation-1.0` или `beat-moderation-vision-1.0`; также принимаются имена моделей модерации OpenAI (`omni-moderation-latest`, `omni-moderation-2024-09-26`, `text-moderation-latest`, `text-moderation-stable`). См. раздел «Какая модель отвечает» в начале страницы. Прежние имена до 13 октября 2026 года, `beat-moderation-1` и `beat-moderation-vision-1`, также допустимы. Другое имя даёт 400. |

## Ответ

| Поле                                     | Описание                                                                                                                                                                                              |
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                                     | ID вызова. Указывайте его в обращениях в поддержку.                                                                                                                                                   |
| `model`                                  | Фактически ответившая модель: `beat-moderation-2.0`, `beat-moderation-1.0` или `beat-moderation-vision-1.0`.                                                                                          |
| `results`                                | Массив с одной записью: текст и изображения проверяются совместно за один вызов.                                                                                                                      |
| `results[].flagged`                      | `true`, если оценка хотя бы одной категории достигла порога.                                                                                                                                          |
| `results[].categories`                   | Для каждой категории — достигла ли её оценка порога.                                                                                                                                                  |
| `results[].category_scores`              | Оценка каждой категории от `0` до `1`.                                                                                                                                                                |
| `results[].category_applied_input_types` | Типы данных, к которым применены семь категорий: `["text"]`, `["image"]` или `["text", "image"]`. Для шести подкатегорий — `[]`.                                                                      |
| `results[].verdict`                      | `allow`, `review` или `block`. Дополнение BeatAPI.                                                                                                                                                    |
| `results[].sexual_level`                 | `none`, `contextual`, `suggestive` или `explicit`. Дополнение BeatAPI.                                                                                                                                |
| `policy_version`                         | Версия политики проверки: `2026-10-15` для `beat-moderation-2.0`; у прежних моделей — `2026-10-12` для текста и `2026-10-13` для изображений. Оценки разных версий несопоставимы. Дополнение BeatAPI. |
| `usage.input_tokens`                     | Число входных токенов, учтённых вызовом. Дополнение BeatAPI.                                                                                                                                          |

Ответ синхронный: успешный HTTP-ответ уже содержит решение. Проверять статус задачи не нужно.

## Категории

Проверяются семь категорий с именами OpenAI, каждая с оценкой от `0` до `1`. Они одинаковы для текста и изображений.

| Категория       | Что отмечает                                                                                                                                                                                  | Что намеренно не отмечает                                                                                                                                                                                            |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sexual`        | Явный сексуальный контент, запросы на него, эротические ролевые диалоги, предложения и реклама сексуальных услуг или порнографии. На изображениях — порнография и нагота с целью возбуждения. | Медицинские, просветительские, новостные и другие нейтральные упоминания; классическое искусство, медицинские изображения, обычные купальники. Неявно сексуальный контент получает `review`, а не отметку категории. |
| `sexual/minors` | Любая сексуализация лиц младше 18 лет, включая вымышленные, завуалированные, рисованные и фотографические материалы.                                                                          | Защита детей, сообщения о нарушениях, образование по возрасту и обычные фотографии детей.                                                                                                                            |
| `violence`      | Угрозы, подстрекательство, прославление насилия и кровавые подробности; на изображениях — тяжёлые повреждения или нападения на людей.                                                         | Нейтральные новости, история, спорт, игры, художественные сцены без жестоких подробностей; само присутствие оружия.                                                                                                  |
| `hate`          | Ненависть по защищаемому признаку: расе, этничности, национальности или региону происхождения, религии, полу, сексуальной ориентации, инвалидности и подобным.                                | Цитирование и документирование ненависти для критики, критика идей и правительств.                                                                                                                                   |
| `harassment`    | Оскорбления, запугивание, травля, публикация личных данных и коллективные нападки на человека или группу.                                                                                     | Корректное несогласие и резкая критика работы или идей.                                                                                                                                                              |
| `self-harm`     | Поощрение самоповреждения, инструкции к нему или выражение текущего намерения автора.                                                                                                         | Профилактика, поддержка и восстановление.                                                                                                                                                                            |
| `illicit`       | Практическая помощь в совершении преступления, предложения и запросы незаконных товаров и услуг.                                                                                              | Новости, правовые материалы, снижение вреда и защитные меры безопасности.                                                                                                                                            |

Шесть ключей подкатегорий OpenAI — `harassment/threatening`, `hate/threatening`, `illicit/violent`, `self-harm/intent`, `self-harm/instructions` и `violence/graphic` — сохранены для совместимости типизированных SDK, но отдельно не оцениваются. Они всегда равны `false`, их оценка — `0`, а список `category_applied_input_types` пуст. Не стройте правила на этих полях.

## Пороги и решения

У каждой проверяемой категории свой порог. Поле `categories[k]` показывает результат сравнения оценки с порогом, а `flagged` равно `true`, если хотя бы одна оценка достигла порога.

|                                            | Порог остальных категорий | Порог `sexual/minors` | Начало диапазона review              |
| ------------------------------------------ | ------------------------: | --------------------: | ------------------------------------ |
| Текст (`beat-moderation-1.0`)              |                     `0.6` |                 `0.3` | `0.35`; для `sexual/minors` — `0.15` |
| Изображение (`beat-moderation-vision-1.0`) |                     `0.6` |                `0.35` | `0.35`; для `sexual/minors` — `0.25` |

У Beat Moderation 2.0 свои пороги, перечисленные в начале страницы. Таблица выше относится к прежним моделям при явном выборе.

| `verdict` | Условие                                                                                                                                   | Что делать                                              |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| `block`   | Хотя бы одна оценка достигла порога. Эквивалентно `flagged: true`.                                                                        | Отклоните контент.                                      |
| `review`  | Пороги не достигнуты, но оценка находится в диапазоне проверки ниже порога либо контент имеет сексуальный подтекст без явного содержания. | Передайте человеку или примените более строгое правило. |
| `allow`   | Ни одно из условий выше не выполнено.                                                                                                     | Разрешите контент.                                      |

Поле `sexual_level` описывает сексуальный характер контента независимо от оценки:

| `sexual_level` | Значение                                                                                      |
| -------------- | --------------------------------------------------------------------------------------------- |
| `none`         | Сексуального содержания нет.                                                                  |
| `contextual`   | Секс или нагота без цели возбуждения: медицина, образование, новости, классическое искусство. |
| `suggestive`   | Сексуальный подтекст без явного содержания.                                                   |
| `explicit`     | Явный сексуальный контент.                                                                    |

Оценка `category_scores.sexual` — вероятность уровня `explicit`. Контент с подтекстом получает низкую оценку здесь, но `sexual_level: "suggestive"` и `verdict: "review"`. Если для вас важен подтекст, читайте оба поля. Когда изображение передано с текстом, возвращается более высокий уровень из двух.

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

Поле `policy_version` определяет политику, сформировавшую оценки. Оценки разных версий и оценки текстовой и визуальной модели несопоставимы. Сохраняйте версию рядом с каждой оценкой.

## Ограничения

Здесь описаны прежние модели при явном выборе. Beat Moderation 2.0 принимает один текст и до четырёх изображений; её ограничения приведены в начале страницы.

* **Один текст, одно изображение или по одному каждого типа за вызов.** Несколько текстов или изображений отклоняются с 400, частичная проверка не выполняется. Отправляйте отдельный запрос на каждый элемент.
* **Текст до 8 000 символов.** Более длинный отклоняется с 400, а не обрезается. Разбейте его и отправьте части отдельно. Длина измеряется в кодовых единицах UTF-16, поэтому большинство эмодзи считаются за две.
* **Изображение PNG, JPEG или WebP, до 4 MB и 16 мегапикселей.** Иные варианты дают 400 с описанием причины.
* **Аудио и видео не поддерживаются.**
* **Синхронный ответ.** Потоковой передачи и задачи для опроса нет. Обработка на сервере занимает примерно 0.2 секунды для текста и 0.5 секунды для изображения.

## Ошибки

Ошибки используют стандартный объект BeatAPI: `code`, `message`, `retryable`, `request_id` и `retry_after_seconds` при 429. Все коды и правила повторов приведены в разделе [ошибок](/errors). В этом методе также есть поля OpenAI `type` и `param`, причём `param` всегда равен `null`, чтобы SDK OpenAI создавали привычные исключения.

```json
{
  "error": {
    "code": "bad_request",
    "message": "input is required: the text to moderate, an image, or one of each",
    "retryable": false,
    "request_id": "…",
    "type": "invalid_request_error",
    "param": null
  }
}
```

| HTTP-статус | Код                                            | `type`                  | Исключение Python SDK   | Значение                                                                                                                                                                                      |
| ----------: | ---------------------------------------------- | ----------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|         400 | `bad_request`                                  | `invalid_request_error` | `BadRequestError`       | Сообщение называет нарушенное правило: пустой вход, несколько текстов или изображений, больше 8 000 символов, неизвестное имя модели, неверный JSON или проблема изображения из таблицы ниже. |
|         401 | `missing_api_key` / `invalid_api_key`          | `invalid_request_error` | `AuthenticationError`   | Ключ не передан или недействителен.                                                                                                                                                           |
|         402 | `insufficient_credits`                         | `insufficient_quota`    | `APIStatusError`        | Недостаточный баланс. OpenAI возвращает для пустого баланса 429; здесь используется 402, который SDK автоматически не повторяет.                                                              |
|         403 | `forbidden`                                    | `invalid_request_error` | `PermissionDeniedError` | Ключу или аккаунту недоступна модель. Аккаунт без единого пополнения не может её использовать.                                                                                                |
|         429 | `rate_limit_exceeded`                          | `rate_limit_error`      | `RateLimitError`        | Достигнут лимит запросов. Подождите `Retry-After` секунд; то же число есть в `retry_after_seconds`.                                                                                           |
|         503 | `processing_unavailable` / `processing_failed` | `server_error`          | `InternalServerError`   | Сервис модерации не ответил. Повторите с увеличением задержки.                                                                                                                                |

Что означает 400 для изображения:

| Проблема изображения                                                                              | `message`                                                                                                                                     |
| ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Не PNG, JPEG или WebP: GIF, BMP, HEIC, SVG либо файл другого типа                                 | `the image data is a GIF, which is not supported; send PNG, JPEG or WebP` либо `The image could not be read. Send a PNG, JPEG or WebP image.` |
| Размер больше 4 MB                                                                                | `image is about 5.2 MB; the limit is 4 MB. Resize or recompress it` либо для ссылки `An input file is larger than the 4 MB limit. …`          |
| Больше 16 мегапикселей                                                                            | `The image has too many pixels; the limit is 16 megapixels. Resize it and try again.`                                                         |
| Ссылка не загружается: 404, отказ хоста, отсутствие ответа, неверный сертификат или частный адрес | `An input file could not be downloaded. Please use a publicly reachable HTTPS URL.`                                                           |
| По ссылке возвращается веб-страница или пустой файл                                               | `An input link did not return an image. Link directly to the image file.` / `An input link returned an empty file.`                           |
| Не ссылка и не base64 data URL либо неверный base64                                               | `image_url.url must be an http(s) link to the image, or a base64 data URL such as data:image/jpeg;base64,...`                                 |

Повреждённое или обрезанное изображение может пройти проверки, но вызвать ошибку модели. Тогда возвращается 503 с указанием возможного повреждения файла; повтор с тем же файлом снова завершится ошибкой.

В таблице указаны исключения, реально полученные официальным Python SDK: 401, 402, 403 и 429 проверены 12 октября 2026 года (`openai` 2.48.0), а 400 и 503 — 13 октября 2026 года (`openai` 3.29.0). Ошибка 503 получена для обрезанного JPEG.

Неудачный вызов ничего не проверил: не считайте ошибку разрешением контента. Запрос с отказом 400 не оплачивается.

## Оплата

Модерация оплачивается **только за входные токены**: **$0.08 за 1M входных токенов** для используемой по умолчанию `beat-moderation-2.0`. Прежние модели при явном выборе стоят **$0.06 за 1M входных токенов** для текста и **\$0.22 за 1M входных токенов** для запроса с изображением. Все три модели есть на [странице цен](https://beatapi.io/pricing).

У прежних моделей политика модерации передаётся с каждым вызовом и входит во входные токены: около 1 150 токенов, поэтому даже у короткого текста есть минимальный объём. Изображение добавляет до примерно 1 000 токенов независимо от размера.

Объёмы токенов прежних моделей; значения для 2.0 приведены в начале страницы:

| Запрос                               |    Входные токены |   Стоимость |
| ------------------------------------ | ----------------: | ----------: |
| Одна строка текста                   |       Около 1 200 | ≈ \$0.00007 |
| 8 000 китайских символов             |       Около 9 200 |  ≈ \$0.0006 |
| Одно изображение                     | Около 2 000–2 500 |  ≈ \$0.0005 |
| Одно изображение с коротким промптом |       Около 2 600 |  ≈ \$0.0006 |

Поле `usage.input_tokens` каждого ответа показывает точное число учтённых токенов для сверки стоимости вызова.

## Конфиденциальность

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

## Чего API не делает

* **Это классификатор, а не гарантия.** Явные нарушения определяются надёжно, но завуалированный сленг, созвучия и замаскированный спам, особенно на китайском, — хуже. Проверьте реальные материалы своего продукта до внедрения.
* **Пограничные изображения оцениваются менее стабильно, чем текст.** Художественная нагота, единоборства и исторические фотографии часто близки к порогам; похожие изображения могут получить `allow`, `review` или `block`. Текст внутри картинок, например мемы и реклама с QR-кодами, в наши тесты не входил.
* **`sexual/minors` не заменяет сопоставление хэшей** известных материалов насилия над детьми и не отменяет обязанности сообщать о них по закону.
* **Аудио и видео не проверяются.**
* **Оценки не полностью воспроизводимы.** В наших тестах одинаковые вызовы различались до 0.04, поэтому близкая к порогу оценка может оказаться по любую его сторону. Рассматривайте её как пограничную.

## Агенты

Агенты используют те же проверки через [Capabilities API](/capabilities), где они зарегистрированы как `model:beat-moderation-1.0` и `model:beat-moderation-vision-1.0`. Вход Run для текста — `{"input": "…"}`, для изображения — `{"image_url": "…", "input": "optional text"}`. Результат совпадает с описанным выше. На этом пути ошибки используют стандартный объект без `type` и `param`.

Beat Moderation 2.0 доступна как `model:beat-moderation-2.0`. Вход Run — `{"input": "text", "image_urls": ["https://..."]}`; одно изображение также можно передать через `image_url`.