Statement カタログ

最終更新: 2026年7月23日

statements 配列の各要素が 1 つの文(statement)です。このドキュメントでは 17 種の文のフィールド、動作、結果を整理します。すべての値の箇所は 値式 の規則(参照、リテラル、JsonLogic、ロケールマップ)に従います。

Statement 概要

分類type一行要約
リソース書き込みResourceCreateContent/Media を生成(任意で公開)
ResourceUpdateContent/Media フィールドの全体置換(渡さなかった field・locale は削除)
ResourcePatchContent/Media フィールドの部分マージ(指定した field・locale のみ。リテラル null は削除)
ResourceDelete削除(DraftArchived のみ。Published の場合はまず unpublish)
ResourcePublish / ResourceUnpublish公開 / 公開取り消し
ResourceArchive / ResourceUnarchiveアーカイブ / アーカイブ解除
リソース読み取りResourceReadid で単一件取得
ResourceFindフィルターで最初にマッチした単一件(なければ null)
ResourcePageReadフィルター/ソート/ページ取得({ items, next })
外部Http外部 HTTP 呼び出し({ status, body })。Async 専用
変数SetVarscript-scoped 変数の宣言/更新
制御フローIf条件分岐
Loop繰り返し(foreach / while / counted)
Parallelブランチの同時実行
Return結果の返却と早期終了
Try例外処理(catch/finally)

循環呼び出しは最大3回まで。 上のリソース書き込み文(ResourceCreateResourceUpdateResourcePublish など)は変更イベントを発生させ、そのイベントが Webhook を通じて再び Script を実行することがあります。このような連鎖(Script → イベント → Webhook → Script → …)は最大3回までしか続かず、それを超えるとプラットフォームが自動的に打ち切って無限ループを防ぎます。

共通フィールド

{ "type": "<StatementType>", "name": "<任意、script 内で一意>", /* ...タイプ別フィールド... */ }
  • type: 判別子です。上表の値のいずれかです(必須)。
  • name: 任意です。付けると結果が /<name> としてコンテキストにバインドされ、以降の statement が { /<name>/... } で参照します。結果を使わない場合は省略します。
  • バインディング名の規則: name(および Loopas)はコンテキストルートにそのまま載るキーなので、保存時に検証されます。空文字列であってはならず、/~ を含んではならず(JSON Pointer のキーとして使える必要があります)、予約ルート(payloadvarserror)と同じであってはならず、1 つの Script 内で一意でなければなりません。違反した場合はそれぞれ WGL400033(形式)・WGL400032(予約語)・WGL400034(重複)で保存が拒否されます。

エンティティ参照の形式

contentTypetarget などのエンティティ参照は { "sys": { "id": <値式> } } という 1 つの形式に統一します。sys.id だけが必要で、対象タイプは resource から推論します(sys.typesys.targetType は省略)。

  • contentType.sys.id は通常リテラルです(例: "ct_post")。
  • target.sys.id は通常 { /ptr } 値式です(実行時に resolve。例: { /payload/sys/id })。

resource

リソース系の文は対象の種類を resource: "Content" | "Media" で指定します。

リソース書き込み

すべての書き込み文は propagateEvents(デフォルト false)を持ちます。true にすると、その書き込みが自身の EntityEvent を発行します(検索インデックス、Webhook などの後続トリガー)。デフォルトは発行しません(サイレントなシステム書き込み)。

ResourceCreate

Content または Media を作成します。ContentMediafields モデルを共有し、値はロケールマップです。

フィールド対象説明
resource共通"Content" または "Media"(必須)
contentTypeContent作成する Content Type({ sys: { id } })。Content の場合は必須
fields共通フィールドマップ { "<field>": { "<locale>": 値 } }。populate するフィールドごとにデフォルトロケールのバケットが必須。Content のキーは Content Type 定義に従い、Media のキーは固定(titledescriptionfile)
locale共通(便宜)指定すると fields の各値を { <locale>: 値 } に自動ラップ
publish共通書き込み後に公開(CDA/ACDA へ露出)。デフォルト true
  • Mediafile: fields.file.{locale} の値はインジェスト指示 { "source": <値式>, "encoding": "url"|"base64" } です(どちらも必須)。ファイルを含む Media 書き込みは Async 専用です(バックグラウンドでエンジンがインラインで処理してから公開。url と base64 で共通)。ファイルのない(fileless)Media も作成できます。publish:true でファイルがない、または処理が未完了の場合は公開段階でエラーになり、publish:false の場合はそのまま Draft です。
  • 結果(name バインディング): 作成されたリソースです。{ /<name>/sys/id }{ /<name>/fields/<field>/<locale> }
// Content
{ "type": "ResourceCreate", "resource": "Content", "contentType": { "sys": { "id": "ct_post" } },
  "fields": { "title": { "en-US": "{ /payload/fields/title }" } }, "publish": true, "name": "post" }
 
// Media. file はインジェスト指示 (Async 専用)
{ "type": "ResourceCreate", "resource": "Media",
  "fields": {
    "title": { "en-US": "{ /payload/fields/prompt }" },
    "file":  { "en-US": { "source": "{ /gen/body/data/0/url }", "encoding": "url" } }
  }, "name": "img" }

ResourceUpdate

対象の ContentMedia のフィールドを全体置換します(PUT)。fields に渡したものがそのまま新しいフィールドになり、ここにない field と locale は消去されます。一部だけ変更するには ResourcePatch を使います。

フィールド説明
resource"Content" または "Media"
target対象({ sys: { id } }、必須)。id は通常 { /ptr }
fields書き込むフィールド全体。値はロケールマップ全体置換なので、ここにない field と locale は削除されます。Media file はインジェスト指示(上記 ResourceCreate 参照)。列挙したファイルは常に再インジェストし、渡さなかった locale のファイルは削除
locale(便宜)fields を自動ラップ
version(任意)値式(Int)。楽観的ロック。指定すると対象の現在の sys.version一致する場合のみ更新し、不一致の場合はバージョン競合エラーで abort します(Try で catch 可能)。省略時は検査なし(last-write-wins)
publish更新後に republish。デフォルト true

Media で metadata だけを変更しようと Update を使うと file が抜けてファイルがすべて削除されます(全体置換なので)。部分的な変更には必ず ResourcePatch を使います。ファイルを含む Update は Async 専用です。

{ "type": "ResourceUpdate", "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } },
  "fields": { "title": { "en-US": "Hello", "ko-KR": "안녕" }, "status": { "en-US": "published" } } }

ResourcePatch

対象の Content または Media のフィールドを部分マージします(PATCH)。fields に渡したフィールド(およびその中のロケール)のみを上書きし、言及しなかったフィールドとロケールはそのまま維持します。値の形式、localeversionpublishResourceUpdate と同じです。

フィールド説明
resource"Content" または "Media"
target対象({ sys: { id } }、必須)。id は通常 { /ptr }
fields上書きするフィールド。値はロケールマップ指定したフィールドとロケールバケットのみを更新(残りは維持)。値がリテラル null の場合はその (field, locale) を削除Media file はインジェスト指示(上記 ResourceCreate 参照)
locale(便宜)fields を自動ラップ
version(任意)ResourceUpdate と同じ(楽観的ロック)
publish更新後に republish。デフォルト true
  • 特定のロケールやファイルの削除: 値にリテラル null を指定します。例: "title": { "fr-FR": null }(fr-FR のタイトルを削除)、"file": { "en-US": null }(en-US のファイルを削除)。値式が実行時に null と評価されるのは削除ではなくエラーです(リテラル null のみ削除)。
  • Media file にインジェスト指示を与えると、そのロケールのファイルを置き換えます(Async 専用)。ファイルを与えなければ維持します。
// viewCount(en-US) だけ +1。title やその他のロケールなど残りはそのまま維持
{ "type": "ResourcePatch", "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } },
  "fields": { "viewCount": { "en-US": { "+": [ "{ /payload/fields/viewCount }", 1 ] } } } }

ResourceDelete

対象を削除します。DraftArchived 状態のみ削除できます。Published や Changed の場合は拒否されるため、まず ResourceUnpublish する必要があります(Media はファイル処理中(busy)の場合は拒否)。auto-unpublish はしません(CMA/ACMA で同じ)。

フィールド説明
resource"Content" または "Media"
target対象({ sys: { id } }、必須)
{ "type": "ResourceDelete", "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } } }

ResourcePublish, ResourceUnpublish, ResourceArchive, ResourceUnarchive

対象の公開状態とアーカイブ状態を独立して制御します。4 つともフィールドは同じです。各操作の status 前提条件は CMA/ACMA と同じです(publish は Archived 不可でファイル処理の完了が必要、unpublish は PublishedChanged のみ、archive は Draft のみ、unarchive は Archived のみ)。

フィールド説明
resource"Content" または "Media"
target対象({ sys: { id } }、必須)
version(任意)値式(Int)。楽観的ロック。指定すると現在の sys.version と一致する場合のみ実行
{ "type": "ResourcePublish",   "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } } }
{ "type": "ResourceUnpublish", "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } } }
{ "type": "ResourceArchive",   "resource": "Media",   "target": { "sys": { "id": "{ /m/sys/id }" } } }

リソース読み取り

読み取り文は状態を変更しません(propagateEvents はありません)。

3 つの読み取り文はいずれも from(任意、デフォルト Current)で、どの保存版を読み取るかを指定します。Current はコンテンツスタジオに表示される最新の下書き(CMA/ACMA が読む値)で、Published公開スナップショット(CDA/ACDA が配信する、最後に公開した時点の値)です。

ResourceFindResourcePageRead はこれに加えて advanced(任意、デフォルト false)で 高度な検索(Advanced Search) を有効にできます。Content 専用のため、Media の読み取りでは無視されます。有効にすると whereregexnearwithin 演算子と全文検索を使えます(全文検索が有効な LongText フィールドでは、eq が値を含む項目まで部分・類似マッチで見つけます)。また orderfields.* で並べ替えできます。無効にするとこの 3 つの演算子は拒否され、テキストの eq は完全一致になり、prefix と比較・リスト演算子は高度な検索に関係なく動作します。作成または変更したばかりの項目は高度な検索への反映に少し(約 1 秒)かかるため、その直後の高度な検索では拾えないことがあります。書き込んだばかりの項目をすぐに読み取る必要がある場合は、id で ResourceRead(基本の保存版で、反映の遅延はありません)を使うか、書き込みが返した sys.id で取得します。

whereorder では、コンテンツのフィールドは fields.<field> と書きます(名前だけでは認識されません)。fields.<field> には space の既定ロケールが自動的に適用されるため、ロケールを直接付けません。下の例の fields.statusfields.slug がそのまま既定ロケールの照会です。特定(非既定)のロケールだけを狙う場合にのみ、fields.<field>.<locale>(例: fields.title.ko-KR)で明示します。sys.*(sys.createdAt など)と createdBy(:self)は fields. を付けずにそのまま書きます。詳しい規則は 値式の where と order のロケール にあります。

ResourceRead

id で単一件取得します(get-by-id)。結果はリソース全体を名前にバインドします。

フィールド説明
resource"Content" または "Media"
target対象({ sys: { id } })。id は値式
from(任意)Current(デフォルト、最新の下書き)または Published(公開スナップショット)
  • 結果: { /<name>/sys/id }{ /<name>/fields/<field>/<locale> } を直接参照します(items/0 は不要)。
  • 対象がなければエラーです。Try で囲んで処理できます。
{ "type": "ResourceRead", "resource": "Content",
  "target": { "sys": { "id": "{ /payload/fields/orderId }" } }, "name": "order" }

ResourceFind

フィルターで最初にマッチした単一件を読み取ります。なければ null です。ユニークな業務キー(slug、email、sku)で 1 件を探すときに使います。

フィールド説明
resource"Content" または "Media"
contentType(Content) 検索範囲の Content Type({ sys: { id } })
whereフィルター({ "<field>": { "<op>": <値> } })。使える演算子は 演算子一覧 に従います(regexnearwithinadvanced が必要)。createdBy: ":self" をサポート
order複数マッチ時に「最初」を決定するソート(例: "-sys.createdAt")
from(任意)Current(デフォルト、最新の下書き)または Published(公開スナップショット)
advanced(任意)高度な検索(Advanced Search)で実行。Content 専用(Media は無視)。デフォルト false。上の リソース読み取り の説明を参照
  • 結果: 最初にマッチしたリソースを名前にバインドします。{ /<name>/fields/<field>/<locale> } で直接参照します。なければ null なので、{ "==": [ "{ /<name> }", null ] } で存在の有無を分岐します(find-then-upsert の典型)。
{ "type": "ResourceFind", "resource": "Content", "contentType": { "sys": { "id": "ct_article" } },
  "where": { "fields.slug": { "eq": "{ /payload/fields/slug }" } }, "name": "found" }

ResourcePageRead

フィルター、ソート、ページでの取得です。

フィールド説明
resource"Content" または "Media"
contentType(Content) 検索範囲の Content Type
whereフィルター({ "<field>": { "<op>": <値> } })。使える演算子は 演算子一覧 に従います(regexnearwithinadvanced が必要)。createdBy: ":self" をサポート
orderソート(例: "-sys.createdAt")
limitページサイズ(100 以下)
cursor次のページは前回結果の next
from(任意)Current(デフォルト、最新の下書き)または Published(公開スナップショット)
advanced(任意)高度な検索(Advanced Search)で実行。Content 専用(Media は無視)。デフォルト false。上の リソース読み取り の説明を参照
  • 結果: { items, next } です。{ /<name>/items/0/... }、次のページは { /<name>/next }
  • 全体を巡回するには Loop while "{ /vars/hasMore }"cursorSetVar の累積で行います(クックブック 参照)。
{ "type": "ResourcePageRead", "resource": "Content", "contentType": { "sys": { "id": "ct_post" } },
  "where": { "fields.status": { "eq": "draft" } }, "order": "-sys.createdAt", "limit": 100, "name": "page" }

外部

Http

外部 HTTP を呼び出します。Http があれば executionModeAsync でなければなりません(ExternalIo)。

フィールド説明
method"GET", "POST", "PUT", "PATCH", "DELETE"
url対象 URL(値式。{ /ptr } を挿入可能)
headers[{ "key", "value", "secret"? }]value は値式。secret:true のヘッダーは CMA(管理者)専用として扱われ、エンドユーザーには公開されず、送信直前にのみ復号されます
bodyリクエスト body(値式または JSON)
timeoutMsこの呼び出しのタイムアウト(ms)
retry応答 status が 400 以上の場合に再試行する回数。デフォルト 0、上限は maxHttpRetry(デフォルト 2)
ignoreStatusCode(再試行を終えた)最終 status が 400 以上のとき、この呼び出しを失敗とみなすか。false(デフォルト)の場合は失敗として扱われTry/catch の対象になります。true の場合は失敗とみなさず、{ status, body } をそのままバインドします(呼び出し元が status で直接分岐)
  • 結果: { status, body } です。{ /<name>/status }{ /<name>/body/... }
  • 応答サイズの上限: 応答本文は最大 10MiB です。これを超えると、この呼び出しは例外で失敗し、他のランタイム失敗と同様に Try/catch で処理できます(サイズによる失敗なので ignoreStatusCode では無視されません)。
{ "type": "Http", "method": "POST", "url": "https://api.llm.com/v1/gen",
  "headers": [ { "key": "Authorization", "value": "Bearer sk-...", "secret": true } ],
  "body": { "prompt": "{ /payload/fields/prompt }" }, "timeoutMs": 15000, "retry": 1, "name": "resp" }

変数

SetVar

script-scoped な可変変数を宣言または更新します。{ /vars/<var> } で参照します(JsonLogic には変数宣言がないため statement として提供します)。

フィールド説明
var変数名。{ /vars/<var> } で参照
value値式。自分自身を参照して累積できます
{ "type": "SetVar", "var": "total", "value": 0 }
{ "type": "SetVar", "var": "total", "value": { "+": [ "{ /vars/total }", "{ /row/qty }" ] } }   // 累積
{ "type": "SetVar", "var": "ids",   "value": { "merge": [ "{ /vars/ids }", [ "{ /row/sys/id }" ] ] } }  // 配列の収集

制御フロー

If

条件分岐です。condition は JsonLogic で、真偽は 真偽判定 の規則に従います。

フィールド説明
conditionJsonLogic(boolean として評価)
then真の場合に実行する Statement 配列
else(任意)偽の場合に実行する Statement 配列
{ "type": "If",
  "condition": { "<": [ "{ /wallet/fields/balance/en-US }", "{ /payload/fields/cost }" ] },
  "then": [ { "type": "Return", "value": { "ok": false, "reason": "insufficient credit" } } ],
  "else": [ /* ... */ ] }

Loop

繰り返しです。モードを 1 つ選びます。over(foreach)、while(条件)、for(カウント)です。どのモードでもエンジンが maxIterations で上限を強制します(無限ループの防止)。body 内での外部呼び出し(HttpMedia のファイルインジェスト)は禁止されます。

フィールド説明
overforeach: 配列に resolve される値式
while条件: JsonLogic(真である間繰り返す)
forカウント: { "from", "to", "step"? }from から to まで含むstep はデフォルト 1
maxIterationsエンジンが強制する最大繰り返し回数(必須)
as現在の項目やインデックスをバインドする名前({ /<as> })
body繰り返し本体の Statement 配列
// foreach
{ "type": "Loop", "over": "{ /payload/fields/items }", "as": "item", "maxIterations": 100,
  "body": [ { "type": "ResourceCreate", "resource": "Content", "contentType": { "sys": { "id": "ct_item" } },
             "fields": { "name": { "en-US": "{ /item/name }" } } } ] }
 
// while
{ "type": "Loop", "while": "{ /vars/hasMore }", "maxIterations": 1000, "body": [ /* ... */ ] }
 
// counted (1..10 step 2)
{ "type": "Loop", "for": { "from": 1, "to": 10, "step": 2 }, "as": "i", "maxIterations": 100, "body": [ /* ... */ ] }

Parallel

ブランチを同時に実行し、join してから進みます。ブランチ間の参照は不可です(依存がある場合は順次に配置します)。

フィールド説明
branchesStatement[][]。各要素が 1 つのブランチ(文の配列)
{ "type": "Parallel", "branches": [
  [ { "type": "Http", "method": "GET", "url": "https://api.a.com/x", "name": "a" } ],
  [ { "type": "Http", "method": "GET", "url": "https://api.b.com/y", "name": "b" } ]
] }

Return

一般的なプログラミングの return ですScript の結果を呼び出し元に返し、その地点で正常終了します。

フィールド説明
value(任意)返す値式
isErrorデフォルト falsetrue の場合は value が応答の error として返ります(そうでなければ return)
statusCode応答ステータスコード。デフォルト 200
  • Return に到達しなければ返り値はありません。結果を返すには value を明示します。
  • 例外や throw ではなく正常終了なので catch の対象ではありません(Try の中でも Script 全体を終了しますが finally は実行します)。
  • guard もこの文で表現します。Ifthen:[Return](条件違反時に返却して以降は実行しない)であり、複数ある用途の 1 つです。
{ "type": "Return", "value": { "orderId": "{ /order/sys/id }", "status": "paid" }, "statusCode": 201 }
{ "type": "Return", "value": { "reason": "payment failed" }, "isError": true, "statusCode": 402 }

Try

例外処理です。

フィールド説明
body試行する Statement 配列
catch(任意)body 失敗時に実行。/error{ message, statement } を露出
finally(任意)成功・失敗に関わらず常に実行
  • catch が処理すれば Script は中断されません。catch のない失敗のみが Script を中断させます(補償の試行を含む)。
  • 何が「失敗」なのか、補償(compensation)の限界は 実行セマンティクス、制約、セキュリティ で扱います。
{ "type": "Try",
  "body":    [ { "type": "Http", "method": "POST", "url": "https://primary.api/gen", "name": "resp" },
               { "type": "ResourceCreate", "resource": "Content", "contentType": { "sys": { "id": "ct_result" } },
                 "fields": { "text": { "en-US": "{ /resp/body/text }" } } } ],
  "catch":   [ { "type": "ResourceCreate", "resource": "Content", "contentType": { "sys": { "id": "ct_result" } },
                 "fields": { "text": { "en-US": "生成失敗" }, "error": { "en-US": "{ /error/message }" } } } ],
  "finally": [ /* 常に実行 */ ] }