Dernière mise à jour : 2026-09-10 21:20
Payload CMS et webhooks
auto-post.io peut publier les articles générés vers un projet Payload CMS via son API REST. Cette page présente aussi les destinations webhook pour les workflows qui nécessitent une étape de livraison personnalisée.
Intégration Payload CMS
Pré-requis
Préparez les éléments suivants :
- L’URL publique de base de l’API REST Payload
- Un compte Payload pouvant accéder aux collections configurées
- Le slug de la collection d’authentification, généralement
users - Le slug de la collection d’articles
- Les slugs facultatifs des collections de catégories et de médias
Connecter Payload CMS
- Ouvrez la page Sites, puis choisissez Ajouter un site.
- Sélectionnez Payload CMS comme plateforme.
- Saisissez le nom et l’URL publique du site.
- Saisissez l’URL de l’API Payload, l’adresse e-mail, le mot de passe, le slug de la collection d’authentification et celui de la collection d’articles.
- Ajoutez les slugs des collections de catégories et de médias si votre projet les utilise.
- Sélectionnez Continuer. auto-post.io se connecte, lit un article d’exemple et propose un mapping des champs.
- Vérifiez le mapping proposé, puis validez la connexion.
La connexion conserve les informations nécessaires pour obtenir un JWT Payload. Les jetons sont renouvelés ou recréés lorsque cela est nécessaire.
Mapping des champs
Le mapping relie les champs auto-post.io aux champs de la collection d’articles Payload :
- Titre
- Slug
- Contenu
- Date de publication
- Catégories
- Image mise en avant
- Image Open Graph
- Titre, description et mots-clés SEO
- URL publique de l’article
Les champs imbriqués sont pris en charge avec des chemins à points comme seo.title. Utilisez la suggestion IA comme point de départ, puis vérifiez chaque champ avant l’enregistrement.
Le contenu rich text Payload est envoyé au format JSON Lexical par défaut. Choisissez le format HTML uniquement si votre collection attend du HTML.
Collections et endpoints Payload
L’exemple suivant montre la structure minimale attendue par l’intégration. Les noms de champs peuvent être différents si vous configurez le mapping correspondant dans auto-post.io.
// payload/collections/Posts.js
import { lexicalEditor } from '@payloadcms/richtext-lexical';
export const Posts = {
slug: 'posts',
access: {
create: ({ req }) => Boolean(req.user),
read: () => true,
update: ({ req }) => Boolean(req.user),
},
fields: [
{ name: 'title', type: 'text', required: true },
{ name: 'slug', type: 'text', required: true, unique: true },
{ name: 'content', type: 'richText', editor: lexicalEditor() },
{ name: 'publishedAt', type: 'date' },
{ name: 'categories', type: 'relationship', relationTo: 'categories', hasMany: true },
{ name: 'featuredImage', type: 'upload', relationTo: 'media' },
],
};auto-post.io utilise les endpoints REST Payload suivants. Remplacez https://cms.example.com/api et les slugs des collections par vos valeurs :
# Login and receive a JWT
curl -X POST "https://cms.example.com/api/users/login" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"YOUR_PASSWORD"}'
# Create a post
curl -X POST "https://cms.example.com/api/posts" \
-H "Authorization: JWT YOUR_JWT" \
-H "Content-Type: application/json" \
-d '{"title":"A generated article","slug":"a-generated-article","content":{"root":{"type":"root","children":[],"direction":null,"format":"","indent":0,"version":1}},"_status":"draft"}'
# Update an existing post
curl -X PATCH "https://cms.example.com/api/posts/123" \
-H "Authorization: JWT YOUR_JWT" \
-H "Content-Type: application/json" \
-d '{"title":"An updated article","_status":"published"}'Pour les images mises en avant, configurez une collection de médias et vérifiez que son champ d’upload accepte le champ multipart configuré dans auto-post.io, file par défaut :
curl -X POST "https://cms.example.com/api/media" \
-H "Authorization: JWT YOUR_JWT" \
-F "[email protected]"Fonctionnement de la publication
Lorsqu’une campagne génère un article pour un site Payload :
- Le contenu brouillon est envoyé avec
_statusdéfini surdraft. - Le contenu publié est envoyé avec
_statusdéfini surpublished. - Les documents Payload existants sont mis à jour au lieu d’être dupliqués lorsque leur identifiant est connu.
- Les catégories sont synchronisées depuis la collection configurée.
- Les images mises en avant sont envoyées vers la collection de médias configurée lorsqu’un champ média est mappé.
- L’URL publique est récupérée depuis le champ configuré, une URL renvoyée par Payload ou un modèle de chemin configuré.
Consultez Gestion des campagnes pour configurer les campagnes qui publient vers Payload CMS.
Workflows avec webhook personnalisé
Utilisez une destination webhook lorsque le contenu doit passer par votre endpoint ou votre workflow d’automatisation avant d’arriver dans un CMS ou un autre service. Le endpoint récepteur doit :
- Authentifier la requête
- Vérifier le contenu et les champs obligatoires
- Retourner une réponse réussie uniquement après acceptation de la requête
- Gérer les nouvelles tentatives sans créer de doublons
N’exposez pas de secrets dans une URL webhook. Stockez-les dans le service récepteur et renouvelez-les s’ils sont compromis.
Contrat de requête webhook
Utilisez une requête JSON avec un événement explicite et les champs de l’article. Le client récepteur peut vérifier ce contrat, le convertir au format de son CMS et retourner une réponse 2xx après acceptation.
{
"event": "article.published",
"idempotencyKey": "article-123-published",
"article": {
"title": "A generated article",
"slug": "a-generated-article",
"content": "<p>Article content</p>",
"status": "published",
"publishedAt": "2026-09-10T19:20:00Z",
"featuredImage": "https://cdn.example.com/articles/a-generated-article.jpg"
}
}Le endpoint de destination doit vérifier la signature ou le secret configuré pour votre workflow, refuser les requêtes incorrectes avec une erreur 4xx et rendre idempotencyKey unique avant d’écrire le contenu.
// webhook-server.js
import express from 'express';
const app = express();
app.use(express.json());
app.post('/webhooks/auto-post', async (req, res) => {
const { event, idempotencyKey, article } = req.body;
if (event !== 'article.published' || !idempotencyKey || !article?.title) {
return res.status(400).json({ error: 'Invalid webhook payload' });
}
// Verify the configured secret or signature before this point.
// Ignore idempotencyKey when it has already been processed.
await publishToDestination(article, idempotencyKey);
return res.status(202).json({ accepted: true });
});
app.listen(3000);Dépannage
La connexion échoue
- Vérifiez que l’URL pointe vers l’API REST Payload et pas uniquement vers le frontend public.
- Vérifiez le slug de la collection d’authentification et les identifiants.
- Vérifiez que la collection d’articles existe et est lisible par le compte.
- Vérifiez que l’API est accessible depuis Internet.
Les articles sont refusés
- Vérifiez que les noms mappés correspondent à la collection Payload.
- Vérifiez le type du champ de contenu et le format rich text choisi.
- Vérifiez les champs obligatoires, les relations et les droits sur les médias.
- Vérifiez les règles d’accès de la collection pour les opérations de création et de mise à jour.
Les images sont absentes
- Configurez le slug d’une collection de médias.
- Vérifiez le champ d’image mise en avant ou Open Graph.
- Vérifiez que la collection de médias accepte le champ d’upload configuré.
Documentation associée
Dernière mise à jour : 2026-09-10 21:20