Última actualización: 2026-09-10 21:20
Payload CMS y webhooks
auto-post.io puede publicar artículos generados en un proyecto de Payload CMS mediante su API REST. Esta página también explica los destinos webhook para los flujos que necesitan un paso de entrega personalizado.
Integración con Payload CMS
Requisitos
Antes de conectar Payload CMS, prepara:
- Una URL pública base de la API REST de Payload
- Una cuenta de Payload con acceso a las colecciones configuradas
- El slug de la colección de autenticación, normalmente
users - El slug de la colección de artículos
- Los slugs opcionales de las colecciones de categorías y medios
Conectar Payload CMS
- Abre la página Sitios web y selecciona Añadir sitio web.
- Selecciona Payload CMS como plataforma.
- Introduce el nombre y la URL pública del sitio.
- Introduce la URL de la API de Payload, el correo electrónico, la contraseña, el slug de autenticación y el slug de la colección de artículos.
- Añade los slugs de categorías y medios si tu proyecto los utiliza.
- Selecciona Continuar. auto-post.io inicia sesión, lee un artículo de ejemplo y propone un mapeo de campos.
- Revisa el mapeo propuesto y confirma la conexión.
La conexión guarda la información necesaria para obtener un JWT de Payload. Los tokens se renuevan o se vuelven a crear cuando es necesario.
Mapeo de campos
El mapeo conecta los campos de auto-post.io con los campos de la colección de artículos de Payload:
- Título
- Slug
- Contenido
- Fecha de publicación
- Categorías
- Imagen destacada
- Imagen Open Graph
- Título, descripción y palabras clave SEO
- URL pública del artículo
Se admiten campos anidados mediante rutas con puntos como seo.title. Usa la sugerencia de IA como punto de partida y revisa cada campo antes de guardar.
El contenido rich text de Payload se envía como JSON Lexical de forma predeterminada. Elige el formato HTML solo cuando tu colección espere contenido HTML.
Colecciones y endpoints de Payload
El siguiente ejemplo muestra la estructura mínima que espera la integración. Los nombres de los campos pueden ser diferentes si configuras el mapeo correspondiente en 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 utiliza los siguientes endpoints REST de Payload. Sustituye https://cms.example.com/api y los slugs de las colecciones por tus valores:
# 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"}'Para las imágenes destacadas, configura una colección de medios y asegúrate de que su campo de carga acepte el campo multipart configurado en auto-post.io, file de forma predeterminada:
curl -X POST "https://cms.example.com/api/media" \
-H "Authorization: JWT YOUR_JWT" \
-F "[email protected]"Comportamiento de publicación
Cuando una campaña genera un artículo para un sitio Payload:
- El contenido borrador se envía con
_statusdefinido comodraft. - El contenido publicado se envía con
_statusdefinido comopublished. - Los documentos Payload existentes se actualizan en lugar de duplicarse cuando se conoce su identificador.
- Las categorías se sincronizan desde la colección configurada.
- Las imágenes destacadas se cargan en la colección de medios configurada cuando hay un campo mapeado.
- La URL pública se obtiene del campo configurado, de una URL devuelta por Payload o de una plantilla de ruta configurada.
Consulta Gestión de campañas para configurar las campañas que publican en Payload CMS.
Flujos con webhook personalizado
Usa un destino webhook cuando el contenido deba pasar por tu propio endpoint o flujo de automatización antes de llegar a un CMS u otro servicio. El endpoint receptor debe:
- Autenticar la solicitud
- Validar el contenido y los campos obligatorios
- Devolver una respuesta correcta solo después de aceptar la solicitud
- Gestionar los reintentos sin crear contenido duplicado
No expongas secretos en una URL webhook. Guárdalos en el servicio receptor y rótalos si quedan expuestos.
Contrato de la solicitud webhook
Usa una solicitud JSON con un evento explícito y los campos del artículo. El cliente receptor puede validar este contrato, transformarlo al formato de su CMS y devolver una respuesta 2xx después de aceptar la solicitud.
{
"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"
}
}El endpoint de destino debe validar la firma o el secreto configurado para tu flujo, rechazar las solicitudes incorrectas con 4xx y hacer único idempotencyKey antes de escribir el contenido.
// 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);Solución de problemas
La conexión falla
- Confirma que la URL apunta a la API REST de Payload y no solo al frontend público.
- Comprueba el slug de autenticación y las credenciales.
- Confirma que la colección de artículos existe y que la cuenta puede leerla.
- Comprueba que la API sea accesible desde Internet.
Los artículos son rechazados
- Verifica que los nombres mapeados coincidan con la colección Payload.
- Confirma el tipo del campo de contenido y el formato rich text seleccionado.
- Revisa los campos obligatorios, las relaciones y los permisos de medios.
- Comprueba las reglas de acceso de la colección para crear y actualizar documentos.
Faltan las imágenes
- Configura el slug de una colección de medios.
- Comprueba el campo de imagen destacada u Open Graph.
- Confirma que la colección de medios acepte el campo de carga configurado.
Documentación relacionada
Última actualización: 2026-09-10 21:20