Deweloperzy · REST JSON

API dewelopera Astrina

Jedno REST JSON API dla Twoich statystyk ruchu, recenzji, ocen, inteligencji telefonicznej, 32 uruchamialnych narzędzi i logowania społecznościowego. Prosta autoryzacja klucza, hojny darmowy poziom.

20Sekcje odniesienia API
18sieci społecznościowe
6sieci reklamowe

Autoryzacja i limit

Każde żądanie wymaga twojego klucza API. Uzyskaj jeden na swoim Panel API. Przekaż to w nagłówku żądania — klucze nigdy nie są akceptowane w URL, więc nie mogą wyciekać do logów serwera, proxy ani nagłówków 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

Twój dzienny limit jest związany z Twoim planem: Darmowy 100/dzień, Pro 5,000/dzień, Biznes 25,000/dzień, Biznes Plus 100,000/dzień — zaktualizuj swój plan, aby uzyskać wyższy limit. Każda odpowiedź odzwierciedla Twój limit. Błędy zwracają pole "error" z odpowiednim statusem: 401 (zły klucz), 429 (limit), 400/422 (złe parametry), 403/404 (nie Twoje / nie znaleziono). Odpowiedzi są otwarte CORS i noindex.

API społecznościowe

Jedno API REST do publikowania, planowania, mierzenia i wysyłania wiadomości w każdej sieci, którą łączysz — 18 sieci społecznościowych i 6 sieci reklamowych, jeden model uwierzytelniania, jeden kształt żądania.

Obsługiwane sieci (18): X (Twitter), Instagram, Facebook, Threads, LinkedIn, TikTok, YouTube, Pinterest, Reddit, Snapchat, Google Business, VK, Odnoklassniki, Telegram, WhatsApp, Discord, Mastodon, Bluesky. Sieci reklamowe: Meta Ads, Google Ads, TikTok Ads, LinkedIn Ads, Pinterest Ads, X Ads.

To samo uwierzytelnianie klucza co wszystko powyżej (tylko nagłówek), ograniczone do social. Połącz kanały na swoim Panel społecznościowy. Publikowanie jest asynchroniczne: /publish zwraca post z każdym docelowym w kolejce; pracownik dostarcza w ciągu minuty, a webhook uruchamia się, gdy dotrze.

GET/api/v1/social/channels Każda sieć, jej możliwości i które masz połączone. Wywołaj to najpierw.
GET/api/v1/social/accounts Kanały, które masz połączone — identyfikatory /publish targets.
POST/api/v1/social/publish Opublikuj lub zaplanuj jeden post na jeden lub wiele kanałów.
ParamOpis
textTreść posta (wymagana, chyba że podano media)
channels"wszystkie", lub lista identyfikatorów kanałów z /accounts
mediaTablica {url,type,alt} (opcjonalnie)
scheduled_atCzas ISO-8601; pomiń lub przeszły = opublikuj teraz
idempotency_keyTwój identyfikator posta — ponowne wysłanie z tym samym kluczem zwraca pierwszy, nigdy nie podwaja postów
overridesNadpisania treści na poziomie kanału, kluczowane według identyfikatora kanału
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 } }
GET/api/v1/social/post Jeden post i wynik dostarczenia dla każdego celu (?id=…), lub ostatnia lista.
GET/api/v1/social/analytics Obserwujący, wyświetlenia, zasięg i zaangażowanie — seria kanałów lub podsumowanie konta. Zrzuty ekranu, nigdy szacunki.
GETPOST/api/v1/social/messages Przeczytaj wątek DM lub wyślij wiadomość bezpośrednią na kanale, który to obsługuje.
GET/api/v1/social/comments Komentarze zebrane na twoich opublikowanych postach.
GETPOST/api/v1/social/ads Lista i tworzenie kampanii reklamowych w sześciu sieciach reklamowych.
GETPOSTDELETE/api/v1/social/webhooks Zostań powiadomiony, gdy post zostanie opublikowany lub przyjdzie komentarz/DM/wzmianka.

Wydarzenia: post.published, post.partial, post.failed, comment.received, dm.received, mention.received. Ogólny hak jest podpisany z X-Astrina-Signature: sha256=hmac(timestamp.body, secret).

Analityka

GET/api/v1/stats Analityka ruchu dla strony, którą posiadasz.
ParamOpis
siteIdentyfikator witryny lub domena, którą posiadasz (wymagane)
period24h · 7d (domyślnie) · 30d · 90d
reportsummary (domyślnie) · timeseries · pages · sources · countries · devices
limitWiersze dla raportów szczegółowych (1–100, domyślnie 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 }
}

Konwersje

POST/api/v1/conversion Zarejestruj konwersję z serwera, aby przychody, które nigdy nie dotykają przeglądarki, były nadal przypisywane.
ParamOpis
siteIdentyfikator witryny lub domena, którą posiadasz (wymagane)
kindlead · qualified · deal · sale · recurring · refund · churn
valueKwota, w poniższej walucie. Ujemna dla zwrotu.
currencyTrzyznakowy kod, domyślnie USD
uidIdentyfikator odwiedzającego z skryptu śledzącego. Opcjonalne — zobacz notatkę poniżej.
external_idTwój własny identyfikator dla rekordu, używany do unikania podwójnego liczenia ponownego próby
POST /api/v1/conversion
Authorization: Bearer <your API key>

site=example.com&kind=sale&value=249.00&currency=USD&uid=v_8f3c…&external_id=order-1042

{ "recorded": true, "id": 5512, "kind": "sale" }

Konwersja bez uid jest rejestrowana, a nie odrzucana: sprzedaż zamknięta przez telefon to wciąż przychód. Liczy się w sumach i jest raportowana jako nieprzypisana, zamiast być przypisana do kanału, którego nie można prześledzić.

Minifikacja

POST/api/v1/minify Minifikuj HTML, CSS lub JS i otrzymaj skompresowane bajty z powrotem. Działa na naszych serwerach (bez tokenów AI); fakturowane za każde żądanie według rozmiaru wejścia.
ParamOpis
kindhtml · css · js — wymagane (poprzez ?kind=, przesłaną nazwę pliku lub Content-Type)
treśćŹródło do minifikacji: surowa treść żądania, multipart file, lub 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}" }

Autoryzacja: tylko nagłówek (X-Api-Key lub Bearer), zakres minify. CSS i JS są minifikowane bezpiecznie — odstępy calc() i JS ASI są zachowane; HTML redukuje białe znaki, zachowując <pre>, <textarea>, <script>, <style> i JSON-LD w nienaruszonym stanie. Śledź użycie i klucze na swoim Panel minifikacji.

Oryginalność &amp; wykrywanie AI

POST/api/v1/originality Rozpocznij jedno sprawdzenie: unikalność tekstu, tekst napisany przez AI, unikalność obrazu lub obraz wygenerowany przez AI. Zwraca identyfikator uruchomienia natychmiast — praca odbywa się na pracowniku.
ParamOpis
kindtext-unique · ai-text · image-unique · ai-image — wymagane
texttekst do sprawdzenia (moduły tekstowe)
urlprzeczytaj tekst — lub pobierz obraz — z tego adresu zamiast tego
imagepole pliku wieloczęściowego (moduły obrazów); lub 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 }

Autoryzacja: tylko nagłówek (X-Api-Key lub Bearer), zakres originality. Pro i wyżej. Jedno zadanie kosztuje stałą liczbę żądań API z twojego dziennego limitu — 10 za unikalność tekstu, 5 za tekst AI, 5 za unikalność obrazu, 3 za obraz AI — ponieważ jedno zadanie to tuzin zapytań indeksowych, tuzin pobrań stron lub kilka setek ocen modeli. Poza dziennym limitem sprawdzeń twojego planu, zadanie kosztuje również stałą cenę z twojego salda, a odpowiedź dokładnie mówi, co zostało obciążone.

GET/api/v1/originality?run=<id> Sprawdź uruchomienie. Gdy działa, otrzymujesz etap, w którym się znajduje; gdy się kończy, otrzymujesz pełny raport.
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":[…] } }

Sprawdzanie kosztuje 1 żądanie. Sprawdzenie unikalności tekstu zazwyczaj kończy się w 15–40 sekund; sprawdzaj co 2–3 sekundy. Każdy raport zawiera swoje zaufanie i dowody za nim: dopasowane strony z cytowanymi fragmentami lub pomiary, które każdy sygnał wyprodukował. Wykrywanie jest probabilistyczne — API nigdy nie zwraca werdyktu bez liczb, z których pochodzi.

POST/api/v1/originality Warstwa de-AI, te same drzwi: kind=deai-text przepisywanie szkicu, aby przestał być odczytywany jako napisany przez maszynę; kind=deai-image przekodowuje wygenerowany obraz, aby jego piksele zachowywały się jak fotografia.
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 zapytań API do przepisywania tekstu, 6 do przekodowania obrazu — przepisywanie może wykorzystać wywołanie modelu, a cena to pokrywa. Każde zadanie otrzymuje JEDNO darmowe deterministyczne przejście i maksymalnie JEDNO płatne przepisywanie modelu: jeśli to nie wystarczy, odpowiedź to mówi zamiast ponownie wydawać. Zadanie związane z obrazem odpowiada linkiem do pobrania (przechowywane przez 72 godziny). Przeredagowujący wprowadza poprawki, które obroniłby redaktor — cięcia standardowych przejść, zróżnicowany rytm, zastąpione nadużywane słowa — i ponownie mierzy tym samym detektorem. Nie dodaje błędów i nie wymyśla faktów. Przekształtnik obrazów odrzuca pliki z podpisanym manifestem C2PA zamiast je usuwać i wpisuje uczciwy kredyt „ilustracja wspomagana przez AI” do tego, co produkuje.

GET/api/v1/originality Katalog: ile każde sprawdzenie kosztuje w żądaniach API i w pieniądzach, oraz ile twojego limitu pozostało dzisiaj.

Recenzje i oceny

GET/api/v1/reviews Najnowsze recenzje + ocena zbiorcza dla dowolnego tematu.
ParamOpis
typesite · phone · email · address · org · shop
keyWartość tematu (domena, numer, 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/" }
GET/api/v1/rating Kompaktowe podsumowanie ocen + rozkład gwiazdek + osadzone adresy URL.
ParamOpis
siteSkrót do witryny według domeny
type + keyLub dowolny temat według typu + klucz
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" }

Inteligencja telefonów

GET/api/v1/phone Operator, typ linii i ryzyko spamu w społeczności dla numeru.
ParamOpis
numberNumer telefonu w formacie międzynarodowym, np. +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/" }

Sprawdzenie czarnej listy i spamu

GET/api/v1/blacklist Sprawdź, czy telefon, e-mail, domena lub strona znajduje się na czarnej liście spamu / oszustw.
ParamOpis
valueTelefon, e-mail, domena lub URL do sprawdzenia (typ automatycznie wykryty).
typeOpcjonalnie — wymuś jeden z 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 } }

Sprawdzenie AML dla kryptowalut

GET/api/v1/aml Sprawdź adres portfela kryptowalutowego w kontekście sankcji i list wywiadu zagrożeń — łańcuch automatycznie wykryty, w tym wynik ryzyka.
ParamOpis
addressAdres portfela do sprawdzenia. Kształty BTC, EVM (0x…), TRON, Solana, TON, LTC, DOGE, XRP, XMR i BCH są rozpoznawane; każdy inny ciąg jest sprawdzany tak, jak jest.
formatOpcjonalne — ustaw na csv, aby otrzymać CSV zamiast 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 } }

Masowo: POST tablicę "addresses" (do 50), aby sprawdzić wiele w jednym wywołaniu — jedna jednostka kwoty każda.

POST /api/v1/aml
{ "addresses": ["0x…", "bc1…", "T…"] }

{ "results": [ { "address": "0x…", "listed": false, "risk": 0, … } ], "count": 3 }

Każda odpowiedź zawiera nagłówki X-RateLimit-Limit i X-RateLimit-Remaining. Pełna dokumentacja, model ryzyka i tablice na żywo: astrina.io/aml/

Sprawdzenie wycieku hasła

GET/api/v1/pwned Sprawdź, czy hasło pojawiło się w naruszeniu danych — używając k-anonimowości, aby hasło nigdy nie opuściło klienta.

Zahaszuj hasło za pomocą SHA-1 w swojej aplikacji, a następnie wyślij tylko pierwsze 5 znaków szesnastkowych tego hasha. API zwraca każdy naruszony sufiks hasha, który dzieli prefiks; porównujesz lokalnie. Czyste hasło nigdy nie jest przesyłane.

ParamOpis
prefixPierwsze 5 znaków szesnastkowych hasha SHA-1 (zalecane — k-anonimowość). Zwraca pasujące sufiksy z liczbą naruszeń.
hashAlternatywa: pełny 40-znakowy SHA-1. Wygodne, ale hash opuszcza klienta — preferuj prefiks, gdzie to możliwe.
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 } }

Źródło danych: Have I Been Pwned (Pwned Passwords). Ten sam model k-anonimowości napędza darmowe narzędzie przeglądarki na /password-check/.

Narzędzia

Uruchom nasze synchroniczne narzędzia po stronie serwera przez API — 31 z 141. Narzędzia tylko dla przeglądarki oraz oczekujące skanowania/renderowania nie są ujawniane. Każde narzędzie ma ten sam kształt i zwraca tę samą kopertę; bramy planu i dzienne limity uruchomień są identyczne jak na stronie internetowej.

GET /api/v1/tool                         # katalog
GET /api/v1/tool?name=<key>&value=<input>  # uruchom jeden (value2 dla narzędzi z dwoma wejściami)     -H "X-Api-Key: ak_your_key_here"
ParamOpis
nameKlucz narzędzia (zobacz każdy blok poniżej).
valueGłówne wejście — URL, domena, URL-e oddzielone przecinkami/nowymi liniami lub tekst.
value2Drugie wejście, tylko dla narzędzi, które porównują dwie rzeczy.

Errors: 404 unknown utility · 400 not API-runnable · 403 plan required · 429 daily run cap reached · 422 bad input. Każde zwraca pole "error".

🔍 SEO (18)
GET/api/v1/tool?name=site-audit 🔍 Techniczne, szybkość i bezpieczeństwo w jednym podejściu.
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": []
    }
}
GET/api/v1/tool?name=serp-preview 👁️ Jak wygląda fragment w wynikach wyszukiwania.
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…"
        ]
    }
}
GET/api/v1/tool?name=og-preview 📣 Karta wyświetlana, gdy Twój link jest udostępniany.
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 …"
        ]
    }
}
GET/api/v1/tool?name=schema-validator 🧬 Waliduje dane strukturalne 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…"
        ]
    }
}
GET/api/v1/tool?name=meta-tags 🏷️ Tytuł, opis i tagi og z długościami.
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": []
    }
}
GET/api/v1/tool?name=keyword-density 📊 Gęstość i częstotliwość słów na stronie.
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…"
        ]
    }
}
GET/api/v1/tool?name=redirects ↪️ Śledzi łańcuchy 301/302 krok po kroku.
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…"
        ]
    }
}
GET/api/v1/tool?name=sitemap 🗺️ Waliduje mapę witryny XML i jej indeks.
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."
        ]
    }
}
GET/api/v1/tool?name=html-validate ✅ Błędy strukturalne zgodnie z zasadami 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…"
        ]
    }
}
GET/api/v1/tool?name=robots-txt 🤖 Analizuje plik i rozwiązuje go dla każdego robota.
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…"
        ]
    }
}
GET/api/v1/tool?name=images-seo 🖼️ Tekst alternatywny, wymiary i formaty.
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…",
            "…"
        ]
    }
}
GET/api/v1/tool?name=cms-detect 🧱 Identyfikuje CMS i stos technologiczny.
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 …"
        ]
    }
}
GET/api/v1/tool?name=readability 📖 Trudność tekstu i metryki czytelności.
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…"
        ]
    }
}
GET/api/v1/tool?name=hreflang 🌍 Międzynarodowe oznaczenie, w tym linki zwrotne.
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."
        ]
    }
}
GET/api/v1/tool?name=canonical 🔗 Który URL strona deklaruje jako oryginalny.
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": []
    }
}
GET/api/v1/tool?name=http-status 📋 Masowe kody HTTP i przekierowania.
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."
        ]
    }
}
GET/api/v1/tool?name=favicon ⭐ Każdy rozmiar i format, którego szuka przeglądarka.
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."
        ]
    }
}
🛡️ Bezpieczeństwo (12)
GET/api/v1/tool?name=ssl 🔒 Certyfikat, łańcuch i ważność.
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."
        ]
    }
}
GET/api/v1/tool?name=security-headers 🛡️ HSTS, CSP, opcje ramki, ocenione.
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…"
        ]
    }
}
GET/api/v1/tool?name=http-headers 📨 Każdy nagłówek odpowiedzi, wyjaśniony.
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…"
        ]
    }
}
GET/api/v1/tool?name=csp 🚧 Wymienia dyrektywy, które pozostawiają lukę.
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…"
        ]
    }
}
GET/api/v1/tool?name=dns 🌐 A, AAAA, MX, NS, TXT, SOA i 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…"
        ]
    }
}
GET/api/v1/tool?name=whois 📜 Rejestrator, daty i serwery nazw.
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 …"
        ]
    }
}
GET/api/v1/tool?name=email-auth ✉️ Rekordy SPF, DKIM i 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…"
        ]
    }
}
GET/api/v1/tool?name=http2 ⚡ Który protokół i kompresja są używane.
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 …"
        ]
    }
}
GET/api/v1/tool?name=ip-info 📍 Geolokalizacja i sieć dla adresu.
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…"
        ]
    }
}
GET/api/v1/tool?name=ports 🔌 Znane porty usługowe, sprawdzone bezpiecznie.
GET /api/v1/tool?name=ports&value=https%3A%2F%2Fexample.com%2F{ "ok": true, "utility": "ports", "ms": 0, "result": { … } }
GET/api/v1/tool?name=cookies 🍪 Ciasteczka i ich flagi zgodnie z RODO.
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 …"
        ]
    }
}
GET/api/v1/tool?name=cors 🔓 Jakie źródła są dozwolone przez twój punkt końcowy.
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)
GET/api/v1/tool?name=palette-url 🌐 Kolory, które strona faktycznie używa.
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)
GET/api/v1/tool?name=php-version 🐘 Wykryj wersję PHP, którą ujawnia serwer.
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…"
        ]
    }
}

Zaloguj się z Astrina (Auth API)

Dodaj logowanie społecznościowe do swojej strony za pomocą jednej integracji. Astrina jest pośrednikiem w stylu OAuth2/OIDC; rejestrujesz swoją stronę raz i ponownie wykorzystujesz każdego dostawcę, którego włączysz.

GET /auth/authorize.phpWyślij użytkownika tutaj (dodaj &provider=google aby pominąć wybór). Zwraca kod do twojego redirect_uri.
POST /auth/token.phpWymień kod (po stronie serwera, z twoim sekretem klienta) na tożsamość: sub, dostawca, e-mail, imię, awatar.
GET /auth/providers.phpLista aktualnie włączonych dostawców, z gotowymi adresami URL do logowania głębokiego.

Wbudowane PHP SDK + pełny przewodnik: przewodnik integracji · pobierz sdk.php

API optymalizacji obrazów

Kompresuj i konwertuj obrazy (JPEG, PNG, GIF, WebP, AVIF, SVG) — bezstratnie lub stratnie. Wyślij plik, URL lub base64; otrzymaj zoptymalizowany obraz i oszczędność jego rozmiaru.

POST /api/v1/imageCiało: image=@file, lub JSON {url} / {data:base64}. Opcje: lossy=1|0, format=keep|webp|avif|jpeg|png, jakość, zmiana rozmiaru. Zwraca bajty wejściowe/wyjściowe, saved_percent i URL do pobrania.
GET /api/v1/image?get=…Pobierz zoptymalizowany wynik za pomocą jego tokena — nie potrzebny klucz, przekaż URL bezpośrednio do tagu obrazu.

Tylko płatne plany; rozliczane w ramach miesięcznego limitu obrazów. Interfejs webowy: Optymalizator obrazów

Punkty końcowe, których nie wywołujesz

Dwie rodziny istnieją pod /api/v1, które nie są dla Twojego kodu, wymienione tutaj, aby ta strona była kompletną mapą:

POST /api/v1/social/inboundOdbiornik webhook dostawcy (Meta / WhatsApp Cloud API). Jest wywoływany PRZEZ dostawcę, a nie przez Ciebie: GET to handshake subskrypcyjny, POST dostarcza wiadomości. Skonfiguruj to w Społecznościowe.
/api/v1/node/…Protokół urządzenia Pulsar — rejestracja, następnie, przesyłanie, heartbeat i przyjaciele — mówiony przez agenta węzła, a nie przez klucz API. Jest udokumentowany z resztą protokołu na Strona protokołu Pulsar.

Grupy witryn

GET/api/v1/groups Grupy Twojej witryny i ich członkowie — identyfikatory grup, które przyjmuje /api/v1/stats?group=…, bez skanowania pulpitu nawigacyjnego.
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"} ] } ] }

Tylko do odczytu; grupy są edytowane w Moje grupy stron. Zakres groups.

Zrzut promocji

GET/api/v1/promotion?site=… Obraz promocji jednego z Twoich serwisów w formacie JSON: rankingi, geo, linki zwrotne, audyt i cele — te same liczby, które pokazuje centrum promocji.
ParamOpis
siteid serwisu lub domena — musi należeć do właściciela klucza
sectionsummary (default) · rankings · geo · backlinks · audit · goals

Pole, dla którego platforma nie ma danych, zwraca null — nigdy nie jest to zgadywanie. Zakres promotion.

Dane sieci Pulsar

GET/api/v1/pulsar?site=… Rozproszone monitorowanie serwisu, który posiadasz, zbierane przez niezależne urządzenia: potwierdzenie z kilku punktów widzenia dla każdego monitora oraz opóźnienie według kraju.
ParamOpis
siteid serwisu lub domena (wymagane)
reportmonitors (default) · coverage

Każda liczba to werdykt kworum z niezależnych urządzeń; gdy sieć jeszcze nie podjęła decyzji, wartość jest null, a nie opinia pojedynczego serwera. O sieci.

Komentarze

GET/api/v1/comment?key=… Moderowane komentarze na stronie dla dowolnej strony, według URL. To samo, co wykorzystuje widget komentarzy.
GET  /api/v1/comment?key=https://example.com/post
POST /api/v1/comment   key=https://example.com/post&author=Ann&body=Nice+one

Treści są przechowywane jako czysty tekst (tagi usunięte) — escape przy renderowaniu. Moderacja i widget znajdują się w Komentarze.

Eksport danych wywiadowczych zagrożeń

GET/api/v1/ti-export Eksport z uwzględnieniem licencji zbioru informacji o zagrożeniach: tylko wiersze z licencją do ponownego rozpowszechniania lub pochodzące z Astrina, każdy z nich zawiera swoje źródło do przypisania.

Podwójne zabezpieczenie: ważny klucz OR przełącznik operatora, który jest wyłączony, dopóki warunki handlowe nie zostaną uzgodnione. Kanały z restrykcyjną licencją nigdy nie są uwzględniane, niezależnie od planu.

Na co odpowiada ta strona

  • referencja punktów końcowych API
  • uwierzytelnianie API i limity
  • przykłady żądań API
  • dokumentacja API REST JSON
  • jak uzyskać klucz API
  • co to jest api astrina
  • jak działa api astrina
  • api astrina wyjaśnione
  • api astrina przewodnik
  • jak zacząć z api astrina
  • recenzje api astrina
  • czy api astrina jest tego warte
  • cennik api astrina
  • api astrina alternatywy
  • api astrina dla początkujących
  • dlaczego api astrina
  • api astrina — co otrzymujesz