API do Desenvolvedor Astrina
Uma API REST JSON para suas estatísticas de tráfego, avaliações, classificações, inteligência de telefone, 32 utilitários executáveis e login social. Autenticação simples por chave, generoso nível gratuito.
Autenticação e cota
Cada solicitação precisa da sua chave API. Obtenha uma em seu Painel da API. Passe isso em um cabeçalho de solicitação — chaves nunca são aceitas na URL, então não podem vazar para logs de servidor, proxies ou cabeçalhos 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_hereSua cota diária vem com seu plano: Gratuito 100/dia, Pro 5.000/dia, Business 25.000/dia, Business Plus 100.000/dia — atualize seu plano para um limite maior. Cada resposta ecoa sua cota. Erros retornam um campo "erro" com o status correto: 401 (chave inválida), 429 (cota), 400/422 (parâmetros inválidos), 403/404 (não é seu / não encontrado). As respostas são abertas para CORS e noindex.
Uma API REST para publicar, agendar, medir e enviar mensagens em cada rede que você conectar — 18 redes sociais e 6 redes de anúncios, um modelo de autenticação, uma forma de solicitação.
Redes suportadas (18): X (Twitter), Instagram, Facebook, Threads, LinkedIn, TikTok, YouTube, Pinterest, Reddit, Snapchat, Google Business, VK, Odnoklassniki, Telegram, WhatsApp, Discord, Mastodon, Bluesky. Redes de anúncios: Meta Ads, Google Ads, TikTok Ads, LinkedIn Ads, Pinterest Ads, X Ads.
Mesma autenticação de chave que tudo acima (apenas cabeçalho), escopo para social. Conectar canais em seu Painel social. A publicação é assíncrona: /publish retorna o post com cada alvo na fila; o trabalhador entrega dentro de um minuto e um webhook é acionado quando chega.
/api/v1/social/channels Cada rede, suas capacidades e quais você conectou. Chame isso primeiro./api/v1/social/accounts Os canais que você conectou — os ids /publish targets./api/v1/social/publish Publique ou agende uma postagem em um ou mais canais.| Parâmetro | Descrição |
|---|---|
text | Corpo da postagem (obrigatório, a menos que a mídia seja fornecida) |
channels | "todos", ou uma lista de ids de canais de /accounts |
media | Array de {url,type,alt} (opcional) |
scheduled_at | Hora ISO-8601; omita ou passado = publique agora |
idempotency_key | Seu id para a postagem — uma nova tentativa com a mesma chave retorna a primeira, nunca publica em duplicidade |
overrides | Substituições de corpo por canal, indexadas pelo id do canal |
POST /api/v1/social/publish
Authorization: Bearer <your API key>
Content-Type: application/json
{ "text": "We just shipped 🚀", "channels": "all",
"idempotency_key": "launch-42" }
{ "ok": true, "post": {
"id": 1841, "status": "publishing", "text": "We just shipped 🚀",
"targets": [
{ "channel_id": 12, "provider": "telegram", "status": "queued", "url": null },
{ "channel_id": 31, "provider": "mastodon", "status": "queued", "url": null } ] },
"quota": { "used": 3, "limit": 25000 } }/api/v1/social/post Uma postagem e o resultado de entrega de cada alvo (?id=…), ou a lista recente./api/v1/social/analytics Seguidores, impressões, alcance e engajamento — uma série de canais ou um resumo de conta. Capturas, nunca estimativas./api/v1/social/messages Leia um thread de DM ou envie uma mensagem direta em um canal que suporte isso./api/v1/social/comments Comentários capturados em suas postagens publicadas./api/v1/social/ads Liste e crie campanhas publicitárias em seis redes de anúncios./api/v1/social/webhooks Receba notificações quando uma postagem chegar ou um comentário/DM/menção chegar.Eventos: post.published, post.partial, post.failed, comment.received, dm.received, mention.received. Um hook genérico é assinado com X-Astrina-Signature: sha256=hmac(timestamp.body, secret).
Análises
/api/v1/stats Análises de tráfego para um site que você possui.| Parâmetro | Descrição |
|---|---|
site | ID do site ou domínio que você possui (obrigatório) |
period | 24h · 7d (padrão) · 30d · 90d |
report | summary (padrão) · timeseries · pages · sources · countries · devices |
limit | Linhas para relatórios detalhados (1–100, padrão 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 }
}Conversões
/api/v1/conversion Registre uma conversão do seu servidor, para que a receita que nunca toca o navegador ainda seja atribuída.| Parâmetro | Descrição |
|---|---|
site | ID do site ou domínio que você possui (obrigatório) |
kind | lead · qualified · deal · sale · recurring · refund · churn |
value | Valor, na moeda abaixo. Negativo para um reembolso. |
currency | Código de três letras, padrão USD |
uid | ID do visitante do script de rastreamento. Opcional — veja a nota abaixo. |
external_id | Seu próprio ID para o registro, usado para evitar a contagem dupla de uma nova tentativa |
POST /api/v1/conversion
Authorization: Bearer <your API key>
site=example.com&kind=sale&value=249.00¤cy=USD&uid=v_8f3c…&external_id=order-1042
{ "recorded": true, "id": 5512, "kind": "sale" }Uma conversão sem um uid é registrada, não rejeitada: uma venda fechada por telefone ainda é receita. Conta nos totais e é relatada como não atribuída em vez de ser atribuída a um canal que não pode ser rastreado.
Minificar
/api/v1/minify Minifique HTML, CSS ou JS e receba os bytes comprimidos de volta. Executa em nossos servidores (sem tokens de IA); cobrado por solicitação com base no tamanho da entrada.| Parâmetro | Descrição |
|---|---|
kind | html · css · js — obrigatório (via ?kind=, o nome do arquivo enviado ou Content-Type) |
| corpo | A fonte a ser minificada: o corpo da solicitação bruta, um multipart file, ou 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: apenas cabeçalho (X-Api-Key ou Bearer), escopo minify. CSS e JS são minificados com segurança — o espaçamento calc() e JS ASI são preservados; HTML colapsa espaços em branco enquanto mantém <pre>, <textarea>, <script>, <style> e JSON-LD intactos. Acompanhe o uso e as chaves em seu Painel de Minificação.
Originalidade & detecção de IA
/api/v1/originality Inicie uma verificação: exclusividade de texto, texto escrito por IA, exclusividade de imagem ou imagem gerada por IA. Retorna um id de execução imediatamente — o trabalho acontece em um trabalhador.| Parâmetro | Descrição |
|---|---|
kind | text-unique · ai-text · image-unique · ai-image — obrigatório |
text | o texto a ser verificado (módulos de texto) |
url | leia o texto — ou busque a imagem — deste endereço em vez disso |
image | campo de arquivo multipart (módulos de imagem); ou 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: apenas cabeçalho (X-Api-Key ou Bearer), escopo originality. Pro e acima. Uma tarefa custa um número fixo de solicitações de API da sua cota diária — 10 para exclusividade de texto, 5 para texto de IA, 5 para exclusividade de imagem, 3 para imagem de IA — porque uma tarefa é uma dúzia de consultas de índice, uma dúzia de downloads de página ou algumas centenas de avaliações de modelo. Além da cota diária de verificações do seu plano, uma tarefa também custa um preço fixo do seu saldo, e a resposta diz exatamente o que foi cobrado.
/api/v1/originality?run=<id> Consulte uma execução. Enquanto funciona, você recebe o estágio em que está; quando termina, você recebe o relatório completo.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":[…] } }A consulta custa 1 solicitação. Uma verificação de exclusividade de texto normalmente termina em 15–40 segundos; consulte a cada 2–3 segundos. Cada relatório carrega sua confiança e as evidências por trás dele: páginas correspondentes com fragmentos citados, ou as medições que cada sinal produziu. A detecção é probabilística — a API nunca retorna um veredicto sem os números de onde veio.
/api/v1/originality A camada de De-AI, mesma porta: tipo=deai-text reescreve um rascunho para que ele pare de ser lido como escrito por máquina; tipo=deai-image re-codifica uma imagem gerada para que seus pixels se comportem como uma 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 solicitações de API para uma reescrita de texto, 6 para uma recodificação de imagem — uma reescrita pode gastar uma chamada de modelo, e o preço cobre isso. Cada tarefa recebe UMA passagem determinística gratuita e no máximo UMA reescrita de modelo paga: se isso não for suficiente, a resposta diz isso em vez de gastar novamente. Uma tarefa de imagem responde com um link de download (mantido por 72 horas). O reescritor faz edições que um editor defenderia — transições padrão cortadas, ritmo variado, palavras excessivamente usadas substituídas — e reavalia com o mesmo detector. Ele não adiciona erros e não inventa fatos. O re-codificador de imagem recusa arquivos que carregam um manifesto C2PA assinado em vez de removê-los, e escreve um crédito honesto de “ilustração assistida por IA” no que produz.
/api/v1/originality O catálogo: quanto cada verificação custa em solicitações de API e em dinheiro, e quanto da sua cota resta hoje.Avaliações e classificações
/api/v1/reviews Últimas avaliações + classificação agregada para qualquer assunto.| Parâmetro | Descrição |
|---|---|
type | site · phone · email · address · org · shop |
key | O valor do assunto (domínio, número, e-mail, …) |
GET /api/v1/reviews?type=site&key=example.com
{ "type": "site", "subject": "example.com", "rating": 4.3, "count": 87,
"reviews": [{ "author": "Jane", "rating": 5, "body": "…", "date": "2026-07-01" }, …],
"url": "https://astrina.io/reviews/site/example.com/" }/api/v1/rating Resumo compacto de classificações + distribuição de estrelas + URLs incorporadas.| Parâmetro | Descrição |
|---|---|
site | Atalho para um site por domínio |
type + key | Ou qualquer assunto por tipo + chave |
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" }Inteligência de Telefone
/api/v1/phone Operadora, tipo de linha e risco de spam comunitário para um número.| Parâmetro | Descrição |
|---|---|
number | Número de telefone no formato internacional, ex. +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/" }Verificação de lista negra e spam
/api/v1/blacklist Verifique se um telefone, e-mail, domínio ou site está na lista negra de spam / golpe.| Parâmetro | Descrição |
|---|---|
value | O telefone, e-mail, domínio ou URL a ser verificado (tipo detectado automaticamente). |
type | Opcional — forçar um dos 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 } }
Verificação de AML de Cripto
/api/v1/aml Verifique um endereço de carteira de criptomoeda contra listas de sanções e inteligência de ameaças — cadeia detectada automaticamente, pontuação de risco incluída.| Parâmetro | Descrição |
|---|---|
address | O endereço da carteira a ser verificado. Formatos BTC, EVM (0x…), TRON, Solana, TON, LTC, DOGE, XRP, XMR e BCH são reconhecidos; qualquer outra string é pesquisada como está. |
format | Opcional — defina como csv para receber CSV em vez de 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 } }Em massa: POST um array de "endereços" (até 50) para verificar muitos em uma chamada — uma unidade de cota cada.
POST /api/v1/aml
{ "addresses": ["0x…", "bc1…", "T…"] }
{ "results": [ { "address": "0x…", "listed": false, "risk": 0, … } ], "count": 3 }Cada resposta carrega os cabeçalhos X-RateLimit-Limit e X-RateLimit-Remaining. Documentação completa, modelo de risco e painéis ao vivo: astrina.io/aml/
Verificação de vazamento de senha
/api/v1/pwned Verifique se uma senha apareceu em um vazamento de dados — usando k-anonimato, para que a senha nunca saia do cliente.Hash a senha com SHA-1 em seu aplicativo, depois envie apenas os primeiros 5 caracteres hexadecimais desse hash. A API retorna todos os sufixos de hash vazados que compartilham o prefixo; você compara localmente. A senha em texto claro nunca é transmitida.
| Parâmetro | Descrição |
|---|---|
prefix | Primeiros 5 caracteres hexadecimais do hash SHA-1 (recomendado — k-anonimato). Retorna sufixos correspondentes com contagens de vazamento. |
hash | Alternativa: o SHA-1 completo de 40 hexadecimais. Conveniente, mas o hash sai do cliente — prefira o prefixo sempre que possível. |
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 } }Fonte de dados: Have I Been Pwned (Senhas Vazadas). O mesmo modelo de k-anonimato alimenta a ferramenta gratuita do navegador em /password-check/.
Utilitários
Execute nossas utilidades do lado do servidor síncronas pela API — 31 dos 141. Utilidades apenas para navegador e crawls/renders em fila não estão expostas. Cada utilidade tem a mesma forma e retorna o mesmo envelope; os limites de plano e as cotas diárias são idênticos ao site.
GET /api/v1/tool # o catálogo GET /api/v1/tool?name=<key>&value=<input> # execute um (value2 para utilidades de duas entradas) -H "X-Api-Key: ak_your_key_here"
| Parâmetro | Descrição |
|---|---|
name | A chave da utilidade (veja cada bloco abaixo). |
value | A entrada principal — uma URL, domínio, URLs separadas por vírgula/nova linha, ou texto. |
value2 | A segunda entrada, apenas para utilidades que comparam duas coisas. |
Errors: 404 unknown utility · 400 not API-runnable · 403 plan required · 429 daily run cap reached · 422 bad input. Cada um retorna um campo "error".
🔍 SEO (18)
/api/v1/tool?name=site-audit 🔍 Técnico, velocidade e segurança em uma única passagem.GET /api/v1/tool?name=site-audit&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "site-audit",
"ms": 807,
"result": {
"summary": [
{
"label": "Overall",
"value": "93/100",
"state": "ok"
},
{
"label": "SEO",
"value": "90/100",
"state": "ok"
},
{
"label": "Performance",
"value": "90/100",
"state": "ok"
},
"…"
],
"cols": [
"Area",
"What failed",
"What to do"
],
"rows": [
{
"a": "SEO",
"b": "Headings in logical order",
"c": "Nest headings sequentially (H1→H2→H3) without skipping levels.",
"state": "bad"
},
{
"a": "SEO",
"b": "All images have alt",
"c": "Add descriptive alt to every <img> (alt=\"\" only for decorative).",
"state": "bad"
},
{
"a": "SEO",
"b": "Form inputs have labels",
"c": "Pair every input with a <label for> or an aria-label.",
"state": "warn"
},
"…"
],
"notes": []
}
}/api/v1/tool?name=serp-preview 👁️ Como o snippet aparece nos resultados de busca.GET /api/v1/tool?name=serp-preview&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "serp-preview",
"ms": 127,
"result": {
"summary": [
{
"label": "Title length",
"value": "53 chars",
"state": "ok"
},
{
"label": "Description length",
"value": "163 chars",
"state": "warn"
},
{
"label": "Title truncated",
"value": "no",
"state": "ok"
},
"…"
],
"cols": [
"Part",
"Value"
],
"rows": [
{
"a": "Headline shown",
"b": "Every site you look after, in one dashboard — Astrina",
"state": ""
},
{
"a": "Breadcrumb shown",
"b": "astrina.io",
"state": ""
},
{
"a": "Snippet shown",
"b": "Real traffic, daily SEO checks and reviews for your sites and your clients’ sites. One …",
"state": ""
},
"…"
],
"notes": [
"Google cuts on pixel width, not character count, and rewrites titles on roughly a third…"
]
}
}/api/v1/tool?name=og-preview 📣 O cartão exibido quando seu link é compartilhado.GET /api/v1/tool?name=og-preview&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "og-preview",
"ms": 499,
"result": {
"summary": [
{
"label": "og:title",
"value": "set",
"state": "ok"
},
{
"label": "og:description",
"value": "set",
"state": "ok"
},
{
"label": "og:image",
"value": "set",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Card title",
"b": "Every site you look after, in one dashboard — Astrina",
"state": ""
},
{
"a": "Card description",
"b": "Real traffic, daily SEO checks and reviews for your sites and your clients’ sites. One …",
"state": ""
},
{
"a": "Card image",
"b": "https://astrina.io/og.php",
"state": "ok"
},
"…"
],
"notes": [
"Facebook, X and LinkedIn each cache what they scraped. After fixing tags, re-scrape in …"
]
}
}/api/v1/tool?name=schema-validator 🧬 Valida dados estruturados JSON-LD.GET /api/v1/tool?name=schema-validator&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "schema-validator",
"ms": 75,
"result": {
"summary": [
{
"label": "JSON-LD blocks",
"value": "2",
"state": "ok"
},
{
"label": "Types found",
"value": "2",
"state": "ok"
},
{
"label": "Invalid blocks",
"value": "0",
"state": "ok"
},
"…"
],
"cols": [
"Where",
"Type",
"Verdict"
],
"rows": [
{
"a": "block 1",
"b": "Organization",
"c": "required properties present",
"state": "ok"
},
{
"a": "block 2",
"b": "WebSite",
"c": "required properties present",
"state": "ok"
}
],
"notes": [
"Valid markup is not the same as an eligible rich result. Google also applies content po…"
]
}
}/api/v1/tool?name=meta-tags 🏷️ Título, descrição e tags og com comprimentos.GET /api/v1/tool?name=meta-tags&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "meta-tags",
"ms": 164,
"result": {
"summary": [
{
"label": "Title length",
"value": "53",
"state": "ok"
},
{
"label": "Description length",
"value": "163",
"state": "warn"
},
{
"label": "H1 count",
"value": "1",
"state": "ok"
},
"…"
],
"cols": [
"Tag",
"Value",
"Length",
"…"
],
"rows": [
{
"a": "title",
"b": "Every site you look after, in one dashboard — Astrina",
"c": "53",
"d": "Good length.",
"state": "ok"
},
{
"a": "meta description",
"b": "Real traffic, daily SEO checks and reviews for your sites and your clients’ sites. One …",
"c": "163",
"d": "Long — the snippet is cut around 160 characters.",
"state": "warn"
},
{
"a": "canonical",
"b": "https://astrina.io/",
"c": "19",
"d": "Declared.",
"state": "ok"
},
"…"
],
"notes": []
}
}/api/v1/tool?name=keyword-density 📊 Densidade e frequência de palavras na página.GET /api/v1/tool?name=keyword-density&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "keyword-density",
"ms": 93,
"result": {
"summary": [
{
"label": "Words",
"value": "1093",
"state": "ok"
},
{
"label": "Unique words",
"value": "503",
"state": ""
},
{
"label": "Vocabulary richness",
"value": "46.0%",
"state": "ok"
},
"…"
],
"cols": [
"Kind",
"Term",
"Count",
"…"
],
"rows": [
{
"a": "single word",
"b": "one",
"c": "20",
"d": "1.83%",
"e": "title, H1, description",
"state": "ok"
},
{
"a": "single word",
"b": "reviews",
"c": "17",
"d": "1.56%",
"e": "description",
"state": "ok"
},
{
"a": "single word",
"b": "listed",
"c": "15",
"d": "1.37%",
"e": "body only",
"state": ""
},
"…"
],
"notes": [
"Density is a diagnostic, not a target. No search engine has a threshold to hit — this i…"
]
}
}/api/v1/tool?name=redirects ↪️ Segue cadeias 301/302 passo a passo.GET /api/v1/tool?name=redirects&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "redirects",
"ms": 1753,
"result": {
"summary": [
{
"label": "Final status",
"value": "200",
"state": "ok"
},
{
"label": "Redirects followed",
"value": "0",
"state": "ok"
},
{
"label": "Ends at",
"value": "https://astrina.io/",
"state": ""
},
"…"
],
"cols": [
"Address",
"Hop",
"Status",
"…"
],
"rows": [
{
"a": "as entered",
"b": "1",
"c": "200",
"d": "https://astrina.io/",
"e": "— final destination —",
"state": "ok"
},
{
"a": "http://astrina.io/",
"b": "1",
"c": "200",
"d": "http://astrina.io/",
"e": "— final destination —",
"state": "ok"
},
{
"a": "https://astrina.io/",
"b": "1",
"c": "200",
"d": "https://astrina.io/",
"e": "— final destination —",
"state": "ok"
},
"…"
],
"notes": [
"The http, https, www and apex forms of this address do not all end at the same URL. Sea…",
"The page contains JavaScript that changes location. A crawler may or may not follow it,…",
"Every hop above was requested and its answer read; nothing in the chain is guessed from…"
]
}
}/api/v1/tool?name=sitemap 🗺️ Valida o sitemap XML e seu índice.GET /api/v1/tool?name=sitemap&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "sitemap",
"ms": 2646,
"result": {
"summary": [
{
"label": "Type",
"value": "sitemap index",
"state": "ok"
},
{
"label": "URLs found",
"value": "5408",
"state": "ok"
},
{
"label": "Unique URLs",
"value": "5405",
"state": "warn"
},
"…"
],
"cols": [
"Child sitemap",
"Status",
"URLs",
"…"
],
"rows": [
{
"a": "https://astrina.io/sitemap-core.xml",
"b": "200",
"c": "534",
"d": "59.9 KB",
"state": "ok"
},
{
"a": "https://astrina.io/sitemap-blog.xml",
"b": "200",
"c": "42",
"d": "5.2 KB",
"state": "ok"
},
{
"a": "https://astrina.io/sitemap-catalog.xml",
"b": "200",
"c": "61",
"d": "6.9 KB",
"state": "ok"
},
"…"
],
"notes": [
"Started from the sitemap declared in robots.txt: https://astrina.io/sitemap.xml",
"3 URLs appear more than once.",
"7 addresses were fetched, within your plan cap of 25."
]
}
}/api/v1/tool?name=html-validate ✅ Erros estruturais em relação às regras do W3C.GET /api/v1/tool?name=html-validate&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "html-validate",
"ms": 180,
"result": {
"summary": [
{
"label": "Errors",
"value": "8",
"state": "bad"
},
{
"label": "Warnings",
"value": "0",
"state": "ok"
},
{
"label": "Total findings",
"value": "8",
"state": "warn"
},
"…"
],
"cols": [
"Line",
"Level",
"Finding"
],
"rows": [
{
"a": "314",
"b": "error",
"c": "htmlParseEntityRef: expecting ';'",
"state": "bad"
},
{
"a": "513",
"b": "error",
"c": "Unexpected end tag : svg",
"state": "bad"
},
{
"a": "514",
"b": "error",
"c": "Unexpected end tag : svg",
"state": "bad"
},
"…"
],
"notes": [
"420 \"unknown element\" complaints were discarded. The parser behind this check knows the…",
"This is a structural check — parse errors, duplicate ids, obsolete and required element…"
]
}
}/api/v1/tool?name=robots-txt 🤖 Analisa o arquivo e o resolve por crawler.GET /api/v1/tool?name=robots-txt&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "robots-txt",
"ms": 133,
"result": {
"summary": [
{
"label": "robots.txt",
"value": "found",
"state": "ok"
},
{
"label": "Size",
"value": "1.9 KB",
"state": "ok"
},
{
"label": "Groups",
"value": "10",
"state": ""
},
"…"
],
"cols": [
"Crawler",
"This URL",
"Deciding rule",
"…"
],
"rows": [
{
"a": "*",
"b": "allowed",
"c": "Allow: /",
"d": "the * group",
"state": "ok"
},
{
"a": "Googlebot",
"b": "allowed",
"c": "Allow: /",
"d": "the * group",
"state": "ok"
},
{
"a": "Bingbot",
"b": "allowed",
"c": "Allow: /",
"d": "the * group",
"state": "ok"
},
"…"
],
"text": "# As a condition of accessing this website, you agree to abide by the following\n# conte…",
"notes": [
"At least one group carries Disallow: / — that blocks an entire crawler from the whole s…"
]
}
}/api/v1/tool?name=images-seo 🖼️ Texto alternativo, dimensões e formatos.GET /api/v1/tool?name=images-seo&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "images-seo",
"ms": 1910,
"result": {
"summary": [
{
"label": "Images",
"value": "7",
"state": "ok"
},
{
"label": "Missing alt",
"value": "0",
"state": "ok"
},
{
"label": "Decorative (alt=\"\")",
"value": "7",
"state": ""
},
"…"
],
"cols": [
"Image",
"Alt text",
"Size",
"…"
],
"rows": [
{
"a": "https://astrina.io/shot.php?s=1",
"b": "(empty)",
"c": "46.6 KB",
"d": "empty alt (decorative); no width/height — causes layout shift",
"state": "warn"
},
{
"a": "https://astrina.io/shot.php?s=4",
"b": "(empty)",
"c": "75.1 KB",
"d": "empty alt (decorative); no width/height — causes layout shift",
"state": "warn"
},
{
"a": "https://astrina.io/shot.php?s=8",
"b": "(empty)",
"c": "68.1 KB",
"d": "empty alt (decorative); no width/height — causes layout shift",
"state": "warn"
},
"…"
],
"notes": [
"6 images declare no width and height. The browser cannot reserve space, so the page jum…",
"None of the sampled images are WebP or AVIF. Converting usually removes a third of the …",
"Optimizing the sampled images could save roughly 131 KB. Compress or convert them to We…",
"…"
]
}
}/api/v1/tool?name=cms-detect 🧱 Identifica o CMS e a pilha de tecnologia.GET /api/v1/tool?name=cms-detect&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "cms-detect",
"ms": 135,
"result": {
"summary": [
{
"label": "CMS",
"value": "Magento",
"state": "ok"
},
{
"label": "Signals found",
"value": "2",
"state": "ok"
},
{
"label": "Server",
"value": "cloudflare",
"state": ""
},
"…"
],
"cols": [
"Kind",
"Name",
"Evidence",
"…"
],
"rows": [
{
"a": "CMS",
"b": "Magento",
"c": "markup: mage/",
"d": "strong",
"state": "ok"
},
{
"a": "CDN / Edge",
"b": "Cloudflare",
"c": "server: cloudflare",
"d": "strong",
"state": "ok"
}
],
"notes": [
"This reads fingerprints, not an inventory. A strong match is reliable; a weak one is a …"
]
}
}/api/v1/tool?name=readability 📖 Dificuldade do texto e métricas de legibilidade.GET /api/v1/tool?name=readability&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "readability",
"ms": 94,
"result": {
"summary": [
{
"label": "Reading ease",
"value": "47.0 — difficult",
"state": "warn"
},
{
"label": "Grade level",
"value": "12.6",
"state": "warn"
},
{
"label": "Gunning Fog",
"value": "15.5",
"state": "warn"
},
"…"
],
"cols": [
"Measure",
"Value"
],
"rows": [
{
"a": "Formula used",
"b": "Flesch Reading Ease and Flesch–Kincaid grade",
"state": ""
},
{
"a": "Language detected",
"b": "Latin script",
"state": ""
},
{
"a": "Syllables per word",
"b": "1.60",
"state": ""
},
"…"
],
"notes": [
"10 sentences run past 25 words.",
"These formulas count syllables and sentence lengths. They cannot tell whether the writi…"
]
}
}/api/v1/tool?name=hreflang 🌍 Marcação internacional, incluindo links de retorno.GET /api/v1/tool?name=hreflang&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "hreflang",
"ms": 907,
"result": {
"summary": [
{
"label": "hreflang tags",
"value": "4",
"state": "ok"
},
{
"label": "Problems",
"value": "0",
"state": "ok"
},
{
"label": "x-default",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Code",
"URL",
"Links back",
"…"
],
"rows": [
{
"a": "en",
"b": "https://astrina.io/",
"c": "n/a",
"d": "ok",
"state": "ok"
},
{
"a": "ru",
"b": "https://astrina.io/ru/",
"c": "yes",
"d": "ok",
"state": "ok"
},
{
"a": "uk",
"b": "https://astrina.io/uk/",
"c": "yes",
"d": "ok",
"state": "ok"
},
"…"
],
"notes": [
"Return links were checked on 2 alternates."
]
}
}/api/v1/tool?name=links 🔀 Links internos, externos e nofollow.GET /api/v1/tool?name=links&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "links",
"ms": 104,
"result": {
"summary": [
{
"label": "Internal links",
"value": "116",
"state": "ok"
},
{
"label": "External links",
"value": "0",
"state": ""
},
{
"label": "Nofollow",
"value": "0",
"state": ""
},
"…"
],
"cols": [
"Kind",
"Anchor text",
"URL",
"…"
],
"rows": [],
"notes": [
"This lists what the page declares. Whether those targets actually load is the broken-li…"
]
}
}/api/v1/tool?name=canonical 🔗 Qual URL a página declara como original.GET /api/v1/tool?name=canonical&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "canonical",
"ms": 75,
"result": {
"summary": [
{
"label": "Canonical",
"value": "declared",
"state": "ok"
},
{
"label": "Self-referencing",
"value": "yes",
"state": "ok"
},
{
"label": "Declarations found",
"value": "1",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Requested URL",
"b": "https://astrina.io/",
"state": ""
},
{
"a": "URL after redirects",
"b": "https://astrina.io/",
"state": ""
},
{
"a": "Canonical in HTML",
"b": "https://astrina.io/",
"state": ""
},
"…"
],
"notes": []
}
}/api/v1/tool?name=http-status 📋 Códigos HTTP em massa e redirecionamentos.GET /api/v1/tool?name=http-status&value=https%3A%2F%2Fastrina.io%2F%0Ahttps%3A%2F%2Fastrina.io%2Fpricing{
"ok": true,
"utility": "http-status",
"ms": 774,
"result": {
"summary": [
{
"label": "Checked",
"value": "2",
"state": "ok"
},
{
"label": "OK (2xx)",
"value": "2",
"state": "ok"
},
{
"label": "Redirected",
"value": "0",
"state": "ok"
},
"…"
],
"cols": [
"URL",
"Status",
"Hops",
"…"
],
"rows": [
{
"a": "https://astrina.io/",
"b": "200",
"c": "0",
"d": "same URL",
"e": "97 ms",
"state": "ok"
},
{
"a": "https://astrina.io/pricing",
"b": "200",
"c": "0",
"d": "same URL",
"e": "62 ms",
"state": "ok"
}
],
"notes": [
"All 2 addresses were checked, within the cap of 25 for this run."
]
}
}/api/v1/tool?name=favicon ⭐ Todo tamanho e formato que um navegador procura.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."
]
}
}🛡️ Segurança (12)
/api/v1/tool?name=ssl 🔒 Certificado, cadeia e expiração.GET /api/v1/tool?name=ssl&value=astrina.io{
"ok": true,
"utility": "ssl",
"ms": 86,
"result": {
"summary": [
{
"label": "Certificate",
"value": "valid and trusted",
"state": "ok"
},
{
"label": "Days left",
"value": "75",
"state": "ok"
},
{
"label": "Hostname matches",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Common name",
"b": "astrina.io",
"state": ""
},
{
"a": "Subject alternative names",
"b": "astrina.io, *.astrina.io",
"state": ""
},
{
"a": "Issued by",
"b": "WE1",
"state": ""
},
"…"
],
"notes": [
"Read from a live TLS handshake to 172.67.166.83:443 with SNI for astrina.io."
]
}
}/api/v1/tool?name=security-headers 🛡️ HSTS, CSP, opções de quadro, classificados.GET /api/v1/tool?name=security-headers&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "security-headers",
"ms": 94,
"result": {
"summary": [
{
"label": "Grade",
"value": "A",
"state": "ok"
},
{
"label": "Score",
"value": "85/100",
"state": "ok"
},
{
"label": "HSTS",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Header",
"Value",
"Verdict"
],
"rows": [
{
"a": "Strict-Transport-Security",
"b": "max-age=31536000; includeSubDomains",
"c": "Set for 365 days.",
"state": "ok"
},
{
"a": "Content-Security-Policy",
"b": "default-src 'self' https: data:; script-src 'self' 'unsafe-inline' https:; style-src 's…",
"c": "Set. The CSP analyser tool checks whether it actually holds.",
"state": "ok"
},
{
"a": "X-Content-Type-Options",
"b": "nosniff",
"c": "Set correctly.",
"state": "ok"
},
"…"
],
"notes": [
"The grade weighs the headers that change what an attacker can do. It says nothing about…"
]
}
}/api/v1/tool?name=http-headers 📨 Cada cabeçalho de resposta, explicado.GET /api/v1/tool?name=http-headers&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "http-headers",
"ms": 88,
"result": {
"summary": [
{
"label": "Status",
"value": "200",
"state": "ok"
},
{
"label": "Protocol",
"value": "HTTP/2",
"state": "ok"
},
{
"label": "Headers",
"value": "20",
"state": ""
},
"…"
],
"cols": [
"Header",
"Value",
"What it does"
],
"rows": [
{
"a": "alt-svc",
"b": "h3=\":443\"; ma=86400",
"c": "Advertises another protocol for this origin, usually HTTP/3.",
"state": ""
},
{
"a": "cache-control",
"b": "no-store, no-cache, must-revalidate",
"c": "How long, and by whom, this response may be cached.",
"state": ""
},
{
"a": "cf-cache-status",
"b": "DYNAMIC",
"c": "",
"state": ""
},
"…"
],
"text": "alt-svc: h3=\":443\"; ma=86400\ncache-control: no-store, no-cache, must-revalidate\ncf-cach…",
"notes": [
"Our fetcher keeps one value per header name, so if the server sent several Set-Cookie l…"
]
}
}/api/v1/tool?name=csp 🚧 Nomeia as diretrizes que deixam uma brecha.GET /api/v1/tool?name=csp&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "csp",
"ms": 116,
"result": {
"summary": [
{
"label": "Policy",
"value": "enforced",
"state": "ok"
},
{
"label": "Directives",
"value": "7",
"state": ""
},
{
"label": "Serious holes",
"value": "7",
"state": "bad"
},
"…"
],
"cols": [
"Directive",
"Sources",
"Finding"
],
"rows": [
{
"a": "default-src",
"b": "'self' https: data:",
"c": "data: in a script source is a known bypass; https: alone allows every https origin on t…",
"state": "bad"
},
{
"a": "script-src",
"b": "'self' 'unsafe-inline' https:",
"c": "'unsafe-inline' on scripts defeats the policy — this is the exact thing CSP exists to s…",
"state": "bad"
},
{
"a": "style-src",
"b": "'self' 'unsafe-inline'",
"c": "'unsafe-inline' — acceptable for styles, still worth removing",
"state": "warn"
},
"…"
],
"text": "default-src 'self' https: data:; script-src 'self' 'unsafe-inline' https:; style-src 's…",
"notes": [
"Nothing reports violations, so you will not learn what the policy blocked or nearly blo…",
"This reads the policy as written. Whether it fits what the page actually loads can only…"
]
}
}/api/v1/tool?name=dns 🌐 A, AAAA, MX, NS, TXT, SOA e CAA.GET /api/v1/tool?name=dns&value=astrina.io{
"ok": true,
"utility": "dns",
"ms": 507,
"result": {
"summary": [
{
"label": "A",
"value": "2",
"state": "ok"
},
{
"label": "AAAA",
"value": "2",
"state": "ok"
},
{
"label": "MX",
"value": "1",
"state": "ok"
},
"…"
],
"cols": [
"Type",
"Name",
"Value",
"…"
],
"rows": [
{
"a": "A",
"b": "astrina.io",
"c": "104.21.34.236",
"d": "292s",
"e": "",
"state": ""
},
{
"a": "A",
"b": "astrina.io",
"c": "172.67.166.83",
"d": "292s",
"e": "",
"state": ""
},
{
"a": "AAAA",
"b": "astrina.io",
"c": "2606:4700:3037::ac43:a653",
"d": "296s",
"e": "",
"state": ""
},
"…"
],
"notes": [
"No CAA record. Adding one names the certificate authorities allowed to issue for this d…",
"Answered by this server's resolver. A record changed in the last few hours may not have…"
]
}
}/api/v1/tool?name=whois 📜 Registrador, datas e servidores de nomes.GET /api/v1/tool?name=whois&value=astrina.io{
"ok": true,
"utility": "whois",
"ms": 313,
"result": {
"summary": [
{
"label": "Domain",
"value": "astrina.io",
"state": "ok"
},
{
"label": "Registrar",
"value": "NameCheap, Inc.",
"state": ""
},
{
"label": "Expires",
"value": "2027-07-09",
"state": "ok"
},
"…"
],
"cols": [
"Field",
"Value"
],
"rows": [
{
"a": "Expires",
"b": "2027-07-09 15:37 UTC",
"state": ""
},
{
"a": "Registered",
"b": "2026-07-09 15:37 UTC",
"state": ""
},
{
"a": "Last changed",
"b": "2026-07-14 15:37 UTC",
"state": ""
},
"…"
],
"notes": [
"Read from the registry over RDAP, the protocol that replaced WHOIS. Registrant contact …"
]
}
}/api/v1/tool?name=email-auth ✉️ Registros SPF, DKIM e DMARC.GET /api/v1/tool?name=email-auth&value=astrina.io{
"ok": true,
"utility": "email-auth",
"ms": 1954,
"result": {
"summary": [
{
"label": "SPF",
"value": "present",
"state": "ok"
},
{
"label": "DKIM",
"value": "1 selector(s)",
"state": "ok"
},
{
"label": "DMARC",
"value": "p=none",
"state": "warn"
},
"…"
],
"cols": [
"Mechanism",
"Record",
"Finding",
"…"
],
"rows": [
{
"a": "MX",
"b": "mail.astrina.io",
"c": "priority 10",
"d": "",
"state": "ok"
},
{
"a": "SPF",
"b": "v=spf1 a mx ip4:149.202.80.42 ~all",
"c": "Ends in ~all (softfail) with about 2 lookups. Move to -all once you are confident the l…",
"d": "2 lookups",
"state": "ok"
},
{
"a": "DMARC",
"b": "v=DMARC1; p=none; rua=mailto:[email protected]; fo=1",
"c": "p=none — monitoring only. It collects reports and blocks nothing, which is the right pl…",
"d": "100%",
"state": "warn"
},
"…"
],
"notes": [
"Move from p=none to p=quarantine once the reports show your legitimate senders passing.…",
"All of this is read from public DNS. Nothing was sent to your mail servers and no messa…"
]
}
}/api/v1/tool?name=http2 ⚡ Qual protocolo e compressão são usados.GET /api/v1/tool?name=http2&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "http2",
"ms": 122,
"result": {
"summary": [
{
"label": "Protocol",
"value": "HTTP/2",
"state": "ok"
},
{
"label": "Compression",
"value": "Zstandard",
"state": "ok"
},
{
"label": "HTTP/3",
"value": "advertised",
"state": "ok"
},
"…"
],
"cols": [
"Measure",
"Value",
"What it means"
],
"rows": [
{
"a": "Negotiated protocol",
"b": "HTTP/2",
"c": "Multiplexed: many requests share one connection, so head-of-line blocking on the browse…",
"state": "ok"
},
{
"a": "Compression",
"b": "Zstandard",
"c": "Zstandard — fast and compact where the client supports it.",
"state": "ok"
},
{
"a": "Alt-Svc",
"b": "h3=\":443\"; ma=86400",
"c": "HTTP/3 is advertised, so browsers will move to QUIC after the first request.",
"state": "ok"
},
"…"
],
"notes": [
"We ask for every encoding we can accept, so what is reported is what your server chose …"
]
}
}/api/v1/tool?name=ip-info 📍 Geolocalização e rede para um endereço.GET /api/v1/tool?name=ip-info&value=astrina.io{
"ok": true,
"utility": "ip-info",
"ms": 2145,
"result": {
"summary": [
{
"label": "Host",
"value": "astrina.io",
"state": ""
},
{
"label": "Addresses",
"value": "4",
"state": "ok"
},
{
"label": "IPv6",
"value": "yes",
"state": "ok"
},
"…"
],
"cols": [
"Address",
"Family",
"Network",
"…"
],
"rows": [
{
"a": "104.21.34.236",
"b": "IPv4",
"c": "AS13335 — CLOUDFLARENET - Cloudflare, Inc., US",
"d": "104.21.32.0/19",
"e": "US",
"f": "no reverse DNS",
"state": "warn"
},
{
"a": "172.67.166.83",
"b": "IPv4",
"c": "AS13335 — CLOUDFLARENET - Cloudflare, Inc., US",
"d": "172.67.160.0/20",
"e": "US",
"f": "no reverse DNS",
"state": "warn"
},
{
"a": "2606:4700:3035::6815:22ec",
"b": "IPv6",
"c": "AS13335 — CLOUDFLARENET - Cloudflare, Inc., US",
"d": "2606:4700:3035::/48",
"e": "US",
"f": "no reverse DNS",
"state": "warn"
},
"…"
],
"notes": [
"4 addresses answer for this name. That is normal for a CDN or a load balancer.",
"The country shown is the one recorded on the address allocation in the routing registry…",
"No commercial geolocation database was consulted, so there is no city, no coordinate an…"
]
}
}/api/v1/tool?name=ports 🔌 Portas de serviço bem conhecidas, verificadas com segurança.GET /api/v1/tool?name=ports&value=https%3A%2F%2Fexample.com%2F{ "ok": true, "utility": "ports", "ms": 0, "result": { … } }/api/v1/tool?name=cookies 🍪 Cookies e suas bandeiras contra o GDPR.GET /api/v1/tool?name=cookies&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "cookies",
"ms": 103,
"result": {
"summary": [
{
"label": "Cookies in response",
"value": "1",
"state": "ok"
},
{
"label": "Third-party trackers",
"value": "0",
"state": "ok"
},
{
"label": "Consent mechanism",
"value": "detected",
"state": "ok"
},
"…"
],
"cols": [
"Name",
"Value",
"Secure",
"…"
],
"rows": [
{
"a": "astrsess",
"b": "44c774bdb4b0b81bd429e64545acc9a7",
"c": "yes",
"d": "yes",
"e": "lax",
"f": "session",
"g": "flags look right",
"state": "ok"
}
],
"notes": [
"Cookies set later by JavaScript, or after a login, are outside what a single anonymous …"
]
}
}/api/v1/tool?name=cors 🔓 Quais origens seu endpoint permite.GET /api/v1/tool?name=cors&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "cors",
"ms": 884,
"result": {
"summary": [
{
"label": "CORS enabled",
"value": "no",
"state": "ok"
},
{
"label": "Allowed origin",
"value": "same origin only",
"state": "ok"
},
{
"label": "Origin reflection",
"value": "none",
"state": "ok"
},
"…"
],
"cols": [
"Header or probe",
"Value",
"Meaning"
],
"rows": [
{
"a": "Access-Control-Allow-Origin",
"b": "— not sent —",
"c": "No CORS headers on a request that carried no Origin. That is the ordinary case; what ma…",
"state": "ok"
},
{
"a": "Access-Control-Allow-Credentials",
"b": "— not sent —",
"c": "Credentials are not shared.",
"state": "ok"
},
{
"a": "Access-Control-Allow-Methods",
"b": "— not sent —",
"c": "Sent on preflight responses.",
"state": ""
},
"…"
],
"notes": [
"Two forged origins were sent and neither was echoed back, so this endpoint does not bui…",
"This is a GET carrying an Origin header, not a full preflight. An endpoint that answers…"
]
}
}🎨 CSS (1)
/api/v1/tool?name=palette-url 🌐 As cores que um site realmente usa.GET /api/v1/tool?name=palette-url&value=https%3A%2F%2Fastrina.io%2F{
"ok": true,
"utility": "palette-url",
"ms": 578,
"result": {
"summary": [
{
"label": "Distinct colours",
"value": "132",
"state": "warn"
},
{
"label": "Stylesheets read",
"value": "2 / 2",
"state": "ok"
},
{
"label": "CSS custom properties",
"value": "28",
"state": "ok"
},
"…"
],
"cols": [
"Colour",
"RGB",
"Uses",
"…"
],
"rows": [
{
"a": "#ffffff",
"b": "rgb(255, 255, 255)",
"c": "40",
"d": "near-white",
"e": "contrast on white 1.0:1 · on black 21.0:1",
"state": ""
},
{
"a": "#000000",
"b": "rgb(0, 0, 0)",
"c": "27",
"d": "near-black",
"e": "contrast on white 21.0:1 · on black 1.0:1",
"state": ""
},
{
"a": "#5b5bd6",
"b": "rgb(91, 91, 214)",
"c": "20",
"d": "brand or accent",
"e": "contrast on white 5.4:1 · on black 3.9:1",
"state": ""
},
"…"
],
"notes": [
"Over 60 distinct colours. That is usually several palettes layered by different people …",
"Counts are how often a colour appears in the CSS, which is not the same as how much of …"
]
}
}{ } DevOps (1)
/api/v1/tool?name=php-version 🐘 Detecte a versão PHP que um servidor revela.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 com Astrina (Auth API)
Adicione login social ao seu site com uma integração. A Astrina é o intermediário no estilo OAuth2/OIDC; você registra seu site uma vez e reutiliza cada provedor que habilita.
GET /auth/authorize.php | Envie o usuário aqui (adicione &provider=google para pular o seletor). Retorna um código para seu redirect_uri. |
POST /auth/token.php | Troque o código (lado do servidor, com seu segredo do cliente) pela identidade: sub, provedor, e-mail, nome, avatar. |
GET /auth/providers.php | Liste os provedores atualmente habilitados, com URLs de login de deep-link prontas. |
SDK PHP de fácil integração + guia completo: guia de integração · baixar sdk.php
API de otimização de imagem
Comprimir e converter imagens (JPEG, PNG, GIF, WebP, AVIF, SVG) — sem perda ou com perda. Envie um arquivo, uma URL ou base64; receba de volta a imagem otimizada e a economia de tamanho.
POST /api/v1/image | Corpo: image=@file, ou JSON {url} / {data:base64}. Opções: lossy=1|0, format=keep|webp|avif|jpeg|png, quality, resize. Retorna bytes de entrada/saída, saved_percent e uma URL de download. |
GET /api/v1/image?get=… | Busque um resultado otimizado pelo seu token — sem chave necessária, passe a URL diretamente para uma tag de imagem. |
Apenas planos pagos; medido contra sua cota mensal de imagens. Interface web: Otimizador de Imagem
Endpoints que você não chama
Duas famílias existem sob /api/v1 que não são para o seu código, listadas aqui para que esta página seja o mapa completo:
POST /api/v1/social/inbound | O receptor de webhook do provedor (Meta / WhatsApp Cloud API). É chamado PELO provedor, não por você: GET é o handshake de assinatura, POST entrega mensagens. Configure-o em Social. |
/api/v1/node/… | O protocolo do dispositivo Pulsar — registrar, próximo, enviar, heartbeat e amigos — falado pelo agente do nó, não por uma chave de API. Está documentado com o restante do protocolo na Página do protocolo Pulsar. |
Grupos de sites
/api/v1/groups Os grupos do seu site e seus membros — os ids dos grupos que /api/v1/stats?group=… aceita, sem raspar o painel.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"} ] } ] }Somente leitura; grupos são editados em Meus grupos de sites. Escopo groups.
Captura de promoção
/api/v1/promotion?site=… A imagem de promoção de um dos seus sites como JSON: rankings, geo, backlinks, auditoria e metas — os mesmos números que o hub de promoção mostra.| Parâmetro | Descrição |
|---|---|
site | id do site ou domínio — deve pertencer ao proprietário da chave |
section | summary (default) · rankings · geo · backlinks · audit · goals |
Um campo para o qual a plataforma não tem dados retorna nulo — nunca uma suposição. Escopo promotion.
Dados da rede Pulsar
/api/v1/pulsar?site=… Monitoramento distribuído para um site que você possui, coletado por dispositivos independentes: confirmação por monitor de vários pontos de vista e latência por país.| Parâmetro | Descrição |
|---|---|
site | id do site ou domínio (obrigatório) |
report | monitors (default) · coverage |
Cada figura é um veredicto de quórum de dispositivos independentes; quando a rede ainda não decidiu, o valor é nulo em vez da opinião de um único servidor. Sobre a rede.
Comentários
/api/v1/comment?key=… Comentários moderados no site para qualquer página, por URL. O mesmo armazenamento que o widget de comentários utiliza.GET /api/v1/comment?key=https://example.com/post POST /api/v1/comment key=https://example.com/post&author=Ann&body=Nice+one
Corpos são armazenados como texto simples (tags removidas) — escapar na renderização. Moderação e o widget vivem em Comentários.
Exportação de inteligência de ameaças
/api/v1/ti-export Exportação ciente de licença do corpus de inteligência de ameaças: apenas linhas com licença redistribuível ou originadas da Astrina, cada uma carregando sua fonte para atribuição.Duplamente protegido: uma chave válida E o interruptor do operador, que está desligado até que os termos comerciais sejam acordados. Feeds com licença restritiva nunca são incluídos, independentemente do plano.
Obtenha sua chave de API
O que esta página responde
- referência de endpoint da API
- autenticação e cotas da API
- exemplos de requisições da API
- documentação da API REST JSON
- como obter uma chave de API
- o que é a api astrina
- como a api astrina funciona
- a api astrina explicado
- guia de a api astrina
- como começar com a api astrina
- avaliações de a api astrina
- vale a pena a api astrina
- preços de a api astrina
- a api astrina alternativas
- a api astrina para iniciantes
- por que a api astrina
- a api astrina — o que você recebe
API Social