---
title: "Copy paywall"
method: POST
path: "/paywalls/{paywallId}/copy"
---

# Copy paywall

`POST /paywalls/{paywallId}/copy`

## Request

- Base URL: `https://api.web2wave.com/api`
- URL: `https://api.web2wave.com/api/paywalls/{paywallId}/copy`
- Auth: API key in header `api_key`

Duplicate a paywall inside the current project: settings, screens, CSS variables, prices and plans
are copied into a new paywall (published version resets to 1, the `Published` tag is dropped).
Same as the "Copy" action in the cabinet.

## Path parameters

- `paywallId` integer, required

## Headers

- `api_key` string, required

## Request body

- object
  - `name` string: Name of the copy. Defaults to "<source name> (copy)".
  - `slug` string: Slug of the copy (lowercased, only `0-9 a-z - _`), unique within the project. Defaults to "<source slug>-copy" (with a numeric suffix if taken).

## Response `201`

Paywall copied

- object
  - `success` integer
  - `paywall` Paywall
    - `id` integer
    - `project_id` integer
    - `slug` string
    - `name` string
    - `payment_system` string
    - `comparison_period` string, nullable
    - `theme` string, nullable
    - `tags` string[]
    - `analytics` object
      - `meta_pixel_id` string, nullable
      - `facebook_access_token` string, nullable
      - `tiktok_pixel_id` string, nullable
      - `tiktok_access_token` string, nullable
      - `snap_access_token` string, nullable
      - `pinterest_tag_id` string, nullable
      - `pinterest_ad_account_id` string, nullable
      - `pinterest_access_token` string, nullable
      - `openai_ads_pixel_id` string, nullable
      - `openai_ads_api_key` string, nullable
    - `favicon` string, nullable: Favicon CDN URL (upload via `POST /project-files/upload` first).
    - `og` object, nullable: Open Graph / SEO data. On update the object is merged with the stored value; `null` resets title and description (the stored image is kept).
      - `title` string, nullable
      - `description` string, nullable
      - `image` string, nullable
    - `auto_currency_switching` boolean, nullable: Enable automatic currency switching by visitor geo. Invalid values return 422.
    - `after_pay_redirect` AfterPayRedirect: Where to send the user after a successful payment. Set this on the paywall (default for every price) or per-price (overrides the default). * `type=0` (alias `"quiz"`) — redirect to a quiz; `id` is the quiz_id. * `type=1` (alias `"paywall"`) — redirect to another paywall; `id` is the paywall_id (great for upsell flows: free → premium upsell). Both numeric and semantic forms of `type` are accepted; the backend normalises them. Omit the object entirely (or pass null) to use the platform default (return to the quiz the user came from).
      - `type` union, required: 0 = redirect to a quiz, 1 = redirect to a paywall. Accepts the string aliases `"quiz"` / `"paywall"`.
        - 0 | 1
        - 'quiz' | 'paywall' | '0' | '1'
      - `id` integer, required: Target ID. Quiz ID when type=0/"quiz"; paywall ID when type=1/"paywall". Must belong to the current project. Pass 0 to disable the redirect.
    - `language` string, nullable
    - `country` string, nullable
    - `published_version` integer, nullable
    - `auto_languages` integer
    - `templates_version` integer, nullable
    - `custom_css` string, nullable
    - `custom_head_html` string, nullable
    - `css_variables` object
    - `plans` integer[]
    - `prices` object[]
      - `price_id` integer
      - `priority` integer
      - `paypal_id` integer, nullable
      - `after_pay_redirect` AfterPayRedirect: Where to send the user after a successful payment. Set this on the paywall (default for every price) or per-price (overrides the default). * `type=0` (alias `"quiz"`) — redirect to a quiz; `id` is the quiz_id. * `type=1` (alias `"paywall"`) — redirect to another paywall; `id` is the paywall_id (great for upsell flows: free → premium upsell). Both numeric and semantic forms of `type` are accepted; the backend normalises them. Omit the object entirely (or pass null) to use the platform default (return to the quiz the user came from).
        - `type` union, required: 0 = redirect to a quiz, 1 = redirect to a paywall. Accepts the string aliases `"quiz"` / `"paywall"`.
          - 0 | 1
          - 'quiz' | 'paywall' | '0' | '1'
        - `id` integer, required: Target ID. Quiz ID when type=0/"quiz"; paywall ID when type=1/"paywall". Must belong to the current project. Pass 0 to disable the redirect.
    - `created_at` string, date-time
    - `updated_at` string, date-time
    - `deleted_at` string, date-time, nullable
    - `livemode` boolean
    - `source_data` string

## Other responses

- `404`: Paywall not found in current project
- `422`: Validation error (e.g. slug already taken)

## Changes

- **2026-11-03** `eb8b2d9124ac`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/web2wave/apis/web2wave-api/changes/paywalls/:paywallId/copy/post.md)

---

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