HubNews API
API REST publica, gratuita e sem autenticacao. Integre artigos de tecnologia, categorias e dados de reacoes ao seu aplicativo em minutos.
Quick Start
Faca sua primeira requisicao agora mesmo. Nenhuma chave de API necessaria:
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 Requisicoes
1.000 requisicoes por hora por IP. Os headers de resposta incluem:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Limite total por hora |
| X-RateLimit-Remaining | Requisicoes restantes |
Se atingir o limite, aguarde o reset ou entre em contato para limites superiores.
Endpoints
/articlesListar Artigos
Retorna uma lista paginada de artigos publicados, ordenados por data de publicacao (mais recentes primeiro).
Parametros
| Name | Type | Description |
|---|---|---|
| locale | string | Idioma (pt, en, es, fr). Padrao: pt |
| category | string | Filtrar por slug de categoria |
| per_page | integer | Itens por pagina (1-50). Padrao: 20 |
| page | integer | Numero da pagina |
Resposta
{
"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}Obter Artigo
Retorna um artigo completo pelo slug traduzido.
Parametros
| Name | Type | Description |
|---|---|---|
| locale | string | Idioma (pt, en, es, fr). Padrao: pt |
Resposta
{
"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
Retorna todas as categorias ativas com contagem de artigos.
Parametros
| Name | Type | Description |
|---|---|---|
| locale | string | Idioma (pt, en, es, fr). Padrao: pt |
Resposta
{
"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 do Artigo
| Field | Type | Description |
|---|---|---|
| id | integer | Identificador unico |
| title | string | Titulo do artigo no idioma solicitado |
| slug | string | Slug do artigo (usado na URL) |
| summary | string | Resumo curto do artigo |
| content | string | Conteudo HTML (truncado na listagem, completo no detalhe) |
| category | object|null | Objeto com nome e slug da categoria |
| source | string|null | Nome da fonte original |
| source_url | string | URL da fonte original |
| image_url | string|null | URL da imagem de capa |
| published_at | string | Data de publicacao em formato ISO 8601 |
| locale | string | Idioma do conteudo retornado |
| views | integer | Numero de visualizacoes |
| reactions | object | Contagem de reacoes (like/dislike) |
Exemplos 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[] }
}Erros
A API retorna respostas JSON padronizadas para erros:
| Status | Description |
|---|---|
| 404 | Recurso nao encontrado |
| 422 | Parametros invalidos |
| 429 | Limite de requisicoes atingido |
| 500 | Erro interno do 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: 3600Precisa de limites maiores?
Se seu projeto necessita de mais de 1.000 requisicoes por hora, entre em contato. Podemos oferecer limites personalizados para parceiros e integradores.
Fale Conosco