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.

Restez a la pointe de l'edition

Recevez les dernieres nouveautes, tutoriels et bonnes pratiques dans votre boite mail.

F
Fatplant

Le CMS open-source des redactions de presse en ligne. Du chemin de fer a la publication et au paywall : journaux, magazines et plateformes editoriales, self-hosted et sans vendor lock-in.

Open Source RGPD MIT License
Pourquoi « Fatplant » ?

« Fatplant », c'est « Flat Plan » qui a un peu bougé. Le flat plan — le chemin de fer en jargon de presse — c'est le plan page à page d'un journal avant impression : le squelette de l'édition, la pré-maquette en fil de fer. C'est exactement ce que dessine notre page builder. Un CMS qui part du chemin de fer ne pouvait pas s'appeler autrement. 🌱

© 2026 Fatplant SAS. Tous droits reserves.