Tout ce que dit cette page vaut pour chaque endpoint de /v1 : un seul
gestionnaire de votre côté lit tous les refus, et une seule politique de relance
couvre tous les appels.
Une seule forme d’erreur
Quel que soit le statut, une erreur répond le même corps :
{
"code": "not_found",
"message": "no asset of this organization has this id",
"request_id": "0192a6d3-5e6f-7a8b-9c0d-1e2f3a4b5c6d"
}
codeest ce sur quoi votre code se branche. Un code garde son sens pour toujours, et la liste peut s’allonger : lisez un code inconnu d’après le statut HTTP qui l’accompagne.messageest en anglais et s’adresse à une personne — journalisez-le, montrez-le à un développeur, ne vous branchez jamais dessus : il peut changer à tout moment.request_ididentifie la requête : citez-le quand vous nous écrivez à propos d’un échec. Il est absent, jamaisnull, quand le serveur n’en a pas.
Statuts et codes
| Statut | code |
Ce qui s’est passé | Que faire |
|---|---|---|---|
400 |
validation |
Un paramètre, ou une valeur du corps, que les règles de l’endpoint refusent. Le message dit lequel. | Corriger la requête. |
401 |
unauthorized |
Pas d’en-tête Authorization: Bearer, ou une clé inconnue, expirée ou révoquée. |
Envoyer une clé valide. |
403 |
forbidden |
La clé ne porte pas la permission que demande l’endpoint ; ou l’organisation n’a pas ce qu’il sert — des chaînes ; ou l’asset est en lecture seule (voir plus bas). | Utiliser une clé créée avec cette permission. |
404 |
not_found |
Rien de ce que votre organisation peut atteindre ne porte cet identifiant — dans le chemin ou dans le corps. | — |
409 |
conflict |
La requête contredit l’état de la ressource (voir plus bas). | Relire l’état actuel plutôt que renvoyer la même requête. |
413 |
payload_too_large |
Un fichier de plus de 10 Gio, ou une vignette de plus de 10 Mio. | Envoyer moins. |
415 |
unsupported_media_type |
Un corps envoyé sous un Content-Type que l’endpoint ne prend pas. |
Envoyer du JSON, ou l’image sous son type. |
422 |
validation |
Un corps JSON qui n’est pas la requête : un champ manquant, mal typé, ou que le corps ne connaît pas. | Corriger le corps. |
429 |
rate_limited |
Plus que ce que l’API accepte en ce moment, de cette clé ou de son organisation. | Attendre les secondes que donne Retry-After, puis renvoyer. |
500 |
internal |
Un échec de notre côté. | Relancer avec un délai croissant ; citer le request_id si ça dure. |
502 |
upstream_error |
Un service interrogé pour vous a échoué — le fournisseur d’une vidéo hébergée ailleurs, par exemple. Rien n’a été créé. | Renvoyer la requête un peu plus tard. |
503 |
service_unavailable |
Le service ne peut pas répondre pour l’instant. | Relancer avec un délai croissant. |
504 |
timed_out |
Le serveur a cessé d’attendre cette requête. | Un GET, un PATCH ou un PUT se renvoie sans risque ; pour un POST, voir plus bas. |
La référence de l’API liste, pour chaque endpoint, les refus qu’il peut répondre.
Un corps refusé : 415, 422 ou 400
Chaque corps est du JSON, sauf celui d’une vignette, qui est l’image elle-même. Un corps refusé l’est pour l’une de trois raisons, et chacune a son statut :
415— il n’est pas envoyé sous le bonContent-Type: un corps JSON hors deapplication/json, une vignette hors deimage/jpeg,image/pngouimage/webp;422— ce n’est pas la requête : un champ obligatoire manque, un champ a le mauvais type, ou le corps nomme un champ que la requête ne liste pas ;400— c’est bien la requête, mais une valeur est refusée par ses règles : trop longue, mal formée, contradictoire avec une autre. Le message nomme le champ.
L’API n’ignore pas ce qu’elle ne comprend pas : un champ inconnu dans un corps
est refusé plutôt qu’ignoré, et de même pour un paramètre de requête — que
l’endpoint ne connaît pas, ou donné deux fois (400). ?typ=video est refusé
plutôt que servi sans filtre, et une écriture ne prend aucun paramètre de requête.
Une faute de frappe est donc une erreur que vous voyez tout de suite, jamais un
réglage ignoré en silence.
Un identifiant dans un corps : 404
Un identifiant envoyé dans un corps — un workspace, une chaîne, un asset, un champ
personnalisé — qui ne désigne rien que votre clé puisse atteindre vaut un
404, qu’il ne désigne rien du tout ou quelque chose d’une autre organisation.
C’est la même réponse que pour un identifiant dans le chemin.
Les catégories d’une publication font exception : une catégorie qui n’est pas
de la chaîne de la publication est refusée par un 400, qui la nomme.
Les 403 qui ne sont pas une permission
Une clé qui porte la bonne permission peut quand même recevoir un 403 :
- l’organisation ne publie pas de chaînes : chaque endpoint des chaînes, des
catégories et des publications répond
403à toutes ses clés ; - l’asset est validé dans le fonds commun de l’organisation : il est en
lecture seule pour l’API, et chacune des requêtes qui le modifient répond
403, quelles que soient les permissions de la clé — seuls les modérateurs du fonds commun le modifient, depuis Videas. Voir Modifier un asset.
Ni l’un ni l’autre ne se relance.
Les 409
Un 409 dit que la requête contredit l’état de la ressource. Relire cet état dit
quoi faire :
| Requête | Le 409 |
Que faire |
|---|---|---|
DELETE /v1/uploads/{upload_id} |
L’upload est déjà terminé : son fichier appartient à l’asset. | Rien : l’upload ne s’abandonne plus. |
PUT /v1/assets/{asset_id}/tags |
Un tag en cours de création pour l’un de vos mots a été supprimé au même instant. | Renvoyer la requête. |
POST /v1/publications |
L’asset est déjà publié sur cette chaîne. | GET /v1/publications?channel_id=…&asset_id=… répond sa publication. |
POST /v1/publications |
L’asset n’est pas encore ready. |
La renvoyer une fois l’asset prêt. |
POST et PATCH /v1/publications |
Le slug est pris par une autre publication ou une page de la chaîne. |
Choisir une autre adresse — le message nomme celle qui est prise. |
PATCH /v1/publications/{publication_id} |
access ferait sortir une publication restricted, paid ou on_request. |
Rien par l’API : ces accès se règlent depuis Videas. |
| Toute écriture sur les chaînes | Les chaînes de l’organisation sont en cours de transfert vers Videas, et se modifient depuis la plateforme d’où elles viennent jusqu’à la fin du transfert. | Attendre la fin du transfert. Les lectures répondent normalement. |
Relancer
429: attendez le nombre de secondes que donneRetry-After, puis renvoyez la même requête.500,502,503,504: relancez avec un délai croissant — un back-off exponentiel.- Un
GETse renvoie toujours sans risque, et unPATCHou unPUTaussi : chacun dit ce que la ressource doit porter, et envoyé deux fois, le second la trouve déjà dans cet état et n’écrit rien. DELETE /v1/uploads/{upload_id}se renvoie sans risque : un upload déjà abandonné, expiré ou en échec répond204et reste tel quel.- Un
POSTcrée quelque chose : après une expiration ou une5xx, cherchez ce que le premier a pu créer avant de le renvoyer.POST /v1/uploadsetPOST /v1/assetsne sont pas idempotents : envoyés deux fois, ils créent deux assets. Renseignezexternal_refà chaque fois, et cherchez-le avecGET /v1/assets?external_ref=avant de renvoyer — pour un fichier comme pour une vidéo hébergée ailleurs.POST /v1/publicationspublie un asset une seule fois sur une chaîne : renvoyé, il répond409, etGET /v1/publications?channel_id=…&asset_id=…retrouve la publication que le premier a créée.
Limites
Voici les limites que publie le contrat :
| Limite | Valeur |
|---|---|
| Un fichier, envoyé ou récupéré depuis un lien | 10 Gio |
Un PUT vers upload_url, un chunk tus |
le max_put_bytes de l’upload |
| Un chunk tus, sauf le dernier | 5 Mio au moins |
| Délai pour envoyer un fichier | jusqu’au expires_at de l’upload |
| Redirections suivies pour récupérer un lien | cinq, jamais de https vers http |
| Liens en attente ou en cours de téléchargement, par organisation | bornés — au-delà, un 429 avec Retry-After |
| Une vignette | 10 Mio, en JPEG, PNG ou WebP |
name, external_ref d’un asset |
500 caractères |
description d’un asset |
50 000 caractères |
excerpt, copyright, seo_description d’un asset |
1 000 caractères |
seo_title d’un asset |
255 caractères |
| Tags d’un asset, en une requête | 100 mots, de 100 caractères chacun |
| Valeurs de champs personnalisés, en une requête | 200, de 256 Kio chacune |
| Catégories d’une publication | 100 |
slug d’une publication |
255 caractères |
| Lignes par page | limit, ramené au plafond de l’endpoint s’il le dépasse |
Au-delà, toute requête peut être refusée par un 429 quand une clé, ou son
organisation, envoie plus que ce que l’API accepte : la réponse porte toujours
Retry-After, et attendre ce délai est tout ce qu’elle demande.
Ce qui peut changer sous /v1
Sans nouvelle version, l’API peut gagner :
- un nouvel endpoint ;
- un nouveau paramètre de requête facultatif ;
- un nouveau champ dans une réponse ;
- une nouvelle valeur dans une liste de valeurs — le
coded’une erreur ou d’un échec, lestatusd’un upload, et celles du tableau ci-dessous.
Écrivez votre client pour qu’il lise un champ ou une valeur inconnus comme quelque chose qu’il ne connaît pas encore, pas comme une erreur. Pour certaines listes, le contrat dit comment lire une valeur inconnue :
| Liste | Une valeur inconnue se lit comme |
|---|---|
Le type et le status d’un asset |
une valeur que votre client ne traite pas encore |
third_party.provider |
other |
Le type d’un champ personnalisé |
un champ que votre client ne lit ni n’écrit |
Le status d’une publication |
une publication que la chaîne ne montre pas |
L’access d’une publication |
restricted |
Jamais sous /v1 : retirer ou renommer quoi que ce soit, changer un type ou
une unité, ou refuser une requête qui était acceptée. Ce serait une nouvelle
version, /v2.
Pour aller plus loin
- Démarrer — une clé, ses permissions, et un premier appel.
- Lire la bibliothèque.
- Ajouter un fichier par l’API.
- Modifier un asset et publier sur une chaîne.