# Developer-product updates

`roblox_update_developer_product` accepts an explicit universe and product ID, `confirm: true`, and at least one change:

```json
{
  "universeId": 123,
  "productId": 456,
  "changes": {
    "price": 99,
    "isForSale": true,
    "isRegionalPricingEnabled": true
  },
  "confirm": true
}
```

`storePageEnabled` is also supported. Unspecified fields are omitted from the PATCH. The tool uses `developer-product:write` and `developer-product:read`, then reads creator configuration after the update. No live product was modified during development.

Interpret both `applied` and `verified`. An accepted update followed by a failed read returns `applied: true, verified: false`. A failed write response leaves application status `unknown`; inspect configuration before retrying. Mismatched fields are reported. Verification observes a later read, not an atomic compare-and-swap; another writer can change the product concurrently.

The [official product schema](https://raw.githubusercontent.com/Roblox/creator-docs/main/content/en-us/reference/cloud/developer-products-api/v1.json) documents regional pricing as a boolean request field and reports it through enabled pricing features. [Managed pricing](https://create.roblox.com/docs/production/monetization/managed-pricing) also includes game enrollment and price optimization. This tool does not claim to perform that enrollment.

## Batch creation

`roblox_create_developer_products` accepts `universeId`, `confirm: true`, and 1–30 `products` with name, price, optional description, sale availability, and optional regional-pricing preference. It completes one paginated catalog scan before any writes and reuses existing names without changing them. Do not perform another catalog scan solely for duplicate protection.

Per-item statuses are `created`, `reused`, `unknown`, and `not-attempted`. The batch stops new writes after an unconfirmed creation; successful earlier items remain in the result. It paces requests at least 400 ms apart within a batch, limits the catalog to 20 pages, and uses a 50-second overall deadline. It does not reserve names against other processes or creators. A process interruption can lose the in-memory result; inspect the catalog before retrying. Regional-pricing preference is omitted unless supplied, preserving Roblox's server default for new items. Batch icon uploads are not supported.

Local scheduled discounts now have a persisted job store and worker; see [execution and recovery limits](V3_DISCOUNT_JOBS.md). Public SDK mutation contracts, batch updates, and live verification remain outstanding.
