API
Présentation
Fatplant expose une API RESTful construite avec API Platform sur le standard JSON:API. L’API est divisée en deux parties :
- API publique (
/api/public/*) : accessible sans authentification, expose uniquement le contenu publié. - API privée (
/api/*) : requiert un token JWT, expose toutes les ressources (brouillons, médias, utilisateurs, configuration).
Documentation interactive
Une documentation interactive (Swagger UI) est disponible à l’adresse :
https://api.monmedia.fr/api/docs Elle liste tous les endpoints, leurs paramètres et permet de les tester directement depuis le navigateur.
Authentification JWT
Les endpoints privés requièrent un token JWT dans l’en-tête Authorization :
# Obtenir un token
curl -X POST https://api.monmedia.fr/api/login
-H "Content-Type: application/json"
-d '{"email": "admin@monmedia.fr", "password": "VotreMotDePasse"}' Réponse :
{
"token": "eyJhbGciOiJSUzI1NiJ9...",
"refresh_token": "def50200..."
} Utilisez ce token dans les requêtes suivantes :
curl https://api.monmedia.fr/api/articles
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9..." API publique
Articles
# Liste des articles publiés (pagination incluse)
GET /api/public/articles
# Filtrer par catégorie
GET /api/public/articles?categories.slug=politique
# Filtrer par tag
GET /api/public/articles?tags.slug=election
# Trier par date décroissante (par défaut)
GET /api/public/articles?order[publishedAt]=desc
# Un article par slug
GET /api/public/articles?slug=mon-article-slug Exemple de réponse :
{
"@context": "/api/contexts/Article",
"@id": "/api/public/articles",
"@type": "hydra:Collection",
"hydra:totalItems": 42,
"hydra:member": [
{
"@id": "/api/public/articles/1",
"title": "Mon premier article",
"slug": "mon-premier-article",
"excerpt": "Un court résumé de l'article.",
"publishedAt": "2026-03-15T10:00:00+00:00",
"author": { "name": "Claire Maublanc" },
"categories": [{ "title": "Politique", "slug": "politique" }],
"seo": {
"metaTitle": "Mon premier article - Mon Média",
"metaDescription": "Un court résumé de l'article."
}
}
]
} Dossiers
GET /api/public/dossiers
GET /api/public/dossiers?slug=mon-dossier Pages
GET /api/public/pages?slug=a-propos Catégories et Tags
GET /api/public/categories
GET /api/public/tags Médias
# Un média par ID
GET /api/public/media/42 Pagination
Tous les endpoints de collection supportent la pagination :
# Page 2, 20 éléments par page
GET /api/public/articles?page=2&itemsPerPage=20 La réponse inclut les liens de navigation :
{
"hydra:view": {
"@id": "/api/public/articles?page=2",
"hydra:first": "/api/public/articles?page=1",
"hydra:last": "/api/public/articles?page=5",
"hydra:previous": "/api/public/articles?page=1",
"hydra:next": "/api/public/articles?page=3"
}
} Exemples complets avec curl
Récupérer les 5 derniers articles de la catégorie “Sport”
curl "https://api.monmedia.fr/api/public/articles?categories.slug=sport&order[publishedAt]=desc&itemsPerPage=5"
-H "Accept: application/ld+json" Récupérer le contenu du page builder d’une page
curl "https://api.monmedia.fr/api/public/pages?slug=accueil"
-H "Accept: application/ld+json" Le champ content contient le document JSON du page builder (voir Page builder).
Intégration avec le frontend SSR
Le frontend SvelteKit SSR consomme l’API publique dans les fonctions load :
// src/routes/articles/[slug]/+page.server.ts
export async function load({ params, fetch }) {
const res = await fetch(
`${process.env.API_URL}/api/public/articles?slug=${params.slug}`
);
const data = await res.json();
const article = data['hydra:member'][0];
if (!article) throw error(404, 'Article non trouvé');
return { article };
} Limites de taux
En production, l’API applique une limite de taux de 1 000 requêtes par minute par adresse IP. Cette valeur est configurable dans la configuration Symfony via le composant Rate Limiter.