# API de Publicação em Redes Sociais

> Conecte contas sociais, agende posts e publique clipes gerados por IA no YouTube, TikTok, Instagram, Facebook, X / Twitter, LinkedIn e outras plataformas.

## API de Publicação em Redes Sociais

Use a API de Publicação em Redes Sociais para conectar contas de redes sociais e publicar clipes do WayinVideo diretamente nessas contas.

Esta API foi criada para clipes exportados gerados por [Clipping com IA](https://wayin.ai/pt/api-docs/ai-clipping/) e [Buscar Momentos](https://wayin.ai/pt/api-docs/find-moments/). Crie os clipes com uma dessas APIs primeiro e garanta que o projeto original tenha sido enviado com `enable_export = true`. Depois, use o `project_id` e o `idx` do clipe ao criar a tarefa de publicação.

Fluxo típico:

1. Crie uma URL de autorização OAuth para a plataforma que deseja conectar.
2. Abra o `auth_url` retornado em um navegador e conclua a autorização.
3. Chame o endpoint de contas para confirmar a conta conectada e copiar seu `id`.
4. Crie uma tarefa de publicação com o clipe de destino e as configurações específicas da conta.

Todos os endpoints exigem:

```http
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
x-wayinvideo-api-version: v2
```

> **Cobrança:** Durante o período promocional por tempo limitado, conectar com sucesso uma conta de rede social consome atualmente **10 API Units**. Se a autorização não for concluída com sucesso, nenhuma API Unit será descontada.

---

## Endpoints

| Método | Caminho                                | Descrição                                                               |
| ------ | -------------------------------------- | ----------------------------------------------------------------------- |
| `POST` | `/api/v2/social-media/oauth/{platform}` | Cria uma URL OAuth de uso único para uma plataforma de rede social      |
| `GET`  | `/api/v2/social-media/accounts`        | Lista contas de redes sociais conectadas                                |
| `POST` | `/api/v2/social-media/publish`         | Cria uma tarefa para publicar um clipe em uma ou mais contas conectadas |

---

## Conectar uma Conta de Rede Social

Crie uma URL de autorização OAuth para a plataforma que deseja conectar.

```
POST https://wayinvideo-api.wayin.ai/api/v2/social-media/oauth/{platform}
```

### Parâmetros de Caminho

| Parâmetro  | Tipo   | Obrigatório | Descrição                                                                                                    |
| ---------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------------ |
| `platform` | string | Sim         | Plataforma de rede social. Valores permitidos: `youtube`, `tiktok`, `twitter`, `instagram`, `facebook`, `linkedin`. |

### Corpo da Requisição

Nenhum corpo de requisição é necessário.

### Exemplo de Requisição

```bash
curl -X POST https://wayinvideo-api.wayin.ai/api/v2/social-media/oauth/youtube \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2" \
  --data ''
```

### Exemplo de Resposta

```json
{
  "data": {
    "auth_url": "https://example.com/oauth2/auth?xxxxxx",
    "state": "a49bc736-xxxxx"
  }
}
```

### Campos da Resposta

| Campo      | Tipo   | Descrição                                                                                     |
| ---------- | ------ | --------------------------------------------------------------------------------------------- |
| `auth_url` | string | URL da página OAuth de terceiros. Abra esta URL em um navegador para autorizar a conta.       |
| `state`    | string | Identificador de estado da autorização.                                                       |

### Observações

- Cada `auth_url` pode ser usado apenas uma vez. Se a autorização falhar ou a URL expirar, chame este endpoint novamente para criar uma nova URL.
- Após a autorização ser concluída com sucesso, chame [Listar Contas de Redes Sociais](#listar-contas-de-redes-sociais) para confirmar que a conta está disponível para publicação.
- Você pode conectar várias contas na mesma plataforma. Por exemplo, chame o endpoint OAuth do YouTube várias vezes para conectar vários canais do YouTube.
- Se a conta não for conectada com sucesso, nenhuma API Unit será descontada.

---

## Listar Contas de Redes Sociais

Obtenha todas as contas de redes sociais conectadas ao proprietário da API key atual. Use este endpoint antes de publicar para encontrar os valores de `id` usados em `publish_configs`.

```
GET https://wayinvideo-api.wayin.ai/api/v2/social-media/accounts?active_only={active_only}
```

### Parâmetros de Consulta

| Parâmetro     | Tipo    | Obrigatório | Padrão  | Descrição                                                      |
| ------------- | ------- | ----------- | ------- | -------------------------------------------------------------- |
| `active_only` | boolean | Não         | `false` | Quando `true`, retorna apenas contas com tokens válidos.       |

### Exemplo de Requisição

```bash
curl -X GET "https://wayinvideo-api.wayin.ai/api/v2/social-media/accounts?active_only=true" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2"
```

### Resposta Quando Nenhuma Conta Está Conectada

```json
{
  "data": []
}
```

Se `data` estiver vazio, chame [Conectar uma Conta de Rede Social](#conectar-uma-conta-de-rede-social) primeiro.

### Resposta Quando Há Contas Conectadas

```json
{
  "data": [
    {
      "id": "smaccxxx",
      "platform": "youtube",
      "platform_username": "MyChannel",
      "platform_avatar": "https://example.com/avatar.jpg",
      "token_valid": true,
      "token_expiring_soon": false
    }
  ]
}
```

### Campos da Resposta

| Campo                 | Tipo           | Descrição                                                                                                                      |
| --------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `id`                  | string         | ID único da conta social. Use-o como chave em `publish_configs` ao chamar `/publish`. Não use o nome da plataforma como chave. |
| `platform`            | string         | Identificador da plataforma. Veja [Valores de Plataforma](#valores-de-plataforma).                                             |
| `platform_username`   | string         | Nome de usuário, nome do canal ou nome da conta na plataforma.                                                                 |
| `platform_avatar`     | string \| null | URL da imagem de avatar da conta.                                                                                              |
| `token_valid`         | boolean        | `true` significa que o token de autorização é válido e a conta pode ser usada para publicação.                                 |
| `token_expiring_soon` | boolean        | `true` significa que o token de autorização expirará em breve. Peça ao usuário para reconectar a conta.                        |

### Uso Recomendado

- Antes de criar uma tarefa de publicação, confirme que a conta de destino tem `token_valid: true`.

---

## Criar uma Tarefa de Publicação

Publique um clipe em uma ou mais contas de redes sociais conectadas. Identifique o clipe enviando o ID do projeto e o índice do clipe.

> **Obrigatório:** O `project_id` deve vir de uma tarefa de Clipping com IA ou Buscar Momentos enviada com `enable_export = true`. A publicação social exige um vídeo de clipe exportado; projetos criados sem exportação ativada não podem ser publicados com este endpoint.

```
POST https://wayinvideo-api.wayin.ai/api/v2/social-media/publish
```

### Campos da Requisição

| Campo             | Tipo            | Obrigatório | Descrição                                                                                              |
| ----------------- | --------------- | ----------- | ------------------------------------------------------------------------------------------------------ |
| `project_id`      | string          | Sim         | ID do projeto.                                                                                         |
| `idx`             | integer         | Sim         | Índice do clipe dentro do projeto.                                                                     |
| `resolution`      | string          | Não         | Resolução de exportação usada pelo clipe exportado, como `1080p` ou `720p`.                            |
| `publish_configs` | object          | Sim         | Configurações de publicação indexadas pelo ID da conta social retornado pelo endpoint de contas.       |
| `scheduled_at`    | integer \| null | Não         | Timestamp em milissegundos para publicação agendada. Use `null` ou omita este campo para publicar agora. |

> **Como gerar um valor `scheduled_at`**
>
> `scheduled_at` é um timestamp Unix em milissegundos. Ele deve estar pelo menos 5 minutos no futuro e no máximo 30 dias no futuro.
>
> Para agendar uma publicação para 10 minutos a partir de agora em JavaScript:
>
> ```js
> const scheduledAt = Date.now() + 10 * 60 * 1000;
> ```
>
> Para agendar em um horário específico:
>
> ```js
> const scheduledAt = new Date('2026-06-15T10:00:00Z').getTime();
> ```

### Configuração de Publicação da Plataforma

Cada valor em `publish_configs` é um objeto de configuração de publicação específico da plataforma.

| Campo              | Tipo     | Obrigatório              | Descrição                                                                            |
| ------------------ | -------- | ------------------------ | ------------------------------------------------------------------------------------ |
| `title`            | string   | Condicionalmente obrigatório | Título do vídeo. Obrigatório para YouTube.                                       |
| `description`      | string   | Condicionalmente obrigatório | Descrição do vídeo ou texto do post. Obrigatório para TikTok.                   |
| `tags`             | string[] | Não                      | Lista de tags.                                                                        |
| `visibility`       | string   | Não                      | Visibilidade: `public`, `private` ou `unlisted`. O suporte varia por plataforma.     |
| `thumbnail_url`    | string   | Não                      | URL da imagem de thumbnail personalizada.                                             |
| `category`         | string   | Não                      | Categoria de vídeo específica da plataforma.                                          |
| `allow_comment`    | boolean  | Não                      | Se comentários são permitidos.                                                        |
| `allow_duet`       | boolean  | Não                      | Se duetos são permitidos. Apenas TikTok.                                              |
| `allow_stitch`     | boolean  | Não                      | Se stitches são permitidos. Apenas TikTok.                                            |
| `disclose_content` | boolean  | Não                      | Se conteúdo promocional ou publicitário deve ser declarado. Apenas TikTok.           |

> **Importante:** As chaves dentro de `publish_configs` devem ser IDs de conta retornados por `/api/v2/social-media/accounts`, como `smacct06ixxxxxxx`. Não use `youtube`, `tiktok` ou outros nomes de plataforma como chaves.

### Exemplo de Requisição

```bash
curl -sS -X POST https://wayinvideo-api.wayin.ai/api/v2/social-media/publish \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2" \
  -d '{
    "project_id": "prj06ixxxxxxx",
    "idx": 0,
    "resolution": "1080p",
    "publish_configs": {
      "smacct06ixxxxxxx": {
        "title": "API Test Video",
        "description": "Posted by curl test",
        "tags": ["api", "test"],
        "visibility": "public"
      }
    },
    "scheduled_at": null
  }'
```

### Exemplo de Resposta

```json
{
  "data": {
    "task_id": "pubtask06ixxxxxxx",
    "status": "PENDING",
    "created_at": 1781251687210
  }
}
```

### Campos da Resposta

| Campo          | Tipo            | Descrição                                                                       |
| -------------- | --------------- | -------------------------------------------------------------------------------- |
| `task_id`      | string          | ID único da tarefa de publicação.                                                |
| `status`       | string          | Status da tarefa de publicação. Veja [Valores de Status de Publicação](#valores-de-status-de-publicação). |
| `created_at`   | integer         | Timestamp de criação da tarefa em milissegundos.                                 |
| `schedule_id`  | string \| null  | ID do agendamento. Retornado quando `scheduled_at` é informado.                  |
| `scheduled_at` | integer \| null | Timestamp de publicação agendada em milissegundos.                               |

Você pode ver agendamentos de publicação e resultados em tempo real na [agenda do WayinVideo](https://wayin.ai/wayinvideo/calendar).

---

## Valores de Plataforma

| Valor       | Plataforma  | Site                  |
| ----------- | ----------- | --------------------- |
| `youtube`   | YouTube     | https://youtube.com   |
| `tiktok`    | TikTok      | https://tiktok.com    |
| `twitter`   | Twitter / X | https://twitter.com   |
| `instagram` | Instagram   | https://instagram.com |
| `facebook`  | Facebook    | https://facebook.com  |
| `linkedin`  | LinkedIn    | https://linkedin.com  |

## Valores de Status de Publicação

| Valor          | Descrição                                                                                |
| -------------- | ---------------------------------------------------------------------------------------- |
| `PENDING`      | A tarefa foi criada e está aguardando agendamento.                                       |
| `SCHEDULED`    | A tarefa foi agendada e está aguardando o horário programado.                            |
| `PROCESSING`   | A publicação está em andamento, incluindo upload do vídeo e processamento da plataforma. |
| `DONE`         | A publicação foi concluída com sucesso.                                                  |
| `PARTIAL_DONE` | Algumas contas tiveram sucesso e outras falharam. Só é possível ao publicar em várias contas. |
| `ERROR`        | A publicação falhou.                                                                      |
| `CANCELLED`    | A publicação foi cancelada.                                                              |

---

## Exemplo de Fluxo Completo

### Etapa 1: Criar uma URL OAuth do YouTube

```bash
curl -X POST https://wayinvideo-api.wayin.ai/api/v2/social-media/oauth/youtube \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2" \
  --data ''
```

Abra o `auth_url` retornado em um navegador e conclua a autorização.

### Etapa 2: Listar Contas Disponíveis

```bash
curl -X GET "https://wayinvideo-api.wayin.ai/api/v2/social-media/accounts?active_only=true" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2"
```

Copie o `id` da conta em que deseja publicar.

### Etapa 3: Publicar um Clipe

```bash
curl -sS -X POST https://wayinvideo-api.wayin.ai/api/v2/social-media/publish \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "x-wayinvideo-api-version: v2" \
  -d '{
    "project_id": "prj06ixxxxxxx",
    "idx": 0,
    "resolution": "1080p",
    "publish_configs": {
      "smacct06ixxxxxxx": {
        "title": "API Test Video",
        "description": "Posted by curl test",
        "tags": ["api", "test"],
        "visibility": "public"
      }
    },
    "scheduled_at": null
  }'
```

---

## Observações

1. As chaves de `publish_configs` são IDs de conta, não nomes de plataforma.
2. Para agendar uma publicação, envie `scheduled_at` como um timestamp futuro em milissegundos.
3. O mesmo clipe pode ser publicado várias vezes em contas diferentes. Publicar o mesmo clipe na mesma conta novamente cria uma tarefa independente.
4. A publicação social exige um vídeo de clipe exportado. Use o `project_id` de uma tarefa de Clipping com IA ou Buscar Momentos criada com `enable_export = true`.
5. Se a publicação retornar um erro de token da conta, reconecte essa conta de rede social e tente novamente.
