Les champs personnalisés sont ceux que votre organisation a ajoutés à sa bibliothèque : ce qu’un asset peut porter à côté de son titre et de sa description — un lien utile, un format, une date de tournage, un intervenant. Chaque organisation a les siens, et l’API les décrit avant de les écrire :
| Requête | Ce qu’elle fait | Permission |
|---|---|---|
GET /v1/custom-fields |
Liste les champs de l’organisation, page par page | assets.library.read |
GET /v1/custom-fields/count |
Les compte | assets.library.read |
GET /v1/custom-fields/{field_id}/choices |
Liste les options d’un champ à choix | assets.library.read |
GET /v1/custom-fields/{field_id}/choices/count |
Les compte | assets.library.read |
PATCH /v1/assets/{asset_id}/custom-fields |
Écrit les valeurs d’un asset | assets.library.edit |
Les valeurs d’un asset se lisent dans le custom_fields de
GET /v1/assets/{asset_id}.
Lister les champs
curl https://api.videas.com/v1/custom-fields \
-H "Authorization: Bearer $VIDEAS_API_KEY"
{
"data": [
{
"id": "0192a680-1d2e-7f3a-8b4c-5d6e7f8a9b0c",
"label": "Lien utile",
"slug": "lien-utile",
"type": "link",
"multiple": false,
"required": false,
"public": true,
"workspace_id": null,
"asset_types": null,
"created_at": "2026-03-02T10:00:00Z",
"updated_at": "2026-03-02T10:00:00Z"
},
{
"id": "0192a680-2e3f-7a4b-9c5d-6e7f8a9b0c1d",
"label": "Format",
"slug": "format",
"type": "choice",
"multiple": false,
"required": false,
"public": true,
"workspace_id": null,
"asset_types": ["video", "third_party"],
"created_at": "2026-03-02T10:04:31Z",
"updated_at": "2026-06-18T14:20:07Z"
}
],
"next": null
}
| Champ | |
|---|---|
id |
L’identifiant du champ — celui par lequel une écriture le désigne, et celui à conserver. |
label |
Ce qu’une personne lit à côté de sa valeur. |
slug |
Un court nom que l’organisation lui a donné. Pas unique : deux groupes de champs peuvent en avoir chacun un sous le même nom. Désignez toujours un champ par son id. |
type |
Ce qu’il contient, qui décide de la forme de sa valeur — voir plus bas. |
multiple |
Pour un champ choice, s’il prend plusieurs options plutôt qu’une ; false pour tout autre type. |
required |
S’il est obligatoire : sa valeur peut changer, jamais être vidée. Un asset peut pourtant ne pas en avoir encore. |
public |
S’il est montré au public là où un asset qui le porte est publié — sur la page d’une chaîne et dans les détails du lecteur. |
workspace_id |
Le seul workspace dont il concerne les assets ; null pour tous. |
asset_types |
Les types d’asset qu’il concerne ; null pour tous. |
La liste se lit du plus ancien au plus récent — order=desc pour l’inverse — et
se parcourt avec next et after, comme
toutes les listes.
Où un champ s’applique
Un champ s’applique à un asset quand son workspace et son type sont ceux qu’il
vise : workspace_id vaut null ou le workspace de l’asset, et asset_types vaut
null ou contient le type de l’asset. Écrire un champ qui ne s’applique pas à
l’asset est refusé par un 400.
Les types, et la forme de leur valeur
Une valeur a la forme que lui donne le type de son champ — la même à la
lecture et à l’écriture :
type |
Valeur | Par exemple |
|---|---|---|
text |
une chaîne, sur une ligne | "Salle B, niveau 2" |
long_text |
une chaîne, sur plusieurs lignes | "Première partie…\nSeconde partie…" |
number |
un nombre | 42.5 |
date |
un jour, AAAA-MM-JJ |
"2026-11-02" |
boolean |
true ou false |
true |
choice |
l’id d’une option ; sur un champ multiple, une liste d’id |
"0192a681-3f4a-7b5c-8d6e-7f8a9b0c1d2e" |
link |
{"url", "label"} : une adresse absolue http ou https, et les mots qui la présentent |
{"url": "https://example.com/dossier", "label": "Le dossier complet"} |
record, json, file |
pas encore lus ni écrits par l’API | — |
- Rien n’est converti :
42n’est pas un texte, et"true"n’est pas un booléen. - Le
labeld’unlinkpeut être omis à l’écriture ; à la lecture, il vautnullquand l’adresse s’affiche telle quelle. - Une
dateécrite ailleurs que par l’API peut porter aussi une heure,AAAA-MM-JJTHH:MM:SS, avec un décalage facultatif : lisez les deux formes. - Les champs
record,jsonetfilefigurent dans la liste, mais leurs valeurs ne sont ni lues ni écrites ici pour l’instant. - La liste des types peut s’allonger : lisez un type inconnu comme un champ que votre client ne lit ni n’écrit.
Les options d’un champ à choix
Une valeur de champ choice contient des identifiants d’options, pas leurs
libellés. GET /v1/custom-fields/{field_id}/choices liste les options d’un
champ — à part, parce qu’un champ peut en proposer des milliers :
curl https://api.videas.com/v1/custom-fields/0192a680-2e3f-7a4b-9c5d-6e7f8a9b0c1d/choices \
-H "Authorization: Bearer $VIDEAS_API_KEY"
{
"data": [
{ "id": "0192a681-3f4a-7b5c-8d6e-7f8a9b0c1d2e", "label": "Reportage" },
{ "id": "0192a681-4a5b-7c6d-9e7f-8a9b0c1d2e3f", "label": "Interview" },
{ "id": "0192a681-5b6c-7d7e-8f8a-9b0c1d2e3f4a", "label": "Conférence" }
],
"next": null
}
- Lisez cette liste pour trouver l’
idd’une option que vous connaissez par son libellé, et le libellé que désigne la valeur d’un asset. - Elle se lit du plus ancien au plus récent, ce qui n’est pas l’ordre d’un formulaire : triez-les vous-même si vous les affichez.
- Une option retirée du champ n’est plus listée, et ne peut plus être choisie.
Un asset qui l’avait choisie avant la garde, la relit par son
id, et peut se la voir renvoyer. - Un
field_idqui n’est pas celui d’un champchoicerépond404.
Pour passer du libellé à l’identifiant, parcourez les options une fois et gardez la table :
import os
import requests
API = "https://api.videas.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['VIDEAS_API_KEY']}"}
def option_ids(field_id):
"""{libellé: id} pour chaque option du champ."""
ids, params = {}, {}
while True:
page = requests.get(f"{API}/custom-fields/{field_id}/choices", headers=HEADERS, params=params)
page.raise_for_status()
body = page.json()
ids.update({option["label"]: option["id"] for option in body["data"]})
if body["next"] is None:
return ids
params["after"] = body["next"]
Écrire les valeurs d’un asset
PATCH /v1/assets/{asset_id}/custom-fields prend une liste de valeurs, chacune
désignant son champ par son id :
curl -X PATCH https://api.videas.com/v1/assets/0192a6e4-3b5c-7d6e-8f90-a1b2c3d4e5f6/custom-fields \
-H "Authorization: Bearer $VIDEAS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"values": [
{
"field_id": "0192a680-1d2e-7f3a-8b4c-5d6e7f8a9b0c",
"value": { "url": "https://example.com/recyclage-fibre-carbone", "label": "Le dossier complet" }
},
{
"field_id": "0192a680-2e3f-7a4b-9c5d-6e7f8a9b0c1d",
"value": "0192a681-3f4a-7b5c-8d6e-7f8a9b0c1d2e"
}
]
}'
- Les champs que vous nommez prennent les valeurs envoyées ; les autres gardent les leurs. Ce n’est pas une liste qui remplace tout.
nullvide un champ — comme une chaîne vide sur untextou unlong_text, et une liste vide sur un champmultiple. Un champrequiredne peut pas être vidé :400.- Chaque valeur est tenue aux règles de son champ — la longueur d’un texte, les bornes d’un nombre, une option que le champ propose encore.
- 200 valeurs au plus par requête, un champ nommé une seule fois, et 256 Kio au plus par valeur.
- Tout ou rien : si une seule valeur est refusée, aucune n’est écrite.
La réponse est l’asset entier ; ses valeurs sont dans custom_fields, dans
l’ordre d’un formulaire :
{
"id": "0192a6e4-3b5c-7d6e-8f90-a1b2c3d4e5f6",
"updated_at": "2026-10-15T08:30:14Z",
"custom_fields": [
{
"field_id": "0192a680-2e3f-7a4b-9c5d-6e7f8a9b0c1d",
"slug": "format",
"label": "Format",
"type": "choice",
"value": "0192a681-3f4a-7b5c-8d6e-7f8a9b0c1d2e"
},
{
"field_id": "0192a680-1d2e-7f3a-8b4c-5d6e7f8a9b0c",
"slug": "lien-utile",
"label": "Lien utile",
"type": "link",
"value": { "url": "https://example.com/recyclage-fibre-carbone", "label": "Le dossier complet" }
}
]
}
(extrait : la réponse porte tous les champs de l’asset.)
custom_fieldsne liste que les champs qui s’appliquent à l’asset et dont il a une valeur ; les champsrecord,jsonetfilen’y figurent pas encore.updated_atne bouge pas quand ses valeurs changent.- Renvoyer les valeurs que l’asset porte déjà ne change rien, et la dernière requête arrivée l’emporte.
- La modification est inscrite dans l’historique de l’asset sous le nom de la clé,
et un asset validé dans le fonds commun de l’organisation est refusé par un
403— comme pour ses textes et ses tags.
Erreurs
Toutes les erreurs ont le même corps — {"code": "…", "message": "…", "request_id": "…"}.
Testez code ; message s’adresse à un humain et peut changer.
| Statut | code |
Ce qui s’est passé |
|---|---|---|
400 |
validation |
Écriture : plus de 200 valeurs, ou un champ nommé deux fois ; un champ qui ne s’applique pas à cet asset ; un champ record, json ou file ; une valeur qui n’a pas la forme de son type, sort des règles du champ ou dépasse 256 Kio ; une option que le champ ne propose pas ; null sur un champ obligatoire. Le message nomme le champ, par son slug ou son id, et rien n’est écrit. Lectures : un paramètre inconnu, un limit qui n’est pas un entier, un after venu d’ailleurs. |
401 |
unauthorized |
Pas de clé, ou une clé inconnue, expirée ou révoquée. |
403 |
forbidden |
La clé ne porte pas assets.library.read (lectures) ou assets.library.edit (écriture) ; ou l’asset est validé dans le fonds commun. |
404 |
not_found |
Aucun asset que liste GET /v1/assets n’a cet identifiant ; aucun champ de GET /v1/custom-fields n’a l’un des field_id — le message le nomme, et rien n’est écrit ; ou, pour les options, le champ n’est pas un champ choice. |
415 |
unsupported_media_type |
Le corps n’est pas envoyé en application/json. |
422 |
validation |
values manquant ou qui n’est pas une liste, une entrée sans field_id ou sans value, un field_id qui n’est pas un uuid, ou un champ que le corps ne connaît pas. |
429 |
rate_limited |
Trop de requêtes : attendez le nombre de secondes indiqué par Retry-After. |
Pour aller plus loin
- Modifier un asset — ses textes et ses tags.
- Publier sur une chaîne — où un
champ
publicest montré à son public. - La référence de l’API, générée depuis son contrat.