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
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/json3. Campos aceitos
| Campo | Tipo | Descrição |
|---|---|---|
| title* | string (3–200) | Título da publicação. |
| slug | string | Slug único. Se omitido, gerado a partir do título. Mesmo slug = atualiza. |
| excerpt | string (até 400) | Resumo curto exibido nas listagens. |
| body_html | string (HTML) | Conteúdo. Tags perigosas são removidas automaticamente. |
| cover_image_url | URL | Imagem de capa. |
| type | article | video | event | Tipo da publicação. Default: article. |
| status | draft | scheduled | published | Default: draft. |
| scheduled_for | ISO datetime | Obrigatório quando status='scheduled'. |
| published_at | ISO datetime | Opcional. Default: now() se status='published'. |
| category | string | Slug ou nome da categoria existente. |
| category_id | uuid | Alternativa direta a category. |
| tags | string[] (até 15) | Lista de tags livres. |
| video_url | URL | Obrigatório quando type='video'. |
| event_starts_at | ISO datetime | Obrigatório quando type='event'. |
| event_location | string | Local do evento. |
| author_id | uuid | Autor. 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
{ "ok": true, "id": "uuid", "slug": "titulo-da-noticia", "action": "created" }{
"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
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
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,idvazio, ou mais de 200 ids no/check.401— chave ausente ou inválida.500— erro interno.