API Astrina для разработчиков
Один REST JSON API для статистики трафика, отзывов, рейтингов, проверки номеров, 32 запускаемых утилит и входа через соцсети. Простая авторизация по ключу, щедрый бесплатный тариф.
Авторизация и квота
Каждому запросу нужен ваш API-ключ. Получите его в панели API. Передавайте его в заголовке запроса — ключи никогда не принимаются в URL, поэтому они не попадут в логи сервера, прокси или заголовок Referer:
curl https://astrina.io/api/v1/rating?site=example.com \
-H "X-Api-Key: ak_your_key_here"
# or: Authorization: Bearer ak_your_key_hereДневная квота идёт вместе с вашим тарифом: Free 100/день, Pro 5 000/день, Business 25 000/день, Business Plus 100 000/день — повысьте тариф для большего лимита. Каждый ответ содержит вашу квоту. Ошибки возвращают поле «error» с нужным статусом: 401 (неверный ключ), 429 (квота), 400/422 (неверные параметры), 403/404 (не ваше / не найдено). Ответы CORS-открыты и noindex.
Один REST API для публикации, планирования, аналитики и сообщений во всех подключённых сетях — 18 соцсетей и 6 рекламных сетей, одна модель авторизации, один формат запроса.
Поддерживаемые сети (18): X (Twitter), Instagram, Facebook, Threads, LinkedIn, TikTok, YouTube, Pinterest, Reddit, Snapchat, Google Business, VK, Odnoklassniki, Telegram, WhatsApp, Discord, Mastodon, Bluesky. Рекламные сети: Meta Ads, Google Ads, TikTok Ads, LinkedIn Ads, Pinterest Ads, X Ads.
Та же авторизация по ключу, что и выше (только заголовок), с областью social. Подключите каналы в вашей панели Social. Публикация асинхронна: /publish возвращает пост с каждой целью в очереди; воркер доставляет в течение минуты, а вебхук срабатывает после публикации.
/api/v1/social/channels Каждая сеть, её возможности и какие вы подключили. Вызовите это первым./api/v1/social/accounts Подключённые вами каналы — идентификаторы, на которые нацелен /publish./api/v1/social/publish Опубликуйте или запланируйте пост в один или несколько каналов.| Параметр | Описание |
|---|---|
text | Текст поста (обязателен, если нет медиа) |
channels | «all» или список идентификаторов каналов из /accounts |
media | Массив {url,type,alt} (необязательно) |
scheduled_at | Время ISO-8601; отсутствует или в прошлом = опубликовать сейчас |
idempotency_key | Ваш идентификатор поста — повтор с тем же ключом вернёт первый, без дублей |
overrides | Переопределение текста по каналам, по идентификатору канала |
POST /api/v1/social/publish
Authorization: Bearer <your API key>
Content-Type: application/json
{ "text": "We just shipped 🚀", "channels": "all",
"idempotency_key": "launch-42" }
{ "ok": true, "post": {
"id": 1841, "status": "publishing", "text": "We just shipped 🚀",
"targets": [
{ "channel_id": 12, "provider": "telegram", "status": "queued", "url": null },
{ "channel_id": 31, "provider": "mastodon", "status": "queued", "url": null } ] },
"quota": { "used": 3, "limit": 25000 } }/api/v1/social/post Один пост и результат доставки по каждой цели (?id=…) или список недавних./api/v1/social/analytics Подписчики, показы, охват и вовлечённость — ряд по каналу или сводка по аккаунту. Снимки, а не оценки./api/v1/social/messages Читайте переписку или отправляйте личное сообщение в канале, где это поддерживается./api/v1/social/comments Комментарии, собранные к вашим опубликованным постам./api/v1/social/ads Просматривайте и создавайте рекламные кампании в шести рекламных сетях./api/v1/social/webhooks Узнавайте, когда пост опубликован или пришёл комментарий/сообщение/упоминание.События: post.published, post.partial, post.failed, comment.received, dm.received, mention.received. Обычный вебхук подписывается через X-Astrina-Signature: sha256=hmac(timestamp.body, secret).
Аналитика
/api/v1/stats Аналитика трафика для вашего сайта.| Параметр | Описание |
|---|---|
site | ID или домен вашего сайта (обязательно) |
period | 24h · 7d (по умолчанию) · 30d · 90d |
report | summary (по умолчанию) · timeseries · pages · sources · countries · devices |
limit | Строк для отчётов-разбивок (1–100, по умолчанию 20) |
GET /api/v1/stats?site=example.com&period=30d
{
"site": "example.com", "site_id": 4, "period": "30d",
"summary": {
"visitors": 18204, "pageviews": 54881, "visits": 24310,
"pages_per_visit": 2.26, "online_now": 7
},
"top_sources": [{ "source": "google.com", "visitors": 9021 }, …],
"top_countries": [{ "country": "US", "visitors": 7440 }, …],
"quota": { "used": 12, "limit": 100 }
}Конверсии
/api/v1/conversion Записывайте конверсию со своего сервера, чтобы выручка, не проходящая через браузер, всё равно была атрибутирована.| Параметр | Описание |
|---|---|
site | ID или домен вашего сайта (обязательно) |
kind | lead · qualified · deal · sale · recurring · refund · churn |
value | Сумма в валюте, указанной ниже. Отрицательная — для возврата. |
currency | Трёхбуквенный код, по умолчанию USD |
uid | Идентификатор посетителя из скрипта отслеживания. Необязателен — см. примечание ниже. |
external_id | Ваш собственный идентификатор записи — чтобы повтор запроса не посчитался дважды |
POST /api/v1/conversion
Authorization: Bearer <your API key>
site=example.com&kind=sale&value=249.00¤cy=USD&uid=v_8f3c…&external_id=order-1042
{ "recorded": true, "id": 5512, "kind": "sale" }Конверсия без uid записывается, а не отклоняется: продажа, закрытая по телефону, — это всё равно выручка. Она входит в итоги и помечается как неатрибутированная, вместо того чтобы приписываться каналу, к которому её нельзя проследить.
Минификация
/api/v1/minify Минифицируйте HTML, CSS или JS и получите сжатые байты в ответ. Выполняется на наших серверах (без токенов ИИ); тарифицируется за каждый запрос по объёму входных данных.| Параметр | Описание |
|---|---|
kind | html · css · js — обязателен (через ?kind=, имя загружаемого файла или Content-Type) |
| тело | Источник для минификации: сырое тело запроса, multipart-поле file, или JSON {"kind":"…","data":"…"} |
POST /api/v1/minify?kind=css
X-Api-Key: ak_your_key_here
.button{ color: #ffffff; margin: 0 0 0 0; }
{ "kind":"css", "in_bytes":42, "out_bytes":24, "saved_pct":43,
"hash":"be6ca66f…", "output":".button{color:#fff;margin:0}" }Авторизация: только заголовок (X-Api-Key или Bearer), scope minify. CSS и JS минифицируются безопасно — пробелы в calc() и ASI в JS сохраняются; в HTML схлопываются пробелы, но <pre>, <textarea>, <script>, <style> и JSON-LD остаются нетронутыми. Использование и ключи — в вашей панели минификации.
Уникальность и детекция ИИ
/api/v1/originality Запустить одну проверку: уникальность текста, текст от ИИ, уникальность изображения или изображение от ИИ. Сразу возвращает id запуска — работа идёт на воркере.| Параметр | Описание |
|---|---|
kind | text-unique · ai-text · image-unique · ai-image — обязательно |
text | текст для проверки (текстовые модули) |
url | прочитать текст — или скачать изображение — по этому адресу |
image | файл в multipart (модули изображений); либо image_base64 |
POST /api/v1/originality
X-Api-Key: ak_your_key_here
kind=ai-text&text=In+today%27s+rapidly+evolving+digital+landscape…
{ "ok":true, "run":1042, "kind":"ai-text", "status":"queued",
"poll":"https://astrina.io/api/v1/originality?run=1042",
"units_charged":5, "balance_charged_usd":0,
"checks_used_today":7, "checks_per_day":500 }Авторизация: только заголовок (X-Api-Key или Bearer), scope originality. Тариф Pro и выше. Одна задача стоит фиксированное число запросов из дневной квоты API — 10 для уникальности текста, 5 для текста от ИИ, 5 для уникальности изображения, 3 для изображения от ИИ, — потому что одна задача это десяток запросов к индексу, десяток скачанных страниц или несколько сотен вычислений модели. Сверх дневного лимита проверок задача также стоит фиксированную сумму с баланса, и ответ прямо сообщает, сколько списано.
/api/v1/originality?run=<id> Опросить запуск. Пока он идёт, возвращается текущий этап; по завершении — полный отчёт.GET /api/v1/originality?run=1042
X-Api-Key: ak_your_key_here
{ "ok":true, "run":1042, "kind":"ai-text", "status":"running",
"progress":75, "stage":"model", "stage_label":"Scoring every sentence against a language model" }
{ "ok":true, "status":"done", "score":88.4, "verdict":"ai", "confidence":71,
"report":{ "per_sentence":[…], "features":{…}, "notes":[…] } }Опрос стоит 1 запрос. Проверка уникальности текста обычно занимает 15–40 секунд; опрашивайте раз в 2–3 секунды. В каждом отчёте есть уверенность и доказательства: найденные страницы с цитатами совпавших фрагментов или значения каждого измеренного признака. Детекция вероятностная — API никогда не возвращает вердикт без чисел, из которых он получен.
/api/v1/originality Де-ИИ слой через ту же дверь: kind=deai-text переписывает черновик, чтобы он перестал читаться как машинный; kind=deai-image перекодирует сгенерированную картинку, чтобы её пиксели вели себя как у фотографии.POST /api/v1/originality
X-Api-Key: ak_your_key_here
kind=deai-text&text=In+today%27s+rapidly+evolving+digital+landscape…
{ "ok":true, "run":1043, "kind":"deai-text", "status":"queued", "units_charged":15 }
GET /api/v1/originality?run=1043
{ "status":"done", "score":41.2,
"report":{ "before":93.0, "after":41.2, "target":70, "reached_target":true,
"changes":["4 stock transition(s) removed","1 sentence pair(s) joined for rhythm"],
"paid_pass":true, "text":"…the rewritten text…" } }15 запросов API за рерайт текста, 6 за рекодинг изображения: рерайт может потратить вызов модели, и цена это покрывает. На задачу — один бесплатный детерминированный проход и максимум один платный рерайт моделью; если этого мало, ответ так и говорит, а не тратит снова. Задача с изображением отвечает ссылкой на скачивание (хранится 72 часа). Рерайтер делает правки, которые защитил бы редактор: убирает шаблонные связки, меняет ритм, заменяет затасканные слова — и заново измеряет тем же детектором. Он не вносит ошибок и не придумывает фактов. Рекодер отклоняет файлы с подписанным манифестом C2PA, а не снимает его, и пишет в результат честную строку «иллюстрация, сделанная с помощью ИИ».
/api/v1/originality Каталог: сколько каждая проверка стоит в запросах API и в деньгах и сколько лимита осталось на сегодня.Отзывы и рейтинги
/api/v1/reviews Последние отзывы + сводный рейтинг по любому объекту.| Параметр | Описание |
|---|---|
type | site · phone · email · address · org · shop |
key | Значение объекта (домен, номер, e-mail, …) |
GET /api/v1/reviews?type=site&key=example.com
{ "type": "site", "subject": "example.com", "rating": 4.3, "count": 87,
"reviews": [{ "author": "Jane", "rating": 5, "body": "…", "date": "2026-07-01" }, …],
"url": "https://astrina.io/reviews/site/example.com/" }/api/v1/rating Краткая сводка рейтинга + распределение по звёздам + URL для встраивания.| Параметр | Описание |
|---|---|
site | Быстрый доступ к сайту по домену |
type + key | Или любой объект по type + key |
GET /api/v1/rating?site=example.com
{ "type": "site", "subject": "example.com", "rating": 4.3, "count": 87,
"distribution": { "1": 3, "2": 4, "3": 9, "4": 26, "5": 45 },
"reviews_url": "https://astrina.io/reviews/site/example.com/",
"widget_url": "https://astrina.io/widget.php?type=site&key=example.com",
"badge_url": "https://astrina.io/badge.php?s=4" }Проверка номеров
/api/v1/phone Оператор, тип линии и community-оценка спам-риска номера.| Параметр | Описание |
|---|---|
number | Номер в международном формате, напр. +14155550123 |
GET /api/v1/phone?number=+14155550123
{ "number": "+14155550123", "country": "United States", "iso": "US",
"operator": "…", "line_type": "mobile",
"risk": { "score": 12, "verdict": "low", "confidence": 0.6, "reports": 3, … },
"url": "https://astrina.io/reviews/phone/+14155550123/" }Чёрный список и проверка на спам
/api/v1/blacklist Проверьте, есть ли телефон, email, домен или сайт в чёрном списке спама/мошенников.| Параметр | Описание |
|---|---|
value | Телефон, email, домен или URL для проверки (тип определяется автоматически). |
type | Необязательно — задать один из phone · email · domain |
GET /api/v1/[email protected] { "value": "[email protected]", "listed": true, "categories": ["disposable"], "matches": [ { "type": "email_domain", "match": "mailinator.com", "category": "disposable", "source": "disposable-email-domains", "confidence": 90, "added": "2026-07-12 15:46:00" } ], "quota": { "used": 7, "limit": 100000 } }
AML-проверка криптоадресов
/api/v1/aml Проверка криптокошелька по санкционным спискам и базам киберразведки — блокчейн определяется автоматически, оценка риска в ответе.| Параметр | Описание |
|---|---|
address | Адрес кошелька для проверки. Распознаются форматы BTC, EVM (0x…), TRON, Solana, TON, LTC, DOGE, XRP, XMR и BCH; любая другая строка ищется как есть. |
format | Необязательно — укажите csv, чтобы получить CSV вместо JSON. |
GET /api/v1/aml?address=TPPR7e8hGC57dexrE2jy1f94wtuGyVP6Dp
{ "address": "TPPR7e8hGC57dexrE2jy1f94wtuGyVP6Dp",
"chain": "tron", "listed": true, "risk": 100, "level": "sanctioned",
"categories": ["sanctioned"],
"matches": [
{ "category": "sanctioned", "source": "US OFAC SDN sanctions list",
"jurisdiction": "US", "risk": 100, "confidence": 88, "added": "2026-08-10" } ],
"quota": { "used": 1, "limit": 100 } }Пакетно: отправьте POST с массивом «addresses» (до 50), чтобы проверить многие за один вызов — по 1 единице квоты за адрес.
POST /api/v1/aml
{ "addresses": ["0x…", "bc1…", "T…"] }
{ "results": [ { "address": "0x…", "listed": false, "risk": 0, … } ], "count": 3 }Каждый ответ содержит заголовки X-RateLimit-Limit и X-RateLimit-Remaining. Полная документация, модель риска и живые списки: astrina.io/aml/
Проверка утечки паролей
/api/v1/pwned Проверьте, встречался ли пароль в утечке данных — по модели k-анонимности, поэтому пароль никогда не покидает клиент.Захешируйте пароль по SHA-1 в своём приложении, затем отправьте только первые 5 hex-символов этого хеша. API вернёт все суффиксы хешей из утечек с этим префиксом; сравнение вы делаете локально. Открытый пароль никогда не передаётся.
| Параметр | Описание |
|---|---|
prefix | Первые 5 hex-символов SHA-1-хеша (рекомендуется — k-анонимность). Возвращает подходящие суффиксы с числом утечек. |
hash | Альтернатива: полный 40-символьный SHA-1. Удобно, но хеш покидает клиент — по возможности предпочитайте prefix. |
GET /api/v1/pwned?prefix=5BAA6
{ "mode": "range", "prefix": "5BAA6", "returned": 1978,
"suffixes": [
{ "suffix": "1E4C9B93F3F0682250B6CF8331B7EE68FD8", "count": 52372427 }, ... ],
"quota": { "used": 22, "limit": 100000 } }
# convenience mode — send the whole SHA-1, get a direct verdict:
GET /api/v1/pwned?hash=5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
{ "mode": "hash", "found": true, "count": 52372427,
"note": "This password appears in known breaches - do not use it.",
"quota": { "used": 23, "limit": 100000 } }Источник данных: Have I Been Pwned (Pwned Passwords). Та же модель k-анонимности лежит в основе бесплатного браузерного инструмента на /password-check/.
Утилиты
Запускайте наши синхронные серверные утилиты через API — 31 из 141. Браузерные утилиты и очередь краулов/рендеров не выставлены. Все утилиты имеют одинаковый формат вызова и ответа; тарифные ограничения и дневные лимиты те же, что на сайте.
GET /api/v1/tool # каталог GET /api/v1/tool?name=<key>&value=<input> # запуск одной (value2 — для утилит с двумя входами) -H "X-Api-Key: ak_your_key_here"
| Параметр | Описание |
|---|---|
name | Ключ утилиты (см. блоки ниже). |
value | Основной ввод — URL, домен, список URL через запятую/перенос строки или текст. |
value2 | Второй ввод — только для утилит, сравнивающих две вещи. |
Ошибки: 404 неизвестная утилита · 400 недоступна по API · 403 нужен тариф · 429 дневной лимит запусков · 422 неверный ввод. В каждой есть поле "error".
🔍 SEO (18)
/api/v1/tool?name=site-audit 🔍 Технические факторы, скорость и безопасность за один проход.GET /api/v1/tool?name=site-audit&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "site-audit",
"ms": 807,
"result": {
"summary": [
{
"label": "Overall",
"value": "93/100",
"state": "ok"
},
{
"label": "SEO",
"value": "90/100",
"state": "ok"
},
{
"label": "Performance",
"value": "90/100",
"state": "ok"
},
"…"
],
"cols": [
"Area",
"What failed",
"What to do"
],
"rows": [
{
"a": "SEO",
"b": "Headings in logical order",
"c": "Nest headings sequentially (H1→H2→H3) without skipping levels.",
"state": "bad"
},
{
"a": "SEO",
"b": "All images have alt",
"c": "Add descriptive alt to every <img> (alt=\"\" only for decorative).",
"state": "bad"
},
{
"a": "SEO",
"b": "Form inputs have labels",
"c": "Pair every input with a <label for> or an aria-label.",
"state": "warn"
},
"…"
],
"notes": []
}
}/api/v1/tool?name=serp-preview 👁️ Как сниппет выглядит в результатах поиска.GET /api/v1/tool?name=serp-preview&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "serp-preview",
"ms": 127,
"result": {
"summary": [
{
"label": "Title length",
"value": "53 chars",
"state": "ok"
},
{
"label": "Description length",
"value": "163 chars",
"state": "warn"
},
{
"label": "Title truncated",
"value": "no",
"state": "ok"
},
"…"
],
"cols": [
"Part",
"Value"
],
"rows": [
{
"a": "Headline shown",
"b": "Every site you look after, in one dashboard — Astrina",
"state": ""
},
{
"a": "Breadcrumb shown",
"b": "astrina.io",
"state": ""
},
{
"a": "Snippet shown",
"b": "Real traffic, daily SEO checks and reviews for your sites and your clients’ sites. One …",
"state": ""
},
"…"
],
"notes": [
"Google cuts on pixel width, not character count, and rewrites titles on roughly a third…"
]
}
}/api/v1/tool?name=og-preview 📣 Карточка, которая показывается при отправке ссылки.GET /api/v1/tool?name=og-preview&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "og-preview",
"ms": 499,
"result": {
"summary": [
{
"label": "og:title",
"value": "set",
"state": "ok"
},
{
"label": "og:description",
"value": "set",
"state": "ok"
},
{
"label": "og:image",
"value": "set",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Card title",
"b": "Every site you look after, in one dashboard — Astrina",
"state": ""
},
{
"a": "Card description",
"b": "Real traffic, daily SEO checks and reviews for your sites and your clients’ sites. One …",
"state": ""
},
{
"a": "Card image",
"b": "https://astrina.io/og.php",
"state": "ok"
},
"…"
],
"notes": [
"Facebook, X and LinkedIn each cache what they scraped. After fixing tags, re-scrape in …"
]
}
}/api/v1/tool?name=schema-validator 🧬 Проверяет структурированные данные JSON-LD.GET /api/v1/tool?name=schema-validator&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "schema-validator",
"ms": 75,
"result": {
"summary": [
{
"label": "JSON-LD blocks",
"value": "2",
"state": "ok"
},
{
"label": "Types found",
"value": "2",
"state": "ok"
},
{
"label": "Invalid blocks",
"value": "0",
"state": "ok"
},
"…"
],
"cols": [
"Where",
"Type",
"Verdict"
],
"rows": [
{
"a": "block 1",
"b": "Organization",
"c": "required properties present",
"state": "ok"
},
{
"a": "block 2",
"b": "WebSite",
"c": "required properties present",
"state": "ok"
}
],
"notes": [
"Valid markup is not the same as an eligible rich result. Google also applies content po…"
]
}
}/api/v1/tool?name=meta-tags 🏷️ Title, description и og-теги с длиной.GET /api/v1/tool?name=meta-tags&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "meta-tags",
"ms": 164,
"result": {
"summary": [
{
"label": "Title length",
"value": "53",
"state": "ok"
},
{
"label": "Description length",
"value": "163",
"state": "warn"
},
{
"label": "H1 count",
"value": "1",
"state": "ok"
},
"…"
],
"cols": [
"Tag",
"Value",
"Length",
"…"
],
"rows": [
{
"a": "title",
"b": "Every site you look after, in one dashboard — Astrina",
"c": "53",
"d": "Good length.",
"state": "ok"
},
{
"a": "meta description",
"b": "Real traffic, daily SEO checks and reviews for your sites and your clients’ sites. One …",
"c": "163",
"d": "Long — the snippet is cut around 160 characters.",
"state": "warn"
},
{
"a": "canonical",
"b": "https://astrina.io/",
"c": "19",
"d": "Declared.",
"state": "ok"
},
"…"
],
"notes": []
}
}/api/v1/tool?name=keyword-density 📊 Плотность и частота слов на странице.GET /api/v1/tool?name=keyword-density&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "keyword-density",
"ms": 93,
"result": {
"summary": [
{
"label": "Words",
"value": "1093",
"state": "ok"
},
{
"label": "Unique words",
"value": "503",
"state": ""
},
{
"label": "Vocabulary richness",
"value": "46.0%",
"state": "ok"
},
"…"
],
"cols": [
"Kind",
"Term",
"Count",
"…"
],
"rows": [
{
"a": "single word",
"b": "one",
"c": "20",
"d": "1.83%",
"e": "title, H1, description",
"state": "ok"
},
{
"a": "single word",
"b": "reviews",
"c": "17",
"d": "1.56%",
"e": "description",
"state": "ok"
},
{
"a": "single word",
"b": "listed",
"c": "15",
"d": "1.37%",
"e": "body only",
"state": ""
},
"…"
],
"notes": [
"Density is a diagnostic, not a target. No search engine has a threshold to hit — this i…"
]
}
}/api/v1/tool?name=redirects ↪️ Проходит цепочки 301/302 шаг за шагом.GET /api/v1/tool?name=redirects&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "redirects",
"ms": 1753,
"result": {
"summary": [
{
"label": "Final status",
"value": "200",
"state": "ok"
},
{
"label": "Redirects followed",
"value": "0",
"state": "ok"
},
{
"label": "Ends at",
"value": "https://astrina.io/",
"state": ""
},
"…"
],
"cols": [
"Address",
"Hop",
"Status",
"…"
],
"rows": [
{
"a": "as entered",
"b": "1",
"c": "200",
"d": "https://astrina.io/",
"e": "— final destination —",
"state": "ok"
},
{
"a": "http://astrina.io/",
"b": "1",
"c": "200",
"d": "http://astrina.io/",
"e": "— final destination —",
"state": "ok"
},
{
"a": "https://astrina.io/",
"b": "1",
"c": "200",
"d": "https://astrina.io/",
"e": "— final destination —",
"state": "ok"
},
"…"
],
"notes": [
"The http, https, www and apex forms of this address do not all end at the same URL. Sea…",
"The page contains JavaScript that changes location. A crawler may or may not follow it,…",
"Every hop above was requested and its answer read; nothing in the chain is guessed from…"
]
}
}/api/v1/tool?name=sitemap 🗺️ Проверяет XML-карту сайта и её индекс.GET /api/v1/tool?name=sitemap&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "sitemap",
"ms": 2646,
"result": {
"summary": [
{
"label": "Type",
"value": "sitemap index",
"state": "ok"
},
{
"label": "URLs found",
"value": "5408",
"state": "ok"
},
{
"label": "Unique URLs",
"value": "5405",
"state": "warn"
},
"…"
],
"cols": [
"Child sitemap",
"Status",
"URLs",
"…"
],
"rows": [
{
"a": "https://astrina.io/sitemap-core.xml",
"b": "200",
"c": "534",
"d": "59.9 KB",
"state": "ok"
},
{
"a": "https://astrina.io/sitemap-blog.xml",
"b": "200",
"c": "42",
"d": "5.2 KB",
"state": "ok"
},
{
"a": "https://astrina.io/sitemap-catalog.xml",
"b": "200",
"c": "61",
"d": "6.9 KB",
"state": "ok"
},
"…"
],
"notes": [
"Started from the sitemap declared in robots.txt: https://astrina.io/sitemap.xml",
"3 URLs appear more than once.",
"7 addresses were fetched, within your plan cap of 25."
]
}
}/api/v1/tool?name=html-validate ✅ Структурные ошибки по правилам W3C.GET /api/v1/tool?name=html-validate&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "html-validate",
"ms": 180,
"result": {
"summary": [
{
"label": "Errors",
"value": "8",
"state": "bad"
},
{
"label": "Warnings",
"value": "0",
"state": "ok"
},
{
"label": "Total findings",
"value": "8",
"state": "warn"
},
"…"
],
"cols": [
"Line",
"Level",
"Finding"
],
"rows": [
{
"a": "314",
"b": "error",
"c": "htmlParseEntityRef: expecting ';'",
"state": "bad"
},
{
"a": "513",
"b": "error",
"c": "Unexpected end tag : svg",
"state": "bad"
},
{
"a": "514",
"b": "error",
"c": "Unexpected end tag : svg",
"state": "bad"
},
"…"
],
"notes": [
"420 \"unknown element\" complaints were discarded. The parser behind this check knows the…",
"This is a structural check — parse errors, duplicate ids, obsolete and required element…"
]
}
}/api/v1/tool?name=robots-txt 🤖 Разбирает файл и применяет правила для каждого краулера.GET /api/v1/tool?name=robots-txt&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "robots-txt",
"ms": 133,
"result": {
"summary": [
{
"label": "robots.txt",
"value": "found",
"state": "ok"
},
{
"label": "Size",
"value": "1.9 KB",
"state": "ok"
},
{
"label": "Groups",
"value": "10",
"state": ""
},
"…"
],
"cols": [
"Crawler",
"This URL",
"Deciding rule",
"…"
],
"rows": [
{
"a": "*",
"b": "allowed",
"c": "Allow: /",
"d": "the * group",
"state": "ok"
},
{
"a": "Googlebot",
"b": "allowed",
"c": "Allow: /",
"d": "the * group",
"state": "ok"
},
{
"a": "Bingbot",
"b": "allowed",
"c": "Allow: /",
"d": "the * group",
"state": "ok"
},
"…"
],
"text": "# As a condition of accessing this website, you agree to abide by the following\n# conte…",
"notes": [
"At least one group carries Disallow: / — that blocks an entire crawler from the whole s…"
]
}
}/api/v1/tool?name=images-seo 🖼️ Alt-тексты, размеры и форматы.GET /api/v1/tool?name=images-seo&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "images-seo",
"ms": 1910,
"result": {
"summary": [
{
"label": "Images",
"value": "7",
"state": "ok"
},
{
"label": "Missing alt",
"value": "0",
"state": "ok"
},
{
"label": "Decorative (alt=\"\")",
"value": "7",
"state": ""
},
"…"
],
"cols": [
"Image",
"Alt text",
"Size",
"…"
],
"rows": [
{
"a": "https://astrina.io/shot.php?s=1",
"b": "(empty)",
"c": "46.6 KB",
"d": "empty alt (decorative); no width/height — causes layout shift",
"state": "warn"
},
{
"a": "https://astrina.io/shot.php?s=4",
"b": "(empty)",
"c": "75.1 KB",
"d": "empty alt (decorative); no width/height — causes layout shift",
"state": "warn"
},
{
"a": "https://astrina.io/shot.php?s=8",
"b": "(empty)",
"c": "68.1 KB",
"d": "empty alt (decorative); no width/height — causes layout shift",
"state": "warn"
},
"…"
],
"notes": [
"6 images declare no width and height. The browser cannot reserve space, so the page jum…",
"None of the sampled images are WebP or AVIF. Converting usually removes a third of the …",
"Optimizing the sampled images could save roughly 131 KB. Compress or convert them to We…",
"…"
]
}
}/api/v1/tool?name=cms-detect 🧱 Определяет CMS и стек технологий.GET /api/v1/tool?name=cms-detect&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "cms-detect",
"ms": 135,
"result": {
"summary": [
{
"label": "CMS",
"value": "Magento",
"state": "ok"
},
{
"label": "Signals found",
"value": "2",
"state": "ok"
},
{
"label": "Server",
"value": "cloudflare",
"state": ""
},
"…"
],
"cols": [
"Kind",
"Name",
"Evidence",
"…"
],
"rows": [
{
"a": "CMS",
"b": "Magento",
"c": "markup: mage/",
"d": "strong",
"state": "ok"
},
{
"a": "CDN / Edge",
"b": "Cloudflare",
"c": "server: cloudflare",
"d": "strong",
"state": "ok"
}
],
"notes": [
"This reads fingerprints, not an inventory. A strong match is reliable; a weak one is a …"
]
}
}/api/v1/tool?name=readability 📖 Сложность текста и метрики читаемости.GET /api/v1/tool?name=readability&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "readability",
"ms": 94,
"result": {
"summary": [
{
"label": "Reading ease",
"value": "47.0 — difficult",
"state": "warn"
},
{
"label": "Grade level",
"value": "12.6",
"state": "warn"
},
{
"label": "Gunning Fog",
"value": "15.5",
"state": "warn"
},
"…"
],
"cols": [
"Measure",
"Value"
],
"rows": [
{
"a": "Formula used",
"b": "Flesch Reading Ease and Flesch–Kincaid grade",
"state": ""
},
{
"a": "Language detected",
"b": "Latin script",
"state": ""
},
{
"a": "Syllables per word",
"b": "1.60",
"state": ""
},
"…"
],
"notes": [
"10 sentences run past 25 words.",
"These formulas count syllables and sentence lengths. They cannot tell whether the writi…"
]
}
}/api/v1/tool?name=hreflang 🌍 Международная разметка, включая обратные ссылки.GET /api/v1/tool?name=hreflang&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "hreflang",
"ms": 907,
"result": {
"summary": [
{
"label": "hreflang tags",
"value": "4",
"state": "ok"
},
{
"label": "Problems",
"value": "0",
"state": "ok"
},
{
"label": "x-default",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Code",
"URL",
"Links back",
"…"
],
"rows": [
{
"a": "en",
"b": "https://astrina.io/",
"c": "n/a",
"d": "ok",
"state": "ok"
},
{
"a": "ru",
"b": "https://astrina.io/ru/",
"c": "yes",
"d": "ok",
"state": "ok"
},
{
"a": "uk",
"b": "https://astrina.io/uk/",
"c": "yes",
"d": "ok",
"state": "ok"
},
"…"
],
"notes": [
"Return links were checked on 2 alternates."
]
}
}/api/v1/tool?name=links 🔀 Внутренние, внешние и nofollow-ссылки.GET /api/v1/tool?name=links&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "links",
"ms": 104,
"result": {
"summary": [
{
"label": "Internal links",
"value": "116",
"state": "ok"
},
{
"label": "External links",
"value": "0",
"state": ""
},
{
"label": "Nofollow",
"value": "0",
"state": ""
},
"…"
],
"cols": [
"Kind",
"Anchor text",
"URL",
"…"
],
"rows": [],
"notes": [
"This lists what the page declares. Whether those targets actually load is the broken-li…"
]
}
}/api/v1/tool?name=canonical 🔗 Какой URL страница объявляет оригинальным.GET /api/v1/tool?name=canonical&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "canonical",
"ms": 75,
"result": {
"summary": [
{
"label": "Canonical",
"value": "declared",
"state": "ok"
},
{
"label": "Self-referencing",
"value": "yes",
"state": "ok"
},
{
"label": "Declarations found",
"value": "1",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Requested URL",
"b": "https://astrina.io/",
"state": ""
},
{
"a": "URL after redirects",
"b": "https://astrina.io/",
"state": ""
},
{
"a": "Canonical in HTML",
"b": "https://astrina.io/",
"state": ""
},
"…"
],
"notes": []
}
}/api/v1/tool?name=http-status 📋 HTTP-коды и редиректы пакетно.GET /api/v1/tool?name=http-status&value=https%3A%2F%2Fastrina.io%2F%0Ahttps%3A%2F%2Fastrina.io%2Fpricing{
"ok": true,
"utility": "http-status",
"ms": 774,
"result": {
"summary": [
{
"label": "Checked",
"value": "2",
"state": "ok"
},
{
"label": "OK (2xx)",
"value": "2",
"state": "ok"
},
{
"label": "Redirected",
"value": "0",
"state": "ok"
},
"…"
],
"cols": [
"URL",
"Status",
"Hops",
"…"
],
"rows": [
{
"a": "https://astrina.io/",
"b": "200",
"c": "0",
"d": "same URL",
"e": "97 ms",
"state": "ok"
},
{
"a": "https://astrina.io/pricing",
"b": "200",
"c": "0",
"d": "same URL",
"e": "62 ms",
"state": "ok"
}
],
"notes": [
"All 2 addresses were checked, within the cap of 25 for this run."
]
}
}/api/v1/tool?name=favicon ⭐ Все размеры и форматы, которые ищет браузер.GET /api/v1/tool?name=favicon&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "favicon",
"ms": 573,
"result": {
"summary": [
{
"label": "Icons declared",
"value": "1",
"state": ""
},
{
"label": "Icons that load",
"value": "1 / 2",
"state": "ok"
},
{
"label": "/favicon.ico",
"value": "missing",
"state": "warn"
},
"…"
],
"cols": [
"Relation",
"URL",
"Status",
"…"
],
"rows": [
{
"a": "icon",
"b": "https://astrina.io/favicon.svg",
"c": "200",
"d": "unknown",
"e": "396 B",
"state": "ok"
},
{
"a": "icon (browser fallback)",
"b": "https://astrina.io/favicon.ico",
"c": "404",
"d": "unknown",
"e": "2.8 KB",
"state": "warn"
}
],
"notes": [
"There is no /favicon.ico at the root. Browsers and feed readers still ask for it by def…",
"No apple-touch-icon. iOS will screenshot the page instead when someone adds it to their…",
"No web app manifest. Android uses it for the home-screen icon and the install prompt."
]
}
}🛡️ Безопасность (12)
/api/v1/tool?name=ssl 🔒 Сертификат, цепочка и срок действия.GET /api/v1/tool?name=ssl&value=astrina.io{
"ok": true,
"utility": "ssl",
"ms": 86,
"result": {
"summary": [
{
"label": "Certificate",
"value": "valid and trusted",
"state": "ok"
},
{
"label": "Days left",
"value": "75",
"state": "ok"
},
{
"label": "Hostname matches",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Common name",
"b": "astrina.io",
"state": ""
},
{
"a": "Subject alternative names",
"b": "astrina.io, *.astrina.io",
"state": ""
},
{
"a": "Issued by",
"b": "WE1",
"state": ""
},
"…"
],
"notes": [
"Read from a live TLS handshake to 172.67.166.83:443 with SNI for astrina.io."
]
}
}/api/v1/tool?name=security-headers 🛡️ HSTS, CSP, frame options — с оценкой.GET /api/v1/tool?name=security-headers&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "security-headers",
"ms": 94,
"result": {
"summary": [
{
"label": "Grade",
"value": "A",
"state": "ok"
},
{
"label": "Score",
"value": "85/100",
"state": "ok"
},
{
"label": "HSTS",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Header",
"Value",
"Verdict"
],
"rows": [
{
"a": "Strict-Transport-Security",
"b": "max-age=31536000; includeSubDomains",
"c": "Set for 365 days.",
"state": "ok"
},
{
"a": "Content-Security-Policy",
"b": "default-src 'self' https: data:; script-src 'self' 'unsafe-inline' https:; style-src 's…",
"c": "Set. The CSP analyser tool checks whether it actually holds.",
"state": "ok"
},
{
"a": "X-Content-Type-Options",
"b": "nosniff",
"c": "Set correctly.",
"state": "ok"
},
"…"
],
"notes": [
"The grade weighs the headers that change what an attacker can do. It says nothing about…"
]
}
}/api/v1/tool?name=http-headers 📨 Все заголовки ответа с пояснениями.GET /api/v1/tool?name=http-headers&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "http-headers",
"ms": 88,
"result": {
"summary": [
{
"label": "Status",
"value": "200",
"state": "ok"
},
{
"label": "Protocol",
"value": "HTTP/2",
"state": "ok"
},
{
"label": "Headers",
"value": "20",
"state": ""
},
"…"
],
"cols": [
"Header",
"Value",
"What it does"
],
"rows": [
{
"a": "alt-svc",
"b": "h3=\":443\"; ma=86400",
"c": "Advertises another protocol for this origin, usually HTTP/3.",
"state": ""
},
{
"a": "cache-control",
"b": "no-store, no-cache, must-revalidate",
"c": "How long, and by whom, this response may be cached.",
"state": ""
},
{
"a": "cf-cache-status",
"b": "DYNAMIC",
"c": "",
"state": ""
},
"…"
],
"text": "alt-svc: h3=\":443\"; ma=86400\ncache-control: no-store, no-cache, must-revalidate\ncf-cach…",
"notes": [
"Our fetcher keeps one value per header name, so if the server sent several Set-Cookie l…"
]
}
}/api/v1/tool?name=csp 🚧 Называет директивы, которые оставляют дыру.GET /api/v1/tool?name=csp&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "csp",
"ms": 116,
"result": {
"summary": [
{
"label": "Policy",
"value": "enforced",
"state": "ok"
},
{
"label": "Directives",
"value": "7",
"state": ""
},
{
"label": "Serious holes",
"value": "7",
"state": "bad"
},
"…"
],
"cols": [
"Directive",
"Sources",
"Finding"
],
"rows": [
{
"a": "default-src",
"b": "'self' https: data:",
"c": "data: in a script source is a known bypass; https: alone allows every https origin on t…",
"state": "bad"
},
{
"a": "script-src",
"b": "'self' 'unsafe-inline' https:",
"c": "'unsafe-inline' on scripts defeats the policy — this is the exact thing CSP exists to s…",
"state": "bad"
},
{
"a": "style-src",
"b": "'self' 'unsafe-inline'",
"c": "'unsafe-inline' — acceptable for styles, still worth removing",
"state": "warn"
},
"…"
],
"text": "default-src 'self' https: data:; script-src 'self' 'unsafe-inline' https:; style-src 's…",
"notes": [
"Nothing reports violations, so you will not learn what the policy blocked or nearly blo…",
"This reads the policy as written. Whether it fits what the page actually loads can only…"
]
}
}/api/v1/tool?name=dns 🌐 A, AAAA, MX, NS, TXT, SOA и CAA.GET /api/v1/tool?name=dns&value=astrina.io{
"ok": true,
"utility": "dns",
"ms": 507,
"result": {
"summary": [
{
"label": "A",
"value": "2",
"state": "ok"
},
{
"label": "AAAA",
"value": "2",
"state": "ok"
},
{
"label": "MX",
"value": "1",
"state": "ok"
},
"…"
],
"cols": [
"Type",
"Name",
"Value",
"…"
],
"rows": [
{
"a": "A",
"b": "astrina.io",
"c": "104.21.34.236",
"d": "292s",
"e": "",
"state": ""
},
{
"a": "A",
"b": "astrina.io",
"c": "172.67.166.83",
"d": "292s",
"e": "",
"state": ""
},
{
"a": "AAAA",
"b": "astrina.io",
"c": "2606:4700:3037::ac43:a653",
"d": "296s",
"e": "",
"state": ""
},
"…"
],
"notes": [
"No CAA record. Adding one names the certificate authorities allowed to issue for this d…",
"Answered by this server's resolver. A record changed in the last few hours may not have…"
]
}
}/api/v1/tool?name=whois 📜 Регистратор, даты и NS-серверы.GET /api/v1/tool?name=whois&value=astrina.io{
"ok": true,
"utility": "whois",
"ms": 313,
"result": {
"summary": [
{
"label": "Domain",
"value": "astrina.io",
"state": "ok"
},
{
"label": "Registrar",
"value": "NameCheap, Inc.",
"state": ""
},
{
"label": "Expires",
"value": "2027-07-09",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Expires",
"b": "2027-07-09 15:37 UTC",
"state": ""
},
{
"a": "Registered",
"b": "2026-07-09 15:37 UTC",
"state": ""
},
{
"a": "Last changed",
"b": "2026-07-14 15:37 UTC",
"state": ""
},
"…"
],
"notes": [
"Read from the registry over RDAP, the protocol that replaced WHOIS. Registrant contact …"
]
}
}/api/v1/tool?name=email-auth ✉️ Записи SPF, DKIM и DMARC.GET /api/v1/tool?name=email-auth&value=astrina.io{
"ok": true,
"utility": "email-auth",
"ms": 1954,
"result": {
"summary": [
{
"label": "SPF",
"value": "present",
"state": "ok"
},
{
"label": "DKIM",
"value": "1 selector(s)",
"state": "ok"
},
{
"label": "DMARC",
"value": "p=none",
"state": "warn"
},
"…"
],
"cols": [
"Mechanism",
"Record",
"Finding",
"…"
],
"rows": [
{
"a": "MX",
"b": "mail.astrina.io",
"c": "priority 10",
"d": "",
"state": "ok"
},
{
"a": "SPF",
"b": "v=spf1 a mx ip4:149.202.80.42 ~all",
"c": "Ends in ~all (softfail) with about 2 lookups. Move to -all once you are confident the l…",
"d": "2 lookups",
"state": "ok"
},
{
"a": "DMARC",
"b": "v=DMARC1; p=none; rua=mailto:[email protected]; fo=1",
"c": "p=none — monitoring only. It collects reports and blocks nothing, which is the right pl…",
"d": "100%",
"state": "warn"
},
"…"
],
"notes": [
"Move from p=none to p=quarantine once the reports show your legitimate senders passing.…",
"All of this is read from public DNS. Nothing was sent to your mail servers and no messa…"
]
}
}/api/v1/tool?name=http2 ⚡ Какой протокол и сжатие используются.GET /api/v1/tool?name=http2&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "http2",
"ms": 122,
"result": {
"summary": [
{
"label": "Protocol",
"value": "HTTP/2",
"state": "ok"
},
{
"label": "Compression",
"value": "Zstandard",
"state": "ok"
},
{
"label": "HTTP/3",
"value": "advertised",
"state": "ok"
},
"…"
],
"cols": [
"Measure",
"Value",
"What it means"
],
"rows": [
{
"a": "Negotiated protocol",
"b": "HTTP/2",
"c": "Multiplexed: many requests share one connection, so head-of-line blocking on the browse…",
"state": "ok"
},
{
"a": "Compression",
"b": "Zstandard",
"c": "Zstandard — fast and compact where the client supports it.",
"state": "ok"
},
{
"a": "Alt-Svc",
"b": "h3=\":443\"; ma=86400",
"c": "HTTP/3 is advertised, so browsers will move to QUIC after the first request.",
"state": "ok"
},
"…"
],
"notes": [
"We ask for every encoding we can accept, so what is reported is what your server chose …"
]
}
}/api/v1/tool?name=ip-info 📍 Геолокация и сеть для адреса.GET /api/v1/tool?name=ip-info&value=astrina.io{
"ok": true,
"utility": "ip-info",
"ms": 2145,
"result": {
"summary": [
{
"label": "Host",
"value": "astrina.io",
"state": ""
},
{
"label": "Addresses",
"value": "4",
"state": "ok"
},
{
"label": "IPv6",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Address",
"Family",
"Network",
"…"
],
"rows": [
{
"a": "104.21.34.236",
"b": "IPv4",
"c": "AS13335 — CLOUDFLARENET - Cloudflare, Inc., US",
"d": "104.21.32.0/19",
"e": "US",
"f": "no reverse DNS",
"state": "warn"
},
{
"a": "172.67.166.83",
"b": "IPv4",
"c": "AS13335 — CLOUDFLARENET - Cloudflare, Inc., US",
"d": "172.67.160.0/20",
"e": "US",
"f": "no reverse DNS",
"state": "warn"
},
{
"a": "2606:4700:3035::6815:22ec",
"b": "IPv6",
"c": "AS13335 — CLOUDFLARENET - Cloudflare, Inc., US",
"d": "2606:4700:3035::/48",
"e": "US",
"f": "no reverse DNS",
"state": "warn"
},
"…"
],
"notes": [
"4 addresses answer for this name. That is normal for a CDN or a load balancer.",
"The country shown is the one recorded on the address allocation in the routing registry…",
"No commercial geolocation database was consulted, so there is no city, no coordinate an…"
]
}
}/api/v1/tool?name=ports 🔌 Известные сервисные порты, проверка безопасна.GET /api/v1/tool?name=ports&value=https%3A%2F%2Fexample.com%2F{ "ok": true, "utility": "ports", "ms": 0, "result": { … } }/api/v1/tool?name=cookies 🍪 Cookie и их флаги с точки зрения GDPR.GET /api/v1/tool?name=cookies&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "cookies",
"ms": 103,
"result": {
"summary": [
{
"label": "Cookies in response",
"value": "1",
"state": "ok"
},
{
"label": "Third-party trackers",
"value": "0",
"state": "ok"
},
{
"label": "Consent mechanism",
"value": "detected",
"state": "ok"
},
"…"
],
"cols": [
"Name",
"Value",
"Secure",
"…"
],
"rows": [
{
"a": "astrsess",
"b": "44c774bdb4b0b81bd429e64545acc9a7",
"c": "yes",
"d": "yes",
"e": "lax",
"f": "session",
"g": "flags look right",
"state": "ok"
}
],
"notes": [
"Cookies set later by JavaScript, or after a login, are outside what a single anonymous …"
]
}
}/api/v1/tool?name=cors 🔓 Какие источники разрешает ваш эндпоинт.GET /api/v1/tool?name=cors&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "cors",
"ms": 884,
"result": {
"summary": [
{
"label": "CORS enabled",
"value": "no",
"state": "ok"
},
{
"label": "Allowed origin",
"value": "same origin only",
"state": "ok"
},
{
"label": "Origin reflection",
"value": "none",
"state": "ok"
},
"…"
],
"cols": [
"Header or probe",
"Value",
"Meaning"
],
"rows": [
{
"a": "Access-Control-Allow-Origin",
"b": "— not sent —",
"c": "No CORS headers on a request that carried no Origin. That is the ordinary case; what ma…",
"state": "ok"
},
{
"a": "Access-Control-Allow-Credentials",
"b": "— not sent —",
"c": "Credentials are not shared.",
"state": "ok"
},
{
"a": "Access-Control-Allow-Methods",
"b": "— not sent —",
"c": "Sent on preflight responses.",
"state": ""
},
"…"
],
"notes": [
"Two forged origins were sent and neither was echoed back, so this endpoint does not bui…",
"This is a GET carrying an Origin header, not a full preflight. An endpoint that answers…"
]
}
}🎨 CSS (1)
/api/v1/tool?name=palette-url 🌐 Цвета, которые сайт действительно использует.GET /api/v1/tool?name=palette-url&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "palette-url",
"ms": 578,
"result": {
"summary": [
{
"label": "Distinct colours",
"value": "132",
"state": "warn"
},
{
"label": "Stylesheets read",
"value": "2 / 2",
"state": "ok"
},
{
"label": "CSS custom properties",
"value": "28",
"state": "ok"
},
"…"
],
"cols": [
"Colour",
"RGB",
"Uses",
"…"
],
"rows": [
{
"a": "#ffffff",
"b": "rgb(255, 255, 255)",
"c": "40",
"d": "near-white",
"e": "contrast on white 1.0:1 · on black 21.0:1",
"state": ""
},
{
"a": "#000000",
"b": "rgb(0, 0, 0)",
"c": "27",
"d": "near-black",
"e": "contrast on white 21.0:1 · on black 1.0:1",
"state": ""
},
{
"a": "#5b5bd6",
"b": "rgb(91, 91, 214)",
"c": "20",
"d": "brand or accent",
"e": "contrast on white 5.4:1 · on black 3.9:1",
"state": ""
},
"…"
],
"notes": [
"Over 60 distinct colours. That is usually several palettes layered by different people …",
"Counts are how often a colour appears in the CSS, which is not the same as how much of …"
]
}
}{ } DevOps (1)
/api/v1/tool?name=php-version 🐘 Определите версию PHP, которую выдаёт сервер.GET /api/v1/tool?name=php-version&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "php-version",
"ms": 74,
"result": {
"summary": [
{
"label": "PHP version",
"value": "not disclosed",
"state": "ok"
},
{
"label": "Security support",
"value": "unknown",
"state": ""
},
{
"label": "Version leaked",
"value": "no",
"state": "ok"
}
],
"cols": [
"Field",
"Value",
"Verdict"
],
"rows": [
{
"a": "PHP detected",
"b": "no",
"c": "Nothing in the response names PHP. The site may not use it, or it may simply be configu…",
"state": "ok"
},
{
"a": "Server header",
"b": "cloudflare",
"c": "No version published here.",
"state": "ok"
}
],
"notes": [
"This reads only what the server volunteers in its headers. Nothing is probed, and a sit…"
]
}
}Вход через Astrina (Auth API)
Добавьте вход через соцсети на свой сайт одной интеграцией. Astrina — брокер в стиле OAuth2/OIDC; вы регистрируете сайт один раз и переиспользуете каждого включённого провайдера.
GET /auth/authorize.php | Отправьте сюда пользователя (добавьте &provider=google чтобы пропустить выбор). Вернёт code на ваш redirect_uri. |
POST /auth/token.php | Обменяйте code (на сервере, с вашим client secret) на идентичность: sub, provider, email, name, avatar. |
GET /auth/providers.php | Список включённых провайдеров с готовыми ссылками входа. |
Готовый PHP SDK + полный гайд: руководство по интеграции · скачать sdk.php
API оптимизации изображений
Сжимайте и конвертируйте изображения (JPEG, PNG, GIF, WebP, AVIF, SVG) — без потерь или с потерями. Отправьте файл, URL или base64; получите оптимизированное изображение и размер экономии.
POST /api/v1/image | Тело: image=@файл, или JSON {url} / {data:base64}. Опции: lossy=1|0, format=keep|webp|avif|jpeg|png, quality, resize. Возвращает in/out байты, saved_percent и ссылку на скачивание. |
GET /api/v1/image?get=… | Получите оптимизированный результат по токену — ключ не нужен, вставьте url прямо в тег изображения. |
Только платные тарифы; учитывается в месячной квоте изображений. Веб-интерфейс: Оптимизатор изображений
Эндпоинты, которые вызываете не вы
Под /api/v1 есть два семейства, предназначенных не для вашего кода, — они перечислены здесь, чтобы эта страница была полной картой:
POST /api/v1/social/inbound | Приёмник вебхуков провайдера (Meta / WhatsApp Cloud API). Его вызывает провайдер, а не вы: GET — рукопожатие подписки, POST доставляет сообщения. Настраивается в Соцсети. |
/api/v1/node/… | Протокол устройств Pulsar — register, next, submit, heartbeat и прочие — на нём говорит агент узла, а не владелец API-ключа. Он описан вместе с остальным протоколом на странице протокола Pulsar. |
Группы сайтов
/api/v1/groups Ваши группы сайтов и их состав — те самые id групп, которые принимает /api/v1/stats?group=…, без парсинга дашборда.GET /api/v1/groups
X-Api-Key: ak_your_key_here
{ "ok":true, "groups":[ { "id":4, "name":"Client sites", "sites":[ {"id":12,"domain":"example.com"} ] } ] }Только чтение; группы редактируются в Мои группы сайтов. Права groups.
Срез продвижения
/api/v1/promotion?site=… Срез продвижения одного из ваших сайтов в JSON: позиции, гео, ссылки, аудит и цели — те же числа, что и в хабе продвижения.| Параметр | Описание |
|---|---|
site | id или домен сайта — должен принадлежать владельцу ключа |
section | summary (default) · rankings · geo · backlinks · audit · goals |
Поле, по которому у платформы нет данных, возвращается как null — никаких догадок. Скоуп promotion.
Данные сети Pulsar
/api/v1/pulsar?site=… Распределённый мониторинг вашего сайта, собранный независимыми устройствами: подтверждение каждого монитора с нескольких точек и задержки по странам.| Параметр | Описание |
|---|---|
site | id или домен сайта (обязательно) |
report | monitors (default) · coverage |
Каждое число — вердикт кворума независимых устройств; пока сеть не решила, значение null, а не мнение одного сервера. О сети.
Комментарии
/api/v1/comment?key=… Модерируемые комментарии для любой страницы, по URL. То же хранилище, что и у виджета комментариев.GET /api/v1/comment?key=https://example.com/post POST /api/v1/comment key=https://example.com/post&author=Ann&body=Nice+one
Тексты хранятся как обычный текст (теги вырезаются) — экранируйте при выводе. Модерация и виджет — в Комментарии.
Экспорт threat-intel
/api/v1/ti-export Экспорт корпуса threat-intel с учётом лицензий: только строки с правом распространения или собственные данные Astrina, каждая со своим источником для атрибуции.Двойной замок: действующий ключ И переключатель оператора, выключенный до согласования коммерческих условий. Фиды с ограничительной лицензией не попадают в выгрузку ни при каком тарифе.
Social API