# Publicar um vídeo ponta a ponta

> Passo a passo para publicar um vídeo pela API do Praeko: subir a mídia, criar o post com um item por rede, escolher fila ou horário e conferir o resultado.

Fonte: https://praeko.app/docs/guides/publish-a-video

O caminho completo, do arquivo no disco ao item publicado na rede. Cada passo tem a rota na [referência](https://praeko.app/docs/api).

1. **Mídia**: Cria a mídia e envia os bytes (`/v1/media`).
2. **Post**: Um item por rede, com fila, horário fixo ou rascunho (`/v1/posts`).
3. **Praeko**: Publica no horário e tenta de novo se a rede falhar.
4. **Seu código**: Lê o estado do post ou recebe um webhook.

### 1. Conferir os canais

`GET /v1/channels` lista os canais conectados e quantos horários cada um tem. Conecte as redes no painel, em Canais; o item com `connected: false` ainda não foi conectado.

**curl**

```bash
curl https://praeko.app/v1/channels \
  -H "Authorization: Bearer $PRAEKO_KEY" -H "X-Praeko-Contract: en"
```

### 2. Subir o vídeo

`POST /v1/media` cria a mídia. Até 50 MiB, com `simple: true`, envie o arquivo todo em `PUT /v1/media/:id/content`. Acima disso, o envio é em partes: veja [Enviar mídia](https://praeko.app/docs/guides/media).

**curl**

```bash
curl -X POST https://praeko.app/v1/media \
  -H "Authorization: Bearer $PRAEKO_KEY" -H "X-Praeko-Contract: en" \
  -H "Content-Type: application/json" \
  -d '{ "type": "video", "name": "v.mp4", "mime": "video/mp4", "size": 8123456, "simple": true }'
# resposta: { "id": "…", "state": "uploading", … }
curl -X PUT https://praeko.app/v1/media/$MEDIA_ID/content \
  -H "Authorization: Bearer $PRAEKO_KEY" -H "Content-Type: video/mp4" \
  --data-binary @v.mp4
```

### 3. Criar o post

Um post tem um item por rede. Cada item usa o próximo horário livre do canal (`queue: true`), um horário fixo (`scheduledFor`, em ISO 8601 UTC) ou fica como rascunho (`draft: true`). O texto de cada rede vai em `texts`. Com `mode` você escolhe a visibilidade: YouTube `private`, `scheduled` ou `public`; TikTok `draft` ou `direct`; Instagram `now`.

**curl**

```bash
curl -X POST https://praeko.app/v1/posts \
  -H "Authorization: Bearer $PRAEKO_KEY" -H "X-Praeko-Contract: en" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Meu vídeo",
        "media": { "video": "'$MEDIA_ID'" },
        "texts": { "youtube": { "text": "Descrição" }, "tiktok": { "text": "Legenda" } },
        "items": [
          { "network": "youtube", "queue": true },
          { "network": "tiktok", "scheduledFor": "2026-11-10T20:30:00Z" }
        ] }'
```

A resposta é `201` com o `id` do post e um item por rede, cada um com `state` e `scheduledFor`.

### 4. Conferir o resultado

`GET /v1/posts/:id` devolve o post com os itens. O `state` de um item é `draft`, `scheduled`, `sent`, `private` (no YouTube, enviado como privado, esperando você), `error` ou `canceled`. Para não ficar perguntando, [cadastre um webhook](https://praeko.app/docs/guides/webhooks): `post.sent` avisa quando saiu e `post.failed` quando o item desistiu.

## Depois de criar

| Quero | Rota |
|---|---|
| Mudar título, texto, horário ou mover para o rascunho | [`PATCH /v1/posts/:id`](https://praeko.app/docs/api/posts/update-post) |
| Publicar agora um item da fila | [`POST /v1/posts/:id/publish-now`](https://praeko.app/docs/api/posts/publish-now) |
| Cancelar os itens pendentes | [`DELETE /v1/posts/:id`](https://praeko.app/docs/api/posts/cancel-post) |
| Ver o que está agendado e os horários livres | [`GET /v1/calendar`](https://praeko.app/docs/api/calendar/calendar) |

> **YouTube já enviado e ainda agendado** Quando o Praeko já subiu o vídeo como privado com horário de publicação, o `PATCH /v1/posts/:id` ainda muda o horário (pelo menos 5 minutos à frente), o título, a descrição e o comentário fixo, conferindo o vídeo ao vivo; a resposta traz `itemResults` por item. Vídeo já público responde `409 video_not_private`; horário que já passou, `409 not_editable`. Cancelar com `DELETE` **não** segura esse vídeo: o YouTube o publica no horário. Use `?dismiss=true` para tirar o horário (ele fica privado) ou `?dismiss=true&delete_video=true` para apagá-lo.

> **Trocar a mídia de um post já agendado** Mudar o vídeo de um post que já está agendado responde `409 media_locked`; apagar uma mídia usada por um post pendente responde `409 media_in_use`.

> **Reenviar o POST cria outro post** Mande o cabeçalho `Idempotency-Key` e a repetição recebe a resposta da primeira vez, sem criar outro post: [saiba como](https://praeko.app/docs/guides/idempotency). Sem o cabeçalho, mande o seu próprio `id` (repetido, volta `409 id_exists`).
