К содержимому

API

Документация API

Подключите SculkWard, отправьте сообщение и получите решение для автоматического действия или ручной проверки.

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

  1. 1Выпустите ключ в панели — он начинается с sk_live_.
  2. 2Передайте ключ в заголовке x-api-key.
  3. 3Отправьте текст в POST /v1/moderate и прочитайте вердикт из JSON.
curl https://sculkward.com/v1/moderate \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"input": "продам акк дёшево, пиши в тг @seller"}'

Аутентификация#

Каждый запрос к /v1 требует ключ вида sk_live_…. Передайте его одним из двух способов:

x-api-key: sk_live_xxx
Держите ключ на сервере. Не публикуйте его в браузерном коде или репозитории. Отсутствующий или неверный ключ даёт 401; скомпрометированный ключ отзывается в панели.

Эндпоинты#

МетодПутьНазначение
POST/v1/moderateПроверить текст и получить готовый вердикт.
POST/v1/moderate/batchПроверить до 32 текстов синхронно одним запросом.
GET/v1/usageСводка использования по ключу.
GET/v1/healthСтатус сервиса (без ключа).

POST/v1/moderate#

Проверяет текст и возвращает готовый вердикт: категории вреда, их оценки и блок рекламы.

Параметры

ПолеТипОписание
inputобязательноеstringТекст для проверки. Пустой даёт 400.
image_urlbetastringСсылка на изображение. Модерация изображений в разработке — поле пока не обрабатывается.

POST/v1/moderate/batch#

Синхронно проверяет от 1 до 32 элементов и возвращает массив results в исходном порядке. Каждый элемент завершается независимо: ошибка одного не скрывает успешные соседние результаты.

curl https://sculkward.com/v1/moderate/batch \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"custom_id":"msg-1","input":"first message"},{"custom_id":"msg-2","input":"second message"}]}'

Лимиты: 32 KiB на элемент, 512 KiB на JSON-тело и до 64 символов в custom_id. custom_id должны быть уникальны внутри одного пакета.

Результаты сохраняют порядок input. Переданный custom_id возвращается в ответе и позволяет надёжно сопоставить элементы.

Верхнеуровневый request_id обозначает попытку HTTP-запроса. Каждый успешный result содержит свой id конкретного результата модерации.

Структурно неверный пакет даёт HTTP 400. После приёма эндпоинт возвращает HTTP 200 с поэлементным status: ok или error. Повторяйте overloaded и upstream ошибки с экспоненциальной задержкой и случайным разбросом.

Ответ200 OK#

ПолеТипОписание
idstringИдентификатор результата, возвращённый в этом ответе с вердиктом.
request_idstringИдентификатор конкретной попытки запроса для трассировки и поддержки.
flaggedboolИтоговый флаг: сработала хотя бы одна категория или реклама.
categoriesobjectБулев флаг по каждой категории — порог уже применён.
category_scoresobject · 0…1Числовая оценка каждой категории — для собственных порогов.
adobjectЧисловая оценка вероятности рекламы.
{
  "id": "mod_3f9a2b7c8d1e4f50a6b3c2d1e0f9a8b7",
  "request_id": "req_123456781234423482341234567890ab",
  "flagged": true,
  "categories": {
    "harassment": false,
    "hate": false,
    "sexual": false,
    "violence": false,
    "self_harm": false,
    "illicit": false
  },
  "category_scores": {
    "harassment": 0.05,
    "hate": 0.02,
    "sexual": 0.01,
    "violence": 0.03,
    "self_harm": 0.00,
    "illicit": 0.04
  },
  "ad": {
    "score": 0.92
  }
}

Сохраняйте оба идентификатора: id обозначает результат, возвращённый в этом ответе с вердиктом, а request_id — конкретную попытку запроса для трассировки и поддержки.

Категории#

У части категорий есть уточняющие под-категории — например harassment_threatening.

harassment

Травля и оскорбления в адрес человека.

hate

Ненависть и дискриминация по признаку.

sexual

Сексуальный контент.

violence

Насилие и угрозы.

self_harm

Самоповреждение и суицид.

illicit

Противоправные действия и инструкции.

GET/v1/usage#

Общее количество запросов, выполненных с этим ключом.

{
  "total": 18432
}

Ошибки#

Ошибки приходят единым конвертом с машиночитаемым type и текстом message:

{
  "error": {
    "type": "validation",
    "message": "input must not be empty"
  },
  "request_id": "req_123456781234423482341234567890ab"
}
HTTPТипКогда
400validationПустой input или некорректное тело.
401unauthorizedНет ключа или ключ неверный либо отозван.
402payment_requiredНедостаточно баланса для платного запроса.
404not_foundЗапрошенный ресурс не найден.
429rate_limitedПревышена дневная квота тарифа.
503overloadedМощность модерации временно исчерпана. Повторите запрос с экспоненциальной задержкой и случайным разбросом; это не сбой внешней зависимости.
503upstreamПроверка временно недоступна — повторите запрос позже.
500internalВнутренняя ошибка сервиса.

Дневной лимит зависит от тарифа и обновляется в начале UTC-суток. Смотреть тарифы