# Blog Agent API

API HTTP autenticada para um agente externo (n8n, Make, Zapier, cURL, script próprio) analisar, criar, otimizar e auto-publicar posts do blog **Dicas dos Papais**.

## Endpoint base

```
https://cyqvdmhvkogyoagkvded.functions.supabase.co/blog-agent
```

## Autenticação

Todo request deve enviar o header:

```
x-api-key: <BLOG_AGENT_API_KEY>
```

A chave está salva como secret do projeto. Para revogar/rotacionar, gere uma nova via _Cloud → Secrets_ e atualize o agente.

Sem a chave (ou chave errada) o endpoint responde **401 Unauthorized**.

**Rate limit:** 60 requests por minuto por IP. Excedido → **429**.

## Rotas

| Método | Path | Descrição |
|---|---|---|
| GET | `/categories` | Lista categorias ativas (`id`, `slug`, `name`, `color`) |
| GET | `/posts` | Lista posts (query: `limit`, `offset`, `category`, `is_published`, `since`) |
| GET | `/posts/:slug` | Retorna post completo pelo slug |
| POST | `/posts` | Cria novo post (auto-publica por padrão) |
| PATCH | `/posts/:id` | Atualiza post existente (otimização) |

## Payload de criação/atualização

Todos os campos são opcionais, exceto `title` e `content` no POST.

```jsonc
{
  "title": "10 dicas para economizar em fraldas",     // obrigatório no POST
  "content": "<p>HTML do corpo do post...</p>",       // obrigatório no POST
  "slug": "10-dicas-fraldas",                         // gerado do título se omitido
  "excerpt": "Guia prático para pais...",             // gerado dos 160 primeiros chars se omitido
  "category": "dicas",                                // slug OU category_id (UUID)
  "category_id": "uuid-opcional",
  "cover_image": "https://.../capa.jpg",              // ou "image_url"
  "reading_time": "5 min de leitura",                 // calculado (palavras/200) se omitido
  "instagram_embed_html": "<blockquote class=\"instagram-media\" ...>...</blockquote>",
  "is_published": true,                               // padrão true no POST
  "author_email": "autor@dicasdospapais.com.br"       // se omitido usa BLOG_AGENT_DEFAULT_AUTHOR_EMAIL
}
```

### Comportamento automático

- **Slug**: gerado do título, com sufixo `-2`, `-3`... em caso de colisão.
- **Excerpt**: primeiros 160 chars do texto puro se não enviado.
- **Reading time**: `Math.ceil(palavras / 200) + " min de leitura"`.
- **Instagram embed**: se um `<blockquote class="instagram-media">` estiver dentro do `content`, ele é extraído para o campo dedicado. Se inválido (sem `data-instgrm-permalink` ou URL fora de `instagram.com`), o request retorna **400**.
- **Autor**: se `author_email` não for enviado, usa o email configurado em `BLOG_AGENT_DEFAULT_AUTHOR_EMAIL`.
- **Marcador**: todo post criado por essa rota recebe `source = "agent"` e aparece no admin com o badge **IA**.
- Toda criação/atualização é registrada em `activity_logs`.

## Exemplos cURL

### Listar categorias

```bash
curl "https://cyqvdmhvkogyoagkvded.functions.supabase.co/blog-agent/categories" \
  -H "x-api-key: $BLOG_AGENT_API_KEY"
```

### Listar posts publicados atualizados na última semana

```bash
curl "https://cyqvdmhvkogyoagkvded.functions.supabase.co/blog-agent/posts?is_published=true&since=2026-06-29T00:00:00Z&limit=50" \
  -H "x-api-key: $BLOG_AGENT_API_KEY"
```

### Ler um post pelo slug (para análise/otimização)

```bash
curl "https://cyqvdmhvkogyoagkvded.functions.supabase.co/blog-agent/posts/10-dicas-fraldas" \
  -H "x-api-key: $BLOG_AGENT_API_KEY"
```

### Criar novo post (auto-publicado)

```bash
curl -X POST "https://cyqvdmhvkogyoagkvded.functions.supabase.co/blog-agent/posts" \
  -H "x-api-key: $BLOG_AGENT_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "title": "10 dicas para economizar em fraldas",
    "category": "dicas",
    "content": "<p>Fraldas são um dos maiores gastos...</p>",
    "cover_image": "https://exemplo.com/capa.jpg"
  }'
```

### Otimizar post existente

```bash
# 1) buscar o id
curl ".../blog-agent/posts/10-dicas-fraldas" -H "x-api-key: $KEY"

# 2) enviar versão otimizada
curl -X PATCH ".../blog-agent/posts/<uuid>" \
  -H "x-api-key: $KEY" -H "content-type: application/json" \
  -d '{
    "title": "10 dicas comprovadas para economizar em fraldas em 2026",
    "excerpt": "Guia atualizado com preços de novembro/26...",
    "content": "<p>Versão reescrita pelo agente...</p>"
  }'
```

## Uso com n8n

Configuração do nó **HTTP Request**:

- **Method**: `POST` (ou `GET`/`PATCH` conforme a rota)
- **URL**: `https://cyqvdmhvkogyoagkvded.functions.supabase.co/blog-agent/posts`
- **Authentication**: _Generic Credential Type → Header Auth_
  - Name: `x-api-key`
  - Value: sua chave `BLOG_AGENT_API_KEY`
- **Send Headers**: `content-type: application/json`
- **Send Body**: JSON, com o payload acima

## Códigos de resposta

| Código | Significado |
|---|---|
| 200 | OK (GET, PATCH) |
| 201 | Post criado |
| 400 | Payload inválido / embed do Instagram inválido |
| 401 | `x-api-key` ausente ou inválida |
| 404 | Post/rota não encontrada |
| 429 | Rate limit (60 req/min por IP) |
| 500 | Erro interno |

## Fluxo típico do agente

1. `GET /categories` — cachear os slugs disponíveis.
2. `GET /posts?is_published=true&limit=50` — descobrir o que existe.
3. Para cada post candidato: `GET /posts/:slug` → analisar/reescrever com o LLM que preferir.
4. `PATCH /posts/:id` para otimizar OU `POST /posts` para criar novo.
5. Post vai ao ar imediatamente (a menos que `is_published: false`).
