---
title: "Exclude videos from a campaign"
method: POST
path: "/campaigns/{campaign_id}/content/exclusions"
tags: ["Campaign Content & Challenges"]
---

# Exclude videos from a campaign

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

## Request

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

Stop one or more of a campaign's videos from counting toward its results — leaderboard standings, stats and payout eligibility are re-aggregated once for the whole batch before the response returns, so send the entire selection in ONE call rather than one call per video.

Every video id must already belong to this campaign (unknown ids → 404). At least one `reasons` code is required and a `note` is mandatory when the reason is `other`, because the reason reaches the creator. Rejected with 409 when the campaign's results are already final, or when it is a LIVE campaign (scored from live sessions, which can't be excluded individually).

Requires `read_write` scope and an `Idempotency-Key`; `X-Dry-Run: true` echoes the intended change without writing.

## Path parameters

- `campaign_id` integer, required

## Headers

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

## Request body

- ExcludeVideosRequest: Exclude one or more videos from a campaign.
  - `video_ids` string[], required
  - `reasons` ExclusionReason[], required
  - `note` string

## Response `200`

Successful Response

- union
  - ExcludeVideosResponse
    - `success` boolean, required
    - `code` string, required
    - `data` ExcludeVideosData, required
      - `excluded_video_ids` string[], required
      - `already_excluded_video_ids` string[], required
  - ExcludeVideosDryRunResponse
    - `dry_run` true, required
    - `would` ExcludeVideosDryRunData, required
      - `action` 'exclude', required
      - `campaign_id` integer, required
      - `video_ids` string[], required
      - `reasons` string[], required
      - `note` string, required

## 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.

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-09-15** `1163780ede1d`: 1 info
  - added `#/components/schemas/ExcludeVideosResponse, #/components/schemas/ExcludeVideosDryRunResponse` to the response body `anyOf` list for the response status `200`

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/campaigns/:campaign_id/content/exclusions/post.md)

---

[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)
