Catálogo de statements
Última atualização: 23 de julho de 2026
Cada elemento do array statements é um único statement. Este documento cataloga os campos, o comportamento e o resultado dos 17 tipos de statement. Toda posição de valor segue as regras de Expressões de valor (referência, literal, JsonLogic, mapa de locale).
Resumo dos statements
| Categoria | type | Resumo em uma linha |
|---|---|---|
| Escritas de recurso | ResourceCreate | Cria Content/Media (opcionalmente publica) |
ResourceUpdate | Substituição total dos campos de Content/Media (todo campo/locale não fornecido é excluído) | |
ResourcePatch | Mesclagem parcial dos campos de Content/Media (apenas os campos/locales especificados; um null literal exclui) | |
ResourceDelete | Exclui (apenas Draft/Archived; se Published, anule a publicação primeiro) | |
ResourcePublish / ResourceUnpublish | Publica / anula a publicação | |
ResourceArchive / ResourceUnarchive | Arquiva / desarquiva | |
| Leituras de recurso | ResourceRead | Lê um único item por id |
ResourceFind | Primeiro item único correspondente por filtro (null se não houver) | |
ResourcePageRead | Leitura com filtro/ordenação/página ({ items, next }) | |
| Externo | Http | Chamada HTTP externa ({ status, body }). Exclusivamente Async |
| Variáveis | SetVar | Declara/atualiza uma variável com escopo de script |
| Controle de fluxo | If | Ramificação condicional |
Loop | Itera (foreach / while / counted) | |
Parallel | Executa branches de forma concorrente | |
Return | Retorna um resultado e encerra antecipadamente | |
Try | Tratamento de exceções (catch/finally) |
Chamadas cíclicas são limitadas a 3. As instruções de escrita de recursos acima (
ResourceCreate,ResourceUpdate,ResourcePublishetc.) geram eventos de alteração, e esses eventos podem executar um Script novamente por meio de um Webhook. Uma cadeia assim (Script → evento → Webhook → Script → …) continua no máximo 3 vezes. A partir daí, a plataforma a interrompe automaticamente para evitar loops infinitos.
Campos comuns
{ "type": "<StatementType>", "name": "<opcional, único dentro do script>", /* ...campos específicos do tipo... */ }type: o discriminador. Um dos valores da tabela acima (obrigatório).name: opcional. Se definido, o resultado é vinculado ao contexto em/<name>, de modo que statements posteriores podem referenciá-lo como{ /<name>/... }. Omita-o se você não usar o resultado.- Regras de nome de vínculo:
name(e oasdeLoop) é uma chave adicionada diretamente à raiz do contexto, por isso é validada ao salvar. Ela não pode ser uma string vazia e não pode conter/nem~(precisa poder servir como chave de JSON Pointer), não pode coincidir com as raízes reservadas (payload,vars,error) e deve ser única dentro de um Script. Em caso de violação, o salvamento é rejeitado comWGL400033(formato),WGL400032(palavra reservada) ouWGL400034(duplicidade), respectivamente.
Formato da referência de entidade
Referências de entidade como contentType e target são unificadas em um único formato: { "sys": { "id": <expressão de valor> } }. Apenas sys.id é necessário; o tipo de destino é inferido a partir de resource (sys.type e sys.targetType são omitidos).
contentType.sys.idgeralmente é um literal (ex.:"ct_post").target.sys.idgeralmente é uma expressão de valor{ /ptr }(resolvida em tempo de execução; ex.:{ /payload/sys/id }).
resource
Os statements da família de recursos especificam o tipo de destino com resource: "Content" | "Media".
Escritas de recurso
Todo statement de escrita tem propagateEvents (padrão false). Defini-lo como true faz com que essa escrita emita seu próprio EntityEvent (acionando trabalhos subsequentes, como a indexação de busca e Webhooks). O padrão não emite (uma escrita silenciosa do sistema).
ResourceCreate
Cria um Content ou Media. Content e Media compartilham o modelo fields, e os valores são mapas de locale.
| Campo | Aplica-se a | Descrição |
|---|---|---|
resource | Comum | "Content" ou "Media" (obrigatório) |
contentType | Content | O Content Type a criar ({ sys: { id } }). Obrigatório para Content |
fields | Comum | Mapa de campos { "<field>": { "<locale>": valor } }. Cada campo preenchido exige o bucket do locale padrão. As chaves de Content seguem a definição do Content Type; as chaves de Media são fixas (title, description, file) |
locale | Comum | (Conveniência) Se fornecido, cada valor em fields é automaticamente encapsulado como { <locale>: valor } |
publish | Comum | Publica após a escrita (exposto na CDA/ACDA). Padrão true |
Mediafile: o valor defields.file.{locale}é uma instrução de ingestão{ "source": <expressão de valor>, "encoding": "url"|"base64" }(ambos obrigatórios). Uma escrita de Media que inclui um arquivo é exclusivamente Async (o motor a processa de forma inline em segundo plano e depois publica; vale para url e base64). Você também pode criar um Media sem arquivo (fileless). Sepublish:truemas não houver arquivo ou o processamento estiver incompleto, a etapa de publicação gera erro; sepublish:false, permaneceDraft.- Resultado (vínculo de
name): o recurso criado.{ /<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 é uma instrução de ingestão (exclusivamente 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
Substitui totalmente os campos do Content ou Media de destino (PUT). O que você passa em fields se torna o novo conjunto de campos, e todo campo e locale que não estiver presente aqui é removido. Para alterar apenas parte dele, use ResourcePatch.
| Campo | Descrição |
|---|---|
resource | "Content" ou "Media" |
target | O destino ({ sys: { id } }, obrigatório). O id geralmente é { /ptr } |
fields | O conjunto completo de campos a escrever. Os valores são mapas de locale. Por ser uma substituição total, todo campo e locale que não estiver presente aqui é removido. O file de Media é uma instrução de ingestão (veja ResourceCreate acima). Os arquivos listados são sempre reingeridos, e os arquivos de locales não fornecidos são excluídos |
locale | (Conveniência) Encapsula fields automaticamente |
version | (Opcional) Uma expressão de valor (Int). Bloqueio otimista. Se fornecido, a atualização é executada somente se corresponder ao sys.version atual do destino; em caso de divergência, ela é abortada com um erro de conflito de versão (que pode ser capturado com Try). Se omitido, não há verificação (last-write-wins) |
publish | Republica após a atualização. Padrão true |
Se você usar o Update apenas para alterar os metadados de um Media, o file fica de fora e todos os arquivos são excluídos (por ser uma substituição total). Para alterações parciais, use obrigatoriamente ResourcePatch. Um Update que inclui arquivo é exclusivamente Async.
{ "type": "ResourceUpdate", "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } },
"fields": { "title": { "en-US": "Hello", "ko-KR": "안녕" }, "status": { "en-US": "published" } } }ResourcePatch
Mescla parcialmente os campos do Content ou Media de destino (PATCH). Ela sobrescreve apenas os campos (e os locales dentro deles) que você passa em fields e mantém intactos os campos e locales que você não menciona. O formato dos valores, locale, version e publish são os mesmos de ResourceUpdate.
| Campo | Descrição |
|---|---|
resource | "Content" ou "Media" |
target | O destino ({ sys: { id } }, obrigatório). O id geralmente é { /ptr } |
fields | Os campos a sobrescrever. Os valores são mapas de locale. Atualiza apenas os campos e buckets de locale especificados (o restante é mantido). Se um valor for um null literal, esse par (campo, locale) é excluído. O file de Media é uma instrução de ingestão (veja ResourceCreate acima) |
locale | (Conveniência) Encapsula fields automaticamente |
version | (Opcional) O mesmo que ResourceUpdate (bloqueio otimista) |
publish | Republica após a atualização. Padrão true |
- Excluir um locale ou arquivo específico: forneça um
nullliteral como valor. Por exemplo:"title": { "fr-FR": null }(exclui o título fr-FR),"file": { "en-US": null }(exclui o arquivo en-US). Uma expressão de valor que é avaliada como null em tempo de execução não é uma exclusão, mas um erro (apenas um null literal exclui). - Se você fornecer uma instrução de ingestão ao
filede Media, ela substitui o arquivo daquele locale (exclusivamente Async). Se você não fornecer um arquivo, ele é mantido.
// +1 apenas em viewCount(en-US). title, outros locales e todo o resto são mantidos como estão
{ "type": "ResourcePatch", "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } },
"fields": { "viewCount": { "en-US": { "+": [ "{ /payload/fields/viewCount }", 1 ] } } } }ResourceDelete
Exclui o destino. Apenas os status Draft e Archived podem ser excluídos. Se estiver Published ou Changed, a exclusão é rejeitada, portanto você deve fazer ResourceUnpublish primeiro (para Media, também é rejeitada enquanto o arquivo está sendo processado (busy)). Não faz auto-unpublish (igual à CMA/ACMA).
| Campo | Descrição |
|---|---|
resource | "Content" ou "Media" |
target | O destino ({ sys: { id } }, obrigatório) |
{ "type": "ResourceDelete", "resource": "Content", "target": { "sys": { "id": "{ /payload/sys/id }" } } }ResourcePublish, ResourceUnpublish, ResourceArchive, ResourceUnarchive
Controlam de forma independente o estado de publicação e de arquivamento do destino. Os quatro compartilham os mesmos campos. A pré-condição de status de cada operação é a mesma da CMA/ACMA (a publicação não é permitida a partir de Archived e exige que o processamento do arquivo esteja concluído; a anulação da publicação apenas a partir de Published/Changed; o arquivamento apenas a partir de Draft; o desarquivamento apenas a partir de Archived).
| Campo | Descrição |
|---|---|
resource | "Content" ou "Media" |
target | O destino ({ sys: { id } }, obrigatório) |
version | (Opcional) Uma expressão de valor (Int). Bloqueio otimista. Se fornecido, a operação é executada apenas se corresponder ao sys.version atual |
{ "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 }" } } }Leituras de recurso
Os statements de leitura não alteram o estado (sem propagateEvents).
Os três statements de leitura usam from (opcional, padrão Current) para definir de qual versão armazenada ler. Current é o rascunho mais recente visto no estúdio de conteúdo (o valor que a CMA/ACMA lê); Published é o snapshot de publicação (o valor no momento da última publicação, entregue pela CDA/ACDA).
Além disso, ResourceFind e ResourcePageRead podem ativar a Busca avançada (Advanced Search) por meio de advanced (opcional, padrão false). É exclusiva de Content, portanto é ignorada nas leituras de Media. Quando ativada, em where é possível usar os operadores regex, near e within e a busca de texto completo (em um campo LongText com a busca de texto completo ativada, eq também encontra os itens que contêm o valor, por correspondência parcial ou aproximada), e order pode ordenar por fields.*. Quando desativada, esses três operadores são rejeitados, eq em texto é correspondência exata, e prefix e os operadores de comparação e de lista funcionam independentemente da busca avançada. Um item recém-criado ou editado leva um breve instante (cerca de 1 segundo) para ser refletido na busca avançada, portanto pode não ser capturado pela consulta de busca avançada imediatamente seguinte. Para ler de imediato um item recém-escrito, use ResourceRead por id (o armazenamento primário, sem esse atraso) ou consulte pelo sys.id que a escrita retornou.
Em where e order, os campos de conteúdo são escritos como fields.<field> (o nome sozinho não é reconhecido). Para fields.<field>, aplica-se automaticamente o locale padrão do Space, portanto você não anexa um locale diretamente. Os fields.status e fields.slug nos exemplos abaixo já são consultas no locale padrão. Somente para direcionar a um locale específico (não padrão), você o indica explicitamente como fields.<field>.<locale> (por exemplo, fields.title.ko-KR). sys.* (como sys.createdAt) e createdBy (:self) são escritos tal como estão, sem fields.. As regras detalhadas estão em Expressões de valor: o locale em where e order.
ResourceRead
Lê um único item por id (get-by-id). O resultado vincula o recurso inteiro ao nome.
| Campo | Descrição |
|---|---|
resource | "Content" ou "Media" |
target | O destino ({ sys: { id } }). O id é uma expressão de valor |
from | (Opcional) Current (padrão, o rascunho mais recente) ou Published (o snapshot de publicação) |
- Resultado: referencie
{ /<name>/sys/id }e{ /<name>/fields/<field>/<locale> }diretamente (sem necessidade deitems/0). - Se o destino não existir, gera erro. Você pode envolvê-lo em
Trypara tratar isso.
{ "type": "ResourceRead", "resource": "Content",
"target": { "sys": { "id": "{ /payload/fields/orderId }" } }, "name": "order" }ResourceFind
Lê o primeiro item único correspondente por filtro. Se não houver nenhum, é null. Use-o para encontrar um registro por uma chave de negócio única (slug, email, sku).
| Campo | Descrição |
|---|---|
resource | "Content" ou "Media" |
contentType | (Content) O Content Type no qual pesquisar ({ sys: { id } }) |
where | O filtro ({ "<field>": { "<op>": <valor> } }). Os operadores são os da lista de operadores (regex/near/within exigem advanced). createdBy: ":self" suportado |
order | A ordenação que determina o "primeiro" quando há várias correspondências (ex.: "-sys.createdAt") |
from | (Opcional) Current (padrão, o rascunho mais recente) ou Published (o snapshot de publicação) |
advanced | (Opcional) Executar via busca avançada. Somente Content (Media é ignorado). Padrão false. Veja a nota Leituras de recurso acima. |
- Resultado: vincula o primeiro recurso correspondente ao nome. Referencie-o diretamente como
{ /<name>/fields/<field>/<locale> }. Como énullquando não há nenhum, ramifique conforme a existência com{ "==": [ "{ /<name> }", null ] }(o padrão típico find-then-upsert).
{ "type": "ResourceFind", "resource": "Content", "contentType": { "sys": { "id": "ct_article" } },
"where": { "fields.slug": { "eq": "{ /payload/fields/slug }" } }, "name": "found" }ResourcePageRead
Uma leitura com filtro, ordenação e página.
| Campo | Descrição |
|---|---|
resource | "Content" ou "Media" |
contentType | (Content) O Content Type no qual pesquisar |
where | O filtro ({ "<field>": { "<op>": <valor> } }). Os operadores são os da lista de operadores (regex/near/within exigem advanced). createdBy: ":self" suportado |
order | A ordenação (ex.: "-sys.createdAt") |
limit | Tamanho da página (100 ou menos) |
cursor | Para a próxima página, o next do resultado anterior |
from | (Opcional) Current (padrão, o rascunho mais recente) ou Published (o snapshot de publicação) |
advanced | (Opcional) Executar via busca avançada. Somente Content (Media é ignorado). Padrão false. Veja a nota Leituras de recurso acima. |
- Resultado:
{ items, next }.{ /<name>/items/0/... }, e a próxima página é{ /<name>/next }. - Para percorrer tudo, use
Loop while "{ /vars/hasMore }"junto comcursore a acumulação deSetVar(veja o Cookbook).
{ "type": "ResourcePageRead", "resource": "Content", "contentType": { "sys": { "id": "ct_post" } },
"where": { "fields.status": { "eq": "draft" } }, "order": "-sys.createdAt", "limit": 100, "name": "page" }Externo
Http
Chama um endpoint HTTP externo. Quando há Http, executionMode deve ser Async (ExternalIo).
| Campo | Descrição |
|---|---|
method | "GET", "POST", "PUT", "PATCH", "DELETE" |
url | A URL de destino (uma expressão de valor; { /ptr } pode ser interpolado) |
headers | [{ "key", "value", "secret"? }]. value é uma expressão de valor. Um cabeçalho secret:true é tratado como exclusivo da CMA (administrador): não é exposto aos usuários finais e é descriptografado apenas imediatamente antes de a requisição ser enviada |
body | O corpo da requisição (uma expressão de valor ou JSON) |
timeoutMs | O tempo limite desta chamada (ms) |
retry | O número de novas tentativas quando o status da resposta é 400 ou superior. Padrão 0; o limite máximo é maxHttpRetry (padrão 2) |
ignoreStatusCode | Se esta chamada deve ser tratada como uma falha quando o status final (após as novas tentativas) é 400 ou superior. Quando false (padrão), ela é tratada como uma falha e se torna um alvo de Try/catch. Quando true, ela não é tratada como uma falha e { status, body } é vinculado como está (o chamador ramifica com base no próprio status) |
- Resultado:
{ status, body }.{ /<name>/status },{ /<name>/body/... }. - Limite de tamanho da resposta: O corpo da resposta tem no máximo 10MiB. Se exceder isso, esta chamada falha com uma exceção e pode ser tratada como qualquer outra falha em tempo de execução com
Try/catch(é uma falha baseada em tamanho, portanto não é suprimida porignoreStatusCode).
{ "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" }Variáveis
SetVar
Declara ou atualiza uma variável mutável com escopo de script. Referencie-a como { /vars/<var> } (o JsonLogic não tem declaração de variável, por isso ela é fornecida como um statement).
| Campo | Descrição |
|---|---|
var | O nome da variável. Referenciada como { /vars/<var> } |
value | Uma expressão de valor. Pode referenciar a si mesma para acumular |
{ "type": "SetVar", "var": "total", "value": 0 }
{ "type": "SetVar", "var": "total", "value": { "+": [ "{ /vars/total }", "{ /row/qty }" ] } } // acumula
{ "type": "SetVar", "var": "ids", "value": { "merge": [ "{ /vars/ids }", [ "{ /row/sys/id }" ] ] } } // coleta em arrayControle de fluxo
If
Uma ramificação condicional. condition é JsonLogic, e verdadeiro/falso segue as regras de Avaliação de verdadeiro e falso.
| Campo | Descrição |
|---|---|
condition | JsonLogic (avaliado como booleano) |
then | O array de Statement a executar quando verdadeiro |
else | (Opcional) O array de Statement a executar quando falso |
{ "type": "If",
"condition": { "<": [ "{ /wallet/fields/balance/en-US }", "{ /payload/fields/cost }" ] },
"then": [ { "type": "Return", "value": { "ok": false, "reason": "insufficient credit" } } ],
"else": [ /* ... */ ] }Loop
Iteração. Escolha um modo: over (foreach), while (condição) ou for (contado). Em qualquer modo, o motor impõe um limite máximo com maxIterations (para evitar loops infinitos). Chamadas externas dentro de body (Http, ingestão de arquivo de Media) são proibidas.
| Campo | Descrição |
|---|---|
over | foreach: uma expressão de valor que resolve para um array |
while | condição: JsonLogic (repete enquanto verdadeiro) |
for | contado: { "from", "to", "step"? }. De from até to inclusive; step tem padrão 1 |
maxIterations | O número máximo de iterações imposto pelo motor (obrigatório) |
as | O nome ao qual vincular o item atual ou o índice ({ /<as> }) |
body | O array de Statement do corpo do loop |
// 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
Executa as branches de forma concorrente e prossegue após a junção delas. Referências entre branches não são permitidas (se houver uma dependência, coloque-as sequencialmente).
| Campo | Descrição |
|---|---|
branches | Statement[][]. Cada elemento é uma branch (um array de statements) |
{ "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
É o return da programação comum. Retorna o resultado do Script ao chamador e encerra normalmente naquele ponto.
| Campo | Descrição |
|---|---|
value | (Opcional) A expressão de valor a retornar |
isError | Padrão false. Quando true, value retorna como o error da resposta (caso contrário, como return) |
statusCode | O código de status da resposta. Padrão 200 |
- Se
Returnnunca for alcançado, não há valor de retorno. Para retornar um resultado, especifiquevalueexplicitamente. - Por ser um encerramento normal, não uma exceção ou throw, não é alvo de
catch(mesmo dentro deTry, encerra o Script inteiro, masfinallyainda é executado). - Um guard também é expresso com este statement:
Ifcombinado comthen:[Return](retorna quando a condição é violada, de modo que o que vem depois não é executado). Este é um de seus vários usos.
{ "type": "Return", "value": { "orderId": "{ /order/sys/id }", "status": "paid" }, "statusCode": 201 }
{ "type": "Return", "value": { "reason": "payment failed" }, "isError": true, "statusCode": 402 }Try
Tratamento de exceções.
| Campo | Descrição |
|---|---|
body | O array de Statement a tentar |
catch | (Opcional) Executa quando body falha. Expõe { message, statement } em /error |
finally | (Opcional) Executa sempre, independentemente de sucesso ou falha |
- Se
catcho tratar, o Script não é interrompido. Apenas uma falha semcatchinterrompe o Script (incluindo uma tentativa de compensação). - O que conta como "falha" e os limites da compensação são abordados em Semântica de execução, restrições e segurança.
{ "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": "Falha na geração" }, "error": { "en-US": "{ /error/message }" } } } ],
"finally": [ /* sempre é executado */ ] }Documentos relacionados
- Expressões de valor: as regras de valor que todos os campos acima seguem.
- Semântica de execução, restrições e segurança: ordem de execução, erros, restrições estáticas e segurança.
- Cookbook: exemplos completos que combinam esses statements.
- Visão geral de Script: a estrutura de nível superior e os modos de execução.
