# Piloto automático

> Configuración, próximos huecos y últimos resultados del piloto automático de un blog de Blogenia por API, con el permiso account:read.

Versión web: https://blogelia.com/docs/piloto-automatico

El piloto automático genera y publica artículos en los días y a la hora que eliges. Esta ruta de solo lectura devuelve su configuración, los próximos huecos y lo que pasó en los últimos.

> **Aviso:** Exige una clave con el permiso `account:read`. Úsala solo desde tu servidor. Ver [Permisos](https://blogelia.com/docs/autenticacion#scopes).

## Obtener el piloto automático

**`GET /blogs/{blogId}/autopilot`**: Configuración, próximos huecos y últimos resultados del piloto de un blog.

**Parámetros de ruta**

| Nombre | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `blogId` | string | Sí | Identificador del blog. |

**Campos de la respuesta**

| Campo | Tipo | Descripción |
| --- | --- | --- |
| `enabled` | boolean | `true` si el piloto está activado. |
| `mode` | string | `review` (los artículos esperan tu aprobación) o `auto` (se publican solos). |
| `scheduleType` | string | `weekly` (días fijos de la semana) o `interval` (cada cierto número de días). |
| `days` | array | Días de la semana de publicación, de 0 (domingo) a 6 (sábado). Vacío con `interval`. |
| `time` | string | Hora de publicación `HH:00`, en Europe/Madrid. |
| `nextSlots` | array | Hasta 10 próximos huecos: `[{ slotAt, status, topicTitle? }]`. `status` puede ser `planned`, `generating`, `pending_approval`, `scheduled`, `published`, `skipped`, `failed` o `missed`. |
| `lastSlots` | array | Hasta 10 últimos huecos: `[{ slotAt, result, articleId?, reason? }]`. `result` toma los mismos valores que `status`. `reason` explica un hueco saltado o fallido, por ejemplo `quota`, `no_topics`, `plan`, `suspended`, `missed`, `global_cap` o `generation_failed`. |
| `credits` | object | `{ perArticle, available }`: créditos que cuesta un artículo medio con los modelos del blog y créditos disponibles. |

**Petición**

*curl*

```bash
curl "https://api.blogelia.com/v1/blogs/66f1c0a2b3c4d5e6f7a8b9c0/autopilot" \
  -H "Authorization: Bearer $BLOGENIA_API_KEY"
```

*Node.js*

```js
const res = await fetch('https://api.blogelia.com/v1/blogs/66f1c0a2b3c4d5e6f7a8b9c0/autopilot', {
  headers: { Authorization: 'Bearer ' + process.env.BLOGENIA_API_KEY },
});
if (!res.ok) throw new Error('HTTP ' + res.status);
const body = await res.json();
console.log(body);
```

*Python*

```python
import os
import requests

res = requests.get(
    "https://api.blogelia.com/v1/blogs/66f1c0a2b3c4d5e6f7a8b9c0/autopilot",
    headers={"Authorization": "Bearer " + os.environ["BLOGENIA_API_KEY"]},
    timeout=10,
)
res.raise_for_status()
print(res.json())
```

**Respuesta**

```json
{
  "enabled": true,
  "mode": "review",
  "scheduleType": "weekly",
  "days": [1, 3],
  "time": "09:00",
  "nextSlots": [
    {
      "slotAt": "2026-11-05T08:00:00.000Z",
      "status": "generating",
      "topicTitle": "Cinco errores al reformar un baño"
    }
  ],
  "lastSlots": [
    {
      "slotAt": "2026-11-03T08:00:00.000Z",
      "result": "published",
      "articleId": "66f1c0a2b3c4d5e6f7a8b9c1"
    },
    { "slotAt": "2026-10-29T08:00:00.000Z", "result": "skipped", "reason": "no_topics" }
  ],
  "credits": { "perArticle": 8, "available": 940 }
}
```

**Respuestas**

| Código | Cuándo |
| --- | --- |
| `200` | Respuesta devuelta. |
| `404` | El blog no existe o es de otra organización. |
| `401` | Clave ausente, no válida o revocada. |
| `403` | La clave no tiene el permiso `account:read` (`code: "insufficient_scope"`), tu plan es Free (`plan_required`) o la organización está suspendida (`ORGANIZATION_SUSPENDED`). |
| `429` | Límite del plan superado. Ver [Límites de uso](https://blogelia.com/docs/limites). |
