---
title: "Update a Price"
method: POST
path: "/prices/{id}"
tags: ["Prices"]
---

# Update a Price

`POST /prices/{id}`

Update an existing Price by its ID

## Path parameters

- `id` string, required

## Request body

- UpdatePriceRequestDTO
  - `metadata` object, nullable — Metadata used by merchants to store additional information about the entity.
  - `name` string — Price name
  - `type` 'one_time' | 'recurring' — Price type
  - `amount` number — Payment amount in minor units (e.g., cents). For recurring prices, this is the amount charged each billing cycle. `0` makes the price free: it can be bundled alongside a paid item, and a free recurring price renews every cycle without ever reaching a payment provider.
  - `quantity` number — Number of units this price represents. The `amount` covers all of them, so referencing this price creates a line item of this quantity with a per-unit amount of `amount / quantity`. Defaults to `1`.
  - `currency` 'usd' | 'eur' | 'gbp' | 'cad' | 'aud' | 'pln' | 'czk' | 'sek' | 'dkk' — Payment currency
  - `product` string — Product ID
  - `active` boolean — Whether the price is active
  - `recurringSchedule` CreateRecurringScheduleDTO
    - `intervalUnit` 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year', required — Recurring interval unit
    - `intervalCount` number, required — Recurring interval count
    - `trial` CreateRecurringScheduleTrialDTO
      - `intervalUnit` 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year', required — Trial interval unit
      - `intervalCount` number, required — Trial interval count
      - `amount` number, required — Initial setup/trial payment amount in minor units (e.g., cents). This is the amount charged during the first billing cycle before the regular recurring amount takes effect.
  - `billingSchedule` CreateBillingSchedulePriceDTO
    - `statementDescriptor` string
    - `cycleDefinitions` CreateBillingScheduleCycleDefinitionDTO[], required
      - `position` number, required
      - `amount` number, required
      - `intervalUnit` 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year', required
      - `intervalValue` number, required

## Response `200`

OK

- PriceDTO
  - `createdAt` string, date-time, required — The date and time when the entity was created.
  - `updatedAt` string, date-time, nullable, required — The date and time when the entity was last updated.
  - `metadata` object, nullable — Metadata used by merchants to store additional information about the entity.
  - `id` string, required — ID of the price
  - `type` 'one_time' | 'recurring', required — Type of the price
  - `active` boolean, required — Indicates if the price is currently active. Inactive prices will be hidden from the dashboard, but can still be used in the API.
  - `name` string — Name of the price. Only available from the dashboard or the API using a secret key.
  - `amount` number, required — Amount of the price in minor units (e.g., cents)
  - `quantity` number, required — Number of units this price represents. The `amount` covers all of them, so a line item referencing this price gets this quantity at a per-unit amount of `amount / quantity`.
  - `currency` 'usd' | 'eur' | 'gbp' | 'cad' | 'aud' | 'pln' | 'czk' | 'sek' | 'dkk', required — Currency of the price
  - `product` object — The product that this price represents. Only available from the dashboard or the API using a secret key.
    - `createdAt` string, date-time, required — The date and time when the entity was created.
    - `updatedAt` string, date-time, nullable, required — The date and time when the entity was last updated.
    - `metadata` object, nullable, required — Metadata used by merchants to store additional information about the entity.
    - `id` string, required — ID of the product
    - `active` boolean, required — Indicates if the product is currently active. Inactive products will be hidden from the dashboard, but can still be used in the API.
    - `name` string, required — Name of the product. Only available from the dashboard or the API using a secret key.
    - `description` string, nullable, required — Description of the product. Only available from the dashboard or the API using a secret key.
    - `statementDescriptor` string, nullable, required — Statement descriptor for the product that will be used in the bank statement
    - `category` 'digital' | 'physical' | 'null', nullable, required — Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment. Only available from the dashboard or the API using a secret key.
    - `shippable` boolean, required — Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Only available from the dashboard or the API using a secret key.
    - `sku` string, nullable, required — Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships: an item without one is kept on the order but never fulfilled. Null when the product has none. Only available from the dashboard or the API using a secret key.
  - `billingSchedule` object, nullable — Deprecated: Use recurringSchedule instead. Billing schedule for `recurring` prices. Only available from the dashboard or the API using a secret key.
    - `createdAt` string, date-time, required — The date and time when the entity was created.
    - `updatedAt` string, date-time, nullable, required — The date and time when the entity was last updated.
    - `metadata` object, nullable, required — Metadata used by merchants to store additional information about the entity.
    - `id` string, required — ID of the billing schedule
    - `currency` 'usd' | 'eur' | 'gbp' | 'cad' | 'aud' | 'pln' | 'czk' | 'sek' | 'dkk', required — Currency of the billing schedule
    - `cycleDefinitions` object[], required
      - `createdAt` string, date-time, required — The date and time when the entity was created.
      - `updatedAt` string, date-time, nullable, required — The date and time when the entity was last updated.
      - `metadata` object, nullable, required — Metadata used by merchants to store additional information about the entity.
      - `position` number, required — Position of the billing cycle in the schedule. Used for ordering.
      - `amount` number, required — Amount to be charged for this billing cycle in minor units (e.g., cents)
      - `currency` 'usd' | 'eur' | 'gbp' | 'cad' | 'aud' | 'pln' | 'czk' | 'sek' | 'dkk', required — Currency of the billing cycle
      - `intervalUnit` 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year', required — Unit of time for the billing cycle interval
      - `intervalValue` number, required — Value of the billing cycle interval
  - `recurringSchedule` object, nullable — Recurring schedule for recurring prices. Only available from the dashboard or the API using a secret key.
    - `intervalUnit` 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year', required — Recurring interval unit
    - `intervalCount` number, required — Recurring interval count
    - `trial` object, nullable, required — Trial schedule details when present
      - `intervalUnit` 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year', required — Trial interval unit
      - `intervalCount` number, required — Trial interval count
      - `amount` number, required — Initial setup/trial payment amount in minor units. This is the amount charged during the first billing cycle before the regular recurring amount takes effect.

## Other responses

- `202` — The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.
- `400` — The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it; or `payment_error` when the payment was refused by the issuer or processor.
- `401` — No API key was supplied, or the key is not valid. `type` is `authentication_error`.
- `403` — The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.
- `404` — No resource exists with the requested identifier. `type` is `not_found_error`.
- `409` — `type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).
- `429` — Too many requests. The rate limit is applied per client across all operations. `type` is `rate_limit_error`.
- `500` — The request could not be completed because of an unexpected error. `type` is `api_error`.
- `504` — The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.

---

[API](https://skmtc.dev/odus/apis/odus-orchestration-api.md) · [All operations](https://skmtc.dev/odus/apis/odus-orchestration-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/odus/odus-orchestration-api/revisions/d5fdcba31576/schema)
