Suger

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

NameInTypeRequiredDescription
orgId path string yes Organization ID
productId path string yes Product ID

Request Body

Required. Content-Type: application/json · Schema: UpdateProductPriceRequest

UpdateProductPriceRequest fields:

FieldTypeRequiredDescription
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:

FieldTypeRequiredDescription
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:

FieldTypeRequiredDescription
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:

FieldTypeRequiredDescription
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:

FieldTypeRequiredDescription
length integer no
unit string no

Responses

200 — OK

Content-Type: application/json · Schema: UpdateProductPriceResponse

UpdateProductPriceResponse fields:

FieldTypeRequiredDescription
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:

FieldTypeRequiredDescription
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

Example

Generated from this operation's schema. Values are placeholders — substitute your own ids, and set SUGER_TOKEN to a bearer token from the OAuth client-credentials exchange.

Request

curl -X PATCH 'https://api.suger.cloud/org/{orgId}/product/{productId}/price' \
  -H "Authorization: Bearer $SUGER_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
  "plans": [
    {
      "commits": [
        {
          "billingFrequency": {},
          "contractDuration": {},
          "key": "string",
          "paymentOption": {},
          "quantity": 1,
          "rate": 100,
          "term": {}
        }
      ],
      "dimensions": [
        {
          "category": "string",
          "description": "string",
          "key": "string",
          "name": "Acme Corp",
          "rate": 100,
          "unit": "string"
        }
      ],
      "planId": "01H0000000000000000000",
      "state": "active"
    }
  ],
  "propagateToPrivateOffers": true,
  "skipProductUpdate": true
}'

Response — 200

{
  "operationId": "01H0000000000000000000",
  "results": [
    {
      "change": "CREATE",
      "target": "string"
    }
  ],
  "status": "PENDING"
}

Error — 400

"string"

View as Markdown · Interactive API reference

Spotted something wrong or out of date on this page? Tell us and we'll correct it.