Adobe Workfront Planning API の基本

IMPORTANT
この記事の情報は、Adobe Workfront の追加機能である Adobe Workfront Planning に関するものです。
Workfront Planning へのアクセス要件のリストについて詳しくは、Adobe Workfront Planning へのアクセスの概要を参照してください。
Workfront計画の一般的な詳細については、Adobe Workfront計画の基本を学ぶを参照してください。

Adobe Workfront Planning APIの目的は、HTTP経由で動作するRESTful アーキテクチャを導入することで、Planningとの統合を構築することを簡素化することです。 このドキュメントでは、RESTおよびJSON応答に精通していることを前提としています。

エンドポイントの完全なリファレンス、リクエスト/レスポンスのスキーマ、バージョン固有の詳細については、Workfront Planning API開発者ドキュメント ​を参照してください。

認証

Workfront Planning APIは、認証にOAuth 2.0を使用します。 資格情報は、Adobe Developer Consoleを使用して設定します。

統合タイプに応じて、次の2つのフローをサポートしています。

  • サーバー間認証(JWT):ユーザー操作のない自動統合およびバックエンドサービスの場合。 OAuth サーバー間の資格情報を使用します(クライアント資格情報の付与 – アプリケーションはクライアント IDと秘密鍵を使用して直接認証を行い、ユーザーのログインや同意手順を行わずにアクセストークンを取得します)。

    詳しくは、​ サーバー間の認証を参照してください。

  • ユーザー認証(認証コードフロー):特定のユーザーの代理で動作する統合用。 OAuth Web アプリまたはシングルページアプリの資格情報(認証コード付与 – ユーザーがログインして同意し、その後、アプリケーションがアクセストークンと交換する認証コードを受け取ります)を使用します。

    詳しくは、​ ユーザー認証を参照してください。

初めに、Adobe Developer Consoleでプロジェクトを作成し、Workfront Planning APIを追加して資格情報を取得します。

資格情報を設定するには、WorkfrontでOAuth2 アプリケーションを作成します。

詳しくは、Workfront統合用のOAuth2 アプリケーションの作成を参照してください。

NOTE
Workfront Planningでは、/login エンドポイントとAPI キー認証はサポートされていません。 sessionIDまたはapiKey個のパラメーターは使用しないでください。

API バージョン管理

Planning APIは、URL パスを使用してバージョン管理されます。

現在サポートされているバージョンは次のとおりです。

バージョン
リリース日
バージョン 1
2024年7月
バージョン 2
2026年5月
NOTE
Workfront Fusion用のWorkfront Planning コネクタは、API バージョン 2に更新されておらず、追って通知されるまでバージョン 1を引き続き使用します。

現在サポートされているバージョンについて詳しくは、Workfront Planning API開発者ドキュメント ​を参照してください。

すべての統合でバージョンを明示的にターゲットにすることをお勧めします。

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

新しいメジャーバージョンがリリースされた場合、廃止日が通知されるまで、以前のバージョンは引き続き利用できます。

Workfront リリースノートに従って、APIの変更を常に把握します。

URL構造と操作

オブジェクトは、一意の URI に HTTP リクエストを送信して操作します。 操作はHTTP メソッドで指定します。

メソッド
操作
GET
IDによる単一のオブジェクトの取得、またはオブジェクトの検索/リスト
投稿する
新しいオブジェクトを作成
PUT
既存のオブジェクトの置き換え(完全更新)
PATCH
既存のオブジェクトの部分的な更新(提供されたフィールドのみが変更されます)
DELETE
オブジェクトの削除
NOTE
バージョン 1では、Version1のメモ: PATCHはサポートされていません。 すべての更新にPUTを使用します。

完全なエンドポイントパスとリクエスト/レスポンスの例については、developer.adobe.com/wf-planningの​ API リファレンス ​を参照してください。

HTTP ステータスコード

Planning APIは、標準のHTTP ステータスコードを返します。

コード
意味
200 OK
成功したGET、PUT、またはPATCH
201作成
投稿が成功しました(リソースが作成されました)
204 コンテンツなし
Adobe DELETEの成功
207 マルチステータス
一括操作が完了し、結果が混在しました。一部の項目は成功し、一部の項目は失敗しました。 詳細については、個々のアイテムの応答を確認してください。
400不正なリクエスト
無効なリクエスト – エラー応答を参照してください
401未認証
認証トークンが見つからないか無効です
403禁止
認証済みだが権限が不十分
404が見つかりません
リソースが存在しません
409紛争
書き込み競合が発生しました。リソースは別のリクエストによって変更されました。 最新バージョンで再試行してください。
429要求が多すぎます
レート制限を超えました
NOTE
バージョン 1のメモ: バージョン 1では、POSTおよびDELETEを含むすべての正常な操作に対して200 OKが返されます。

エラー処理

Planning APIは、一貫した形式でエラーを返します。 各エラー応答は、人間が読み取り可能なメッセージ、機械読み取り可能なエラーコード、およびサポートのエスカレーションのためのリクエスト IDを含む。

エラー応答の例:

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" }
  ]
}

プログラムによるエラー処理を実行するには、errorCodestatusではなく)を使用してください。 失敗の最も具体的な分類を提供します。

NOTE
バージョン 1のメモ: バージョン 1のエラー応答では、文字列errorCodeの代わりに数値type フィールド (例:40001)を使用し、最上位detail フィールドではなくreport オブジェクトに詳細をラップします。

レコードのフィルタリング

レコード検索要求でfilter パラメーターを使用して、特定の条件に一致するレコードのみを返します。 POST リクエストの場合、filterはリクエスト本文のJSON プロパティです。 GET リクエストの場合、filterはJSON エンコードされたフィルターグループを含むクエリパラメーターです。 フィルターは、明示的な論理演算子を含む型付き複合構造体を使用します。

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

フィルターは、AND / OR演算子を使用してネストし、複合条件を構築できます。

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
バージョン 1注: バージョン 1では、filters オブジェクトにMongo スタイルの型未入力演算子が使用されています。 演算子には$が先頭に付けられます(例:$and$or$is$contains$isBetween)。 ページネーション パラメーター(offsetlimit)およびrecordTypeIdは、URL パスおよびクエリパラメーターとしてではなく、リクエスト本文で渡されます。

フィールドタイプと検索修飾子

フィールドで修飾子とフィルターを使用して、結果で返されるデータを制御できます。

例については、Workfront Planning API開発者ドキュメント ​を参照してください。

検索修飾子の使用

Workfront Planningでは、次の検索修飾子がサポートされています。

修飾子
説明
使用可能な値
CONTAINS
{"fieldId":"<id>","condition":"CONTAINS","value":"product"}
フィールド値にフィルターが含まれているレコードを返します
"新製品のローンチ"
DOES_NOT_CONTAIN
{"fieldId":"<id>","condition":"DOES_NOT_CONTAIN","value":"product"}
フィールド値にフィルターが含まれていないレコードを返します
「新しいローンチ」
IS
{"fieldId":"<id>","condition":"IS","value":"new product launch"}
フィールド値がフィルターと完全に一致するレコードを返します
"新製品のローンチ"
IS_NOT
{"fieldId":"<id>","condition":"IS_NOT","value":"product"}
フィールド値がフィルターと完全に一致しないレコードを返します
"新製品のローンチ"
IS_EMPTY
{"fieldId":"<id>","condition":"IS_EMPTY"}
フィールド値が空のレコードを返します
""またはnull
IS_NOT_EMPTY
{"fieldId":"<id>","condition":"IS_NOT_EMPTY"}
フィールド値が空でないレコードを返します
"新製品のローンチ"
GREATER_THAN
{"fieldId":"<id>","condition":"GREATER_THAN","value":"10"}
フィールド値がフィルターより大きいレコードを返します
"11"
GREATER_THAN_OR_EQUAL
{"fieldId":"<id>","condition":"GREATER_THAN_OR_EQUAL","value":"10"}
フィールド値がフィルター以上のレコードを返します
"10", "11"
LESS_THAN
{"fieldId":"<id>","condition":"LESS_THAN","value":"10"}
フィールド値がフィルターより小さいレコードを返します
"9"
LESS_THAN_OR_EQUAL
{"fieldId":"<id>","condition":"LESS_THAN_OR_EQUAL","value":"10"}
フィールド値がフィルター以下のレコードを返します
"9", "10"
IS_BETWEEN
{"fieldId":"<id>","condition":"IS_BETWEEN","value":["2024-01-01","2024-12-31"]}
フィールド値が2つのフィルター値の間にあるレコードを返します
["2024-03-01","2024-06-30"]
IS_NOT_BETWEEN
{"fieldId":"<id>","condition":"IS_NOT_BETWEEN","value":["2024-01-01","2024-12-31"]}
2つのフィルター値の間にフィールド値が含まれていないレコードを返します
["2023-01-01","2025-06-30"]
IS_AFTER
{"fieldId":"<id>","condition":"IS_AFTER","value":"2024-01-01"}
フィルターの後に日付フィールド値があるレコードを返します
"2024-06-01"
IS_BEFORE
{"fieldId":"<id>","condition":"IS_BEFORE","value":"2024-12-31"}
日付フィールド値がフィルターの前にあるレコードを返します
"2024-06-01"
IS_ANY_OF
{"fieldId":"<id>","condition":"IS_ANY_OF","value":["Active","Planned"]}
フィールド値がフィルターリストの任意の値と一致するレコードを返します
["Active","Planned","Complete"]
IS_NONE_OF
{"fieldId":"<id>","condition":"IS_NONE_OF","value":["Active","Planned"]}
フィールド値がフィルターリストの値のいずれとも一致しないレコードを返します
["Active","Planned"]
HAS_ANY_OF
{"fieldId":"<id>","condition":"HAS_ANY_OF","value":["Tag1","Tag2"]}
複数の値フィールドにフィルター値のいずれかを含むレコードを返します
["Tag1","Tag2"]
HAS_ALL_OF
{"fieldId":"<id>","condition":"HAS_ALL_OF","value":["Tag1","Tag2"]}
複数の値フィールドにすべてのフィルター値が含まれているレコードを返します
["Tag1","Tag2"]
IS_EXACTLY
{"fieldId":"<id>","condition":"IS_EXACTLY","value":["Tag1"]}
複数の値フィールドにフィルター値が正確に含まれ、他の値が含まれていないレコードを返します
["Tag1"]
HAS_NONE_OF
{"fieldId":"<id>","condition":"HAS_NONE_OF","value":["Tag1"]}
複数値フィールドにフィルター値が含まれていないレコードを返します
["Tag1"]
NOTE
バージョン 1注:V1修飾子名には$-prefixed camelCaseが使用されています(例:$contains$isNot$isEmpty$greaterThan$greaterThanOrEqual$lessThan$lessThanOrEqual$isBetween$isNotBetween$isAnyOf$hasAllOf)。 各修飾子の動作は同じです。

フィールドタイプ別にサポートされるフィルター条件

フィールドタイプ
サポートされる条件
テキスト、長いテキスト
CONTAINS, DOES_NOT_CONTAIN, IS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
数値、パーセント、通貨
IS, IS_NOT, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, IS_EMPTY, IS_NOT_EMPTY
日付
IS, IS_NOT, IS_AFTER, IS_BEFORE, IS_BETWEEN, IS_NOT_BETWEEN, IS_EMPTY, IS_NOT_EMPTY
単一選択
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
複数選択,ユーザー
HAS_ANY_OF, HAS_ALL_OF, IS_EXACTLY, HAS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
ブール値
IS
数式
CONTAINS, DOES_NOT_CONTAIN, IS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
created-by
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF
updated-by
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
参照
HAS_ANY_OF, HAS_ALL_OF, IS_EXACTLY, HAS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
参照
リンクされたフィールドタイプによって異なります
NOTE
バージョン 1注: バージョン 1では、$接頭辞を付けた演算子名が使用されています(例:$contains$greaterThan$isAnyOf$hasAllOf)。 フィールドタイプごとにサポートされる条件のセットは同じです。

人物フィールドによるフィルタリング

ユーザーフィールドフィルター(usercreated-byupdated-byapproved-by)は、Adobe IMSユーザーIDとWorkfront ユーザーIDの両方を受け入れます。 プレーン文字列値は、Adobe IMSのユーザーIDとして解釈されます。

Workfront ユーザーIDを確認するために識別子の種類を設定するには、idおよびidType パラメーターを明示的に渡す必要があります。 idTypeでサポートされている値は、Workfront ユーザーIDの「WF」とAdobe IMSユーザーIDの「IMS」です。

{
  "filter": {
   "operator": "AND",
    "conditions": [
      {
        "fieldId": "<userFieldId>",
        "condition": "HAS_ANY_OF",
        "value": [
          { "id": "63e3b13000078c1795146248182d15dc", "idType": "WF" }
        ]
      }
    ]
  }
}
NOTE
バージョン 1注:V1では、ユーザーのIMS IDによるフィルタリングのみがサポートされています。

外部IDによる外部参照フィールドのフィルタリング

外部参照フィールドは、レコードを他のAdobe システム(Workfront プロジェクトやAEM Assetsなど)のオブジェクトにリンクします。 内部的には、PlanningはPlanning レコード IDをこれらのオブジェクトに割り当てます。 これらのフィールドを元のオブジェクト IDで直接フィルターするには、フィルター条件に"matchExternalId": trueを追加します。

このフラグは、referenceOptions.isExternaltrueの参照フィールドに対してのみ有効です。外部参照フィールド以外では無視されます。 1つの文字列値を解決できない場合、リクエストは400 Bad Requestで失敗します。 リスト値が指定された場合、未解決のエントリは変更されずに渡され、単純に一致しません。

{
  "filter": {
    "operator": "AND",
    "conditions": [
      {
        "fieldId": "<externalReferenceFieldId>",
        "condition": "IS_ANY_OF",
        "value": [
          "5f6a4f6e00000123456789abcdef0123",
          "/content/dam/wknd/en/adventures/bali-surf-camp"
        ],
        "matchExternalId": true
      }
    ]
  }
}
NOTE
バージョン 1注:V1では、外部オブジェクト IDによるフィルタリングはサポートされていません。

外部接続フィールド

プランニングレコードタイプは、レコードを他のプランニングレコードタイプではなく、他のAdobe システムのオブジェクトにリンクする外部参照フィールドをホストできます。

APIを介して外部参照フィールドを作成するには、新しいREFERENCE フィールドのreferenceOptions.recordTypeIdを、目的の外部レコードタイプのIDに設定します。 サーバーは、ターゲット レコード タイプからreferenceOptions.isExternal=trueと接続メタデータ (connectionName, objectName)を自動的に取得します。

サポートされている外部オブジェクトタイプには、Workfront オブジェクト(プロジェクト、タスク、プログラム、ポートフォリオ、企業、グループ、チーム、ユーザー)およびAEM Assets(アセット、コンテンツフラグメント)が含まれます。

NOTE
バージョン 1注:V1では、外部接続フィールドの作成はサポートされていません。

並べ替え

リクエストにsort配列を含めることで、任意のフィールドで結果を並べ替えます。

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

複数のソートフィールドが順番に評価されます。 ページ間で一貫性のある順序を確保するために、ページを分割するときは常に並べ替えを適用します。

結果をグループ化するには、並べ替えと一緒にグループ配列を含めます。

{
  "sort": [{ "fieldId": "F001", "direction": "asc" }],
  "group": [{ "fieldId": "F002", "direction": "asc" }]
}
NOTE
バージョン 1注:V1では、既存のビューの行の順序を適用するために、sortingsortではなく)、groupingFieldIds (フィールド IDの配列、group オブジェクトではない)および現在は非推奨のrowOrderViewIdが使用されています。 これらのV1 パラメーターはいずれもバージョンでサポートされていません

フィールド投影

応答で返されるフィールドを制限するには、コンマ区切りのリストを含むfieldIdsまたはfieldAliases クエリパラメーターを使用します。 これにより、応答ペイロードのサイズが小さくなり、大量の統合や遅延が発生する可能性が高い統合に適しています。

NOTE
バージョン 1のメモ: バージョン 1では、?fieldIds=?fieldAliases=ではなく?attributes=を投影(例:?attributes=data,createdBy)に使用しています。

ページネーション

Planning APIは、大きなデータセットを管理するためのページ分割された応答をサポートしています。

  • カーソルベースのページネーション​は、ワークスペース、レコードタイプ、フィールド、ビューに使用されます。 前の応答からcursor値を渡して、次のページを取得します。 カーソルに応じた応答には、ページ数が多いかどうかを示すhasMore フラグが含まれます。
  • ページベースのページネーション​は、レコード検索に使用されます。 pagesizeをクエリパラメーターとして使用します。 ページ間で一貫性のある順序を確保するために、ページを分割するときは常に並べ替えを適用します。 ページネーションは0から始まるので、2番目のページの結果を取得するには、パラメーターとして「page=1」を使用します。

例えば、次のリクエストを使用して、レコード検索から500 レコードの2番目のページを取得します。

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" }
  ] }
}

ページ分割されたすべての応答には、より多くの結果が使用可能かどうかを示す構造化エンベロープが含まれます。 ページ間で一貫性のある順序を確保するために、ページを分割するときは常に並べ替えを適用します。

NOTE
バージョン 1のメモ: V1では、リクエスト本文に渡されたoffsetlimitが使用されています(デフォルトは500、最大は2,000)。 レコード 2001 ~ 4000を取得するには、リクエスト本文に「offset」:「2000」、「limit」:「2000」を設定します。 応答は、totalCount フィールドを持つフラットレコード配列を返します。

一括操作

Planning APIは、1回のリクエストでのレコードの一括作成、更新、パッチ適用、削除をサポートしています。 エンドポイントパス、リクエスト形式、操作ごとのレコードの制限については、developer.adobe.com/wf-planningの​ API リファレンス ​を参照してください。

NOTE
バージョン 1のメモ:​一括操作は、バージョン 1では使用できません。

権限

エンティティへの権限は、リソースエンドポイント自体とは別に、専用の権限APIを使用して管理されます。 これにより、現在の権限を読み取り、共有リストを管理し、データ操作とは独立してアクセス要求を処理できます。 詳しくは、Workfront Planning APIの「API リファレンス」の節を参照してください。

NOTE
バージョン 1のメモ: バージョン 1では、パブリック権限APIが公開されていません。 権限レベルは、リソース応答DTOに直接埋め込まれます。

Workfront カスタムフォームでのPlanning APIの使用

Workfront カスタムフォームの外部ルックアップフィールドからPlanning APIを呼び出して、Workfront オブジェクト内に直接Planning データを表示できます。 詳細については、​ カスタムフォームの外部ルックアップフィールドの例を参照してください。

関連リソース

API関連の詳細なドキュメントについては、次の記事も参照してください。

recommendation-more-help
workfront-help-quicksilver