Aller au contenu principal

Erreurs, limites et versions

La forme unique des erreurs de l'API Videas, ses statuts et ses codes — 400, 415 ou 422 pour un corps, 404 pour une référence, 403 et 409 —, quoi relancer et comment, le 429 et son Retry-After, les limites que publie le contrat, et ce qui peut changer sous /v1.

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"
}
  • code est 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.
  • message est 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_id identifie la requête : citez-le quand vous nous écrivez à propos d’un échec. Il est absent, jamais null, 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 bon Content-Type : un corps JSON hors de application/json, une vignette hors de image/jpeg, image/png ou image/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 donne Retry-After, puis renvoyez la même requête.
  • 500, 502, 503, 504 : relancez avec un délai croissant — un back-off exponentiel.
  • Un GET se renvoie toujours sans risque, et un PATCH ou un PUT aussi : 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épond 204 et reste tel quel.
  • Un POST crée quelque chose : après une expiration ou une 5xx, cherchez ce que le premier a pu créer avant de le renvoyer.
    • POST /v1/uploads et POST /v1/assets ne sont pas idempotents : envoyés deux fois, ils créent deux assets. Renseignez external_ref à chaque fois, et cherchez-le avec GET /v1/assets?external_ref= avant de renvoyer — pour un fichier comme pour une vidéo hébergée ailleurs.
    • POST /v1/publications publie un asset une seule fois sur une chaîne : renvoyé, il répond 409, et GET /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 code d’une erreur ou d’un échec, le status d’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