Entwickler · REST JSON

Astrina Entwickler-API

Eine REST JSON API für Ihre Verkehrsstatistiken, Bewertungen, Bewertungen, Telefonintelligenz, 32 ausführbare Utilities und sozialen Login. Einfache Schlüsselauthentifizierung, großzügige kostenlose Stufe.

20API-Referenzabschnitte
18soziale Netzwerke
6Werbenetzwerke

Authentifizierung & Kontingent

Jede Anfrage benötigt Ihren API-Schlüssel. Holen Sie sich einen auf Ihrem API-Dashboard. Übergeben Sie es in einem Anfrage-Header — Schlüssel werden niemals in der URL akzeptiert, sodass sie nicht in Serverprotokolle, Proxys oder Referer-Header gelangen können:

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

Ihr tägliches Kontingent ist in Ihrem Plan enthalten: Kostenlos 100/Tag, Pro 5.000/Tag, Business 25.000/Tag, Business Plus 100.000/Tag — upgraden Sie Ihren Plan für ein höheres Limit. Jede Antwort spiegelt Ihr Kontingent wider. Fehler geben ein "error"-Feld mit dem richtigen Status zurück: 401 (schlüssel ungültig), 429 (Kontingent), 400/422 (schlechte Parameter), 403/404 (nicht Ihr / nicht gefunden). Antworten sind CORS-offen und noindex.

Social API

Eine REST API zum Veröffentlichen, Planen, Messen und Kommunizieren über jedes Netzwerk, das Sie verbinden — 18 soziale Netzwerke und 6 Werbenetzwerke, ein Authentifizierungsmodell, eine Anforderungsform.

Unterstützte Netzwerke (18): X (Twitter), Instagram, Facebook, Threads, LinkedIn, TikTok, YouTube, Pinterest, Reddit, Snapchat, Google Business, VK, Odnoklassniki, Telegram, WhatsApp, Discord, Mastodon, Bluesky. Werbenetzwerke: Meta Ads, Google Ads, TikTok Ads, LinkedIn Ads, Pinterest Ads, X Ads.

Gleiche Schlüssel-Authentifizierung wie alles oben (nur Header), beschränkt auf social. Kanäle auf Ihrem Soziales Dashboard. Die Veröffentlichung ist asynchron: /publish gibt den Beitrag mit jedem Ziel in der Warteschlange zurück; der Worker liefert innerhalb einer Minute und ein Webhook wird ausgelöst, wenn er ankommt.

GET/api/v1/social/channels Jedes Netzwerk, seine Fähigkeiten und welche Sie verbunden haben. Rufen Sie dies zuerst auf.
GET/api/v1/social/accounts Die Kanäle, die Sie verbunden haben — die ids /publish-Ziele.
POST/api/v1/social/publish Veröffentlichen oder planen Sie einen Beitrag für einen oder mehrere Kanäle.
ParameterBeschreibung
textBeitragsinhalt (erforderlich, es sei denn, Medien werden angegeben)
channels"alle", oder eine Liste von Kanal-IDs von /accounts
mediaArray von {url,type,alt} (optional)
scheduled_atISO-8601-Zeit; weglassen oder in der Vergangenheit = jetzt veröffentlichen
idempotency_keyIhre ID für den Beitrag — ein erneuter Versuch mit demselben Schlüssel gibt den ersten zurück, niemals doppelt veröffentlicht
overridesPro-Kanal-Inhaltsüberschreibungen, nach Kanal-ID geordnet
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 Ein Beitrag und das Zustellungsergebnis jedes Ziels (?id=…), oder die aktuelle Liste.
GET/api/v1/social/analytics Follower, Impressionen, Reichweite und Engagement — eine Kanalreihe oder ein Konto-Roll-up. Schnappschüsse, niemals Schätzungen.
GETPOST/api/v1/social/messages Lesen Sie einen DM-Thread oder senden Sie eine direkte Nachricht auf einem Kanal, der dies unterstützt.
GET/api/v1/social/comments Kommentare, die auf Ihren veröffentlichten Beiträgen erfasst wurden.
GETPOST/api/v1/social/ads Listen und erstellen Sie Werbekampagnen über die sechs Werbenetzwerke.
GETPOSTDELETE/api/v1/social/webhooks Erfahren Sie, wann ein Beitrag ankommt oder ein Kommentar/DM/Erwähnung eintrifft.

Ereignisse: post.published, post.partial, post.failed, comment.received, dm.received, mention.received. Ein generischer Hook ist signiert mit X-Astrina-Signature: sha256=hmac(timestamp.body, secret).

Analysen

GET/api/v1/stats Verkehrsanalysen für eine Website, die Sie besitzen.
ParameterBeschreibung
siteWebsite-ID oder Domain, die Sie besitzen (erforderlich)
period24h · 7d (Standard) · 30d · 90d
reportsummary (Standard) · timeseries · pages · sources · countries · devices
limitZeilen für Aufschlüsselungsberichte (1–100, Standard 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 }
}

Konversionen

POST/api/v1/conversion Eine Konversion von Ihrem Server aufzeichnen, sodass Einnahmen, die den Browser nie berühren, weiterhin zugeordnet werden.
ParameterBeschreibung
siteWebsite-ID oder Domain, die Sie besitzen (erforderlich)
kindlead · qualified · deal · sale · recurring · refund · churn
valueBetrag in der untenstehenden Währung. Negativ für eine Rückerstattung.
currencyDrei-Buchstaben-Code, Standard USD
uidBesucher-ID aus dem Tracking-Skript. Optional – siehe die Anmerkung unten.
external_idIhre eigene ID für den Datensatz, die verwendet wird, um eine doppelte Zählung eines Versuchs zu vermeiden.
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" }

Eine Konversion ohne eine uid wird aufgezeichnet, nicht abgelehnt: Ein über das Telefon abgeschlossener Verkauf ist immer noch Umsatz. Es zählt in den Gesamtsummen und wird als nicht zugeordnet gemeldet, anstatt einem Kanal zugewiesen zu werden, dem es nicht zugeordnet werden kann.

Minifizieren

POST/api/v1/minify Minifizieren Sie HTML, CSS oder JS und erhalten Sie die komprimierten Bytes zurück. Läuft auf unseren Servern (keine AI-Token); Abrechnung pro Anfrage nach Eingabegröße.
ParameterBeschreibung
kindhtml · css · js — erforderlich (über ?kind=, den hochgeladenen Dateinamen oder Content-Type)
KörperDie Quelle zum Minifizieren: der rohe Anfragekörper, ein Multipart file, oder 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}" }

Auth: nur Header (X-Api-Key oder Bearer), Scope minify. CSS und JS werden sicher minimiert — calc() Abstände und JS ASI werden beibehalten; HTML reduziert Leerzeichen, während <pre>, <textarea>, <script>, <style> und JSON-LD intakt bleiben. Verfolgen Sie die Nutzung und Schlüssel auf Ihrem Minify-Dashboard.

Originalität &amp; KI-Erkennung

POST/api/v1/originality Starten Sie eine Überprüfung: Text-Einzigartigkeit, KI-geschriebener Text, Bild-Einzigartigkeit oder KI-generiertes Bild. Gibt sofort eine Lauf-ID zurück — die Arbeit erfolgt auf einem Server.
ParameterBeschreibung
kindtext-unique · ai-text · image-unique · ai-image — erforderlich
textden zu überprüfenden Text (Textmodule)
urllesen Sie den Text — oder holen Sie das Bild — stattdessen von dieser Adresse
imageMultipart-Dateifeld (Bildmodule); oder 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 }

Auth: nur Header (X-Api-Key oder Bearer), Scope originality. Pro und höher. Eine Aufgabe kostet eine feste Anzahl von API-Anfragen aus Ihrem täglichen Kontingent — 10 für Text-Einzigartigkeit, 5 für KI-Text, 5 für Bild-Einzigartigkeit, 3 für KI-Bild — weil eine Aufgabe ein Dutzend Indexabfragen, ein Dutzend Seiten-Downloads oder einige hundert Modellevaluierungen umfasst. Über das tägliche Kontingent Ihrer Planung hinaus kostet eine Aufgabe auch einen festen Preis von Ihrem Guthaben, und die Antwort sagt genau, was berechnet wurde.

GET/api/v1/originality?run=<id> Fragen Sie einen Lauf ab. Während es läuft, erhalten Sie den aktuellen Stand; wenn es fertig ist, erhalten Sie den vollständigen Bericht.
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":[…] } }

Abfragen kostet 1 Anfrage. Ein Text-Einzigartigkeit-Durchlauf dauert typischerweise 15–40 Sekunden; fragen Sie alle 2–3 Sekunden ab. Jeder Bericht trägt sein Vertrauen und die Beweise dahinter: übereinstimmende Seiten mit zitierten Fragmenten oder die Messungen, die jedes Signal erzeugt hat. Die Erkennung ist probabilistisch — die API gibt niemals ein Urteil ab, ohne die Zahlen, von denen es stammt.

POST/api/v1/originality Die de-AI-Schicht, dieselbe Tür: kind=deai-text schreibt einen Entwurf um, damit er nicht mehr maschinell geschrieben klingt; kind=deai-image kodiert ein generiertes Bild neu, sodass seine Pixel sich wie ein Foto verhalten.
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-Anfragen für eine Textumformulierung, 6 für eine Bildkodierung — eine Umformulierung kann einen Modellaufruf verbrauchen, und der Preis deckt dies ab. Jede Aufgabe erhält EINEN kostenlosen deterministischen Durchlauf und höchstens EINE bezahlte Modellumformulierung: wenn das nicht ausreicht, sagt die Antwort dies, anstatt erneut zu verbrauchen. Eine Bildaufgabe antwortet mit einem Download-Link (72 Stunden lang aufbewahrt). Der Umformulierungstool nimmt Änderungen vor, die ein Redakteur verteidigen würde — Standardübergänge entfernt, Rhythmus variiert, übermäßige Wörter ersetzt — und misst erneut mit demselben Detektor. Es fügt keine Fehler hinzu und erfindet keine Fakten. Der Bildkodierer lehnt Dateien ab, die ein unterzeichnetes C2PA-Manifest tragen, anstatt sie zu entfernen, und schreibt einen ehrlichen „AI-unterstützte Illustration“ Kredit in das, was er produziert.

GET/api/v1/originality Der Katalog: was jede Überprüfung in API-Anfragen und in Geld kostet und wie viel von Ihrem Kontingent heute übrig ist.

Bewertungen & Rezensionen

GET/api/v1/reviews Neueste Bewertungen + aggregierte Bewertung für jedes Thema.
ParameterBeschreibung
typesite · phone · email · address · org · shop
keyDer Subjektwert (Domain, Nummer, 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 Kompakte Bewertungszusammenfassung + Sternverteilung + Einbettungs-URLs.
ParameterBeschreibung
siteVerknüpfung für eine Website nach Domain
type + keyOder jedes Thema nach Typ + Schlüssel
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" }

Telefonintelligenz

GET/api/v1/phone Anbieter, Leitungstyp und Community-Spam-Risiko für eine Nummer.
ParameterBeschreibung
numberTelefonnummer im internationalen Format, z.B. +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/" }

Blacklist & Spam-Überprüfung

GET/api/v1/blacklist Überprüfen Sie, ob eine Telefonnummer, E-Mail, Domain oder Website auf der Spam-/Betrugs-Schwarzen Liste steht.
ParameterBeschreibung
valueDie Telefonnummer, E-Mail, Domain oder URL, die überprüft werden soll (Typ automatisch erkannt).
typeOptional — eines erzwingen 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 } }

Krypto-AML-Prüfung

GET/api/v1/aml Überprüfen Sie eine Krypto-Wallet-Adresse gegen Sanktionen und Bedrohungsintelligenzlisten — Kette automatisch erkannt, Risikobewertung enthalten.
ParameterBeschreibung
addressDie zu überprüfende Wallet-Adresse. BTC, EVM (0x…), TRON, Solana, TON, LTC, DOGE, XRP, XMR und BCH-Formate werden erkannt; jede andere Zeichenfolge wird unverändert nachgeschlagen.
formatOptional — auf csv setzen, um CSV anstelle von JSON zu erhalten.
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 } }

Massen: POST ein "addresses"-Array (bis zu 50), um viele in einem Aufruf zu überprüfen — jeweils eine Kontingent-Einheit.

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

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

Jede Antwort enthält die Header X-RateLimit-Limit und X-RateLimit-Remaining. Vollständige Dokumentation, Risikomodell und Live-Boards: astrina.io/aml/

Überprüfung auf Passwortlecks

GET/api/v1/pwned Überprüfen Sie, ob ein Passwort in einer Datenpanne aufgetaucht ist — unter Verwendung von k-Anonymität, sodass das Passwort den Client niemals verlässt.

Hashen Sie das Passwort mit SHA-1 in Ihrer App und senden Sie dann nur die ersten 5 Hex-Zeichen dieses Hashes. Die API gibt jeden kompromittierten Hash-Suffix zurück, der das Präfix teilt; Sie vergleichen lokal. Das Klarpasswort wird niemals übertragen.

ParameterBeschreibung
prefixDie ersten 5 Hex-Zeichen des SHA-1-Hashes (empfohlen — k-Anonymität). Gibt übereinstimmende Suffixe mit Anzahl der Pannen zurück.
hashAlternative: der vollständige 40-Hex SHA-1. Praktisch, aber der Hash verlässt den Client — bevorzugen Sie das Präfix, wo möglich.
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 } }

Datenquelle: Have I Been Pwned (Pwned Passwords). Dasselbe k-Anonymitätsmodell treibt das kostenlose Browser-Tool unter /password-check/ an.

Dienstprogramme

Führen Sie unsere synchronen serverseitigen Dienstprogramme über die API aus — 31 von 141. Nur im Browser verfügbare Dienstprogramme und wartende Crawls/Renderings sind nicht verfügbar. Jedes Dienstprogramm hat die gleiche Form und gibt dasselbe Envelope zurück; die Plan-Gates und täglichen Laufobergrenzen sind identisch mit der Website.

GET /api/v1/tool                         # der Katalog
GET /api/v1/tool?name=<key>&value=<input>  # einen ausführen (value2 für Zwei-Eingabe-Dienstprogramme)     -H "X-Api-Key: ak_your_key_here"
ParameterBeschreibung
nameDer Dienstprogramm-Schlüssel (siehe jeden Block unten).
valueDie Haupt-Eingabe — eine URL, Domain, durch Kommas/Zeilenumbrüche getrennte URLs oder Text.
value2Die zweite Eingabe, nur für Dienstprogramme, die zwei Dinge vergleichen.

Fehler: 404 unbekanntes Dienstprogramm · 400 nicht API-lauffähig · 403 Plan erforderlich · 429 tägliche Laufobergrenze erreicht · 422 ungültige Eingabe. Jedes gibt ein "error"-Feld zurück.

🔍 SEO (18)
GET/api/v1/tool?name=site-audit 🔍 Technik, Geschwindigkeit und Sicherheit in einem Durchgang.
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 👁️ Wie der Snippet in den Suchergebnissen aussieht.
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 📣 Die Karte, die angezeigt wird, wenn Ihr Link geteilt wird.
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 🧬 Validiert JSON-LD strukturierte Daten.
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 🏷️ Titel, Beschreibung und og-Tags mit Längen.
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 📊 Dichte und Häufigkeit von Wörtern auf der Seite.
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 ↪️ Folgt 301/302-Ketten Schritt für Schritt.
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 🗺️ Validiert die XML-Sitemap und ihr Index.
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 ✅ Strukturelle Fehler gegen W3C-Regeln.
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 🤖 Analysiert die Datei und löst sie pro Crawler auf.
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 🖼️ Alt-Text, Abmessungen und Formate.
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 🧱 Identifiziert das CMS und den Technologie-Stack.
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 📖 Textschwierigkeit und Lesbarkeitsmetriken.
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 🌍 Internationale Markup, einschließlich Rückverlinkungen.
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 🔗 Welche URL die Seite als original deklariert.
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 📋 Massen-HTTP-Codes und Weiterleitungen.
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 ⭐ Jede Größe und jedes Format, nach dem ein Browser sucht.
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."
        ]
    }
}
🛡️ Sicherheit (12)
GET/api/v1/tool?name=ssl 🔒 Zertifikat, Kette und Ablauf.
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, Frame-Optionen, bewertet.
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 📨 Jeder Antwort-Header, erklärt.
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 🚧 Nennt die Direktiven, die eine Lücke hinterlassen.
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 und 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 📜 Registrar, Daten und Nameserver.
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 ✉️ SPF, DKIM und DMARC-Einträge.
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 ⚡ Welches Protokoll und welche Kompression verwendet wird.
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 📍 Geolokalisierung und Netzwerk für eine Adresse.
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 🔌 Bekannte Dienstports, sicher überprüft.
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 🍪 Cookies und ihre Flags gegen die DSGVO.
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 🔓 Welche Ursprünge Ihr Endpunkt erlaubt.
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 🌐 Die Farben, die eine Website tatsächlich verwendet.
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 🐘 Ermitteln Sie die PHP-Version, die ein Server anzeigt.
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…"
        ]
    }
}

Login mit Astrina (Auth API)

Fügen Sie Ihrer Seite mit einer Integration soziale Anmeldungen hinzu. Astrina ist der OAuth2/OIDC-Stil-Broker; Sie registrieren Ihre Seite einmal und verwenden jeden Anbieter, den Sie aktivieren, erneut.

GET /auth/authorize.phpLeiten Sie den Benutzer hierher (fügen Sie hinzu &provider=google um den Wähler zu überspringen). Gibt einen Code an Ihre redirect_uri zurück.
POST /auth/token.phpTauschen Sie den Code (serverseitig, mit Ihrem Client-Geheimnis) gegen die Identität: sub, Anbieter, E-Mail, Name, Avatar.
GET /auth/providers.phpListen Sie die derzeit aktivierten Anbieter auf, mit bereitgestellten Deep-Link-Login-URLs.

Drop-in PHP SDK + vollständige Anleitung: Integrationsanleitung · sdk.php herunterladen

Bildoptimierungs-API

Komprimieren und konvertieren Sie Bilder (JPEG, PNG, GIF, WebP, AVIF, SVG) — verlustfrei oder verlustbehaftet. Senden Sie eine Datei, eine URL oder base64; erhalten Sie das optimierte Bild und die Einsparungen in der Größe zurück.

POST /api/v1/imageBody: image=@file, oder JSON {url} / {data:base64}. Optionen: lossy=1|0, format=keep|webp|avif|jpeg|png, quality, resize. Gibt in/out Bytes, saved_percent und eine Download-URL zurück.
GET /api/v1/image?get=…Holen Sie sich ein optimiertes Ergebnis anhand seines Tokens — kein Schlüssel erforderlich, geben Sie die URL direkt an ein Bild-Tag weiter.

Nur kostenpflichtige Pläne; gemessen an Ihrem monatlichen Bildkontingent. Weboberfläche: Bildoptimierer

Endpunkte, die Sie nicht aufrufen

Zwei Familien existieren unter /api/v1, die nicht für Ihren Code gedacht sind, hier aufgelistet, damit diese Seite die vollständige Karte ist:

POST /api/v1/social/inboundDer Webhook-Empfänger des Anbieters (Meta / WhatsApp Cloud API). Er wird VOM Anbieter aufgerufen, nicht von Ihnen: GET ist der Abonnements-Handschlag, POST liefert Nachrichten. Konfigurieren Sie es in Sozial.
/api/v1/node/…Das Pulsar-Geräteprotokoll — registrieren, weiter, einreichen, Herzschlag und Freunde — gesprochen vom Knotenagenten, nicht von einem API-Schlüssel. Es ist zusammen mit dem Rest des Protokolls auf der Pulsar-Protokollseite.

Website-Gruppen

GET/api/v1/groups Ihre Site-Gruppen und deren Mitglieder — die Gruppen-IDs, die /api/v1/stats?group=… verwendet, ohne das Dashboard zu scrapen.
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"} ] } ] }

Nur lesen; Gruppen werden bearbeitet in Meine Site-Gruppen. Umfang groups.

Promotion-Snapshot

GET/api/v1/promotion?site=… Das Promotionsbild einer Ihrer Seiten als JSON: Rankings, Geo, Backlinks, Audit und Ziele — die gleichen Zahlen, die das Promotionszentrum anzeigt.
ParameterBeschreibung
siteSite-ID oder Domain — muss dem Eigentümer des Schlüssels gehören
sectionsummary (default) · rankings · geo · backlinks · audit · goals

Ein Feld, für das die Plattform keine Daten hat, kommt als null zurück — niemals eine Vermutung. Umfang promotion.

Pulsar-Netzwerkdaten

GET/api/v1/pulsar?site=… Verteilte Überwachung für eine von Ihnen besessene Seite, gesammelt von unabhängigen Geräten: Bestätigung pro Monitor aus mehreren Blickwinkeln und Latenz nach Land.
ParameterBeschreibung
sitesite id or domain (required)
reportmonitors (default) · coverage

Jede Zahl ist ein Quorum-Urteil von unabhängigen Geräten; wenn das Netzwerk noch nicht entschieden hat, ist der Wert null anstelle der Meinung eines einzelnen Servers. Über das Netzwerk.

Kommentare

GET/api/v1/comment?key=… Moderierte Kommentare vor Ort für jede Seite, nach URL. Dasselbe, was das Drop-in-Kommentar-Widget verwendet.
GET  /api/v1/comment?key=https://example.com/post
POST /api/v1/comment   key=https://example.com/post&author=Ann&body=Nice+one

Inhalte werden als reiner Text gespeichert (Tags entfernt) — Escape bei der Darstellung. Moderation und das Widget leben in Kommentare.

Bedrohungsintelligenz-Export

GET/api/v1/ti-export Lizenzbewusster Export des Bedrohungsintelligenz-Korpus: nur redistributable-lizenzierte oder von Astrina stammende Zeilen, die jeweils ihre Quelle für die Attribution tragen.

Doppelt gesperrt: ein gültiger Schlüssel UND der Betreiberschalter, der ausgeschaltet ist, bis die kommerziellen Bedingungen vereinbart sind. Restriktiv lizenzierte Feeds sind niemals enthalten, egal welcher Plan.

Holen Sie sich Ihren API-Schlüssel

Was diese Seite beantwortet

  • API-Endpunktreferenz
  • API-Authentifizierung und Kontingente
  • beispiele für API-Anfragen
  • REST JSON API-Dokumentation
  • wie man einen API-Schlüssel erhält
  • was ist die astrina api
  • wie die astrina api funktioniert
  • die astrina api erklärt
  • die astrina api Anleitung
  • wie man mit die astrina api beginnt
  • die astrina api Bewertungen
  • ist die astrina api es wert
  • die astrina api Preisgestaltung
  • die astrina api Alternativen
  • die astrina api für Anfänger
  • warum die astrina api
  • die astrina api — was Sie erhalten