RSS a JSON
RSS y Atom son dos dialectos de la misma idea, escritos con veinte años de diferencia, y todo consumidor de feeds termina teniendo que lidiar con ambos, más los feeds mal formados de por medio. Este endpoint visita la URL de un feed y devuelve sus elementos como JSON plano y predecible, para que su código nunca más tenga que tocar un analizador de XML.
Ejecutar — gratis
Corre en su navegador. Gratis y sin límite: sus datos no salen de esta página.
Una especificación de feed se volvió dos, y luego un enredo
RSS apareció a finales de los años noventa como una forma simple de publicar una lista de actualizaciones, y se bifurcó en versiones que competían entre sí (0.91, 1.0, 2.0) antes de que Atom llegara en 2005 a corregir las ambigüedades de RSS con una especificación más estricta. Ambos siguen usándose a diario: un blog en WordPress emite RSS 2.0 por defecto, mucha herramienta de publicación emite Atom, y un agregador real tiene que aceptar cualquiera de los dos más los innumerables feeds que violan su propia especificación con espacios de nombres faltantes o fechas mal formadas. Escribir ese analizador una sola vez, bien hecho, es un trabajo más grande de lo que parece.
Qué devuelve la llamada
Envíe la URL de un feed por POST a /web/rss-to-json y reciba un task_id de inmediato mientras el feed se descarga y analiza en segundo plano. El JSON terminado normaliza el título, enlace y descripción del feed junto con cada elemento —título, enlace, fecha de publicación, autor y contenido— en una sola estructura plana sin importar si el origen era RSS o Atom, así que el código que lo consume no necesita ramificarse según el dialecto recibido. Los resultados llegan a su webhook o a un enlace firmado válido por 24 horas.
Quién necesita esto en realidad
Una herramienta de boletines que arma un resumen diario a partir de veinte feeds de editores, un panel que muestra las últimas publicaciones del blog de un cliente, o un script de investigación que rastrea con qué frecuencia publica un grupo de medios sobre un tema, todos chocan con el mismo obstáculo: los feeds son XML, y la mayoría de las plataformas modernas prefieren trabajar con JSON antes que analizar XML a mano o cargar una librería pesada solo para esto. Normalizar en el punto de ingreso mantiene simple el resto del flujo.
Cómo encaja en la automatización
Como la tarea es asíncrona y se cobra por solicitud, un planificador puede consultar cien feeds cada hora sin que nadie vigile un cron que de vez en cuando se atora con un documento XML mal formado. Un feed que no devuelve nada analizable simplemente reporta una falla clara en lugar de tumbar un script, y las descargas fallidas nunca se cobran, así que una lista de vigilancia que incluye algunos feeds muertos o mal configurados no desperdicia presupuesto en silencio en los que nunca responden.
Qué puede hacer con ella
Boletín diario de resumen
Extraiga los últimos elementos de una lista de feeds de editores cada mañana y arme un solo paquete JSON para una plantilla de boletín.
Widget de blog de cliente
Descargue el feed RSS de un cliente en un horario fijo para alimentar un widget de 'últimas publicaciones' sin incrustar un analizador XML en vivo en el frontend.
Seguimiento del ritmo de publicación de la competencia
Monitoree con qué frecuencia un grupo de feeds de noticias o de la industria publica elementos nuevos para medir la producción de la competencia a lo largo del tiempo.
Republicación cruzada de podcast y blog
Normalice una mezcla de feeds RSS y Atom de distintas plataformas en una sola forma JSON antes de republicar elementos seleccionados en otro sitio.
Preguntas frecuentes
¿Cómo convierto RSS a JSON con la API?
Envíe la URL del feed por POST a /web/rss-to-json, guarde el task_id devuelto y reciba el JSON analizado por webhook o mediante un enlace firmado válido por 24 horas.
¿Es gratis la API RSS a JSON?
No, no hay plan gratuito ni prueba; cuesta $0.002 por solicitud, y un análisis fallido nunca se cobra.
¿También soporta feeds Atom, o solo RSS?
Sí, tanto RSS (0.91, 1.0, 2.0) como Atom se analizan hacia la misma estructura JSON plana.
¿Qué pasa si la URL del feed es inválida o no responde?
La tarea devuelve un error claro en lugar de un resultado parcial, y como falló, no se cobra.
¿Maneja feeds mal formados o fuera de estándar?
Maneja las irregularidades comunes que se ven en feeds publicados en el mundo real, pero un feed que viola seriamente la especificación de RSS o Atom puede que no se analice de forma limpia.
¿Puedo convertir muchos feeds por lote en un horario fijo?
Sí, envíe una tarea asíncrona por cada URL de feed en el horario que necesite y reciba cada resultado por webhook a medida que termine.
¿Qué campos incluye la salida JSON?
Título, enlace y descripción a nivel de feed, más título, enlace, fecha de publicación, autor y contenido de cada elemento, normalizados igual sin importar el formato de origen.
¿Se guarda el contenido del feed descargado después?
No, los feeds descargados y los datos analizados se eliminan después del período de retención y nunca se usan para entrenamiento.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/web/rss-to-json \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/web/rss-to-json", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/rss-to-json",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/rss-to-json", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/rss-to-json", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"input": "…"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.rss_to_json",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
timeout_sec | 30 |
max_crawl_pages | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |