# API de Publication sur les Réseaux Sociaux

> Connectez des comptes sociaux, programmez des posts et publiez des clips générés par IA sur YouTube, TikTok, Instagram, Facebook, X / Twitter, LinkedIn et plus encore.

## API de Publication sur les Réseaux Sociaux

Utilisez l'API de Publication sur les Réseaux Sociaux pour connecter des comptes sociaux et publier des clips WayinVideo directement sur ces comptes.

Cette API est conçue pour les clips exportés générés par [AI Clipping](https://wayin.ai/fr/api-docs/ai-clipping/) et [Find Moments](https://wayin.ai/fr/api-docs/find-moments/). Créez d'abord les clips avec l'une de ces APIs, puis assurez-vous que le projet d'origine a été soumis avec `enable_export = true`. Utilisez ensuite le `project_id` obtenu et l'`idx` du clip lors de la création d'une tâche de publication.

Flux type :

1. Créez une URL d'autorisation OAuth pour la plateforme à connecter.
2. Ouvrez l'`auth_url` retournée dans un navigateur et terminez l'autorisation.
3. Appelez l'endpoint des comptes pour confirmer le compte connecté et copier son `id`.
4. Créez une tâche de publication avec le clip cible et les paramètres propres au compte.

Tous les endpoints exigent :

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

> **Facturation :** Pendant la période promotionnelle limitée, connecter avec succès un compte social consomme actuellement **10 API Units**. Si l'autorisation n'est pas terminée avec succès, aucune API Unit n'est déduite.

---

## Endpoints

| Méthode | Chemin                                  | Description                                                                  |
| ------- | --------------------------------------- | ---------------------------------------------------------------------------- |
| `POST`  | `/api/v2/social-media/oauth/{platform}` | Crée une URL OAuth à usage unique pour une plateforme sociale                 |
| `GET`   | `/api/v2/social-media/accounts`         | Liste les comptes sociaux connectés                                          |
| `POST`  | `/api/v2/social-media/publish`          | Crée une tâche pour publier un clip sur un ou plusieurs comptes connectés     |

---

## Connecter un Compte Social

Créez une URL d'autorisation OAuth pour la plateforme à connecter.

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

### Paramètres de Chemin

| Paramètre  | Type   | Obligatoire | Description                                                                                                  |
| ---------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------------ |
| `platform` | string | Oui         | Plateforme sociale. Valeurs autorisées : `youtube`, `tiktok`, `twitter`, `instagram`, `facebook`, `linkedin`. |

### Corps de Requête

Aucun corps de requête n'est requis.

### Exemple de Requête

```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 ''
```

### Exemple de Réponse

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

### Champs de Réponse

| Champ      | Type   | Description                                                                                         |
| ---------- | ------ | --------------------------------------------------------------------------------------------------- |
| `auth_url` | string | URL de la page OAuth tierce. Ouvrez cette URL dans un navigateur pour autoriser le compte.          |
| `state`    | string | Identifiant d'état d'autorisation.                                                                  |

### Notes

- Chaque `auth_url` ne peut être utilisée qu'une seule fois. Si l'autorisation échoue ou si l'URL expire, appelez à nouveau cet endpoint pour créer une nouvelle URL.
- Une fois l'autorisation réussie, appelez [Lister les Comptes Sociaux](#lister-les-comptes-sociaux) pour confirmer que le compte est disponible pour la publication.
- Vous pouvez connecter plusieurs comptes sur la même plateforme. Par exemple, appelez plusieurs fois l'endpoint OAuth YouTube pour connecter plusieurs chaînes YouTube.
- Si le compte n'est pas connecté avec succès, aucune API Unit n'est déduite.

---

## Lister les Comptes Sociaux

Récupérez tous les comptes sociaux connectés au propriétaire de l'API key actuelle. Utilisez cet endpoint avant la publication pour obtenir les valeurs `id` utilisées par `publish_configs`.

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

### Paramètres de Requête

| Paramètre     | Type    | Obligatoire | Défaut  | Description                                                         |
| ------------- | ------- | ----------- | ------- | ------------------------------------------------------------------- |
| `active_only` | boolean | Non         | `false` | Lorsque `true`, seuls les comptes avec des tokens valides sont renvoyés. |

### Exemple de Requête

```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"
```

### Réponse Lorsqu'Aucun Compte n'Est Connecté

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

Si `data` est vide, appelez d'abord [Connecter un Compte Social](#connecter-un-compte-social).

### Réponse Lorsque des Comptes Sont Connectés

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

### Champs de Réponse

| Champ                 | Type           | Description                                                                                                                          |
| --------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `id`                  | string         | ID unique du compte social. Utilisez-le comme clé dans `publish_configs` lors de l'appel à `/publish`. N'utilisez pas le nom de plateforme. |
| `platform`            | string         | Identifiant de plateforme. Voir [Valeurs de Plateforme](#valeurs-de-plateforme).                                                     |
| `platform_username`   | string         | Nom d'utilisateur, nom de chaîne ou nom du compte sur la plateforme.                                                                  |
| `platform_avatar`     | string \| null | URL de l'image d'avatar du compte.                                                                                                    |
| `token_valid`         | boolean        | `true` signifie que le token d'autorisation est valide et que le compte peut être utilisé pour publier.                              |
| `token_expiring_soon` | boolean        | `true` signifie que le token d'autorisation expirera bientôt. Demandez à l'utilisateur de reconnecter le compte.                     |

### Utilisation Recommandée

- Avant de créer une tâche de publication, confirmez que le compte cible a `token_valid: true`.

---

## Créer une Tâche de Publication

Publiez un clip sur un ou plusieurs comptes sociaux connectés. Identifiez le clip en envoyant l'ID du projet et l'index du clip.

> **Obligatoire :** Le `project_id` doit provenir d'une tâche AI Clipping ou Find Moments soumise avec `enable_export = true`. La publication sociale exige une vidéo de clip exportée ; les projets créés sans export activé ne peuvent pas être publiés avec cet endpoint.

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

### Champs de Requête

| Champ             | Type            | Obligatoire | Description                                                                                              |
| ----------------- | --------------- | ----------- | -------------------------------------------------------------------------------------------------------- |
| `project_id`      | string          | Oui         | ID du projet.                                                                                            |
| `idx`             | integer         | Oui         | Index du clip dans le projet.                                                                            |
| `resolution`      | string          | Non         | Résolution d'export utilisée par le clip exporté, par exemple `1080p` ou `720p`.                         |
| `publish_configs` | object          | Oui         | Paramètres de publication indexés par l'ID de compte social retourné par l'endpoint des comptes.         |
| `scheduled_at`    | integer \| null | Non         | Timestamp en millisecondes pour une publication planifiée. Utilisez `null` ou omettez ce champ pour publier immédiatement. |

> **Comment générer une valeur `scheduled_at`**
>
> `scheduled_at` est un timestamp Unix en millisecondes. Il doit être au moins 5 minutes dans le futur et au plus 30 jours dans le futur.
>
> Pour planifier une publication dans 10 minutes en JavaScript :
>
> ```js
> const scheduledAt = Date.now() + 10 * 60 * 1000;
> ```
>
> Pour planifier à une heure précise :
>
> ```js
> const scheduledAt = new Date('2026-06-15T10:00:00Z').getTime();
> ```

### Configuration de Publication par Plateforme

Chaque valeur de `publish_configs` est un objet de configuration de publication propre à la plateforme.

| Champ              | Type     | Obligatoire              | Description                                                                              |
| ------------------ | -------- | ------------------------ | ---------------------------------------------------------------------------------------- |
| `title`            | string   | Obligatoire sous condition | Titre de la vidéo. Obligatoire pour YouTube.                                            |
| `description`      | string   | Obligatoire sous condition | Description de la vidéo ou texte du post. Obligatoire pour TikTok.                     |
| `tags`             | string[] | Non                      | Liste de tags.                                                                           |
| `visibility`       | string   | Non                      | Visibilité : `public`, `private` ou `unlisted`. Le support varie selon la plateforme.    |
| `thumbnail_url`    | string   | Non                      | URL d'image de miniature personnalisée.                                                  |
| `category`         | string   | Non                      | Catégorie vidéo propre à la plateforme.                                                  |
| `allow_comment`    | boolean  | Non                      | Indique si les commentaires sont autorisés.                                              |
| `allow_duet`       | boolean  | Non                      | Indique si les duos sont autorisés. TikTok uniquement.                                   |
| `allow_stitch`     | boolean  | Non                      | Indique si les stitches sont autorisés. TikTok uniquement.                               |
| `disclose_content` | boolean  | Non                      | Indique si le contenu promotionnel ou publicitaire doit être déclaré. TikTok uniquement. |

> **Important :** Les clés dans `publish_configs` doivent être des IDs de compte retournés par `/api/v2/social-media/accounts`, comme `smacct06ixxxxxxx`. N'utilisez pas `youtube`, `tiktok` ni d'autres noms de plateforme comme clés.

### Exemple de Requête

```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
  }'
```

### Exemple de Réponse

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

### Champs de Réponse

| Champ          | Type            | Description                                                                                       |
| -------------- | --------------- | ------------------------------------------------------------------------------------------------- |
| `task_id`      | string          | ID unique de la tâche de publication.                                                             |
| `status`       | string          | Statut de la tâche de publication. Voir [Valeurs de Statut de Publication](#valeurs-de-statut-de-publication). |
| `created_at`   | integer         | Timestamp de création de la tâche en millisecondes.                                               |
| `schedule_id`  | string \| null  | ID de planification. Renvoyé lorsque `scheduled_at` est fourni.                                   |
| `scheduled_at` | integer \| null | Timestamp de publication planifiée en millisecondes.                                              |

Vous pouvez consulter les planifications et les résultats en temps réel sur le [calendrier WayinVideo](https://wayin.ai/wayinvideo/calendar).

---

## Valeurs de Plateforme

| Valeur      | Plateforme  | 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  |

## Valeurs de Statut de Publication

| Valeur         | Description                                                                                  |
| -------------- | -------------------------------------------------------------------------------------------- |
| `PENDING`      | La tâche a été créée et attend d'être planifiée.                                             |
| `SCHEDULED`    | La tâche a été planifiée et attend l'heure prévue.                                           |
| `PROCESSING`   | La publication est en cours, y compris l'upload vidéo et le traitement côté plateforme.      |
| `DONE`         | La publication a réussi.                                                                     |
| `PARTIAL_DONE` | Certains comptes ont réussi et d'autres ont échoué. Possible uniquement avec plusieurs comptes. |
| `ERROR`        | La publication a échoué.                                                                     |
| `CANCELLED`    | La publication a été annulée.                                                                |

---

## Exemple de Flux Complet

### Étape 1 : Créer une URL OAuth 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 ''
```

Ouvrez l'`auth_url` retournée dans un navigateur et terminez l'autorisation.

### Étape 2 : Lister les Comptes Disponibles

```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"
```

Copiez l'`id` du compte sur lequel vous voulez publier.

### Étape 3 : Publier un Clip

```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
  }'
```

---

## Notes

1. Les clés de `publish_configs` sont des IDs de compte, pas des noms de plateforme.
2. Pour planifier une publication, envoyez `scheduled_at` comme timestamp futur en millisecondes.
3. Le même clip peut être publié plusieurs fois sur des comptes différents. Republier le même clip sur le même compte crée une tâche indépendante.
4. La publication sociale exige une vidéo de clip exportée. Utilisez le `project_id` d'une tâche AI Clipping ou Find Moments créée avec `enable_export = true`.
5. Si la publication retourne une erreur de token de compte, reconnectez ce compte social puis réessayez.
