HubNews API
API REST publique, gratuite et sans authentification. Integrez des articles tech, des categories et des donnees de reactions dans votre application en quelques minutes.
Demarrage Rapide
Faites votre premiere requete des maintenant. Aucune cle d'API requise :
curl -s "https://api.hubnews.ai/api/v1/public/articles?locale=en&per_page=3" | python3 -m json.toolURL de Base
https://api.hubnews.ai/api/v1/publicLimitation de Debit
1 000 requetes par heure par IP. Les en-tetes de reponse incluent :
| Header | Description |
|---|---|
| X-RateLimit-Limit | Limite totale par heure |
| X-RateLimit-Remaining | Requetes restantes |
Si vous atteignez la limite, attendez le reset ou contactez-nous pour des limites superieures.
Endpoints
/articlesLister les Articles
Retourne une liste paginee d'articles publies, tries par date de publication (les plus recents en premier).
Parametres
| Name | Type | Description |
|---|---|---|
| locale | string | Langue (pt, en, es, fr). Par defaut : pt |
| category | string | Filtrer par slug de categorie |
| per_page | integer | Articles par page (1-50). Par defaut : 20 |
| page | integer | Numero de page |
Reponse
{
"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}Obtenir un Article
Retourne un article complet par son slug traduit.
Parametres
| Name | Type | Description |
|---|---|---|
| locale | string | Langue (pt, en, es, fr). Par defaut : pt |
Reponse
{
"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."
}/categoriesLister les Categories
Retourne toutes les categories actives avec le nombre d'articles.
Parametres
| Name | Type | Description |
|---|---|---|
| locale | string | Langue (pt, en, es, fr). Par defaut : pt |
Reponse
{
"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
}
]
}Champs de l'Article
| Field | Type | Description |
|---|---|---|
| id | integer | Identifiant unique |
| title | string | Titre de l'article dans la langue demandee |
| slug | string | Slug de l'article (utilise dans l'URL) |
| summary | string | Resume court de l'article |
| content | string | Contenu HTML (tronque dans la liste, complet dans le detail) |
| category | object|null | Objet avec nom et slug de la categorie |
| source | string|null | Nom de la source originale |
| source_url | string | URL de la source originale |
| image_url | string|null | URL de l'image de couverture |
| published_at | string | Date de publication au format ISO 8601 |
| locale | string | Langue du contenu retourne |
| views | integer | Nombre de vues |
| reactions | object | Compteurs de reactions (like/dislike) |
Exemples de Code
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[] }
}Erreurs
L'API retourne des reponses JSON standardisees pour les erreurs :
| Status | Description |
|---|---|
| 404 | Ressource non trouvee |
| 422 | Parametres invalides |
| 429 | Limite de debit depassee |
| 500 | Erreur interne du serveur |
// 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: 3600Besoin de limites plus elevees ?
Si votre projet necessite plus de 1 000 requetes par heure, contactez-nous. Nous pouvons offrir des limites personnalisees pour les partenaires et integrateurs.
Contactez-nous