# Update product pricing (unified format)

`PATCH https://api.suger.cloud/org/{orgId}/product/{productId}/price`

Update AWS or Azure product pricing with one partner-agnostic request (plans[] with commits + dimensions). Azure auto-goes-live. Set skipProductUpdate (without plans) to leave the list price unchanged and instead re-apply each AWS private offer's stored discount to the current list price of the product's usage dimensions; offers priced with committed or upfront terms are not re-priced.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgId` | path | string | yes | Organization ID |
| `productId` | path | string | yes | Product ID |

## Request Body

Required.

Content-Type: `application/json` · Schema: `UpdateProductPriceRequest`

**`UpdateProductPriceRequest`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `plans` | array<UnifiedPlan> | no | Plans is the set of plans to update. AWS uses exactly one (planId omitted); Azure/GCP use one or more. |
| `propagateToPrivateOffers` | boolean | no | PropagateToPrivateOffers, when true, opts this AWS product reprice into propagating the new list price to the product's released private offers: after the product change set succeeds, each private offer carrying a stored discount is re-priced as listRate*(1-discount/100) (offers without a stored discount are skipped). AWS-only; default false (behaviour unchanged). Azure percentage / GCP offers track list price natively and need no propagation. |
| `skipProductUpdate` | boolean | no | SkipProductUpdate, when true, leaves the product's list price untouched and only re-prices the USAGE DIMENSIONS of the product's released private offers, from the CURRENT stored list price and each offer's stored discount. Use it to re-apply discounts after they drifted (e.g. an offer was repriced outside Suger, or a discount was backfilled later) without submitting a product change set. Offers priced with committed/upfront terms are not re-priced. AWS-only, must be sent without Plans, and honoured only by the product update-pricing endpoint — the offer update-pricing endpoint shares this request type but ignores this field. |

**`UnifiedPlan`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `commits` | array<UnifiedCommit> | no | Commits are the non-usage, recurring / committed fees. AWS -> Entitled commit dimensions (ConfigurableUpfrontPricingTerm). Azure -> the plan's recurrentPrice (a flat monthly/annual subscription fee — NOT a contractual commitment; named "commits" only for cross-partner consistency with the AWS model). GCP -> subscription / fixed price. |
| `dimensions` | array<UnifiedDimension> | no | Dimensions are the per-unit metered charges. AWS -> ExternallyMetered dimensions (UsageBasedPricingTerm). Azure -> the plan's customMeters. GCP -> usage fees / metrics. |
| `planId` | string | no | PlanId locates the plan. AWS: omit/"" (single implicit default offer). Azure: plan.identity.externalId. GCP: purchase option / service level name. |
| `state` | string | no | State changes the plan lifecycle. Azure only (AWS/GCP ignore it): active -> generallyAvailable, deprecated -> deprecated, hidden -> plan visibility "hidden". |

**`UnifiedCommit`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `billingFrequency` | UnifiedTerm | no |  |
| `contractDuration` | UnifiedTerm | no |  |
| `key` | string | no | Key locates AWS commits. Quantity is ignored by update-pricing; new AWS commits are not supported here. |
| `paymentOption` | UnifiedTerm | no |  |
| `quantity` | integer | no |  |
| `rate` | number | no | AWS commit rate / Azure recurrentPrice (PricePerPaymentInUsd) |
| `term` | UnifiedTerm | no |  |

**`UnifiedDimension`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `category` | string | no |  |
| `description` | string | no |  |
| `key` | string | no | locator: AWS dimension key / Azure custom-meter key / GCP metric id |
| `name` | string | no | Name, Category, Unit and Description are only used when creating a brand-new AWS dimension. Unit defaults to "Units" and Description defaults to Name when omitted. |
| `rate` | number | no | unit price |
| `unit` | string | no |  |

**`UnifiedTerm`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `length` | integer | no |  |
| `unit` | string | no |  |

## Responses

### 200 — OK

Content-Type: `application/json` · Schema: `UpdateProductPriceResponse`

**`UpdateProductPriceResponse`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `operationId` | string | no | OperationId is the workflow id; poll it via GetOperationV2. |
| `results` | array<UnifiedPriceResult> | no | Results lists, per submitted item, whether it was matched (UPDATE) or newly created (CREATE). |
| `status` | string | no | Status of the request at submission time. |

**`UnifiedPriceResult`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `change` | string | no |  |
| `target` | string | no |  |

### 400 — Bad request error

Content-Type: `application/json`

### 409 — Conflict: a change to this product is still being processed by the marketplace

Content-Type: `application/json`

### 500 — Internal server error

Content-Type: `application/json`

---

Interactive API reference: https://doc.suger.io/api/
