---
title: "Update campaign"
method: PATCH
path: "/v1/sponsored-product-ads/campaigns/{campaignId}"
tags: ["SponsoredProductAds V1"]
---

# Update campaign

`PATCH /v1/sponsored-product-ads/campaigns/{campaignId}`

## Request

- Base URL: `https://api.otto.market`
- URL: `https://api.otto.market/v1/sponsored-product-ads/campaigns/{campaignId}`
- Auth: HTTP bearer

Partially updates a campaign using [JSON Merge Patch (RFC 7386)](https://datatracker.ietf.org/doc/html/rfc7386). Only include the fields you want to change; omitted fields remain unchanged. Setting a nullable field to `null` clears its value.

## Path parameters

- `campaignId` string, uuid, required

## Request body

- PatchCampaignRequestSponsoredProductAdsV1: Partial update of a campaign. At least one field must be provided. Note: `budgetType` and `campaignType` are immutable after creation and cannot be changed.
  - `name` string: Campaign display name. Must not contain `$`, `§`, `"`, `#`, `*`, or parentheses — except for an optional trailing numeric suffix (e.g. `My campaign (2)`).
  - `startDate` string, date: Campaign start date. Must be today or a future date.
  - `endDate` string, date, nullable: Campaign end date. Must be at least one day after today. May be `null` for ongoing campaigns; however, `null` is not allowed when `budgetType` is `LIFETIME`.
  - `budget` MonetaryAmountSponsoredProductAdsV1
    - `amount` integer, required: Amount in minor units (cents). Example 1099 = 10.99 EUR. Minimum value is 20 (0.20 EUR).
    - `currency` 'EUR', required
  - `pacing` 'ASAP' | 'EVEN'
  - `status` 'WAITING' | 'ACTIVE' | 'PAUSED'

## Response `202`

Campaign update accepted.

- WriteOperationResponseSponsoredProductAdsV1
  - `changeRequest` ChangeRequestSponsoredProductAdsV1, required
    - `requestId` string, uuid, required
    - `requestType` 'CREATE_CAMPAIGN' | 'UPDATE_CAMPAIGN' | 'CREATE_TARGETS' | 'UPDATE_TARGETS' | 'DELETE_TARGETS' | 'CREATE_KEYWORDS' | 'UPDATE_KEYWORDS' | 'DELETE_KEYWORDS', required
    - `status` 'PENDING' | 'ACCEPTED' | 'REJECTED', required
    - `lastModifiedAt` string, date-time, required: Timestamp of the last status change of this change request.
  - `_links` object, required
    - `self` LinkSponsoredProductAdsV1, required: A HAL link object as defined in draft-kelly-json-hal.
      - `href` string, uri, required: The URL of the linked resource.
    - `change-request` LinkSponsoredProductAdsV1: A HAL link object as defined in draft-kelly-json-hal.
      - `href` string, uri, required: The URL of the linked resource.

## Other responses

- `400`: Bad request. Invalid or rejected input data.
- `401`: Unauthorized. Missing or invalid authentication token.
- `403`: Forbidden. Insufficient permissions or resource access denied.
- `404`: Not found. The requested resource does not exist.
- `409`: Conflict. A change request for this campaign is already pending. Wait for it to reach a terminal state (`ACCEPTED` or `REJECTED`) before submitting a new write operation.
- `500`: Internal server error.

## Changes

- **2026-09-10** `3d020f15ab4d`: 1 info
  - endpoint added
- **2026-09-08** `06ee9d8814bd`: 1 breaking
  - api path removed without deprecation
- **2026-09-01** `b1bc133112bd`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/otto/apis/otto-market-api/changes/v1/sponsored-product-ads/campaigns/:campaignId/patch.md)

---

[API](https://skmtc.dev/otto/apis/otto-market-api.md) - [All operations](https://skmtc.dev/otto/apis/otto-market-api/llms.txt) - [OpenAPI document](https://skmtc.dev/otto/apis/otto-market-api/revisions/cc8a74b62e87?raw)
