---
title: "Replace candidate paywall configuration"
method: PUT
path: "/paywall"
tags: ["Paywall"]
---

# Replace candidate paywall configuration

`PUT /paywall`

## Request

- Base URL: `https://api.cavuno.com/v1`
- URL: `https://api.cavuno.com/v1/paywall`
- Auth: HTTP bearer

Atomically replace the candidate-access paywall (configuration + six offers). Matches the Board monetization form rules. Enabling requires candidate profiles, a ready hosted payment connection, and at least one nonzero enabled offer. Disabling schedules active recurring subscriptions to cancel at period end. Requires `billing.manage` and an `Idempotency-Key` header. Never accepts or returns Stripe identifiers.

## Request body

- PutCandidatePaywallBody
  - `object` 'candidate_paywall'
  - `enabled` boolean, required
  - `previewCount` integer, required
  - `lockHeading` string, required
  - `lockDescription` string, required
  - `buttonText` string, required
  - `disclaimerText` string, required
  - `currency` string, required
  - `perMonthLabel` string, required
  - `savingsTemplate` string, required
  - `offers` object[], required
    - `key` 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly' | 'lifetime', required
    - `enabled` boolean, required
    - `amountCents` integer, required
    - `isDefault` boolean, required
    - `label` string
    - `billingLabel` string
    - `kind` 'recurring' | 'lifetime'
    - `displayOrder` integer
    - `intervalUnit` 'day' | 'week' | 'month' | 'year', nullable
    - `intervalCount` integer, nullable

## Response `200`

The replaced candidate paywall resource.

- CandidatePaywall
  - `object` 'candidate_paywall', required
  - `enabled` boolean, required
  - `previewCount` integer, required
  - `lockHeading` string, required
  - `lockDescription` string, required
  - `buttonText` string, required
  - `disclaimerText` string, required
  - `currency` string, required: ISO 4217 currency code, lowercase (e.g. usd).
  - `perMonthLabel` string, required
  - `savingsTemplate` string, required
  - `offers` CandidatePaywallOffer[], required
    - `key` 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly' | 'lifetime', required
    - `kind` 'recurring' | 'lifetime', required
    - `enabled` boolean, required
    - `amountCents` integer, required
    - `label` string, required
    - `billingLabel` string, required
    - `isDefault` boolean, required
    - `displayOrder` integer, required
    - `intervalUnit` 'day' | 'week' | 'month' | 'year', nullable, required
    - `intervalCount` integer, nullable, required

## Other responses

- `default`: An error. Every non-2xx response uses the same envelope; see the Errors section of the introduction.

## Changes

- **2026-10-19** `c34152c38176`: 1 info
  - added the optional property `error/upgrade` to the response with the `default` status

[Operation history](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/changes/paywall/put.md)

---

[API](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api.md) · [All operations](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/revisions/d5974dabff14?raw)
