Principes de base des API Adobe Workfront Planning

IMPORTANT
Les informations de cet article se rapportent à Adobe Workfront Planning, une nouvelle fonctionnalité d’Adobe Workfront.
Pour obtenir la liste des conditions requises pour accéder à Workfront Planning, consultez Vue d’ensemble de l’accès à Adobe Workfront Planning.
Pour obtenir des informations générales sur Workfront Planning, voir Prise en main d’Adobe Workfront Planning.

L’API Planning d’Adobe Workfront a pour objectif de simplifier la création d’intégrations avec Planning en introduisant une architecture RESTful qui fonctionne via HTTP. Ce document suppose que vous connaissez les réponses REST et JSON.

Pour obtenir une référence complète des points d’entrée, des schémas de requête/réponse et des détails spécifiques à la version, consultez la documentation du développeur de l’API Workfront Planning.

Authentification

L’API Workfront Planning utilise OAuth 2.0 pour l’authentification. Les informations d’identification sont configurées via le Adobe Developer Console.

Nous prenons en charge les deux flux suivants en fonction de votre type d’intégration :

  • Authentification de serveur à serveur (JWT) : pour les intégrations automatisées et les services back-end sans interaction utilisateur. Utilise les informations d’identification de serveur à serveur OAuth (octroi des informations d’identification client — votre application s’authentifie directement à l’aide de son identifiant client et de son secret pour obtenir un jeton d’accès, sans connexion de l’utilisateur ni étape de consentement).

    Pour plus d’informations, voir Authentification de serveur à serveur.

  • Authentification de l’utilisateur (flux de code d’autorisation) : pour les intégrations agissant pour le compte d’un utilisateur spécifique. Utilise les informations d’identification de l’application web OAuth ou de l’application monopage (octroi du code d’autorisation : l’utilisateur se connecte et donne son consentement, après quoi votre application reçoit un code d’autorisation qu’elle échange contre un jeton d’accès).

    Pour plus d’informations, voir Authentification utilisateur.

Pour commencer, créez un projet dans Adobe Developer Console et ajoutez l’API Workfront Planning pour obtenir vos informations d’identification.

Pour configurer les informations d’identification, créez une application OAuth2 dans Workfront.

Pour plus d’informations, voir Création d’applications OAuth2 pour les intégrations Workfront.

NOTE
Le point d’entrée /login et l’authentification par clé API ne sont pas pris en charge pour Workfront Planning. N’utilisez pas de paramètres sessionID ou apiKey.

Contrôle de version des API

Le contrôle de version de l’API Planning s’effectue via le chemin URL.

Voici les versions actuellement prises en charge :

Version
Date de publication
Version 1
Juillet 2024
Version 2
Mai 2026
NOTE
Le connecteur Workfront Planning pour Workfront Fusion n’a pas été mis à jour vers la version 2 de l’API et continuera à utiliser la version 1 jusqu’à nouvel ordre.

Pour plus d’informations sur les versions actuellement prises en charge, consultez l’article Documentation destinée aux développeurs et développeuses de l’API Workfront Planning.

Nous vous recommandons de cibler explicitement une version dans toutes les intégrations :

https://{customer-domain}/maestro/api/v2/...

Lorsqu’une nouvelle version majeure est publiée, la version précédente reste disponible jusqu’à ce qu’une date d’obsolescence soit communiquée.

Consultez les notes de mise à jour de Workfront pour rester informé des modifications apportées à l’API.

Structure et opérations de l’URL

Les objets sont manipulés en envoyant une requête HTTP à leur URI unique. L’opération est spécifiée par la méthode HTTP.

Méthode
Opération
GET
Récupérer un seul objet par ID ou rechercher/répertorier des objets
POST
Créer un nouvel objet
PUT
Remplacer un objet existant (mise à jour complète)
PATCH
Mettre à jour partiellement un objet existant (seuls les champs fournis sont modifiés)
SUPPRIMER
Suppression d’un objet
NOTE
Remarque pour la version 1 : PATCH n’est pas pris en charge dans la version 1. Utilisez PUT pour toutes les mises à jour.

Pour obtenir des chemins d’accès complets aux points d’entrée et des exemples de requête/réponse, consultez la référence d’API à l’adresse developer.adobe.com/wf-planning.

Codes d’état HTTP

L’API Planning renvoie des codes d’état HTTP standard :

Code
Signification
200 OK
GET, PUT ou PATCH réussi
201 Créé
POST réussi (ressource créée)
204 Pas de contenu
DELETE réussie
207 Statut multiple
Opération en bloc terminée avec des résultats mitigés, où certains éléments ont réussi et d’autres ont échoué. Vérifiez les réponses de chaque élément pour plus de détails.
400 Requête Incorrecte
Requête non valide — voir la réponse d’erreur pour plus de détails
401 Non Autorisé
Jeton d’authentification manquant ou non valide
403 Interdit
Autorisations authentifiées mais insuffisantes
404 Introuvable
La ressource n’existe pas
409 Conflit
Conflit d’écriture, la ressource a été modifiée par une autre requête. Réessayez avec la dernière version.
429 Too Many Requests
Limite de taux dépassée
NOTE
Remarque sur la version 1 : la version 1 renvoie des 200 OK pour toutes les opérations réussies, y compris POST et DELETE.

Gestion des erreurs

L’API Planning renvoie des erreurs dans un format cohérent. Chaque réponse d’erreur comprend un message lisible par l’utilisateur, un code d’erreur lisible par la machine et un identifiant de demande pour l’escalade de l’assistance.

Exemple de réponse d’erreur :

json
{
  "title": "Validation failed",
  "status": 400,
  "detail": "Request validation failed. See 'errors' for details.",
  "errorCode": "VALIDATION_FAILED",
  "requestId": "req-123",
  "errors": [
    { "field": "name", "message": "must not be blank" }
  ]
}

Utilisez errorCode (non status) pour piloter la gestion des erreurs de programmation. Il fournit la classification la plus spécifique de l’échec.

NOTE
Note de la version 1 : les réponses d’erreur de la version 1 utilisent un champ de type numérique (par exemple, 40001) au lieu d’un errorCode de chaîne, et encapsulent les détails dans un objet report plutôt que dans un champ de detail de niveau supérieur.

Filtrer les enregistrements

Utilisez le paramètre filter dans les demandes de recherche d’enregistrements pour renvoyer uniquement les enregistrements correspondant à des critères spécifiques. Pour les requêtes POST, filter est une propriété JSON dans le corps de la requête. Pour les requêtes GET, filter est un paramètre de requête contenant un groupe de filtres codés JSON. Les filtres utilisent une structure composite typée avec des opérateurs logiques explicites.

json
{
  "filter": {
    "operator": "AND",
    "conditions": [
      { "fieldId": "<fieldId>", "condition": "IS", "value": "Active" },
      { "fieldId": "<fieldId>", "condition": "CONTAINS", "value": "marketing" }
    ]
  }
}

Les filtres peuvent être imbriqués à l’aide d’opérateurs AND/OR pour créer des conditions composites :

json
{
  "filter": {
    "operator": "OR",
    "conditions": [
      {
        "operator": "AND",
        "conditions": [
          { "fieldId": "<fieldId>", "condition": "BETWEEN", "value": ["2024-03-31T20:00:00.000Z", "2024-04-01T20:00:00.000Z"] },
          { "fieldId": "<fieldId>", "condition": "IS", "value": "active" }
        ]
      },
      {
        "operator": "AND",
        "conditions": [
          { "fieldId": "<fieldId>", "condition": "IS_BETWEEN", "value": ["2024-04-15T00:00:00.000Z", "2024-04-16T00:00:00.000Z"] },
          { "fieldId": "<fieldId>", "condition": "IS", "value": "planned" }
        ]
      }
    ]
  }
}
NOTE
Remarque sur la version 1 : la version 1 utilise des opérateurs non typés de style Mongo dans un objet filters. Les opérateurs sont précédés du préfixe $ (par exemple, $and, $or, $is, $contains, $isBetween). Les paramètres de pagination (offset, limit) et recordTypeId sont transmis dans le corps de la requête plutôt que comme chemin d’URL et paramètres de requête.

Types de champs et modificateurs de recherche

Vous pouvez utiliser des modificateurs et des filtres avec des champs pour contrôler les données qui seront renvoyées dans les résultats.

Pour obtenir des exemples, consultez la documentation du développeur de l’API Workfront Planning 🔗.

Utilisation des modificateurs de recherche

Workfront Planning prend en charge les modificateurs de recherche suivants :

Modificateur
Exemple
Description
Valeurs possibles
CONTIENT
{« fieldId »:« <id> »,« condition »:« CONTAINS »,« value »:« product »}
Retourne les enregistrements dont la valeur du champ contient le filtre
« Nouveau lancement de produit »
NE_CONTIENT_PAS
{« fieldId »:« <id> »,« condition »:« Does_NOT_CONTAIN »,« value »:« product »}
Renvoie les enregistrements dont la valeur du champ ne contient pas le filtre
« Nouveau lancement »
EST
{« fieldId »:« <id> »,« condition »:« IS »,« value »:« nouveau lancement de produit »}
Renvoie les enregistrements dont la valeur du champ correspond exactement au filtre
« Nouveau lancement de produit »
IS_NOT
{« fieldId »:« <id> »,« condition »:« IS_NOT »,« value »:« product »}
Renvoie les enregistrements dont la valeur du champ ne correspond pas exactement au filtre
« Nouveau lancement de produit »
IS_EMPTY
{« fieldId »:« <id> »,« condition »:« IS_EMPTY »}
Retourne les enregistrements dont la valeur du champ est vide
« » ou nul
IS_NOT_EMPTY
{« fieldId »:« <id> »,« condition »:« IS_NOT_EMPTY »}
Retourne les enregistrements dont la valeur du champ n’est pas vide
« Nouveau lancement de produit »
GREATER_THAN
{« fieldId »:« <id> »,« condition »:« GREATER_THAN »,« value »:« 10 »}
Renvoie les enregistrements dont la valeur du champ est supérieure au filtre
"11"
GREATER_THAN_OR_EQUAL
{« fieldId »:« <id> »,« condition »:« GREATER_THAN_OR_EQUAL »,« value »:« 10 »}
Renvoie les enregistrements dont la valeur du champ est supérieure ou égale au filtre
"10", "11"
INFÉRIEUR À
{« fieldId »:« <id> »,« condition »:« LESS_THAN »,« value »:« 10 »}
Renvoie les enregistrements dont la valeur du champ est inférieure au filtre
"9"
LESS_THAN_OR_EQUAL
{« fieldId »:« <id> »,« condition »:« LESS_THAN_OR_EQUAL »,« value »:« 10 »}
Renvoie les enregistrements dont la valeur du champ est inférieure ou égale au filtre
"9", "10"
IS_BETWEEN
{« fieldId »:« <id> »,« condition »:« IS_BETWEEN »,« value »:[« 2024-01-01 »,« 2024-12-31 »]}
Renvoie les enregistrements dont la valeur du champ est comprise entre les deux valeurs de filtre
["2024-03-01","2024-06-30"]
IS_NOT_BETWEEN
{« fieldId »:« <id> »,« condition »:« IS_NOT_BETWEEN »,« value »:[« 2024-01-01 »,« 2024-12-31 »]}
Renvoie les enregistrements dont la valeur du champ ne se situe pas entre les deux valeurs de filtre
["2023-01-01","2025-06-30"]
IS_AFTER
{« fieldId »:« <id> »,« condition »:« IS_AFTER »,« value »:« 2024-01-01 »}
Renvoie les enregistrements dont la valeur du champ de date est postérieure au filtre
"2024-06-01"
IS_BEFORE
{« fieldId »:« <id> »,« condition »:« IS_BEFORE »,« value »:« 2024-12-31 »}
Renvoie les enregistrements dont la valeur du champ de date est antérieure au filtre
"2024-06-01"
IS_ANY_OF
{« fieldId »:« <id> »,« condition »:« IS_ANY_OF »,« value »:[« Active »,« Planned »]}
Renvoie les enregistrements dont la valeur du champ correspond à n’importe quelle valeur de la liste de filtres
[« Actif »,« Prévu »,« Terminé »]
IS_NONE_OF
{« fieldId »:« <id> »,« condition »:« IS_NONE_OF »,« value »:[« Active »,« Planned »]}
Renvoie les enregistrements dont la valeur du champ ne correspond à aucune des valeurs de la liste de filtres
[« Actif »,« Prévu »]
HAS_ANY_OF
{« fieldId »:« <id> »,« condition »:« HAS_ANY_OF »,« value »:[« Tag1 »,« Tag2 »]}
Renvoie les enregistrements dont le champ à plusieurs valeurs contient l’une des valeurs de filtre
[« Tag1 »,« Tag2 »]
HAS_ALL_OF
{« fieldId »:« <id> »,« condition »:« HAS_ALL_OF »,« value »:[« Tag1 »,« Tag2 »]}
Renvoie les enregistrements dont le champ à plusieurs valeurs contient toutes les valeurs de filtre
[« Tag1 »,« Tag2 »]
IS_EXACTLY
{« fieldId »:« <id> »,« condition »:« IS_EXACTLY »,« value »:[« Tag1 »]}
Renvoie les enregistrements dont le champ à plusieurs valeurs contient exactement les valeurs de filtre et aucune autre
[« Tag1 »]
HAS_NONE_OF
{« fieldId »:« <id> »,« condition »:« HAS_NONE_OF »,« value »:[« Tag1 »]}
Renvoie les enregistrements dont le champ à plusieurs valeurs ne contient aucune des valeurs de filtre
[« Tag1 »]
NOTE
Note de la version 1 : les noms de modificateurs V1 utilisent $-prefixed camelCase (par exemple $contains, $isNot, $isEmpty, $greaterThan, $greaterThanOrEqual, $lessThan, $lessThanOrEqual, $isBetween, $isNotBetween, $isAnyOf, $hasAllOf). Le comportement de chaque modificateur est le même.

Conditions de filtrage prises en charge par type de champ

Type de champ
Conditions prises en charge
texte, texte long
CONTAINS, Does_NOT_CONTAIN, IS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
nombre, pourcentage, devise
IS, IS_NOT, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, IS_EMPTY, IS_NOT_EMPTY
Date
IS, IS_NOT, IS_AFTER, IS_BEFORE, IS_BETWEEN, IS_NOT_BETWEEN, IS_EMPTY, IS_NOT_EMPTY, IS_NOT_EMPTY
à sélection unique
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
sélection multiple, utilisateur
HAS_ANY_OF, HAS_ALL_OF, IS_EXACTLY, HAS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
booléen
EST
formule
CONTAINS, Does_NOT_CONTAIN, IS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
created-by
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF
mis à jour par
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
created-at
IS, IS_NOT, IS_AFTER, IS_BEFORE, IS_BETWEEN, IS_NOT_BETWEEN
updated-at
IS, IS_NOT, IS_AFTER, IS_BEFORE, IS_BETWEEN, IS_NOT_BETWEEN, IS_EMPTY, IS_NOT_EMPTY, IS_NOT_EMPTY
référence
HAS_ANY_OF, HAS_ALL_OF, IS_EXACTLY, HAS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
recherche
Dépend du type de champ lié
NOTE
Remarque sur la version 1 : la version 1 utilise des noms d’opérateurs avec préfixe $ (par exemple $contains, $greaterThan, $isAnyOf, $hasAllOf). L’ensemble des conditions prises en charge par type de champ est le même.

Filtrer par champs Personnes

Les filtres de champ de personne (user, created-by, updated-by, approved-by) acceptent les ID utilisateur Adobe IMS et Workfront. Une valeur de chaîne simple est interprétée comme un identifiant utilisateur Adobe IMS.

Pour définir le type d’identifiant afin de vérifier l’ID utilisateur Workfront, vous devez transmettre explicitement les paramètres id et idType. Les valeurs prises en charge pour idType sont « WF » pour les ID utilisateur Workfront et « IMS » pour les ID utilisateur Adobe IMS.

{
  "filter": {
   "operator": "AND",
    "conditions": [
      {
        "fieldId": "<userFieldId>",
        "condition": "HAS_ANY_OF",
        "value": [
          { "id": "63e3b13000078c1795146248182d15dc", "idType": "WF" }
        ]
      }
    ]
  }
}
NOTE
Remarque pour la version 1 : la version 1 prend uniquement en charge le filtrage par identifiant IMS des utilisateurs.

Filtrer les champs de référence externes par ID externe

Les champs de référence externes lient les enregistrements aux objets d’autres systèmes Adobe (tels que les projets Workfront ou AEM Assets). En interne, Planning affecte des ID d’enregistrement Planning à ces objets. Pour filtrer ces champs directement en fonction de leur ID d’objet d’origine, ajoutez des "matchExternalId": true à une condition de filtre.

Cet indicateur n’est valide que pour les champs de référence où referenceOptions.isExternal est true ; il est ignoré pour les champs de référence non externes. Si une valeur de chaîne unique ne peut pas être résolue, la requête échoue avec 400 Bad Request. Si une valeur de liste est fournie, les entrées non résolues passent inchangées et ne correspondent tout simplement pas.

{
  "filter": {
    "operator": "AND",
    "conditions": [
      {
        "fieldId": "<externalReferenceFieldId>",
        "condition": "IS_ANY_OF",
        "value": [
          "5f6a4f6e00000123456789abcdef0123",
          "/content/dam/wknd/en/adventures/bali-surf-camp"
        ],
        "matchExternalId": true
      }
    ]
  }
}
NOTE
Remarque concernant la version 1 : la version V1 ne prend pas en charge le filtrage par ID d’objets externes.

Champs de connexion externe

Les types d’enregistrements Planning peuvent héberger des champs de référence externes qui lient des enregistrements à des objets dans d’autres systèmes Adobe au lieu d’autres types d’enregistrements Planning.

Pour créer un champ de référence externe via l’API, définissez referenceOptions.recordTypeId sur un nouveau champ de REFERENCE l’identifiant du type d’enregistrement externe souhaité. Le serveur dérive automatiquement les referenceOptions.isExternal=true et les métadonnées de connexion (connectionName, objectName) du type d’enregistrement cible.

Les types d’objets externes pris en charge comprennent les objets Workfront (projets, tâches, programmes, portfolios, entreprises, groupes, équipes, utilisateurs) et AEM Assets (ressources, fragments de contenu).

NOTE
Remarque concernant la version 1 : la version V1 ne prend pas en charge la création de champs de connexion externe.

Tri

Triez les résultats en fonction de n’importe quel champ en incluant un tableau de sort dans votre requête :

json
{
  "sort": [
    { "fieldId": "F6527ecb25df57c441d92b9fc", "direction": "asc" },
    { "fieldId": "F658afcbd4a0273c67c346fd5", "direction": "desc" }
  ]
}

Plusieurs champs de tri sont évalués dans l’ordre. Appliquez toujours un tri lors de la pagination afin de garantir un ordre cohérent sur toutes les pages.

Pour regrouper des résultats, incluez un tableau de groupe à côté de trier :

{
  "sort": [{ "fieldId": "F001", "direction": "asc" }],
  "group": [{ "fieldId": "F002", "direction": "asc" }]
}
NOTE
Remarque concernant la version 1 : la version 1 utilise sorting (non sort), groupingFieldIds (tableau d’identifiants de champ et non d’objets group) et la rowOrderViewId désormais obsolète pour appliquer l’ordre des lignes d’une vue existante. Aucun de ces paramètres V1 n’est pris en charge dans la version

Projection de champ

Pour limiter les champs renvoyés dans une réponse, utilisez les paramètres de requête fieldIds ou fieldAliases avec une liste séparée par des virgules. Cela réduit la taille de la payload de réponse et est recommandé pour les intégrations à volume élevé ou sensibles à la latence.

NOTE
Note pour la version 1 : la version 1 utilise le ?attributes= pour la projection (par exemple ?attributes=data,createdBy) plutôt que le ?fieldIds= ou le ?fieldAliases=.

Pagination

L’API Planning prend en charge les réponses paginées pour gérer les jeux de données volumineux.

  • La pagination basée sur le curseur est utilisée pour les espaces de travail, les types d’enregistrements, les champs et les vues. Transmettez une valeur cursor de la réponse précédente pour récupérer la page suivante. Les réponses basées sur le curseur incluent un indicateur hasMore pour indiquer s’il y a d’autres pages ou non.
  • La pagination basée sur la page est utilisée pour la recherche d’enregistrements. Utilisez page et size comme paramètres de requête. Appliquez toujours un tri lors de la pagination afin de garantir un ordre cohérent sur toutes les pages. Notez que la pagination est basée sur zéro. Par conséquent, pour récupérer les résultats de la deuxième page, utilisez « page=1 » comme paramètre.

Par exemple, utilisez la requête suivante pour récupérer la deuxième page de 500 enregistrements à partir d’une recherche d’enregistrements :

POST /v2/record-types/{recordTypeId}/records/search?page=1&size=500
{
  "sort": [{ "fieldId": "F6527ecb25df57c441d92b9fc", "direction": "asc" }],
  "filter": { "operator": "AND", "conditions": [
    { "fieldId": "<fieldId>", "condition": "IS", "value": "active" }
  ] }
}

Toutes les réponses paginées incluent une enveloppe structurée indiquant si d’autres résultats sont disponibles. Appliquez toujours un tri lors de la pagination afin de garantir un ordre cohérent sur toutes les pages.

NOTE
Note pour la version 1 : la version V1 utilise offset et limit transmises dans le corps de la requête (500 par défaut, 2 000 max.). Pour récupérer les enregistrements 2001-4000, définissez « offset »: « 2000 », « limit »: « 2000 » dans le corps de la requête. La réponse renvoie un tableau d’enregistrements plats avec un champ totalCount.

Opérations en masse

L’API Planning prend en charge la création, la mise à jour, l’application de correctifs et la suppression en bloc d’enregistrements dans une seule requête. Consultez la référence d’API à l’adresse developer.adobe.com/wf-planning pour connaître les chemins de point d’entrée, les formats de requête et les limites d’enregistrement par opération.

NOTE
Remarque sur la version 1 : les opérations en bloc ne sont pas disponibles dans la version 1.

Autorisations

Les autorisations d’entités sont gérées par le biais d’une API d’autorisations dédiée, distincte des points d’entrée des ressources eux-mêmes. Vous pouvez ainsi lire les autorisations actuelles, gérer la liste de partage et gérer les demandes d’accès indépendamment des opérations sur les données. Pour plus d’informations, consultez la section « Références de l’API » dans l’article API Workfront Planning.

NOTE
Remarque sur la version 1 : la version 1 n’expose pas d’API d’autorisations publiques. Le niveau d’autorisation est directement incorporé dans les DTO de réponse de ressource.

Utilisation de l’API Planning avec des formulaires personnalisés Workfront

Vous pouvez appeler l’API Planning à partir d’un champ de recherche externe dans un formulaire personnalisé Workfront pour faire apparaître les données Planning directement dans les objets Workfront. Pour plus d’informations, voir Exemples du champ de recherche externe dans un formulaire personnalisé.

Ressources connexes

Pour plus d’informations sur les API, consultez également les articles suivants :

recommendation-more-help
workfront-help-quicksilver