---
title: "Replace campaign negative lists"
method: PUT
path: "/v1/ads/campaigns/{campaignId}/negative-keyword-lists"
tags: ["Ad Campaigns"]
---

# Replace campaign negative lists

`PUT /v1/ads/campaigns/{campaignId}/negative-keyword-lists`

Sets the full desired set of shared negative keyword list associations on this campaign. Send listIds=[] to detach all negative keyword lists. Only campaign_shared_set links are changed; the lists and their keywords are preserved. Every list must belong to the campaign customer and have type NEGATIVE_KEYWORDS.

## Path parameters

- `campaignId` string, required — Google campaign id.

## Request body

- object
  - `platform` 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' — Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
  - `listIds` string[], required

## Response `200`

Successful response.

- object
  - `created` integer — New criteria or campaign links created.
  - `removed` integer — Existing criteria or campaign links removed.
  - `customerId` string — Resolved Google Ads customer id.

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `403` — Ads access and permission to the selected account are required.
- `404` — The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.
- `409` — Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.
- `422` — Google Ads connection is missing or unavailable.
- `429` — Google Ads operations budget or platform quota exhausted.
- `501` — Available only on Google Ads.

## Changes

- **2026-09-25** `2c04683ce694` — 8 info
  - added the optional property `details/adAccountId` to the response with the `400` status
  - added the optional property `details/adAccountId` to the response with the `404` status
  - added the optional property `details/createdObjects` to the response with the `400` status
  - added the optional property `details/createdObjects` to the response with the `404` status
  - …4 more
- **2026-09-16** `3e6ddf2a99ea` — 2 info
  - added the optional property `details/budgetScope` to the response with the `400` status
  - added the optional property `details/budgetScope` to the response with the `404` status
- **2026-09-15** `0dba7d004d75` — 4 info
  - added the optional property `details/quotaExhausted` to the response with the `400` status
  - added the optional property `details/quotaExhausted` to the response with the `404` status
  - added the optional property `details/quotaScope` to the response with the `400` status
  - added the optional property `details/quotaScope` to the response with the `404` status
- **2026-09-10** `e70ed06e7150` — 6 info
  - added the optional property `code` to the response with the `404` status
  - added the optional property `details` to the response with the `404` status
  - added the optional property `param` to the response with the `404` status
  - added the optional property `platform` to the response with the `404` status
  - …2 more
- **2026-09-09** `222e3a38a382` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/campaigns/:campaignId/negative-keyword-lists/put.md)

---

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