# API do Bom Dia, Artisan

Base: `https://bom-dia-artisan.dev/api`

API pública e somente leitura. Toda resposta é JSON, com `Content-Type: application/json`.

## GET /api/reports

Lista todas as edições publicadas, da mais recente à mais antiga.

```sh
curl https://bom-dia-artisan.dev/api/reports
```

Resposta: array de edições.

```json
[
  {
    "date": "2026-09-30",
    "title": "Edição de 30 de setembro de 2026",
    "generatedAt": "2026-09-30T08:00:00-03:00",
    "summary": "Resumo curto das mudanças mais relevantes do dia.",
    "sections": [
      {
        "name": "Laravel Framework",
        "items": [
          {
            "title": "Título da atualização",
            "description": "Resumo curto.",
            "status": "Merged",
            "details": "Detalhes em Markdown.",
            "url": "https://github.com/laravel/framework/pull/00000",
            "source": "laravel/framework"
          }
        ]
      }
    ],
    "sources": [{ "title": "Fonte", "url": "https://github.com/laravel/framework" }],
    "metadata": { "timezone": "America/Sao_Paulo" }
  }
]
```

## GET /api/reports/{date}

Uma única edição. `date` usa o formato `YYYY-MM-DD`.

```sh
curl https://bom-dia-artisan.dev/api/reports/2026-09-30
```

Resposta: o mesmo objeto de edição, sem array.

## Campos

- `date`: data da edição (`YYYY-MM-DD`);
- `title`: título da edição;
- `generatedAt`: quando a edição foi gerada, em ISO 8601;
- `summary`: resumo curto;
- `sections[].name`: nome da seção;
- `sections[].items[]`: itens da seção, com `title`, `description`, `details` (Markdown), `status` (`Released`, `Merged` ou `Recommended`), `url` e `source`;
- `sources[]`: fontes citadas, com `title` e `url`;
- `metadata`: metadados livres da edição.

## Limite de requisições

10 requisições a cada 60 segundos por IP, nas rotas `/api/*`.

Toda resposta traz:

- `X-RateLimit-Limit`: teto da janela atual;
- `X-RateLimit-Remaining`: requisições restantes na janela;
- `X-RateLimit-Reset`: fim da janela, em segundos Unix.

Ao estourar o limite, a API responde `429` com `Retry-After`:

```json
{ "statusCode": 429, "statusMessage": "Muitas requisições" }
```

## Erros

Erros usam `statusCode` e `statusMessage`:

```json
{ "statusCode": 404, "statusMessage": "Relatório não encontrado" }
```

`404`: data inexistente ou fora do formato `YYYY-MM-DD`.

## Formatos alternativos

- [Página inicial em Markdown](https://bom-dia-artisan.dev/index.md)
- [Edição em Markdown](https://bom-dia-artisan.dev/reports/2026-09-30.md)
- [Feed RSS](https://bom-dia-artisan.dev/feed.xml)
- [llms.txt](https://bom-dia-artisan.dev/llms.txt)
- [Documentação da API](https://bom-dia-artisan.dev/api-docs.md): este documento
