---
title: "Add a creator to another campaign (move)"
method: POST
path: "/campaigns/creators/{creator_id}/add-to-campaign"
tags: ["Campaigns"]
---

# Add a creator to another campaign (move)

`POST /campaigns/creators/{creator_id}/add-to-campaign`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/campaigns/creators/{creator_id}/add-to-campaign`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

Adds the creator to a target campaign — purely additive (never removes them from the source campaign). The SOURCE shop is your `x-shop-id`; the TARGET shop + campaign are in the body.

**Restrictions:**
- **Region** — the target shop must be region-compatible with the source shop. GLOBAL and US are interchangeable; every other region must match exactly. Mismatch → 409.
- **Same customer** — the target shop must belong to your API key's customer (cross-customer target → opaque 404).
- **No double-add** — if the creator is already ACTIVE (or paid/completed) in the target → 409. A passive/terminal-inactive mapping (viewed/pending/invited/applied/removed/rejected/archived/withdrawn) is UPGRADED to active with NO duplicate row (`pg_advisory_xact_lock` guards it; a `paid_at` row is never overwritten).

Rewards are recomputed server-side from the TARGET campaign. `notify` (default true) sends the creator an acceptance-style notification — SKIPPED on `X-Dry-Run`.

## Path parameters

- `creator_id` integer, required

## Headers

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

## Request body

- AddToCampaignRequest: ``POST /public/v1/campaigns/creators/{creator_id}/add-to-campaign``. Adds (or "moves" — additive, never removes from source) the creator into a target campaign. The SOURCE shop is the request's ``x-shop-id``; the TARGET shop + campaign are in the body. The target shop must: * belong to the SAME customer as the API key (enforced at the route layer; cross-customer target → opaque 404), and * be region-compatible with the source shop — GLOBAL/US interchange- able, every other region exact (enforced in the service → 409). Already-active-in-target → 409; passive/terminal-inactive mappings upgrade to active (no duplicate row). NOTE: ``source_shop_id`` is intentionally NOT a body field — it is always the request's ``x-shop-id`` (the shop the API key is acting on and that middleware has already ownership-validated). This avoids the internal surface's "query shop_id must match source_shop_id" footgun.
  - `target_campaign_id` integer, required: Campaign the creator is being added to (lives in target_shop_id).
  - `target_shop_id` integer, required: Shop that owns the target campaign. Must belong to the same customer as your API key (else 404).
  - `notify` boolean: Send the creator an acceptance-style notification on add. SKIPPED on X-Dry-Run.

## Response `200`

Added or upgraded to active.

- AddToCampaignResponse: 200 response for ``POST /campaigns/creators/{creator_id}/add-to-campaign``. ``data`` carries ``campaign_creator_mapping_id``, ``campaign_id`` (the target), and ``status`` (always ``"active"`` — a passive/terminal mapping that was upgraded reports ``active`` too, with NO duplicate row created).
  - `success` boolean
  - `code` string
  - `data` object: `{campaign_creator_mapping_id, campaign_id, status='active'}`.

## Other responses

- `400`: Invalid request / missing single shop / target campaign not available.
- `403`: API key lacks `read_write` scope, or creator not on the source shop's roster.
- `404`: Target shop/campaign not found, or not owned by the key's customer.
- `409`: Region mismatch, already-active in target, or Idempotency-Key conflict.
- `422`: Validation Error
- `429`: Write rate limit exceeded.

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-09-19** `291230805105`: 1 info
  - api operation id `add_creator_to_campaign_campaigns_creators__creator_id__add_to_campaign_post` removed and replaced with `campaign_creator_add`

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/campaigns/creators/:creator_id/add-to-campaign/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)
