---
title: "Update a rule"
method: PATCH
path: "/v25-10-beta/agentic-logic/rules/{ruleId}"
tags: ["Agentic Logic"]
---

# Update a rule

`PATCH /v25-10-beta/agentic-logic/rules/{ruleId}`

## Request

- Base URL: `https://api.intelligems.io`
- URL: `https://api.intelligems.io/v25-10-beta/agentic-logic/rules/{ruleId}`
- Auth: API key in header `intelligems-access-token`
- TypeScript: <https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta/docs/v25-10-beta/agentic-logic/rules/:ruleId/patch.ts> (a function with typed inputs; its response is checked against the schema)

```http
PATCH /v25-10-beta/agentic-logic/rules/{ruleId}
```

Updates a rule's name, description, settings, or builder-template
configuration. The response is `{ rule }`. This endpoint never changes the
rule's lifecycle state, and `targetSurfaces` cannot change.

- `name` (string, optional) — New merchant-facing name.
- `description` (string, optional, 1–1024 characters) — New plain-language
  summary.
- `settings` (object, optional) — New recommendation settings, the same shape
  as on create. Replaces the stored object whole: a partial object is not
  merged.
- `templateParams` (object, optional) — New template parameters (builder rules
  only).
- `templateVersion` (number, optional) — New template version (builder rules
  only; must be sent with `templateParams`).
- `authoringSessionId` (string, optional) — The AI chat session that authored
  the rule.

Settings and template changes take effect at the next publish; the currently
active version keeps serving until then.

Use the `intelligems-access-token` header. The token selects the organization; do not send `orgId`. The organization must have Agentic Logic enabled.

**Rate Limit:** 50 requests per 30s window, refilling 25 tokens every 30s.

## Path parameters

- `ruleId` string, uuid, required

## Request body

- object: Update a rule's mutable fields. Lifecycle state moves through the lifecycle verbs, never through this endpoint.
  - `name` string: New merchant-facing name.
  - `description` string: New plain-language rule summary.
  - `settings` object: New recommendation settings. Replaces the stored object whole — a partial object is not merged. Takes effect at the next publish.
    - `maxItems` integer: Most products the rule may return, 1-10. The engine supplies it to the rule as `context.slotsNeeded` and trims the envelope to it. One bound for every surface, because one rule can serve several. A surface may still show fewer at once: the checkout block's grid paginates the returned list into a carousel, which is presentation and stays with the placement.
    - `excludeOutOfStock` boolean: Drop products with no purchasable variant. Applied where the product data already is: inside the template for a builder rule, inside the generated source for a code rule, and again as a floor when the engine hydrates the result — so the setting is true on every surface rather than only the ones that remembered to pass it.
    - `excludeItemsInCart` boolean: Drop products the shopper already has in the cart. Runs before the emptiness test, so an envelope this empties falls through to `onEmpty` rather than reporting itself as a result.
    - `excludePdpProduct` boolean: Drop the product the shopper is viewing (`request.pageProduct`, PDP only). Applied inside builder templates before the item cap, so the slot backfills, and again by the engine on every rule's result. Turn it off when the viewed product belongs in the result, e.g. a bundle built around it.
    - `onEmpty` 'hide' | 'smart-recs': What the slot does when the rule returns zero items: 'hide' the placement or fall back to 'smart-recs'. Errors and timeouts take the same route as a miss — there is no separate error policy — and stay distinct in telemetry.
  - `templateParams` object: New template params for builder rules, validated against the template's params schema at write time.
  - `templateVersion` integer: Template artifact version the new params were authored against.
  - `authoringSessionId` string: Id of the AI chat session that authored this rule, recorded by the workspace client once the session id is known (the create call is made by a tool that does not carry it). Re-sending the stored id is a no-op; a different id repoints the rule at that newer conversation, which is what a revision session does when it finishes.

## Response `200`

OK

- object
  - `rule` object, required: One recommendation rule: the org-scoped container that owns drafts, immutable versions, and placement assignments. The rule row carries lifecycle state; only 'active' rules are evaluable.
    - `id` string, required: Server-issued rule id (uuid).
    - `organizationId` string, required: Owning organization id (uuid).
    - `name` string, required: Merchant-facing rule name.
    - `description` string, required: Plain-language summary of what the rule recommends, in what order, and for which shoppers.
    - `managedBy` 'builder' | 'code', required: 'builder' = configured from a template (templateId + templateParams + templateVersion); 'code' = a custom-code workspace rule.
    - `state` 'draft' | 'active' | 'paused', required: Lifecycle state: draft → active → paused. Paused renders as rule-absent on serving. Retiring a rule is a hard delete, legal from any state but never while referenced.
    - `templateId` string, nullable, required: Template identifier for builder rules; null for code rules.
    - `templateParams` object, nullable, required: Template parameters for builder rules, validated against the template's params schema at write time; null for code rules.
    - `templateVersion` integer, nullable, required: Template artifact version the rule was configured against (echo-on-execute model); null for code rules.
    - `targetSurfaces` string[], nullable, required: Surfaces a code rule declares it is written for, fixed at creation and never editable; the rule may only be assigned to placements on these surfaces. Null for builder rules, whose eligibility comes from their template instead. Declared, never inferred: it states which request context the rule was written against, since a surface cannot supply data it never has (post-purchase has no cart, onsite has no customer).
    - `settings` object, required: The rule's recommendation settings — item cap, the two product exclusions, and the empty-result policy. The EDITABLE copy: serving reads the copy frozen onto the active version, so changing this changes nothing until the rule is republished.
      - `maxItems` integer, required: Most products the rule may return, 1-10. The engine supplies it to the rule as `context.slotsNeeded` and trims the envelope to it. One bound for every surface, because one rule can serve several. A surface may still show fewer at once: the checkout block's grid paginates the returned list into a carousel, which is presentation and stays with the placement.
      - `excludeOutOfStock` boolean, required: Drop products with no purchasable variant. Applied where the product data already is: inside the template for a builder rule, inside the generated source for a code rule, and again as a floor when the engine hydrates the result — so the setting is true on every surface rather than only the ones that remembered to pass it.
      - `excludeItemsInCart` boolean, required: Drop products the shopper already has in the cart. Runs before the emptiness test, so an envelope this empties falls through to `onEmpty` rather than reporting itself as a result.
      - `excludePdpProduct` boolean, required: Drop the product the shopper is viewing (`request.pageProduct`, PDP only). Applied inside builder templates before the item cap, so the slot backfills, and again by the engine on every rule's result. Turn it off when the viewed product belongs in the result, e.g. a bundle built around it.
      - `onEmpty` 'hide' | 'smart-recs', required: What the slot does when the rule returns zero items: 'hide' the placement or fall back to 'smart-recs'. Errors and timeouts take the same route as a miss — there is no separate error policy — and stay distinct in telemetry.
    - `authoringSessionId` string, nullable, required: Id of the AI chat session that most recently authored this rule, or null for a rule created outside a chat (and for every rule created before the association was recorded). Follows the latest authoring conversation: creating the rule sets it, and a later revision session repoints it, so the transcript the workspace loads back after a reload — including the diagnosis of a build that gave up — is the one that explains the rule's current state.
    - `systemKey` 'shopify-recommendations', nullable: Set only on a built-in rule Intelligems provisions for every store (e.g. 'shopify-recommendations'); null or absent on every rule a merchant or Atlas created. A built-in rule is read-only: it cannot be renamed, edited, paused, resumed or deleted, and there is at most one per key per store.
    - `createdAtTs` number, required: Creation time, Unix epoch-ms.
    - `lastUpdateTs` number, required: Last update time, Unix epoch-ms.

## Other responses

- `429`: Too Many Requests

---

[API](https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta.md) - [All operations](https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta/llms.txt) - [OpenAPI document](https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta/revisions/7b769b2f90b1?raw)
