---
title: "Update an offering"
method: PATCH
path: "/offerings/{offering_id}"
tags: ["Offerings"]
---

# Update an offering

`PATCH /offerings/{offering_id}`

Partial update. Only supplied fields are changed. `product_ids` replaces the full list in the given order — pass `[]` to detach all products, omit the field to leave the list unchanged.

## Request body

- V4OfferingPatch — Partial update — only supplied fields are changed. `tag` is read-only via `PATCH`; promote an offering with `POST /offerings/{id}/set-main` (which atomically demotes the previous main in the same transaction).
  - `product_ids` string[] — Replaces the full list in the given order. Pass `[]` to clear all product associations. Omit the field entirely to leave existing associations unchanged. Each entry must already exist in this project, otherwise the request fails with 400 `product_not_in_project`. Up to 100 entries per request (`maxItems`).

## Response `200`

Offering updated.

- V4Offering
  - `object` 'offering', required
  - `id` string, required
  - `url` string, required
  - `tag` integer, nullable, required — Offering role within the project. `1` = main offering (`TAG_MAIN`) — exactly one offering per project has tag=1 at any time; promote via `POST /v4/offerings/{offering_id}/set-main`. `0` = regular offering that was demoted from main. `null` = regular offering that has never been tagged. Treat `0` and `null` as equivalent on read. The Offerings endpoints filter out experiment-variant offerings, but legacy rows could carry historical values other than `0`, `1`, or `null`, so the response field is intentionally not enum-restricted. Write schemas restrict accepted values server-side.
  - `product_ids` string[], required — Product UIDs that belong to this offering, in display order.
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## Other responses

- `400` — Invalid request body.
- `401` — Missing or invalid authentication token.
- `404` — Offering not found in this project.
- `409` — An offering with this `id` already exists.
- `415` — Unsupported Content-Type.
- `422` — Operation cannot be performed in the current state. Typed codes: `cannot_patch_experiment_variant` (offering is owned by the experiments service), `cannot_demote_main` (attempted to demote the project's current main offering — use `set-main` on a different offering instead).
- `500` — Internal error

---

[API](https://skmtc.net/qonversion/apis/qonversion-rest-api-v4.md) · [All operations](https://skmtc.net/qonversion/apis/qonversion-rest-api-v4/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/qonversion/qonversion-rest-api-v4/versions/e3f72cf8951c/schema)
