TUS HERRAMIENTAS DE IA. TU FLUJO DE TRABAJO DE CONTENIDO.

Tu contenido. Tus herramientas. Ve y construye algo.

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.

endata / kit de herramientas para desarrolladores

$ connect https://app.endata.com/mcp

Herramientas MCP Streamable HTTP
API REST /api/v1
Eventos firmados HMAC-SHA256

// Tus reglas editoriales viajan con tu contenido.

await client.listTools()Ilustración conceptual · solicitudes reales abajo
Acceso limitado Ciclo de vida editorial completo Entrega de eventos firmadaOpenAPI 3.1

CONOCE TU PRÓXIMA CONEXIÓN

Dale a tus herramientas de IA
algo con qué trabajar.

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.

Tu cliente de IA, conectado.
Vista previa interactiva de MCP

tools/list 1 herramienta de ejemplo visible

Las herramientas de borrador y publicación están ocultas para esta clave de lectura.

TÚ PREGUNTAS

“Muéstrame los últimos artículos de mi publicación.”
EL CLIENTE LLAMApublished:read
json
{
  "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

Haz la conexión.

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.

Códice

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.

javascript
[mcp_servers.endata]
url = "https://app.endata.com/mcp"
bearer_token_env_var = "ENDATA_API_KEY"

Código de Claude

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.

javascript
{
  "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.

Crea tu propio cliente MCP

javascript
// 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

Coge una clave. Obtén contenido.

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.

01Crea una clave

Un propietario de la organización crea una clave para un proyecto.

02Establece tu entorno

Almacena ENDATA_API_KEY y ENDATA_PUBLICATION_ID de forma privada.

03Lee una edición

Obtén artículos aprobados y construye tu experiencia de lectura.

Ejemplo del lado del servidor
javascript
// 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);
}
Inspecciona una respuesta de ejemplo JSON ↗

Ejemplo abreviado. Los marcadores de posición UUID representan IDs reales devueltos por tu proyecto.

json
{
  "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

Eliges qué obtiene acceso.

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:read

Artículos publicados, autores y secciones. Empieza aquí para un lector de sitio web.

editorial:read

Lee borradores, historial de revisiones, investigación, medios, intercambio y estado de publicación.

editorial:write

Crea y revisa noticias; gestiona investigación, fuentes, imágenes y acciones de historias.

editorial:approve

Aprueba una revisión de noticia exacta.

publishing:manage

Publica, reintenta lotes, prepara eliminaciones y envía o cancela intercambios sociales.

widgets:write

Reemplaza los datos de widgets del sitio web, como los precios de un ticker, desde tus propios sistemas.

administration:manage

Configura detalles del proyecto, automatización de investigación, dominios, integraciones y webhooks.

organization:manage

Gestiona 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 por lo que estás construyendo.

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.

Contenido publicado

Lee los artículos publicados, con sus autores y secciones.

POSTarticles_listpublished:read
POSTarticle_readpublished:read
POSTauthors_listpublished:read
POSTsections_listpublished:read

Edición

Crea borradores, consulta el historial, aprueba revisiones exactas y gestiona el estado de cada noticia.

POSTpublication_readeditorial:read
POSToverview_readeditorial:read
POSTstories_listeditorial:read
POSTstory_readeditorial:read
POSTstory_historyeditorial:read
POSTstory_createeditorial:write
POSTstory_updateeditorial:write
POSTstory_previeweditorial:read
POSTstory_approveeditorial:approve
POSTstory_actioneditorial:write
POSTactivity_listeditorial:read

Investigación

Configura la investigación, administra las fuentes, revisa las ejecuciones y reintenta candidatos.

POSTresearch_readeditorial:read
POSTresearch_runeditorial:write
POSTresearch_configureadministration:manage
POSTresearch_source_saveeditorial:write
POSTresearch_retryeditorial:write

Publicación

Consulta el estado de los lotes con editorial:read; publica, reintenta o programa retiros con publishing:manage.

POSTpublishing_readeditorial:read
POSTpublication_publishpublishing:manage
POSTpublication_retrypublishing:manage
POSTstory_unpublishpublishing:manage

Medios

Lista, sube, importa y recorta imágenes con permiso de reutilización y atribución.

POSTmedia_listeditorial:read
POSTmedia_uploadeditorial:write
POSTmedia_importeditorial:write
POSTmedia_cropeditorial:write

Ajustes del proyecto

Administra autores, secciones de cobertura, datos del proyecto y dominios propios.

POSTtaxonomy_saveadministration:manage
POSTpublication_updateadministration:manage
POSTdomains_listadministration:manage
POSTdomain_addadministration:manage
POSTdomain_removeadministration:manage

Distribución en redes

Revisa 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.

POSTconnections_listadministration:manage
POSTconnection_removeadministration:manage
POSTshare_readeditorial:read
POSTstory_sharepublishing:manage
POSTshare_cancelpublishing:manage

Servicios conectados

Consulta, configura, prueba o elimina integraciones de correo, analítica, avisos al equipo y otras del catálogo.

POSTintegrations_listadministration:manage
POSTintegration_saveadministration:manage
POSTintegration_testadministration:manage
POSTintegration_removeadministration:manage

Organización

Administra el acceso del equipo, las invitaciones y los proyectos dentro de los límites del plan.

POSTteam_readorganization:manage
POSTteam_inviteorganization:manage
POSTinvitation_revokeorganization:manage
POSTmember_updateorganization:manage
POSTpublication_createorganization:manage

Webhooks

Registra receptores y administra el historial de entregas y los reenvíos.

POSTwebhooks_listadministration:manage
POSTwebhook_createadministration:manage
POSTwebhook_actionadministration:manage
POSTwebhook_replayadministration:manage

API / TU CAPA DE PRESENTACIÓN

Traemos el contenido.
Tú construyes la experiencia.

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.

Una respuesta. Tu diseño.
FIELDNOTES / TU MARCALA EDICIÓN DE LA INDUSTRIA
01

Perspectiva

El próximo capítulo para tu industria

Una mirada más cercana a las ideas que están remodelando cómo funciona tu mercado.
Equipo editorial
02

Industria

Tres novedades que vale la pena seguir

Las señales que tu equipo debe tener en su radar esta semana.
Equipo editorial
03

Investigación

De la investigación emergente a la práctica cotidiana

Poner los nuevos hallazgos en contexto para quienes toman decisiones.
Equipo editorial

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

Lee una edición, no un objetivo móvil.

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.

GET/api/v1/publications/{publicationId}/articles
GET/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.

javascript
// 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

Haz que tu flujo de trabajo funcione para ti.

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.

POST/api/v1/publications/{publicationId}/operations/{operationId}
javascript
// 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

Presiona reproducir en todo el flujo.

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.

Simulación local
Aprueba revisiónEsperando
Pone en cola publicaciónEsperando
Activa ediciónEsperando
Entrega webhookEsperando
Recibe duplicadoEsperando
RASTREO DE EVENTOS0 / 5

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

Verifica. Persiste. Reconoce.

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-SHA256
javascript
import { 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

Prepárate para el problema ocasional.

Escrituras idempotentes

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.

Solicitudes limitadas

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.

Límites de plan existentes

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.

Requisitos del receptor

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.

¿Tienes algo
en mente?

Cuéntanos qué estás construyendo. Te ayudaremos a encontrar un buen lugar para comenzar.

Hablemos de integraciones