---
title: "Create paywall"
method: POST
path: "/paywalls"
---

# Create paywall

`POST /paywalls`

## Headers

- `api_key` string, required

## Request body

- object
  - `slug` string, required
  - `name` string, required
  - `payment_system` 'stripe' | 'paddle' | 'paypal' | 'revenuecat' | 'adapty' | 'qonversion' | 'cloudpayments' | 'primer', required
  - `comparison_period` 'day' | 'week' | 'month' | 'year', nullable
  - `theme` string, nullable
  - `language` string, nullable
  - `country` string, nullable — ISO 3166-1 alpha-2 country code
  - `plans` integer[], required
  - `prices` object[], required
    - `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.
  - `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.
  - `custom_head_html` string, nullable
  - `custom_css` string, nullable
  - `analytics` object
    - `meta_pixel_id` string, nullable
    - `facebook_access_token` string, nullable
    - `tiktok_pixel_id` string, nullable
    - `tiktok_access_token` string, nullable
  - `tags` string[]
  - `source_paywall` integer, nullable
  - `auto_languages` integer, nullable
  - `templates_version` 1 | 2, nullable — Paywall templates version. Defaults to `2` when omitted.
  - `published_version` integer, nullable
  - `css_variables` object, nullable
  - `screens` string, json, nullable — JSON string with paywall screens content

## Response `201`

Paywall created

- 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
    - `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

---

[API](https://skmtc.net/web2wave/apis/web2wave-api.md) · [All operations](https://skmtc.net/web2wave/apis/web2wave-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/web2wave/web2wave-api/versions/c88545119271/schema)
