Statement カタログ
最終更新: 2026年7月23日
statements 配列の各要素が 1 つの文(statement)です。このドキュメントでは 17 種の文のフィールド、動作、結果を整理します。すべての値の箇所は 値式 の規則(参照、リテラル、JsonLogic、ロケールマップ)に従います。
Statement 概要
| 分類 | type | 一行要約 |
|---|---|---|
| リソース書き込み | ResourceCreate | Content/Media を生成(任意で公開) |
ResourceUpdate | Content/Media フィールドの全体置換(渡さなかった field・locale は削除) | |
ResourcePatch | Content/Media フィールドの部分マージ(指定した field・locale のみ。リテラル null は削除) | |
ResourceDelete | 削除(Draft・Archived のみ。Published の場合はまず unpublish) | |
ResourcePublish / ResourceUnpublish | 公開 / 公開取り消し | |
ResourceArchive / ResourceUnarchive | アーカイブ / アーカイブ解除 | |
| リソース読み取り | ResourceRead | id で単一件取得 |
ResourceFind | フィルターで最初にマッチした単一件(なければ null) | |
ResourcePageRead | フィルター/ソート/ページ取得({ items, next }) | |
| 外部 | Http | 外部 HTTP 呼び出し({ status, body })。Async 専用 |
| 変数 | SetVar | script-scoped 変数の宣言/更新 |
| 制御フロー | If | 条件分岐 |
Loop | 繰り返し(foreach / while / counted) | |
Parallel | ブランチの同時実行 | |
Return | 結果の返却と早期終了 | |
Try | 例外処理(catch/finally) |
循環呼び出しは最大3回まで。 上のリソース書き込み文(
ResourceCreate・ResourceUpdate・ResourcePublishなど)は変更イベントを発生させ、そのイベントが Webhook を通じて再び Script を実行することがあります。このような連鎖(Script → イベント → Webhook → Script → …)は最大3回までしか続かず、それを超えるとプラットフォームが自動的に打ち切って無限ループを防ぎます。
共通フィールド
{ "type": "<StatementType>", "name": "<任意、script 内で一意>", /* ...タイプ別フィールド... */ }type: 判別子です。上表の値のいずれかです(必須)。name: 任意です。付けると結果が/<name>としてコンテキストにバインドされ、以降の statement が{ /<name>/... }で参照します。結果を使わない場合は省略します。- バインディング名の規則:
name(およびLoopのas)はコンテキストルートにそのまま載るキーなので、保存時に検証されます。空文字列であってはならず、/・~を含んではならず(JSON Pointer のキーとして使える必要があります)、予約ルート(payload・vars・error)と同じであってはならず、1 つの Script 内で一意でなければなりません。違反した場合はそれぞれWGL400033(形式)・WGL400032(予約語)・WGL400034(重複)で保存が拒否されます。
エンティティ参照の形式
contentType、target などのエンティティ参照は { "sys": { "id": <値式> } } という 1 つの形式に統一します。sys.id だけが必要で、対象タイプは resource から推論します(sys.type と sys.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 を作成します。Content と Media は fields モデルを共有し、値はロケールマップです。
| フィールド | 対象 | 説明 |
|---|---|---|
resource | 共通 | "Content" または "Media"(必須) |
contentType | Content | 作成する Content Type({ sys: { id } })。Content の場合は必須 |
fields | 共通 | フィールドマップ { "<field>": { "<locale>": 値 } }。populate するフィールドごとにデフォルトロケールのバケットが必須。Content のキーは Content Type 定義に従い、Media のキーは固定(title・description・file) |
locale | 共通 | (便宜)指定すると fields の各値を { <locale>: 値 } に自動ラップ |
publish | 共通 | 書き込み後に公開(CDA/ACDA へ露出)。デフォルト true |
Mediaのfile: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
対象の Content や Media のフィールドを全体置換します(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 に渡したフィールド(およびその中のロケール)のみを上書きし、言及しなかったフィールドとロケールはそのまま維持します。値の形式、locale、version、publish は ResourceUpdate と同じです。
| フィールド | 説明 |
|---|---|
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
対象を削除します。Draft と Archived 状態のみ削除できます。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 は Published・Changed のみ、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 が配信する、最後に公開した時点の値)です。
ResourceFind と ResourcePageRead はこれに加えて advanced(任意、デフォルト false)で 高度な検索(Advanced Search) を有効にできます。Content 専用のため、Media の読み取りでは無視されます。有効にすると where で regex・near・within 演算子と全文検索を使えます(全文検索が有効な LongText フィールドでは、eq が値を含む項目まで部分・類似マッチで見つけます)。また order は fields.* で並べ替えできます。無効にするとこの 3 つの演算子は拒否され、テキストの eq は完全一致になり、prefix と比較・リスト演算子は高度な検索に関係なく動作します。作成または変更したばかりの項目は高度な検索への反映に少し(約 1 秒)かかるため、その直後の高度な検索では拾えないことがあります。書き込んだばかりの項目をすぐに読み取る必要がある場合は、id で ResourceRead(基本の保存版で、反映の遅延はありません)を使うか、書き込みが返した sys.id で取得します。
where と order では、コンテンツのフィールドは fields.<field> と書きます(名前だけでは認識されません)。fields.<field> には space の既定ロケールが自動的に適用されるため、ロケールを直接付けません。下の例の fields.status・fields.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>": <値> } })。使える演算子は 演算子一覧 に従います(regex・near・within は advanced が必要)。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>": <値> } })。使える演算子は 演算子一覧 に従います(regex・near・within は advanced が必要)。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 }"とcursor、SetVarの累積で行います(クックブック 参照)。
{ "type": "ResourcePageRead", "resource": "Content", "contentType": { "sys": { "id": "ct_post" } },
"where": { "fields.status": { "eq": "draft" } }, "order": "-sys.createdAt", "limit": 100, "name": "page" }外部
Http
外部 HTTP を呼び出します。Http があれば executionMode は Async でなければなりません(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 で、真偽は 真偽判定 の規則に従います。
| フィールド | 説明 |
|---|---|
condition | JsonLogic(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 内での外部呼び出し(Http、Media のファイルインジェスト)は禁止されます。
| フィールド | 説明 |
|---|---|
over | foreach: 配列に 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 してから進みます。ブランチ間の参照は不可です(依存がある場合は順次に配置します)。
| フィールド | 説明 |
|---|---|
branches | Statement[][]。各要素が 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 | デフォルト false。true の場合は value が応答の error として返ります(そうでなければ return) |
statusCode | 応答ステータスコード。デフォルト 200 |
Returnに到達しなければ返り値はありません。結果を返すにはvalueを明示します。- 例外や throw ではなく正常終了なので
catchの対象ではありません(Tryの中でも Script 全体を終了しますがfinallyは実行します)。 - guard もこの文で表現します。
Ifとthen:[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": [ /* 常に実行 */ ] }関連ドキュメント
- 値式: 上記すべてのフィールドが従う値の規則。
- 実行セマンティクス、制約、セキュリティ: 実行順序、エラー、静的制約、セキュリティ。
- クックブック: これらの文を組み合わせた完結した例。
- Script 概要: 最上位の構造と実行モード。
