
API модерации изображений: руководство с примерами на Python и JavaScript
Как работает API модерации изображений: какие категории вреда применяются к картинкам, приём только по URL, оплата за изображение, пороги оценок и код на Python и JavaScript.
API модерации изображений принимает картинку, оценивает её по списку категорий вреда и подсказывает, что с ней делать: опубликовать, придержать или заблокировать. Подвох универсальной модели вроде omni-moderation-latest в том, что не каждая категория в её ответе действительно смотрит на изображение: в документации OpenAI 6 из 13 категорий помечены как «Text and images», а остальные 7 как «Text only»[1]. Если отправить фотографию без подписи, эти 7 чисто текстовых категорий вернут 0 по самой конструкции модели, а не потому, что фото безопасно[1].
В этом руководстве разобрано, что это значит на практике: на какие категории можно опираться для изображений, как отправить картинку (reAPI принимает только публичные URL), как тарифицируется запрос, как превратить оценки в решения, а также рабочий пример на Python и JavaScript, который отправляет изображение и опрашивает задачу до получения вердикта. В конце показано, чем отличаются специализированные сервисы для изображений: Sightengine, Hive, Azure AI Content Safety и Amazon Rekognition.
TL;DR
omni-moderation-latestоценивает изображения по 6 категориям:sexual,self-harm,self-harm/intent,self-harm/instructions,violenceиviolence/graphic. Остальные 7, включаяsexual/minors, работают только с текстом[1].- В reAPI изображение передаётся блоком
image_urlс публичным http(s) URL. Base64 и URIdata:отклоняются[2]. - Оплата идёт за единицы модерации: одна единица за изображение, одна за каждые 1000 слов текста, минимум одна единица за запрос[2]. Актуальные ставки указаны на странице модели.
- Вызов асинхронный:
POST /api/v1/moderations, затем опросGET /api/v1/tasks/{id}, покаstatusне станетcompleted[2]. flaggedозначает вердикт модели по умолчанию. Для собственной политики задайте порогиcategory_scores(от 0 до 1) для каждой категории и перекалибруйте их, когда модель обновится[1].- Бесплатен ли собственный эндпоинт OpenAI, разобрано в статье Is the OpenAI moderation API free?.
Какие категории вреда видит API модерации изображений
OpenAI перечисляет, какие типы входных данных поддерживает каждая категория omni-moderation-latest[1]:
| Категория | Входные данные |
|---|---|
sexual | Текст и изображения |
self-harm, self-harm/intent, self-harm/instructions | Текст и изображения |
violence, violence/graphic | Текст и изображения |
sexual/minors | Только текст |
harassment, harassment/threatening | Только текст |
hate, hate/threatening | Только текст |
illicit, illicit/violent | Только текст |
Для конвейера обработки изображений из этого следуют два важных вывода.
Во-первых, ноль не всегда является результатом измерения. OpenAI указывает, что если отправить только изображения без сопроводительного текста, модель вернёт оценку 0 для категорий, работающих только с текстом[1]. Символ ненависти в меме или письменная угроза на скриншоте не будут пойманы оценками hate или harassment в запросе, содержащем только изображение. В поле category_applied_input_types ответ сообщает, по каким типам входных данных оценивалась каждая категория; в примере OpenAI с одним изображением шесть категорий для картинок содержат ["image"], а остальные пустой массив[1]. Проверяйте это поле, прежде чем считать низкую оценку пропуском.
Во-вторых, sexual/minors работает только с текстом[1]. В руководстве OpenAI также сказано, что не следует отправлять в Moderation API известные или предполагаемые материалы сексуального насилия над детьми: API не предназначен для обнаружения CSAM и не заменяет специализированные средства защиты детей[1]. Если ваша платформа принимает загрузки от пользователей, предусмотрите отдельный механизм защиты детей.
OpenAI документирует для модели ограничение на размер файла изображения в 20 МБ[1].
Отправка изображений: только публичные URL
В теле запроса одно поле с контентом, input. Для изображений в нём передаётся массив блоков контента[2]:
{
"model": "omni-moderation-latest",
"input": [
{ "type": "image_url", "image_url": { "url": "https://example.com/upload.jpg" } }
]
}Собственный справочник API OpenAI говорит, что image_url.url может быть либо URL изображения, либо данными изображения в кодировке base64[3]. reAPI принимает только первый вариант: image_url.url должен быть публичным http(s) URL, а base64 или URI data: не проходят валидацию с ошибкой 20003[2]. Это правило действует для медиаданных на входе всех моделей reAPI.
Для пользовательских загрузок порядок действий такой: сохранить файл, получить URL, доступный из интернета, затем отправить его на модерацию. Подписанные URL подходят, если они ещё действительны в момент выполнения задачи[2]. Если URL не удаётся загрузить, задача завершается ошибкой 80007, а списанная сумма возвращается[2]. Держите объект приватным и неопубликованным, пока не придёт вердикт.
Подпись и фотографию можно также положить в один массив. В документации reAPI отмечено, что массив блоков контента возвращает один результат на весь набор, то есть модель оценивает текст и изображение вместе[2]. Для поста с подписью это именно то, что нужно. Для десяти не связанных между собой загрузок это не подходит: по одному общему вердикту не понять, какое изображение его вызвало, поэтому отправляйте их отдельными запросами.
Как тарифицируется модерация изображений
reAPI тарифицирует omni-moderation-latest за единицы модерации[2]:
| Входные данные | Единицы |
|---|---|
Каждый блок image_url | 1 единица |
| Текст | 1 единица за 1000 слов, суммируется по всему запросу; каждый текстовый элемент считается как минимум за 50 слов |
| Любой запрос | Не менее 1 единицы |
Единицы пересчитываются в кредиты один раз на запрос с округлением вверх, опрос бесплатен, а за неудачные запросы средства возвращаются автоматически[2]. Один запрос принимает до 500 элементов[2]. Ставка за единицу указана на странице модели. Сравнение цен и бесплатных лимитов у разных поставщиков приведено в статье Is the OpenAI moderation API free?.
Пример API модерации изображений на Python и JavaScript
Оба примера делают одно и то же: отправляют одно изображение, опрашивают задачу каждые 3 секунды и возвращают первый результат. Документация reAPI по задачам рекомендует опрашивать не чаще чем раз в 2–3 секунды, потому что эндпоинт опроса кешируется на 5 секунд, пока задача выполняется[4]. Проверка модерации обычно завершается за несколько секунд[2].
Python
import time
import requests
API = "https://reapi.ai/api/v1"
HEADERS = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
}
def moderate_image(image_url, timeout_s=60):
submit = requests.post(
f"{API}/moderations",
headers=HEADERS,
json={
"model": "omni-moderation-latest",
"input": [{"type": "image_url", "image_url": {"url": image_url}}],
},
timeout=30,
)
submit.raise_for_status()
task_id = submit.json()["id"]
deadline = time.time() + timeout_s
while time.time() < deadline:
time.sleep(3)
task = requests.get(f"{API}/tasks/{task_id}", headers=HEADERS, timeout=30).json()
if task["status"] == "completed":
return task["output"]["moderation"]["results"][0]
if task["status"] == "failed":
raise RuntimeError(f'{task["error"]["code"]}: {task["error"]["message"]}')
raise TimeoutError(f"task {task_id} still processing")
result = moderate_image("https://example.com/upload.jpg")
print(result["flagged"], result["category_scores"]["violence"])JavaScript (Node.js 18+, сохранить как модуль .mjs)
const API = "https://reapi.ai/api/v1";
const headers = {
Authorization: `Bearer ${process.env.REAPI_API_KEY}`,
"Content-Type": "application/json",
};
async function moderateImage(imageUrl, timeoutMs = 60_000) {
const submit = await fetch(`${API}/moderations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "omni-moderation-latest",
input: [{ type: "image_url", image_url: { url: imageUrl } }],
}),
});
if (!submit.ok) throw new Error(`submit failed: ${submit.status} ${await submit.text()}`);
const { id } = await submit.json();
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
await new Promise((r) => setTimeout(r, 3000));
const task = await (await fetch(`${API}/tasks/${id}`, { headers })).json();
if (task.status === "completed") return task.output.moderation.results[0];
if (task.status === "failed") throw new Error(`${task.error.code}: ${task.error.message}`);
}
throw new Error(`task ${id} still processing`);
}
const result = await moderateImage("https://example.com/upload.jpg");
console.log(result.flagged, result.category_scores.violence);Запускайте JavaScript-версию на сервере, а не в браузере. API-ключ является Bearer-токеном, и если он попадёт во фронтенд-код, его увидит любой, кто откроет инструменты разработчика. То же касается вопроса про React в разделе FAQ ниже. Полная схема запроса, включая текст и смешанные входные данные, приведена в документации API.
Чтение результата и настройка порогов
Каждый результат содержит четыре поля[1][2]:
| Поле | Что оно сообщает |
|---|---|
flagged | true, если модель считает входные данные вредными хотя бы в одной категории |
categories | Вердикт модели true/false по каждой категории |
category_scores | Уверенность модели по каждой категории, от 0 до 1 |
category_applied_input_types | По каким типам входных данных (text, image) оценивалась каждая категория |
flagged годится для первого прохода, но в нём заложены настройки модели по умолчанию, которые могут оказаться строже или мягче вашей политики[2]. OpenAI рекомендует воспринимать оценки как сигналы для политики вашего приложения, а не как автоматическое решение о блокировке, и при необходимости направлять помеченный контент на проверку[1].
Распространённая схема: три диапазона для каждой категории изображений. Ниже низкого порога контент пропускается, в середине уходит на ручную проверку, выше высокого порога блокируется. Минимальный вариант:
IMAGE_CATEGORIES = [
"sexual", "self-harm", "self-harm/intent", "self-harm/instructions",
"violence", "violence/graphic",
]
REVIEW_AT = 0.3 # example values only; calibrate on your own labeled images
BLOCK_AT = 0.8
def decide(result):
applied = result["category_applied_input_types"]
scores = result["category_scores"]
checked = [c for c in IMAGE_CATEGORIES if "image" in applied.get(c, [])]
top = max((scores[c] for c in checked), default=0.0)
if top >= BLOCK_AT:
return "block"
if top >= REVIEW_AT or result["flagged"]:
return "review"
return "allow"Числа выше даны для иллюстрации и не являются рекомендацией. Подберите свои, прогнав несколько сотен уже размеченных вами изображений и посмотрев, где ложатся оценки. Периодически повторяйте эту проверку: OpenAI сообщает, что планирует и дальше обновлять базовую модель и что собственные политики на основе category_scores со временем может потребоваться перекалибровать[1]. При прохождении через reAPI оценки не округляются и не пересчитываются[2], поэтому однажды выполненная калибровка напрямую применима к значениям, которые читает ваш код.
Чем отличаются специализированные API модерации изображений
Универсальная модель и специализированный сервис для изображений отвечают на разные вопросы. omni-moderation-latest оценивает шесть визуальных категорий и может оценивать подпись вместе с изображением[1]. Специализированные API для изображений распознают гораздо больше визуальных классов, например оружие, наркотики, символы ненависти или текст на изображении, и различаются тем, как принимают файл и как сообщают уверенность. По документации каждого поставщика:
| Сервис | Что распознаёт на изображениях | Как передаётся изображение | Результат | Единица тарификации |
|---|---|---|---|---|
omni-moderation-latest в reAPI | sexual, self-harm (3), violence (2)[1] | Публичный http(s) URL[2] | Boolean + оценка 0–1 по каждой категории[1] | За изображение (единица модерации)[2] |
| Sightengine | Обнажённость в 29 классах, насилие, оружие, символы ненависти и оскорбительные знаки, кровь и увечья, самоповреждение, наркотики, алкоголь, табак, азартные игры, текст на изображениях, QR-коды[5] | Прямая загрузка или публично доступный URL[6] | Результаты по каждой выбранной модели | Операции; модели из одной группы считаются один раз за запрос[7] |
| Hive Visual Moderation | Сексуальный контент, изображения насилия, наркотики, изображения ненависти и атрибуты изображения, разбитые на именованные классы[8] | Публичный или подписанный URL либо загрузка локального файла[9] | Уверенность 0–1 по каждому классу[9] | Годовой контракт; небольшим клиентам Hive предлагает свою self-serve VLM[8] |
| Azure AI Content Safety (Analyze Image) | Hate, SelfHarm, Sexual, Violence[10] | Байты в base64 или URL blob-объекта, одно из двух[10] | Уровень серьёзности 0, 2, 4 или 6 по каждой категории[11] | За каждое отправленное изображение[12] |
| Amazon Rekognition (DetectModerationLabels) | Трёхуровневая таксономия меток; верхний уровень включает Explicit, Violence, Visually Disturbing, Drugs & Tobacco, Alcohol, Rude Gestures, Gambling и Hate Symbols[13] | Байты изображения в base64 или объект Amazon S3; JPEG или PNG[14] | Метки с уверенностью; MinConfidence по умолчанию 50[14] | За изображение за вызов API[15] |
Выбор обычно определяют три различия.
Визуальный охват. Если нужно ловить оружие, наркотики, символы ненависти или текст, впечатанный в изображение, специализированные сервисы явно перечисляют эти классы[5][8][13]. У omni-moderation-latest для них нет категорий изображений[1].
Форма оценки. Hive возвращает уверенность 0–1 по каждому классу и советует начинать примерно с 0.90 для пометки класса[8]. Rekognition отбрасывает метки ниже MinConfidence, который по умолчанию равен 50 по шкале 0–100[14]. Azure для изображений возвращает грубые уровни серьёзности: 0, 2, 4 или 6[11]. Порог, подобранный на одном сервисе, не переносится на другой.
Приём входных данных. Azure и Rekognition принимают байты в base64[10][14], а Sightengine и Hive принимают прямую загрузку файла[6][9]. reAPI принимает только URL[2], что удобно для конвейеров, где загрузка и так попадает в объектное хранилище.
omni-moderation-latest подходит, если ваш контент в основном текстовый с прикреплёнными изображениями, если шесть визуальных категорий соответствуют вашей политике или если вы уже вызываете другие модели через reAPI тем же ключом. Более широкое сравнение по модальностям и сценариям приведено в статье Best content moderation API.
Часто задаваемые вопросы
API модерации изображений бесплатно
OpenAI заявляет, что её собственный эндпоинт модерации бесплатен[1]. В reAPI omni-moderation-latest оплачивается по факту использования, одна единица за изображение, а за неудачные запросы средства возвращаются[2]. Бесплатные уровни и лимиты запросов у разных поставщиков сравниваются в статье Is the OpenAI moderation API free?.
Бесплатный API модерации загруженных изображений
Модерация загрузки состоит из трёх шагов: сохранить файл приватно, создать URL, который API сможет загрузить (подписанный URL подходит, пока он действителен), затем отправить этот URL и публиковать только после вердикта[2]. reAPI не принимает байты файла или строку base64 напрямую[2]. Какие сервисы дают бесплатный объём, смотрите в статье Is the OpenAI moderation API free?.
OpenAI API модерации изображений
Да, модель модерации OpenAI работает с изображениями. omni-moderation-latest принимает текст и изображения, не классифицирует аудио и оценивает изображения только по категориям sexual, self-harm и violence[1]. ID модели в reAPI тот же, omni-moderation-latest, и доступна она через асинхронный эндпоинт задач[2].
API модерации изображений Python
Пример на Python выше полный: он отправляет блок image_url на /api/v1/moderations, опрашивает /api/v1/tasks/{id} и возвращает output.moderation.results[0]. Ему нужен только пакет requests. В документации API тот же вызов показан на cURL, Node.js и Go.
API модерации изображений React
Вызывайте API модерации со своего бэкенда, а не из компонента React. Ваше React-приложение загружает файл на ваш сервер или в хранилище, сервер вызывает API с ключом, а клиент получает только решение. Bearer-ключ в браузерном коде виден каждому посетителю.
Может ли ChatGPT API анализировать изображения?
Да. Модели OpenAI с поддержкой зрения анализируют изображения через Responses API и Chat Completions API по URL, data URL в base64 или ID файла[16]. Это свободное понимание изображений. Для фиксированного набора категорий вреда с оценками 0–1 специально предназначен эндпоинт модерации[1].
Лучший API модерации изображений
Зависит от того, что нужно обнаруживать. Универсальная модель вроде omni-moderation-latest покрывает сексуальный контент, самоповреждение и насилие на изображениях и добавляет текстовые категории для подписей[1]; специализированные сервисы для изображений покрывают больше визуальных классов (см. таблицу выше). Полное руководство по выбору приведено в статье Best content moderation API.
Как встроить модерацию изображений в процесс загрузки
Рабочая схема с API модерации изображений короткая: загрузить в приватное хранилище, отправить URL на модерацию, принять решение по оценкам, затем опубликовать. С omni-moderation-latest помните, что на пиксели смотрят только шесть категорий, поэтому добавляйте в запрос подпись или OCR-текст, если вам важен текст внутри изображений, и держите отдельный механизм защиты детей. Начните с flagged, переходите к порогам по категориям, когда появятся размеченные данные, и перепроверяйте эти пороги при смене модели.
Чтобы попробовать, вставьте URL изображения в playground на странице модели Content Moderation, а затем перенесите пример на Python или JavaScript выше в свой бэкенд. В документации API перечислены все поля, которые принимает этот API модерации изображений.
Источники
- OpenAI. Moderation. Получено в октябре 2026 г. с developers.openai.com/api/docs/guides/moderation
- reAPI. omni-moderation-latest API docs. reapi.ai/docs/content-moderation
- OpenAI. Moderations API reference. Получено в октябре 2026 г. с developers.openai.com/api/reference/resources/moderations
- reAPI. Tasks API reference. reapi.ai/docs/api/tasks
- Sightengine. Visual Moderation models. Получено в октябре 2026 г. с sightengine.com/docs/models
- Sightengine. What are the ways to send an image to the API? Получено в октябре 2026 г. с sightengine.com/faq/ways-to-send-image-to-api
- Sightengine. What is an operation? Получено в октябре 2026 г. с sightengine.com/faq/what-is-an-operation
- Hive. Visual Moderation - Overview. Получено в октябре 2026 г. с docs.thehive.ai/docs/visual-content-moderation
- Hive. Using Hive's Visual Moderation API. Получено в октябре 2026 г. с docs.thehive.ai/docs/visual-moderation-api
- Microsoft. Image Operations - Analyze Image (REST API). Получено в октябре 2026 г. с learn.microsoft.com/en-us/rest/api/contentsafety/image-operations/analyze-image
- Microsoft. Harm categories in Azure AI Content Safety. Получено в октябре 2026 г. с learn.microsoft.com/en-us/azure/ai-services/content-safety/concepts/harm-categories
- Microsoft. Azure AI Content Safety pricing. Получено в октябре 2026 г. с azure.microsoft.com/en-us/pricing/details/content-safety
- Amazon Web Services. Using the image and video moderation APIs. Получено в октябре 2026 г. с docs.aws.amazon.com/rekognition/latest/dg/moderation-api.html
- Amazon Web Services. DetectModerationLabels. Получено в октябре 2026 г. с docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectModerationLabels.html
- Amazon Web Services. Amazon Rekognition pricing. Получено в октябре 2026 г. с aws.amazon.com/rekognition/pricing
- OpenAI. Images and vision. Получено в октябре 2026 г. с developers.openai.com/api/docs/guides/images-vision
Автор

Категории
.mjs)Чтение результата и настройка пороговЧем отличаются специализированные API модерации изображенийЧасто задаваемые вопросыAPI модерации изображений бесплатноБесплатный API модерации загруженных изображенийOpenAI API модерации изображенийAPI модерации изображений PythonAPI модерации изображений ReactМожет ли ChatGPT API анализировать изображения?Лучший API модерации изображенийКак встроить модерацию изображений в процесс загрузкиИсточникиЕщё статьи

Seedance 2.5: из изображения в видео, режимы и цена
Создайте видео из изображения в Seedance 2.5: первый и последний кадры, референсы, допустимые поля API, фото реальных людей и цена 10-секундного ролика.


API Nano Banana без бесплатного уровня: реальные цены
Бесплатный уровень Nano Banana API отсутствует: Google указывает 'Не доступно'. Реальные цены за изображение, пакетные тарифы и что даёт $0.02.


Апскейл видео с AI в 2026: код, десктоп или облако
Гайд по апскейлингу видео с AI: бесплатные инструменты, подписка Topaz $59/месяц, облачные API от $0.002/сек и примеры на Python для интеграции.
