API para desarrolladores de Astrina
Una API REST JSON para tus estadísticas de tráfico, reseñas, calificaciones, inteligencia telefónica, 32 utilidades ejecutables y inicio de sesión social. Autenticación de clave simple, generoso nivel gratuito.
Autenticación y cuota
Cada solicitud necesita tu clave API. Consigue una en tu Panel de control de API. Pásalo en un encabezado de solicitud — las claves nunca se aceptan en la URL, por lo que no pueden filtrarse en los registros del servidor, proxies o encabezados 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_hereTu cuota diaria viene con tu plan: Gratis 100/día, Pro 5,000/día, Business 25,000/día, Business Plus 100,000/día — actualiza tu plan para un límite más alto. Cada respuesta refleja tu cuota. Los errores devuelven un campo "error" con el estado correcto: 401 (clave incorrecta), 429 (cuota), 400/422 (parámetros incorrectos), 403/404 (no tuyo / no encontrado). Las respuestas son CORS-abiertas y noindex.
Una API REST para publicar, programar, medir y enviar mensajes a través de cada red que conectes — 18 redes sociales y 6 redes publicitarias, un modelo de autenticación, una forma de solicitud.
Redes soportadas (18): X (Twitter), Instagram, Facebook, Threads, LinkedIn, TikTok, YouTube, Pinterest, Reddit, Snapchat, Google Business, VK, Odnoklassniki, Telegram, WhatsApp, Discord, Mastodon, Bluesky. Redes publicitarias: Meta Ads, Google Ads, TikTok Ads, LinkedIn Ads, Pinterest Ads, X Ads.
La misma autenticación de clave que todo lo anterior (solo encabezado), limitado a social. Conectar canales en tu Tablero social. La publicación es asíncrona: /publish devuelve la publicación con cada objetivo en cola; el trabajador entrega dentro del minuto y se activa un webhook cuando llega.
/api/v1/social/channels Cada red, sus capacidades y cuáles has conectado. Llama a esto primero./api/v1/social/accounts Los canales que has conectado — los ids /publish targets./api/v1/social/publish Publica o programa una publicación en uno o varios canales.| Parámetro | Descripción |
|---|---|
text | Cuerpo de la publicación (requerido a menos que se proporcione un medio) |
channels | "todos", o una lista de ids de canal de /accounts |
media | Array de {url,type,alt} (opcional) |
scheduled_at | Hora ISO-8601; omitir o pasado = publicar ahora |
idempotency_key | Tu id para la publicación — un reintento con la misma clave devuelve la primera, nunca publica dos veces. |
overrides | Sobrescrituras del cuerpo por canal, indexadas por id de 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 Una publicación y el resultado de entrega de cada objetivo (?id=…), o la lista reciente./api/v1/social/analytics Seguidores, impresiones, alcance y compromiso — una serie de canales o un resumen de cuenta. Instantáneas, nunca estimaciones./api/v1/social/messages Lee un hilo de DM, o envía un mensaje directo en un canal que lo soporte./api/v1/social/comments Comentarios capturados en tus publicaciones publicadas./api/v1/social/ads Lista y crea campañas publicitarias en las seis redes de anuncios./api/v1/social/webhooks Recibe notificaciones cuando una publicación se publique o llegue un comentario/DM/mención.Eventos: post.published, post.partial, post.failed, comment.received, dm.received, mention.received. Un gancho genérico está firmado con X-Astrina-Signature: sha256=hmac(timestamp.body, secret).
Análisis
/api/v1/stats Análisis de tráfico para un sitio que posees.| Parámetro | Descripción |
|---|---|
site | ID del sitio o dominio que posees (requerido) |
period | 24h · 7d (predeterminado) · 30d · 90d |
report | summary (predeterminado) · timeseries · pages · sources · countries · devices |
limit | Filas para informes desglosados (1–100, predeterminado 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 }
}Conversiones
/api/v1/conversion Registra una conversión desde tu servidor, para que los ingresos que nunca tocan el navegador aún sean atribuidos.| Parámetro | Descripción |
|---|---|
site | ID del sitio o dominio que posees (requerido) |
kind | lead · qualified · deal · sale · recurring · refund · churn |
value | Cantidad, en la moneda a continuación. Negativo para un reembolso. |
currency | Código de tres letras, USD por defecto |
uid | ID de visitante del script de seguimiento. Opcional — vea la nota a continuación. |
external_id | Su propio ID para el registro, utilizado para evitar contar dos veces un reintento |
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" }Una conversión sin un uid se registra, no se rechaza: una venta cerrada por teléfono sigue siendo ingresos. Cuenta en los totales y se informa como no atribuido en lugar de ser asignado a un canal que no se puede rastrear.
Minificar
/api/v1/minify Minifica HTML, CSS o JS y recibe los bytes comprimidos. Se ejecuta en nuestros servidores (sin tokens de IA); se factura por solicitud según el tamaño de entrada.| Parámetro | Descripción |
|---|---|
kind | html · css · js — requerido (a través de ?kind=, el nombre del archivo subido, o Content-Type) |
| cuerpo | La fuente a minificar: el cuerpo de la solicitud en bruto, un multipart file, o 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}" }Autenticación: solo encabezado (X-Api-Key o Bearer), alcance minify. CSS y JS se minifican de forma segura — el espaciado calc() y JS ASI se preservan; HTML colapsa los espacios en blanco mientras mantiene <pre>, <textarea>, <script>, <style> y JSON-LD intactos. Realiza un seguimiento del uso y las claves en tu Panel de minificación.
Originalidad & detección de IA
/api/v1/originality Inicia una verificación: unicidad de texto, texto escrito por IA, unicidad de imagen o imagen generada por IA. Devuelve un id de ejecución inmediatamente — el trabajo ocurre en un trabajador.| Parámetro | Descripción |
|---|---|
kind | text-unique · ai-text · image-unique · ai-image — requerido |
text | el texto a verificar (módulos de texto) |
url | lee el texto — o recupera la imagen — de esta dirección en su lugar |
image | campo de archivo multipart (módulos de imagen); o 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 }Autenticación: solo encabezado (X-Api-Key o Bearer), alcance originality. Pro y superior. Una tarea cuesta un número fijo de solicitudes API de tu cuota diaria — 10 para unicidad de texto, 5 para texto de IA, 5 para unicidad de imagen, 3 para imagen de IA — porque una tarea es una docena de consultas de índice, una docena de descargas de página o unos pocos cientos de evaluaciones de modelo. Más allá de la asignación diaria de verificaciones de tu plan, una tarea también cuesta un precio fijo de tu saldo, y la respuesta dice exactamente lo que se cobró.
/api/v1/originality?run=<id> Consulta una ejecución. Mientras funciona, obtienes la etapa en la que se encuentra; cuando termina, obtienes el informe 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":[…] } }La consulta cuesta 1 solicitud. Un pase de unicidad de texto generalmente termina en 15–40 segundos; consulta cada 2–3 segundos. Cada informe lleva su confianza y la evidencia detrás de él: páginas coincidentes con fragmentos citados, o las mediciones que cada señal produjo. La detección es probabilística — la API nunca devuelve un veredicto sin los números de los que provino.
/api/v1/originality La capa de De-AI, misma puerta: kind=deai-text reescribe un borrador para que deje de leerse como escrito por una máquina; kind=deai-image re-codifica una imagen generada para que sus píxeles se comporten como una fotografía.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 solicitudes de API para una reescritura de texto, 6 para una recodificación de imagen — una reescritura puede gastar una llamada de modelo, y el precio lo cubre. Cada tarea recibe UN pase determinista gratuito y como máximo UNA reescritura de modelo pagada: si eso no es suficiente, la respuesta lo dice en lugar de gastar nuevamente. Una tarea de imagen responde con un enlace de descarga (guardado por 72 horas). El reescritor hace ediciones que un editor defendería: transiciones estándar eliminadas, ritmo variado, palabras sobreutilizadas reemplazadas, y vuelve a medir con el mismo detector. No añade errores y no inventa hechos. El recodificador de imágenes rechaza archivos que llevan un manifiesto C2PA firmado en lugar de eliminarlos, y escribe un crédito honesto de “ilustración asistida por IA” en lo que produce.
/api/v1/originality El catálogo: lo que cuesta cada verificación en solicitudes API y en dinero, y cuánto de tu asignación queda hoy.Reseñas y calificaciones
/api/v1/reviews Últimas reseñas + calificación agregada para cualquier tema.| Parámetro | Descripción |
|---|---|
type | site · phone · email · address · org · shop |
key | El valor del tema (dominio, número, correo electrónico, …) |
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 Resumen de calificaciones compacto + distribución de estrellas + URLs incrustadas.| Parámetro | Descripción |
|---|---|
site | Acceso directo a un sitio web por dominio |
type + key | O cualquier tema por tipo + clave |
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" }Inteligencia telefónica
/api/v1/phone Operador, tipo de línea y riesgo de spam comunitario para un número.| Parámetro | Descripción |
|---|---|
number | Número de teléfono en formato internacional, p. ej. +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/" }Verificación de lista negra y spam
/api/v1/blacklist Verificar si un teléfono, correo electrónico, dominio o sitio está en la lista negra de spam / estafa.| Parámetro | Descripción |
|---|---|
value | El teléfono, correo electrónico, dominio o URL a verificar (tipo detectado automáticamente). |
type | Opcional — forzar uno de 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 } }
Verificación de AML de criptomonedas
/api/v1/aml Verifica una dirección de billetera de criptomonedas contra listas de sanciones e inteligencia de amenazas — cadena autodetectada, puntaje de riesgo incluido.| Parámetro | Descripción |
|---|---|
address | La dirección de la billetera a verificar. Se reconocen las formas BTC, EVM (0x…), TRON, Solana, TON, LTC, DOGE, XRP, XMR y BCH; cualquier otra cadena se busca tal cual. |
format | Opcional — establece en csv para recibir CSV en lugar 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 } }Por lotes: envía un array de "direcciones" (hasta 50) para revisar muchas en una sola llamada — una unidad de cuota cada una.
POST /api/v1/aml
{ "addresses": ["0x…", "bc1…", "T…"] }
{ "results": [ { "address": "0x…", "listed": false, "risk": 0, … } ], "count": 3 }Cada respuesta lleva los encabezados X-RateLimit-Limit y X-RateLimit-Remaining. Documentación completa, modelo de riesgo y tableros en vivo: astrina.io/aml/
Verificación de filtraciones de contraseñas
/api/v1/pwned Verifica si una contraseña ha aparecido en una violación de datos — utilizando k-anonimato, para que la contraseña nunca salga del cliente.Hashea la contraseña con SHA-1 en tu aplicación, luego envía solo los primeros 5 caracteres hexadecimales de ese hash. La API devuelve cada sufijo de hash comprometido que comparte el prefijo; tú comparas localmente. La contraseña en texto plano nunca se transmite.
| Parámetro | Descripción |
|---|---|
prefix | Primeros 5 caracteres hexadecimales del hash SHA-1 (recomendado — k-anonimato). Devuelve sufijos coincidentes con conteos de violaciones. |
hash | Alternativa: el SHA-1 completo de 40 hexadecimales. Conveniente, pero el hash sale del cliente — prefiere el prefijo cuando sea posible. |
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 } }Fuente de datos: Have I Been Pwned (Contraseñas filtradas). El mismo modelo de k-anonimato impulsa la herramienta gratuita del navegador en /password-check/.
Utilidades
Ejecuta nuestras utilidades del lado del servidor sincrónicas a través de la API — 31 de las 141. Las utilidades solo para navegador y los rastreos/renderizados en cola no están expuestos. Cada utilidad tiene la misma forma y devuelve el mismo sobre; las puertas del plan y los límites diarios de ejecución son idénticos al sitio web.
GET /api/v1/tool # el catálogo GET /api/v1/tool?name=<key>&value=<input> # ejecutar uno (value2 para utilidades de dos entradas) -H "X-Api-Key: ak_your_key_here"
| Parámetro | Descripción |
|---|---|
name | La clave de utilidad (ver cada bloque a continuación). |
value | La entrada principal — una URL, dominio, URLs separadas por comas/nuevas líneas, o texto. |
value2 | La segunda entrada, solo para utilidades que comparan dos cosas. |
Errores: 404 utilidad desconocida · 400 no ejecutable por API · 403 se requiere plan · 429 se alcanzó el límite diario de ejecuciones · 422 entrada incorrecta. Cada uno devuelve un campo "error".
🔍 SEO (18)
/api/v1/tool?name=site-audit 🔍 Técnico, velocidad y seguridad en una sola pasada.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 👁️ Cómo se ve el fragmento en los resultados de búsqueda.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 📣 La tarjeta que se muestra cuando se comparte tu enlace.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 datos estructurados 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, descripción y etiquetas og con longitudes.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 📊 Densidad y frecuencia de palabras en la 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 ↪️ Sigue las cadenas 301/302 salto a salto.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 el mapa del sitio XML y su í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 ✅ Errores estructurales contra las reglas de 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 🤖 Analiza el archivo y lo resuelve por rastreador.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, dimensiones y 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 el CMS y la pila tecnológica.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 📖 Dificultad del texto y métricas de legibilidad.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 🌍 Marcado internacional, incluidos los enlaces 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 🔀 Enlaces internos, externos y 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 🔗 Qué URL declara la página 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 masivos y redirecciones.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 ⭐ Cada tamaño y formato que busca un navegador.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."
]
}
}🛡️ Seguridad (12)
/api/v1/tool?name=ssl 🔒 Certificado, cadena y expiración.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, opciones de marco, clasificados.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 encabezado de respuesta, 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 🚧 Nombra las directivas que dejan un agujero.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 y 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, fechas y servidores de nombres.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 y 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 ⚡ Qué protocolo y compresión se utiliza.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 📍 Geolocalización y red para una dirección.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 🔌 Puertos de servicio bien conocidos, verificados de forma segura.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 y sus banderas contra el 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 🔓 Qué orígenes permite tu punto final.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 🌐 Los colores que un sitio realmente utiliza.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 🐘 Detecta la versión de PHP que revela un servidor.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…"
]
}
}Iniciar sesión con Astrina (API de autenticación)
Agrega inicio de sesión social a tu sitio con una integración. Astrina es el intermediario de estilo OAuth2/OIDC; registras tu sitio una vez y reutilizas cada proveedor que habilitas.
GET /auth/authorize.php | Envía al usuario aquí (agregar &provider=google para omitir el selector). Devuelve un código a tu redirect_uri. |
POST /auth/token.php | Intercambia el código (del lado del servidor, con tu secreto de cliente) por la identidad: sub, proveedor, correo electrónico, nombre, avatar. |
GET /auth/providers.php | Lista los proveedores actualmente habilitados, con URLs de inicio de sesión de enlace profundo listas. |
SDK de PHP para integración + guía completa: guía de integración · descargar sdk.php
API de optimización de imágenes
Comprimir y convertir imágenes (JPEG, PNG, GIF, WebP, AVIF, SVG) — sin pérdida o con pérdida. Envía un archivo, una URL o base64; recibe de vuelta la imagen optimizada y su ahorro de tamaño.
POST /api/v1/image | Cuerpo: image=@file, o JSON {url} / {data:base64}. Opciones: lossy=1|0, format=keep|webp|avif|jpeg|png, quality, resize. Devuelve bytes de entrada/salida, saved_percent y una URL de descarga. |
GET /api/v1/image?get=… | Obtén un resultado optimizado por su token — no se necesita clave, entrega la URL directamente a una etiqueta de imagen. |
Planes de pago solamente; medido contra tu cuota mensual de imágenes. Interfaz web: Optimizador de imágenes
Puntos finales que no llamas
Existen dos familias bajo /api/v1 que no son para tu código, listadas aquí para que esta página sea el mapa completo:
POST /api/v1/social/inbound | El receptor de webhook del proveedor (Meta / WhatsApp Cloud API). Es llamado POR el proveedor, no por ti: GET es el apretón de manos de suscripción, POST entrega mensajes. Configúralo en Social. |
/api/v1/node/… | El protocolo del dispositivo Pulsar — registrar, siguiente, enviar, latido y amigos — hablado por el agente del nodo, no por una clave API. Está documentado con el resto del protocolo en el Página del protocolo Pulsar. |
Grupos de sitios
/api/v1/groups Los grupos de tu sitio y sus miembros — los ids de grupo que /api/v1/stats?group=… toma, sin raspar el panel de control.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"} ] } ] }Solo lectura; los grupos se editan en Mis grupos de sitios. Alcance groups.
Instantánea de promoción
/api/v1/promotion?site=… La imagen de promoción de uno de tus sitios como JSON: rankings, geo, backlinks, auditoría y objetivos — los mismos números que muestra el centro de promoción.| Parámetro | Descripción |
|---|---|
site | id del sitio o dominio — debe pertenecer al propietario de la clave |
section | summary (default) · rankings · geo · backlinks · audit · goals |
Un campo para el cual la plataforma no tiene datos regresa nulo — nunca una suposición. Alcance promotion.
Datos de la red Pulsar
/api/v1/pulsar?site=… Monitoreo distribuido para un sitio que posees, recopilado por dispositivos independientes: confirmación por monitor desde varios puntos de vista y latencia por país.| Parámetro | Descripción |
|---|---|
site | id del sitio o dominio (requerido) |
report | monitors (default) · coverage |
Cada cifra es un veredicto de quórum de dispositivos independientes; cuando la red aún no ha decidido, el valor es nulo en lugar de la opinión de un solo servidor. Acerca de la red.
Comentarios
/api/v1/comment?key=… Comentarios moderados en el sitio para cualquier página, por URL. La misma tienda que utiliza el widget de comentarios emergentes.GET /api/v1/comment?key=https://example.com/post POST /api/v1/comment key=https://example.com/post&author=Ann&body=Nice+one
Los cuerpos se almacenan como texto plano (etiquetas eliminadas) — escapar al renderizar. La moderación y el widget viven en Comentarios.
Exportación de inteligencia de amenazas
/api/v1/ti-export Exportación consciente de licencias del corpus de inteligencia de amenazas: solo filas con licencia redistribuible o de origen Astrina, cada una con su fuente para atribución.Doble puerta: una clave válida Y el interruptor del operador, que está apagado hasta que se acuerden los términos comerciales. Los feeds con licencia restrictiva nunca se incluyen, sea cual sea el plan.
Obtén tu clave API
Lo que esta página responde
- referencia de punto final de API
- autenticación y cuotas de API
- ejemplos de solicitudes de API
- documentación de API REST JSON
- cómo obtener una clave de API
- qué es la api de astrina
- cómo la api de astrina funciona
- la api de astrina explicado
- guía de la api de astrina
- cómo empezar con la api de astrina
- reseñas de la api de astrina
- vale la pena la api de astrina
- precios de la api de astrina
- la api de astrina alternativas
- la api de astrina para principiantes
- por qué la api de astrina
- la api de astrina — lo que obtienes
API Social