Voltar

Documentação

API do CMS

Envie notícias, vídeos e eventos para o portal a partir de ferramentas externas (Zapier, scripts próprios, etc.).

1. Endpoint

POSThttps://brasilnopulso.com/api/public/cms/posts

Aceita um único objeto ou um array de até 50 publicações em uma requisição. Se o slug já existir, a notícia é atualizada (upsert).

2. Autenticação

Todas as requisições exigem o header abaixo. A chave é gerenciada nos secrets do projeto (CMS_INGEST_API_KEY) e nunca deve ser exposta no frontend.

Authorization: Bearer SUA_API_KEY
Content-Type: application/json

3. Campos aceitos

CampoTipoDescrição
title*string (3–200)Título da publicação.
slugstringSlug único. Se omitido, gerado a partir do título. Mesmo slug = atualiza.
excerptstring (até 400)Resumo curto exibido nas listagens.
body_htmlstring (HTML)Conteúdo. Tags perigosas são removidas automaticamente.
cover_image_urlURLImagem de capa.
typearticle | video | eventTipo da publicação. Default: article.
statusdraft | scheduled | publishedDefault: draft.
scheduled_forISO datetimeObrigatório quando status='scheduled'.
published_atISO datetimeOpcional. Default: now() se status='published'.
categorystringSlug ou nome da categoria existente.
category_iduuidAlternativa direta a category.
tagsstring[] (até 15)Lista de tags livres.
video_urlURLObrigatório quando type='video'.
event_starts_atISO datetimeObrigatório quando type='event'.
event_locationstringLocal do evento.
author_iduuidAutor. Default: primeiro admin do sistema.

* obrigatório

4. Exemplos

Artigo simples

curl -X POST https://brasilnopulso.com/api/public/cms/posts \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Título da notícia",
    "excerpt": "Resumo curto que aparece nas listagens",
    "body_html": "<p>Conteúdo em <strong>HTML</strong>.</p>",
    "cover_image_url": "https://exemplo.com/capa.jpg",
    "category": "Economia",
    "tags": ["mercado", "brasil"],
    "status": "published"
  }'

Lote (vários de uma vez)

curl -X POST https://brasilnopulso.com/api/public/cms/posts \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    { "title": "Primeira", "body_html": "<p>...</p>", "status": "published" },
    { "title": "Segunda", "body_html": "<p>...</p>", "status": "draft" }
  ]'

Vídeo

curl -X POST https://brasilnopulso.com/api/public/cms/posts \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "title": "Entrevista exclusiva",
    "video_url": "https://youtube.com/watch?v=abc123",
    "cover_image_url": "https://exemplo.com/thumb.jpg",
    "status": "published"
  }'

Evento

curl -X POST https://brasilnopulso.com/api/public/cms/posts \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "event",
    "title": "Encontro Nacional 2026",
    "event_starts_at": "2026-08-15T19:00:00Z",
    "event_location": "São Paulo - SP",
    "status": "published"
  }'

Publicação agendada

curl -X POST https://brasilnopulso.com/api/public/cms/posts \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Será publicada depois",
    "body_html": "<p>...</p>",
    "status": "scheduled",
    "scheduled_for": "2026-07-01T12:00:00Z"
  }'

5. Respostas

200 — Sucesso (item único)
{ "ok": true, "id": "uuid", "slug": "titulo-da-noticia", "action": "created" }
200 / 207 — Sucesso (lote)
{
  "ok": true,
  "results": [
    { "ok": true, "id": "...", "slug": "primeira", "action": "created" },
    { "ok": false, "slug": "segunda", "error": "..." }
  ]
}

Status 207 indica que houve falhas parciais no lote.

  • 400 — JSON inválido ou validação falhou.
  • 401 — chave ausente ou inválida.
  • 500 — erro interno.

6. Deduplicação (processed_news)

Dois endpoints auxiliares para um agente externo (ex.: coletor de RSS) evitar reprocessar notícias já publicadas. Usam a mesma autenticação e formato de resposta do endpoint de posts. O identificador (external_id) é qualquer string estável da origem — normalmente o GUID do item do feed, por exemplo https://admin.revistaoeste.com/?p=2438236.

6.1 Checagem em lote

POSThttps://brasilnopulso.com/api/public/cms/processed/check

Recebe um array ids (1 a 200 itens) e retorna o subconjunto que já foi marcado como publicado. Somente leitura.

curl -X POST https://brasilnopulso.com/api/public/cms/processed/check \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [
      "https://admin.revistaoeste.com/?p=2438236",
      "https://outrofeed.com/?p=999"
    ]
  }'
// 200 OK
{ "ok": true, "processed": ["https://admin.revistaoeste.com/?p=2438236"] }

6.2 Marcar como publicada

POSThttps://brasilnopulso.com/api/public/cms/processed

Idempotente: chamar duas vezes com o mesmo id não gera erro. Use logo após publicar a notícia via /api/public/cms/posts.

curl -X POST https://brasilnopulso.com/api/public/cms/processed \
  -H "Authorization: Bearer SUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "id": "https://admin.revistaoeste.com/?p=2438236" }'
// 200 OK
{ "ok": true }
  • 400 — JSON inválido, id vazio, ou mais de 200 ids no /check.
  • 401 — chave ausente ou inválida.
  • 500 — erro interno.