REST / JSON

API-док

JSON API: ключ с балансом, оплата за запрос, тот же движок, что и в веб-версии.

Быстрый старт за три запроса

  1. Заведите ключ — вернётся csscl_… с пробным балансомcurl -X POST https://css-cleaner.ru/api/v1/key -H "Content-Type: application/json" -d '{"name":"my-app"}'
  2. Пополните баланс: карта, СБП, крипта или песочницаcurl -X POST https://css-cleaner.ru/api/v1/topup -d 'key=csscl_XXXX&amount=500&provider=yookassa'
  3. Отправляйте CSS — возвращаем чистый CSS и отчётcurl -X POST https://css-cleaner.ru/api/v1/dedup -H "X-API-Key: csscl_XXXX" -d '{"css":".a{color:red}.a{color:red}"}'

Аккаунта нет: ключ и есть счёт. Потеряли ключ — баланс не восстановить.

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

Ключ можно передать любым из трёх способов.

X-API-Key: csscl_XXXXXXXXXXXXXXXX
Authorization: Bearer csscl_XXXXXXXXXXXXXXXX
POST /api/v1/dedup?key=csscl_XXXXXXXXXXXXXXXX

Без ключа доступно 20 бесплатных запросов в день на IP: годится для тестов, но для продакшена заведите ключ.

Эндпоинты

Метод и путьЧто делаетТариф
POST /api/v1/dedupУбирает дубликаты и пустые правила, безопасно склеивает переопределения одного селектора.0.10 ₽
POST /api/v1/filterОставляет только те правила, которые реально срабатывают в переданном HTML.0.20 ₽
POST /api/v1/blockСобирает стили одного блока: вместе с наследуемыми от html/body и всеми нужными var().0.30 ₽
POST /api/v1/keyСоздать ключ с пробным балансомбесплатно
GET /api/v1/keyБаланс, расход, число запросов, текущие ценыбесплатно
POST /api/v1/topupСчёт на пополнение — вернёт ссылку на оплатубесплатно
POST /api/dedup · /api/filter · /api/blockТе же три задачи без ключа и без тарификациибесплатно

Параметры запроса

POST /api/v1/dedup

ПолеТипОбязательноЗначение
cssstringдаCSS целиком, как в файле
strip_commentsboolнетвырезать комментарии (по умолчанию нет)
merge_overridesboolнетслить правила одного селектора в одно — только если свойства не конфликтуют

POST /api/v1/filter

ПолеТипОбязательноЗначение
cssstringдаCSS целиком, как в файле
htmlstringдаHTML страницы, для которой чистим CSS
drop_keyframesboolнетубрать @keyframes, на которые нет ни одной анимации
drop_fontsboolнетубрать @font-face, которые не используются

POST /api/v1/block

ПолеТипОбязательноЗначение
cssstringдаCSS целиком, как в файле
htmlstringдаHTML страницы, для которой чистим CSS
targetstringдаселектор блока: .card, #hero, main .btn
pruneboolнетвыбросить объявления, которые всё равно перекрываются позже по каскаду
drop_keyframesboolнетубрать @keyframes, на которые нет ни одной анимации
drop_fontsboolнетубрать @font-face, которые не используются

POST /api/v1/topup

ПолеТипОбязательноЗначение
keystringдаAPI-ключ, который пополняем
amountnumberдасумма в рублях: от 100 до 100000
providerstringнетyookassa · robokassa · cryptocloud · demo (пусто = первый доступный)

Ответ

Успешный ответ — JSON с результатом и отчётом. Все суммы в копейках.

{
  "ok": true,
  "endpoint": "block",
  "charged": 30,
  "price": 30,
  "balance": 970,
  "output": ":root { --brand: #3b82f6; } body { color: #222; } .card { padding: 24px; }",
  "report": {
    "rules_total": 14, "rules_kept": 9, "rules_dropped": 5,
    "elements_matched": 1, "inherited_kept": ["html", "body", ".content"],
    "var_names": ["--brand", "--gap", "--text"],
    "saved_bytes": 412, "reduction": 38.4
  }
}
ПолеЗначение
outputочищенный CSS одной строкой
charged · price · balanceсколько списали, цена запроса, остаток на ключе
report.saved_bytes · report.reductionсколько байт сэкономлено и на сколько процентов
report.rules_before · rules_after · duplicates · empty · merged_groupsстатистика дедупликации: правил до и после, дубликаты, пустые, склейки
report.rules_kept · rules_dropped · elements_matched · keyframes_dropped · fonts_droppedстатистика фильтрации: что оставили, что выбросили, сколько элементов совпало
report.inherited_kept · var_names · decls_pruned · targetдля блока: унаследованные селекторы, имена переменных, вырезанные объявления

Ошибки

Любая ошибка — JSON вида {"error": "…"}.

HTTPСмысл
400нет css/html или некорректный JSON
401ключ не найден или не передан
402недостаточно средств на ключе
403ключ отключён
404неизвестный эндпоинт, например /api/v1/pretty
413вход больше 2 МБ
429исчерпан дневной бесплатный лимит

Лимиты

Примеры кода

JavaScript (fetch)

const r = await fetch("https://css-cleaner.ru/api/v1/filter", {
  method: "POST",
  headers: { "Content-Type": "application/json", "X-API-Key": "csscl_XXXX" },
  body: JSON.stringify({ html: document.documentElement.outerHTML, css, drop_keyframes: true }),
});
const { output, report } = await r.json();
console.log(`−${report.saved_bytes} б, −${report.rules_dropped} правил`);

Python (requests)

import requests

r = requests.post("https://css-cleaner.ru/api/v1/block",
                  headers={"X-API-Key": "csscl_XXXX"},
                  json={"html": html, "css": css, "target": ".card", "prune": True},
                  timeout=60)
r.raise_for_status()
print(r.json()["output"], r.json()["balance"])