Contenido publicado
Lee los artículos publicados, con sus autores y secciones.
articles_listpublished:readarticle_readpublished:readauthors_listpublished:readsections_listpublished:readTUS HERRAMIENTAS DE IA. TU FLUJO DE TRABAJO DE CONTENIDO.
Trae tu cliente de IA con MCP, construye con la API REST, o sigue cambios a través de webhooks. Lee artículos, forma borradores y conecta tu flujo de trabajo con los permisos que elijas.
MCP, APIs REST y webhooks están incluidos en Business y Network.
$ connect https://app.endata.com/mcp
// Tus reglas editoriales viajan con tu contenido.
await client.listTools()Ilustración conceptual · solicitudes reales abajoCONOCE TU PRÓXIMA CONEXIÓN
Pon tu cliente de IA a trabajar en tu publicación. MCP da a los clientes compatibles herramientas para leer contenido, inspeccionar borradores, guardar revisiones y, con una concesión explícita del propietario, poner en cola la publicación.
tools/list 1 herramienta de ejemplo visible
TÚ PREGUNTAS
published:read{
"name": "articles_list",
"arguments": {
"publicationId": "PUBLICATION_UUID",
"input": {
"limit": 3
}
}
}Solo ejemplos seleccionados, no la lista completa de herramientas ni esquemas de respuesta exactos. Los conjuntos de permisos son ilustrativos. Los nombres de herramientas y argumentos siguen el contrato MCP; no se usa clave de API, modelo de IA o solicitud de red aquí.
CONECTAR / HTTP TRANSMISIBLE
Conecta un cliente MCP compatible usando HTTP Transmisible en https://app.endata.com/mcp. Los esquemas de herramientas provienen del mismo registro de operaciones que la API HTTP.
La aplicación llama a esto un proyecto. Las rutas de la API y los campos de solicitud retienen publication y publicationId; usa esos nombres exactos en el código.
Descubrimiento consciente de permisosSe omiten las herramientas fuera de los ámbitos de una clave. Cada llamada recomprueba la autorización.
Solicitudes de escritura explícitasPasa publicationId, entrada y una clave de solicitud para mutaciones. Las concesiones del propietario aún se aplican.
Añade esto a ~/.codex/config.toml. Haz tu clave de API de proyecto disponible como ENDATA_API_KEY en el entorno que inicia Códice.
[mcp_servers.endata]
url = "https://app.endata.com/mcp"
bearer_token_env_var = "ENDATA_API_KEY"Añade esto a .mcp.json de tu proyecto. Establece ENDATA_API_KEY en el entorno antes de iniciar Claude Code. Mantén la clave misma fuera de los archivos de configuración y del control de código fuente.
{
"mcpServers": {
"endata": {
"type": "http",
"url": "https://app.endata.com/mcp",
"headers": { "Authorization": "Bearer ${ENDATA_API_KEY}" }
}
}
}Estos ejemplos usan la configuración HTTP MCP documentada de los clientes. La conexión y las herramientas disponibles dependen de los ámbitos de tu clave y los permisos del proyecto.
// Node.js con @modelcontextprotocol/sdk instalado.
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from
"@modelcontextprotocol/sdk/client/streamableHttp.js";
const client = new Client({ name: "my-endata-tool", version: "1.0.0" });
await client.connect(new StreamableHTTPClientTransport(
new URL("https://app.endata.com/mcp"),
{ requestInit: { headers: {
Authorization: `Bearer ${process.env.ENDATA_API_KEY}`,
} } }
));
try {
const result = await client.callTool({
name: "articles_list",
arguments: {
publicationId: process.env.ENDATA_PUBLICATION_ID,
input: { limit: 20 },
},
});
if (result.isError) throw new Error(JSON.stringify(result.content));
console.log(result.content);
} finally {
await client.close();
}Esto usa el SDK TypeScript oficial de MCP, no un SDK específico de Endata. Configura las credenciales del portador a través de la configuración de conexión segura de tu cliente. Se admiten conexiones de clave de API; OAuth personal y el registro de cliente están diferidos.
01 / TU PRIMERA SOLICITUD
Crea una clave de API de proyecto en Configuración → Desarrollador → Claves de API. Empieza con published:read y ejecuta tu primera solicitud en un servidor o en tu entorno de compilación.
Un propietario de la organización crea una clave para un proyecto.
Almacena ENDATA_API_KEY y ENDATA_PUBLICATION_ID de forma privada.
Obtén artículos aprobados y construye tu experiencia de lectura.
// JavaScript en el servidor. Mantén las credenciales fuera de los paquetes del navegador.
const base = "https://app.endata.com/api/v1";
const publication = process.env.ENDATA_PUBLICATION_ID;
const headers = { Authorization: `Bearer ${process.env.ENDATA_API_KEY}` };
const response = await fetch(
`${base}/publications/${publication}/articles?limit=20`,
{ headers, cache: "no-store" }
);
if (!response.ok) throw new Error(`Endata returned ${response.status}`);
const { items, editionId, hasMore } = await response.json();
for (const article of items) {
console.log(article.title, article.slug);
}Ejemplo abreviado. Los marcadores de posición UUID representan IDs reales devueltos por tu proyecto.
{
"publication": {
"id": "PUBLICATION_UUID",
"name": "Resumen del sector",
"slug": "industry-brief"
},
"editionId": "EDITION_UUID",
"items": [
{
"id": "ARTICLE_UUID",
"slug": "a-new-perspective",
"title": "Una nueva mirada a tu sector",
"summary": "Lo que importa de lo que ocurre en tu sector, con tu contexto editorial.",
"body": "<p>Contenido del artículo revisado.</p>",
"sources": [
{
"title": "Informe original",
"url": "https://example.com/report"
}
],
"disclosure": "Preparado con asistencia de IA y revisado por el equipo editorial."
}
],
"hasMore": false
}Mantén las claves portadoras fuera de paquetes del navegador, variables de entorno públicas, URLs y control de código fuente. Estos ejemplos nunca te piden que pegues una clave real en esta página.
02 / ACCESO CON INTENCIÓN
Las claves pertenecen a un proyecto y actúan como cuentas de servicio. Elige solo los ámbitos que tu integración necesita. La expiración es opcional; la revocación se comprueba en cada solicitud.
published:readArtículos publicados, autores y secciones. Empieza aquí para un lector de sitio web.
editorial:readLee borradores, historial de revisiones, investigación, medios, intercambio y estado de publicación.
editorial:writeCrea y revisa noticias; gestiona investigación, fuentes, imágenes y acciones de historias.
editorial:approveAprueba una revisión de noticia exacta.
publishing:managePublica, reintenta lotes, prepara eliminaciones y envía o cancela intercambios sociales.
widgets:writeReemplaza los datos de widgets del sitio web, como los precios de un ticker, desde tus propios sistemas.
administration:manageConfigura detalles del proyecto, automatización de investigación, dominios, integraciones y webhooks.
organization:manageGestiona la organización que contiene la publicación de la clave.
Se aplican ámbitos, roles de servicio y límites de plan. Las acciones consecuentes como publicación, programación, eliminación y cambios administrativos también requieren concesiones explícitas del propietario desatendidas. OAuth personal no está disponible aún.
La publicación, el intercambio externo y las invitaciones también requieren que el creador de la clave de API tenga su correo verificado. Un 403 con email_unverified significa que esa persona debe verificar su correo en la plataforma antes de intentar de nuevo.
03 / LOS BLOQUES DE CONSTRUCCIÓN
Explora 51 operaciones entre 10 áreas. Cada operación usa la misma estructura de ruta POST. El catálogo activo contiene los ámbitos exactos y esquemas de entrada.
Las operaciones sociales admiten perfiles y páginas de LinkedIn, Facebook, X, Threads, Instagram, Bluesky, TikTok y YouTube Shorts. Los publicaciones de TikTok y YouTube usan format: "video" y las publicaciones de TikTok también toman options.privacyLevel. Conectar una cuenta primero requiere consentimiento interactivo en Distribución. Las integraciones de boletines recopilan suscriptores; no envían campañas de correo.
Lee los artículos publicados, con sus autores y secciones.
articles_listpublished:readarticle_readpublished:readauthors_listpublished:readsections_listpublished:readCrea borradores, consulta el historial, aprueba revisiones exactas y gestiona el estado de cada noticia.
publication_readeditorial:readoverview_readeditorial:readstories_listeditorial:readstory_readeditorial:readstory_historyeditorial:readstory_createeditorial:writestory_updateeditorial:writestory_previeweditorial:readstory_approveeditorial:approvestory_actioneditorial:writeactivity_listeditorial:readConfigura la investigación, administra las fuentes, revisa las ejecuciones y reintenta candidatos.
research_readeditorial:readresearch_runeditorial:writeresearch_configureadministration:manageresearch_source_saveeditorial:writeresearch_retryeditorial:writeConsulta el estado de los lotes con editorial:read; publica, reintenta o programa retiros con publishing:manage.
publishing_readeditorial:readpublication_publishpublishing:managepublication_retrypublishing:managestory_unpublishpublishing:manageLista, sube, importa y recorta imágenes con permiso de reutilización y atribución.
media_listeditorial:readmedia_uploadeditorial:writemedia_importeditorial:writemedia_cropeditorial:writeAdministra autores, secciones de cobertura, datos del proyecto y dominios propios.
taxonomy_saveadministration:managepublication_updateadministration:managedomains_listadministration:managedomain_addadministration:managedomain_removeadministration:manageRevisa las conexiones y comparte noticias en perfiles y páginas de LinkedIn, Facebook, X, Threads, Instagram, Bluesky, TikTok y YouTube Shorts. Las publicaciones de TikTok y YouTube son el video corto de la noticia (formato "video"). Primero conecta las cuentas en la plataforma.
connections_listadministration:manageconnection_removeadministration:manageshare_readeditorial:readstory_sharepublishing:manageshare_cancelpublishing:manageConsulta, configura, prueba o elimina integraciones de correo, analítica, avisos al equipo y otras del catálogo.
integrations_listadministration:manageintegration_saveadministration:manageintegration_testadministration:manageintegration_removeadministration:manageAdministra el acceso del equipo, las invitaciones y los proyectos dentro de los límites del plan.
team_readorganization:manageteam_inviteorganization:manageinvitation_revokeorganization:managemember_updateorganization:managepublication_createorganization:manageRegistra receptores y administra el historial de entregas y los reenvíos.
webhooks_listadministration:managewebhook_createadministration:managewebhook_actionadministration:managewebhook_replayadministration:manageAPI / TU CAPA DE PRESENTACIÓN
Usa Endata como tu backend editorial y construye el front-end que tu audiencia necesita. Tu sitio web, aplicación o portal de cliente puede renderizar los mismos artículos aprobados con su propio diseño, navegación y marca.
Perspectiva
Industria
Investigación
Contenido de ejemplo · Preparado con asistencia de IA y revisado por el equipo editorial.
Los mismos datos de artículo de ejemplo, tres diseños a medida. Tu aplicación es dueña del diseño, el enrutamiento y el renderizado. Esta vista previa no lleva a artículos reales.
Trae tu propio stackObtén en tu servidor o en tiempo de compilación. Renderiza contenido de artículos, secciones, autores y referencias de fuentes con tus propios componentes.
Mantén tu libertad de diseñoLa API suministra contenido, no una interfaz de usuario prescrita. Preserva la divulgación y la atribución mientras das forma a la experiencia de lectura.
04 / CONTENIDO QUE SE MANTIENE CONSISTENTE
Usa las rutas GET del artículo para entrega de contenido. Fija páginas posteriores en la primera respuesta de editionId, luego reemplaza tu contenido local solo después de que toda la actualización sea exitosa.
/api/v1/publications/{publicationId}/articles/api/v1/publications/{publicationId}/articles/{slug}Paginaciónlímite: 1–100 (predeterminado 20). desplazamiento: 0–10.000.
Filtradoq: hasta 200 caracteres. sección: slug de sección. edición: UUID de edición.
// Fija las páginas siguientes a la edición de la primera página.
// Reutiliza base, publication y headers de la guía rápida.
const collected = [];
let editionId;
let offset = 0;
while (true) {
const query = new URLSearchParams({ limit: "100", offset: String(offset) });
if (editionId) query.set("edition", editionId);
const response = await fetch(
`${base}/publications/${publication}/articles?${query}`,
{ headers, cache: "no-store" }
);
if (!response.ok) throw new Error(`Refresh failed: ${response.status}`);
const page = await response.json();
editionId ??= page.editionId;
collected.push(...page.items);
if (!page.hasMore) break;
offset += page.items.length;
if (!page.items.length || offset > 10000) {
throw new Error("Pagination limit reached; preserve the previous export.");
}
}
// Reemplaza tu exportación anterior solo después de que todas las páginas lleguen bien.
// Una edición vacía obtenida con éxito significa que el contenido anterior debe eliminarse.Preserva las fuentes, la divulgación y la atribución de imágenes. Resuelve las rutas de imagen contra el origen del sitio web público del proyecto, no app.endata.com. Nunca envíes una clave de API con una solicitud de medios.
Los actualizaciones fallidas deben preservar tu exportación anterior. Una edición exitosa vacía debe eliminar contenido antiguo. Las ediciones retenidas más antiguas pueden permanecer legibles; la eliminación provisional no es borrado histórico.
05 / MÁS QUE UN FEED DE CONTENIDO
Prepara borradores, guarda revisiones, aprueba contenido revisado y pone en cola la publicación como operaciones distintas. La clave de solicitud de una escritura hace que los reintentos de red sean seguros sin repetir la mutación.
/api/v1/publications/{publicationId}/operations/{operationId}// Función auxiliar de operaciones en el servidor. Reutiliza una clave de solicitud solo con datos idénticos.
async function operation(name, input, requestKey) {
const response = await fetch(
`${base}/publications/${publication}/operations/${name}`,
{
method: "POST",
headers: {
...headers,
"Content-Type": "application/json",
"Idempotency-Key": requestKey,
},
body: JSON.stringify(input),
}
);
if (!response.ok) throw new Error(`Operation failed: ${response.status}`);
return response.json();
}
// Usa los ID reales de la noticia que ya revisaste.
await operation("story_approve", {
postId: "STORY_UUID",
revisionId: "REVIEWED_REVISION_UUID",
}, "approve-story-revision-001");
// Acción aparte y de consecuencias: requiere publishing:manage
// Y una autorización explícita del propietario para uso sin supervisión de la clave de servicio.
await operation("publication_publish", {}, "publish-edition-001");
// La publicación es asíncrona. Consulta publishing_read o recibe los eventos.Este ejemplo extiende la base del inicio rápido de JavaScript, la publicación y los encabezados. Reemplaza los marcadores de posición UUID con IDs de historia y revisión reales. Un lote de publicación incluye todas las revisiones aprobadas elegibles y eliminaciones preparadas en la publicación, no solo una historia.
Revisiones exactasRevisa el contenido que se aprobará. Maneja conflictos leyendo y revisando el estado más reciente.
Trabajo asincrónicoLa investigación y la publicación devuelven identificadores de ejecución o lote. Consulta el estado o consume eventos del ciclo de vida.
06 / SIGUE EL EVENTO
Recorre la aprobación, publicación y entrega de webhook. Cambia de escenario para ver por qué un receptor necesita reintentos y protección contra duplicados.
Listo. Pasa por el ciclo de vida para ver cómo las solicitudes se convierten en una edición activa y un evento verificado.
Estados ilustrativos, no cuerpos de respuesta de API. Asume los ámbitos requeridos y concesiones del propietario. Sin solicitudes de red. Las entregas reales pueden llegar fuera de orden; los reintentos se ejecutan en un horario de retroceso.
07 / CUANDO ALGO CAMBIA
Registra un punto final HTTPS bajo Configuración → Desarrollador → Webhooks. Elige eventos, guarda el secreto de firma cuando se emita, y verifica el cuerpo exacto de la solicitud antes de procesar.
Webhook-Id ID de evento estable · desduplica aquíWebhook-Delivery-Id ID de entrega · cambia en reproducción manualWebhook-Timestamp Segundos Unix · permite cinco minutosWebhook-Signature v1=resumen hexadecimal HMAC-SHA256import { createHmac, timingSafeEqual } from "node:crypto";
// Pasa el cuerpo de la solicitud en UTF-8 exacto y sin modificar, junto con sus encabezados.
function verifyWebhook(rawBody, headers, secret) {
const timestamp = headers.get("Webhook-Timestamp");
const signature = headers.get("Webhook-Signature");
if (!timestamp || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (!/^v1=[a-f0-9]{64}$/.test(signature || "")) return false;
const expected = createHmac("sha256", secret)
.update(timestamp + "." + rawBody, "utf8")
.digest();
const received = Buffer.from(signature.slice(3), "hex");
return timingSafeEqual(expected, received);
}
// Tras la verificación, analiza y valida el evento.
// Guárdalo de forma atómica con una restricción de unicidad sobre Webhook-Id.
// Responde 2xx después de guardarlo; los eventos duplicados también deben responder 2xx.
// Procésalo de forma asíncrona y concilia el estado actual a través de la API.Al menos una vez, no en ordenPersiste una ID de evento única antes de responder 2xx. Usa la API para reconciliar el estado actual.
Reintentos y reproducciónHasta ocho intentos durante aproximadamente 22 horas. Inspecciona 30 días de historial y reproduce entregas.
Los eventos llevan IDs de recursos y metadatos de transición, no cuerpos de artículos. "edition.published" señala la activación de edición real. Tu receptor debe desencadenar su propia compilación o actualización; registrar un webhook no despliega tu sitio web.
08 / LISTO PARA EL MUNDO REAL
Usa una clave de Idempotency con 8–160 caracteres de letras, números, puntos, guiones bajos, dos puntos o guiones. La misma operación y entrada devuelven el resultado original durante siete días. Una entrada cambiada con la misma clave devuelve 409.
120 solicitudes de integración por minuto por principal. Solicitudes JSON generales: 1 MB. HTTP media_upload: hasta 14 MB JSON con 10 MB de datos de imagen decodificados. MCP retiene el límite de 1 MB.
Las asignaciones de borradores, recuentos de proyectos, asientos y reglas de aprobación aún se aplican. Una integración nunca elude los límites del plan en el que actúa.
Usa un punto final HTTPS público en el puerto 443. Los redireccionamientos se rechazan y la entrega agota el tiempo después de diez segundos. Persiste rápidamente, luego procesa de forma asincrónica.
400Valida la entrada contra el esquema de operación.401Comprueba que la clave sea válida y no haya expirado o sido revocada.403Comprueba los ámbitos, el rol de servicio, las concesiones del propietario y si el creador de la clave ha verificado su correo.402Se alcanzó un límite de plan existente.409Resuelve una revisión cambiada o un conflicto de clave de idempotencia.429Espera hasta el próximo minuto antes de reintentar.Cuéntanos qué estás construyendo. Te ayudaremos a encontrar un buen lugar para comenzar.
Hablemos de integraciones