HubNews API
API REST publica, gratuita y sin autenticacion. Integra articulos de tecnologia, categorias y datos de reacciones en tu aplicacion en minutos.
Inicio Rapido
Haz tu primera solicitud ahora mismo. No se requiere clave de API:
curl -s "https://api.hubnews.ai/api/v1/public/articles?locale=en&per_page=3" | python3 -m json.toolURL Base
https://api.hubnews.ai/api/v1/publicLimite de Solicitudes
1.000 solicitudes por hora por IP. Los headers de respuesta incluyen:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Limite total por hora |
| X-RateLimit-Remaining | Solicitudes restantes |
Si alcanzas el limite, espera el reset o contactanos para limites superiores.
Endpoints
/articlesListar Articulos
Devuelve una lista paginada de articulos publicados, ordenados por fecha de publicacion (mas recientes primero).
Parametros
| Name | Type | Description |
|---|---|---|
| locale | string | Idioma (pt, en, es, fr). Por defecto: pt |
| category | string | Filtrar por slug de categoria |
| per_page | integer | Articulos por pagina (1-50). Por defecto: 20 |
| page | integer | Numero de pagina |
Respuesta
{
"data": [
{
"id": 123,
"title": "...",
"slug": "...",
"summary": "...",
"content": "...",
"category": { "name": "...", "slug": "..." },
"source": "TechCrunch",
"source_url": "https://...",
"image_url": "https://...",
"published_at": "2026-02-15T10:00:00+00:00",
"locale": "pt",
"views": 1234,
"reactions": { "like": 10, "dislike": 2 }
}
],
"meta": {
"current_page": 1,
"last_page": 340,
"per_page": 20,
"total": 6800
}
}/articles/{slug}Obtener Articulo
Devuelve un articulo completo por su slug traducido.
Parametros
| Name | Type | Description |
|---|---|---|
| locale | string | Idioma (pt, en, es, fr). Por defecto: pt |
Respuesta
{
"data": {
"id": 123,
"title": "...",
"slug": "...",
"summary": "...",
"content": "<p>Full HTML content...</p>",
"category": { "name": "...", "slug": "..." },
"source": "TechCrunch",
"source_url": "https://...",
"image_url": "https://...",
"published_at": "2026-02-15T10:00:00+00:00",
"locale": "pt",
"views": 1234,
"reactions": { "like": 10, "dislike": 2 }
}
}
// 404
{
"error": "not_found",
"message": "Article not found."
}/categoriesListar Categorias
Devuelve todas las categorias activas con conteo de articulos.
Parametros
| Name | Type | Description |
|---|---|---|
| locale | string | Idioma (pt, en, es, fr). Por defecto: pt |
Respuesta
{
"data": [
{
"id": 1,
"name": "Artificial Intelligence",
"slug": "artificial-intelligence",
"news_count": 3030
},
{
"id": 2,
"name": "Hardware",
"slug": "hardware",
"news_count": 859
},
{
"id": 5,
"name": "Cybersecurity",
"slug": "cybersecurity",
"news_count": 1241
}
]
}Campos del Articulo
| Field | Type | Description |
|---|---|---|
| id | integer | Identificador unico |
| title | string | Titulo del articulo en el idioma solicitado |
| slug | string | Slug del articulo (usado en la URL) |
| summary | string | Resumen corto del articulo |
| content | string | Contenido HTML (truncado en lista, completo en detalle) |
| category | object|null | Objeto con nombre y slug de la categoria |
| source | string|null | Nombre de la fuente original |
| source_url | string | URL de la fuente original |
| image_url | string|null | URL de la imagen de portada |
| published_at | string | Fecha de publicacion en formato ISO 8601 |
| locale | string | Idioma del contenido devuelto |
| views | integer | Numero de visualizaciones |
| reactions | object | Conteo de reacciones (like/dislike) |
Ejemplos de Codigo
cURL
# List latest articles in English
curl "https://api.hubnews.ai/api/v1/public/articles?locale=en&per_page=5"
# Get a specific article
curl "https://api.hubnews.ai/api/v1/public/articles/article-slug-here?locale=pt"
# List categories
curl "https://api.hubnews.ai/api/v1/public/categories?locale=en"
# Filter by category
curl "https://api.hubnews.ai/api/v1/public/articles?locale=pt&category=artificial-intelligence&per_page=10"JavaScript (fetch)
const API_BASE = "https://api.hubnews.ai/api/v1/public";
// List articles
async function getArticles({ locale = "pt", category, page = 1, perPage = 20 } = {}) {
const params = new URLSearchParams({ locale, page: String(page), per_page: String(perPage) });
if (category) params.set("category", category);
const res = await fetch(`${API_BASE}/articles?${params}`);
if (!res.ok) throw new Error(`API error: ${res.status}`);
return res.json(); // { data: Article[], meta: { ... } }
}
// Get single article
async function getArticle(slug, locale = "pt") {
const res = await fetch(`${API_BASE}/articles/${slug}?locale=${locale}`);
if (!res.ok) throw new Error(`API error: ${res.status}`);
return res.json(); // { data: Article }
}
// Get categories
async function getCategories(locale = "pt") {
const res = await fetch(`${API_BASE}/categories?locale=${locale}`);
if (!res.ok) throw new Error(`API error: ${res.status}`);
return res.json(); // { data: Category[] }
}Errores
La API devuelve respuestas JSON estandarizadas para errores:
| Status | Description |
|---|---|
| 404 | Recurso no encontrado |
| 422 | Parametros invalidos |
| 429 | Limite de solicitudes alcanzado |
| 500 | Error interno del servidor |
// 404 example
{
"error": "not_found",
"message": "Article not found."
}
// 422 example (validation)
{
"message": "The locale field must be one of: pt, en, es, fr.",
"errors": { "locale": ["The locale field must be one of: pt, en, es, fr."] }
}
// 429 example
HTTP 429 Too Many Requests
Retry-After: 3600Necesitas limites mas altos?
Si tu proyecto necesita mas de 1.000 solicitudes por hora, contactanos. Podemos ofrecer limites personalizados para socios e integradores.
Contactanos