SUAS FERRAMENTAS DE IA. SEU FLUXO DE TRABALHO DE CONTEÚDO.

Seu conteúdo. Suas ferramentas. Vá construir algo.

Traga seu cliente de IA junto com MCP, construa com a API REST ou acompanhe mudanças através de webhooks. Leia artigos, molde rascunhos e conecte seu fluxo de trabalho com as permissões que você escolher.

MCP, APIs REST e webhooks estão incluídos em Negócios e Rede.

endata / kit de ferramentas do desenvolvedor

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

Ferramentas MCP Streamable HTTP
API REST /api/v1
Eventos assinados HMAC-SHA256

// Suas regras editoriais viajam com seu conteúdo.

await client.listTools()Ilustração conceitual · solicitações reais abaixo
Acesso com escopo Ciclo de vida editorial completo Entrega de eventos assinadaOpenAPI 3.1

CONHEÇA SUA PRÓXIMA CONEXÃO

Dê às suas ferramentas de IA
algo com o qual trabalhar.

Coloque seu cliente de IA para trabalhar em sua publicação. MCP oferece ferramentas de clientes compatíveis para ler conteúdo, inspecionar rascunhos, salvar revisões e, com uma concessão de proprietário explícita, conteúdo de publicação na fila.

Seu cliente de IA, conectado.
Visualização interativa de MCP

tools/list 1 ferramenta de exemplo visível

Ferramentas de rascunho e publicação estão ocultas desta chave de leitor.

VOCÊ PERGUNTA

“Mostre-me os artigos mais recentes de minha publicação.”
O CLIENTE LIGApublished:read
json
{
  "name": "articles_list",
  "arguments": {
    "publicationId": "PUBLICATION_UUID",
    "input": {
      "limit": 3
    }
  }
}

Exemplos selecionados apenas, não a lista completa de ferramentas ou esquemas de resposta exatos. Os conjuntos de permissões são ilustrativos. Os nomes e argumentos das ferramentas seguem o contrato MCP; nenhuma chave de API, modelo de IA ou solicitação de rede é usada aqui.

CONECTAR / HTTP TRANSMISSÍVEL

Faça a conexão.

Conecte um cliente MCP compatível usando HTTP Transmissível em https://app.endata.com/mcp. Os esquemas de ferramenta vêm do mesmo registro de operações que a API HTTP.

O aplicativo chama isso de projeto. As rotas da API e os campos de solicitação mantêm publication e publicationId; use esses nomes exatos no código.

Descoberta com reconhecimento de permissãoFerramentas fora dos escopos de uma chave são omitidas. Cada chamada verifica novamente a autorização.

Solicitações de gravação explícitasPasse publicationId, entrada e uma requestKey para mutações. Concessões de proprietário ainda se aplicam.

Codex

Adicione isto ao ~/.codex/config.toml. Disponibilize sua chave da API do projeto como ENDATA_API_KEY no ambiente que inicia Codex.

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

Claude Code

Adicione isto ao .mcp.json do seu projeto. Defina ENDATA_API_KEY no ambiente antes de iniciar Claude Code. Mantenha a chave fora dos arquivos de configuração e controle de origem.

javascript
{
  "mcpServers": {
    "endata": {
      "type": "http",
      "url": "https://app.endata.com/mcp",
      "headers": { "Authorization": "Bearer ${ENDATA_API_KEY}" }
    }
  }
}

Estes exemplos usam a configuração HTTP MCP documentada dos clientes. A conexão e as ferramentas disponíveis dependem dos escopos e permissões do projeto de sua chave.

Construa seu próprio cliente MCP

javascript
// Node.js com @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();
}

Isto usa o SDK MCP TypeScript oficial, não um SDK específico de Endata. Configure credenciais de portador através das configurações de conexão segura do seu cliente. Conexões de chave de API são suportadas; OAuth pessoal e registro de cliente são diferidos.

01 / SEU PRIMEIRO PEDIDO

Pegue uma chave. Obtenha algum conteúdo.

Crie uma chave da API do projeto em Configurações → Desenvolvedor → Chaves da API. Comece com published:read e faça seu primeiro pedido em um servidor ou em seu ambiente de construção.

01Crie uma chave

Um proprietário da organização cria uma chave para um projeto.

02Defina seu ambiente

Armazene ENDATA_API_KEY e ENDATA_PUBLICATION_ID privativamente.

03Leia uma edição

Busque artigos aprovados e construa sua experiência de leitor.

Exemplo do lado do servidor
javascript
// JavaScript no servidor. Mantenha as credenciais fora dos pacotes do 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);
}
Inspecione uma resposta de exemplo JSON ↗

Exemplo abreviado. Espaços reservados UUID representam IDs reais retornados pelo seu projeto.

json
{
  "publication": {
    "id": "PUBLICATION_UUID",
    "name": "Resumo do setor",
    "slug": "industry-brief"
  },
  "editionId": "EDITION_UUID",
  "items": [
    {
      "id": "ARTICLE_UUID",
      "slug": "a-new-perspective",
      "title": "Um novo olhar sobre o seu setor",
      "summary": "O que importa no que acontece no seu setor, com o seu contexto editorial.",
      "body": "<p>Conteúdo do artigo revisado.</p>",
      "sources": [
        {
          "title": "Relatório original",
          "url": "https://example.com/report"
        }
      ],
      "disclosure": "Preparado com apoio de IA e revisado pela equipe editorial."
    }
  ],
  "hasMore": false
}

Mantenha chaves de portador fora de pacotes de navegador, variáveis de ambiente público, URLs e controle de origem. Estes exemplos nunca pedem que você cole uma chave real nesta página.

02 / ACESSO COM INTENÇÃO

Você escolhe quem tem acesso.

As chaves pertencem a um projeto e atuam como contas de serviço. Escolha apenas os escopos de que sua integração precisa. A expiração é opcional; a revogação é verificada em cada solicitação.

published:read

Artigos publicados, autores e seções. Comece aqui para um leitor de site.

editorial:read

Leia rascunhos, histórico de revisão, pesquisa, mídia, compartilhamento e status de publicação.

editorial:write

Crie e revise histórias; gerencie pesquisa, fontes, imagens e ações de história.

editorial:approve

Aprove uma revisão de história exata.

publishing:manage

Publique, tente novamente lotes, coloque remessas em estágio e envie ou cancele compartilhamentos sociais.

widgets:write

Substitua os dados de widgets do site, como preços de um ticker, pelos seus próprios sistemas.

administration:manage

Configure detalhes do projeto, automação de pesquisa, domínios, integrações e webhooks.

organization:manage

Gerencie a organização contendo a publicação da chave.

Escopos, funções de serviço e limites de plano se aplicam. Ações consequentes, como publicação, agendamento, exclusão e alterações administrativas, também exigem concessões de proprietário autônomo explícitas. OAuth pessoal ainda não está disponível.

Publicação, compartilhamento externo e convites também exigem o e-mail verificado do criador da chave da API. Um 403 com email_unverified significa que essa pessoa deve verificar seu e-mail na plataforma antes de tentar novamente.

03 / OS BLOCOS DE CONSTRUÇÃO

Explore pelo que você está construindo.

Explore 51 operações em 10 áreas. Cada operação usa a mesma estrutura de rota POST. O catálogo ao vivo contém os escopos exatos e esquemas de entrada.

Operações sociais suportam perfis e páginas LinkedIn, Facebook, X, Threads, Instagram, Bluesky, TikTok e YouTube Shorts. Postagens TikTok e YouTube usam format: "video" e postagens TikTok também aceitam options.privacyLevel. Conectar uma conta primeiro requer consentimento interativo em Distribuição. Integrações de newsletter coletam assinantes; elas não enviam campanhas de e-mail.

Conteúdo publicado

Leia os artigos publicados, com seus autores e seções.

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

Edição

Crie rascunhos, consulte o histórico, aprove revisões exatas e gerencie o estado de cada notícia.

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

Pesquisa

Configure a pesquisa, gerencie as fontes, acompanhe as execuções e tente de novo os candidatos.

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

Publicação

Consulte o status dos lotes com editorial:read; publique, tente de novo ou programe remoções com publishing:manage.

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

Mídia

Liste, envie, importe e recorte imagens com permissão de reuso e atribuição.

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

Configurações do projeto

Gerencie autores, seções de cobertura, dados do projeto e domínios próprios.

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

Distribuição nas redes

Veja as conexões e compartilhe notícias em perfis e Páginas do LinkedIn, Facebook, X, Threads, Instagram, Bluesky, TikTok e YouTube Shorts. As publicações no TikTok e no YouTube são o vídeo curto da notícia (formato "video"). Conecte as contas na plataforma antes.

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

Serviços conectados

Consulte, configure, teste ou remova integrações de e-mail, análise de dados, avisos para a equipe e outras do catálogo.

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

Organização

Gerencie o acesso da equipe, os convites e os projetos dentro dos limites do plano.

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

Webhooks

Cadastre receptores e gerencie o histórico de entregas e os reenvios.

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

API / SUA CAMADA DE APRESENTAÇÃO

Nós trazemos o conteúdo.
Você cria a experiência.

Use Endata como seu backend editorial e construa o front-end que sua audiência precisa. Seu site, aplicativo ou portal de cliente pode renderizar os mesmos artigos aprovados com seu próprio layout, navegação e marca.

Uma resposta. Seu design.
FIELDNOTES / SUA MARCAA EDIÇÃO DO SETOR
01

Perspectiva

O próximo capítulo do seu setor

Um olhar mais atento sobre as ideias que estão mudando o funcionamento do seu mercado.
Equipe editorial
02

Setor

Três novidades que vale a pena acompanhar

Os sinais que sua equipe deve ter no radar esta semana.
Equipe editorial
03

Pesquisa

Da pesquisa emergente à prática cotidiana

Novas descobertas em contexto para quem toma decisões.
Equipe editorial

Conteúdo de exemplo · Preparado com assistência de IA e revisado pela equipe editorial.

Os mesmos dados de artigo de exemplo, três layouts sob medida. Sua aplicação é dona do design, das rotas e da renderização. Esta prévia não leva a artigos reais.

Traga sua própria pilhaBusque em seu servidor ou no momento da construção. Procure conteúdo de artigo, seções, autores e referências de fontes com seus próprios componentes.

Mantenha sua liberdade de designA API fornece conteúdo, não uma UI prescrita. Preserve divulgação e atribuição enquanto você molda a experiência de leitura.

04 / CONTEÚDO QUE PERMANECE CONSISTENTE

Leia uma edição, não um alvo em movimento.

Use as rotas GET do artigo para entrega de conteúdo. Fixe páginas subsequentes ao editionId da primeira resposta, depois substitua seu conteúdo local apenas após a atualização inteira ter sucesso.

GET/api/v1/publications/{publicationId}/articles
GET/api/v1/publications/{publicationId}/articles/{slug}

Paginaçãolimite: 1–100 (padrão 20). deslocamento: 0–10.000.

Filtragemq: até 200 caracteres. seção: slug da seção. edição: UUID da edição.

javascript
// Fixe as páginas seguintes na edição da primeira página.
// Reaproveite base, publication e headers do início rápido.
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.");
  }
}
// Só substitua sua exportação anterior depois que todas as páginas forem lidas com sucesso.
// Uma edição vazia obtida com sucesso significa que o conteúdo antigo deve ser removido.

Preserve fontes, divulgação e atribuição de imagem. Resolva caminhos de imagem contra a origem pública do site do projeto, não app.endata.com. Nunca envie uma chave de API com uma solicitação de mídia.

Atualizações com falha devem preservar sua exportação anterior. Uma edição vazia bem-sucedida deve remover conteúdo antigo. Edições retidas mais antigas podem permanecer legíveis; o despublishing em estágio não é apagamento histórico.

05 / MAIS QUE UM FEED DE CONTEÚDO

Faça seu fluxo de trabalho funcionar para você.

Prepare rascunhos, salve revisões, aprove conteúdo revisado e conteúdo de publicação na fila como operações distintas. A chave de solicitação de uma gravação torna as tentativas de rede seguras sem repetir a mutação.

POST/api/v1/publications/{publicationId}/operations/{operationId}
javascript
// Função auxiliar de operações no servidor. Reutilize uma chave de requisição apenas com dados 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();
}
// Use os IDs reais da notícia que você já revisou.
await operation("story_approve", {
  postId: "STORY_UUID",
  revisionId: "REVIEWED_REVISION_UUID",
}, "approve-story-revision-001");

// Ação separada e de consequência: exige publishing:manage
// E uma autorização explícita do proprietário para uso sem supervisão da chave de serviço.
await operation("publication_publish", {}, "publish-edition-001");
// A publicação é assíncrona. Consulte publishing_read ou receba os eventos.

Este exemplo estende a base, publicação e cabeçalhos do início rápido JavaScript. Substitua espaços reservados UUID por IDs de história e revisão reais. Um lote de publicação inclui todas as revisões aprovadas e remoções em estágio elegíveis na publicação, não apenas uma história.

Revisões exatasRevise o conteúdo que será aprovado. Lidar com conflitos lendo e revisando o estado mais recente.

Trabalho assíncronoPesquisa e publicação retornam identificadores de execução ou lote. Estado de votação ou consumir eventos de ciclo de vida.

06 / SIGA O EVENTO

Pressione play no fluxo inteiro.

Caminhe pela aprovação, publicação e entrega de webhook. Mude cenários para ver por que um receptor precisa de tentativas e proteção de duplicação.

Simulação local
Revisar aprovaçãoEsperando
Fila de publicaçãoEsperando
Ativar ediçãoEsperando
Entregar webhookEsperando
Receber duplicadoEsperando
RASTREAMENTO DE EVENTOS0 / 5

Pronto. Passe pelo ciclo de vida para ver como as solicitações se tornam uma edição ao vivo e um evento verificado.

Estados ilustrativos, não corpos de resposta da API. Assume os escopos necessários e concessões de proprietário. Nenhuma solicitação de rede. Entregas reais podem chegar fora de ordem; tentativas são executadas em um cronograma de backoff.

07 / QUANDO ALGO MUDA

Verifique. Persista. Reconheça.

Registre um endpoint HTTPS em Configurações → Desenvolvedor → Webhooks. Escolha eventos, salve o segredo de assinatura quando for emitido e verifique o corpo exato da solicitação antes de processar.

Webhook-Id ID de evento estável · deduplicar aquiWebhook-Delivery-Id ID de entrega · muda na repetição manualWebhook-Timestamp Segundos Unix · permitir cinco minutosWebhook-Signature v1=resumo hex HMAC-SHA256
javascript
import { createHmac, timingSafeEqual } from "node:crypto";

// Passe o corpo da requisição em UTF-8, exato e sem alterações, junto com os cabeçalhos.
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);
}
// Depois da verificação, interprete e valide o evento.
// Grave-o de forma atômica, com uma restrição de unicidade em Webhook-Id.
// Responda 2xx depois de gravar; eventos duplicados também devem responder 2xx.
// Processe de forma assíncrona e concilie o estado atual pela API.

Pelo menos uma vez, não em ordemPersista uma ID de evento única antes de responder 2xx. Use a API para reconciliar estado atual.

Tentativas e repetiçãoAté oito tentativas em aproximadamente 22 horas. Inspecione 30 dias de histórico e reentregue.

Os eventos transportam IDs de recursos e metadados de transição, não corpos de artigos. "edition.published" sinaliza ativação de edição real. Seu receptor deve ativar sua própria compilação ou atualização; registrar um webhook não implanta seu site.

08 / PRONTO PARA O MUNDO REAL

Planeje para o ocasional problema.

Gravações idempotentes

Use um Idempotency-Key de 8–160 caracteres com letras, números, períodos, sublinhados, dois-pontos ou hífens. A mesma operação e entrada retornam o resultado original por sete dias. Entrada alterada com a mesma chave retorna 409.

Solicitações limitadas

120 solicitações de integração por minuto por principal. Solicitações JSON geral: 1 MB. HTTP media_upload: até 14 MB JSON com 10 MB de dados de imagem decodificados. MCP retém o limite de 1 MB.

Limites de plano existentes

Permissões de rascunho, contagens de projetos, assentos e regras de aprovação ainda se aplicam. Uma integração nunca ignora os limites do plano em que atua.

Requisitos do receptor

Use um endpoint HTTPS público na porta 443. Redirecionamentos são recusados e a entrega expire após dez segundos. Persista prontamente, depois processe de forma assíncrona.

400Valide entrada em relação ao esquema de operação.
401Verifique se a chave é válida e não expirou ou foi revogada.
403Verifique escopos, função de serviço, concessões de proprietário e se o criador da chave verificou seu e-mail.
402Um limite de plano existente foi atingido.
409Resolva uma revisão alterada ou um conflito de idempotency-key.
429Aguarde até o próximo minuto antes de tentar novamente.

Tem algo
em mente?

Diga-nos o que você está construindo. Ajudaremos você a encontrar um bom lugar para começar.

Vamos falar sobre integrações