Conteúdo publicado
Leia os artigos publicados, com seus autores e seções.
articles_listpublished:readarticle_readpublished:readauthors_listpublished:readsections_listpublished:readSUAS FERRAMENTAS DE IA. SEU FLUXO DE TRABALHO DE CONTEÚDO.
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.
$ connect https://app.endata.com/mcp
// Suas regras editoriais viajam com seu conteúdo.
await client.listTools()Ilustração conceitual · solicitações reais abaixoCONHEÇA SUA PRÓXIMA CONEXÃO
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.
tools/list 1 ferramenta de exemplo visível
VOCÊ PERGUNTA
published:read{
"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
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.
Adicione isto ao ~/.codex/config.toml. Disponibilize sua chave da API do projeto como ENDATA_API_KEY no ambiente que inicia Codex.
[mcp_servers.endata]
url = "https://app.endata.com/mcp"
bearer_token_env_var = "ENDATA_API_KEY"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.
{
"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.
// 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
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.
Um proprietário da organização cria uma chave para um projeto.
Armazene ENDATA_API_KEY e ENDATA_PUBLICATION_ID privativamente.
Busque artigos aprovados e construa sua experiência de leitor.
// 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);
}Exemplo abreviado. Espaços reservados UUID representam IDs reais retornados pelo seu projeto.
{
"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
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:readArtigos publicados, autores e seções. Comece aqui para um leitor de site.
editorial:readLeia rascunhos, histórico de revisão, pesquisa, mídia, compartilhamento e status de publicação.
editorial:writeCrie e revise histórias; gerencie pesquisa, fontes, imagens e ações de história.
editorial:approveAprove uma revisão de história exata.
publishing:managePublique, tente novamente lotes, coloque remessas em estágio e envie ou cancele compartilhamentos sociais.
widgets:writeSubstitua os dados de widgets do site, como preços de um ticker, pelos seus próprios sistemas.
administration:manageConfigure detalhes do projeto, automação de pesquisa, domínios, integrações e webhooks.
organization:manageGerencie 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 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.
Leia os artigos publicados, com seus autores e seções.
articles_listpublished:readarticle_readpublished:readauthors_listpublished:readsections_listpublished:readCrie rascunhos, consulte o histórico, aprove revisões exatas e gerencie o estado de cada notícia.
publication_readeditorial:readoverview_readeditorial:readstories_listeditorial:readstory_readeditorial:readstory_historyeditorial:readstory_createeditorial:writestory_updateeditorial:writestory_previeweditorial:readstory_approveeditorial:approvestory_actioneditorial:writeactivity_listeditorial:readConfigure a pesquisa, gerencie as fontes, acompanhe as execuções e tente de novo os candidatos.
research_readeditorial:readresearch_runeditorial:writeresearch_configureadministration:manageresearch_source_saveeditorial:writeresearch_retryeditorial:writeConsulte o status dos lotes com editorial:read; publique, tente de novo ou programe remoções com publishing:manage.
publishing_readeditorial:readpublication_publishpublishing:managepublication_retrypublishing:managestory_unpublishpublishing:manageListe, envie, importe e recorte imagens com permissão de reuso e atribuição.
media_listeditorial:readmedia_uploadeditorial:writemedia_importeditorial:writemedia_cropeditorial:writeGerencie autores, seções de cobertura, dados do projeto e domínios próprios.
taxonomy_saveadministration:managepublication_updateadministration:managedomains_listadministration:managedomain_addadministration:managedomain_removeadministration:manageVeja 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.
connections_listadministration:manageconnection_removeadministration:manageshare_readeditorial:readstory_sharepublishing:manageshare_cancelpublishing:manageConsulte, configure, teste ou remova integrações de e-mail, análise de dados, avisos para a equipe e outras do catálogo.
integrations_listadministration:manageintegration_saveadministration:manageintegration_testadministration:manageintegration_removeadministration:manageGerencie o acesso da equipe, os convites e os projetos dentro dos limites do plano.
team_readorganization:manageteam_inviteorganization:manageinvitation_revokeorganization:managemember_updateorganization:managepublication_createorganization:manageCadastre receptores e gerencie o histórico de entregas e os reenvios.
webhooks_listadministration:managewebhook_createadministration:managewebhook_actionadministration:managewebhook_replayadministration:manageAPI / SUA CAMADA DE APRESENTAÇÃO
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.
Perspectiva
Setor
Pesquisa
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
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.
/api/v1/publications/{publicationId}/articles/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.
// 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
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.
/api/v1/publications/{publicationId}/operations/{operationId}// 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
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.
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
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-SHA256import { 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
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.
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.
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.
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.Diga-nos o que você está construindo. Ajudaremos você a encontrar um bom lugar para começar.
Vamos falar sobre integrações