---
title: "Apply a bulk exclusion as a background job"
method: POST
path: "/campaigns/{campaign_id}/content/exclusions/bulk"
tags: ["Campaign Content & Challenges"]
---

# Apply a bulk exclusion as a background job

`POST /campaigns/{campaign_id}/content/exclusions/bulk`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/campaigns/{campaign_id}/content/exclusions/bulk`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

Applies a batch of video ids across every campaign the chosen `scope` resolves to. Returns a `job_id` IMMEDIATELY — a wide sweep costs one full re-aggregation per campaign and would outlive the request otherwise. Poll `GET /campaigns/{campaign_id}/content/exclusions/jobs/{job_id}` for progress.

The job RE-RESOLVES the targets rather than trusting a preview: minutes can pass between preview and apply, and in that window a creator can be removed or another manager can exclude the same video.

Same `scope` semantics and reason/note rules as the preview and single-exclude calls. Requires `read_write` scope and an `Idempotency-Key`; `X-Dry-Run: true` echoes the intended job without enqueuing it.

## Path parameters

- `campaign_id` integer, required

## Headers

- `Idempotency-Key` string, nullable
- `X-Dry-Run` string, nullable

## Request body

- BulkExcludeVideosRequest: Apply an uploaded file.
  - `video_ids` string[], required
  - `reasons` ExclusionReason[], required
  - `note` string
  - `scope` 'campaign' | 'shop': How far an uploaded file reaches. ``campaign`` is the default: the button lives on one campaign's Content tab and acting only there is what a brand expects. ``shop`` is the opt-in that also excludes the video from every other campaign it appears in, which is the whole point of the upload but is far more destructive, so it is never implied.
  - `source_file` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `400`: Validation error, multi-shop key, or missing `Idempotency-Key`.
- `403`: API key lacks `read_write` scope (`WRITE_NOT_PERMITTED`).
- `404`: Campaign / template / job not in this shop.
- `409`: Campaign results are final, campaign is LIVE-scored, template cap reached, or `Idempotency-Key` conflict.
- `422`: Validation Error
- `429`: Write-tier rate limit (10/min, 50/hr, 100/day) exceeded.

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) - [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/reacherapp/apis/reacher-data-api/revisions/63ce74b30b5a?raw)
