Unique identifier, prefixed with pw_.
Paywalls
Create, list, and retrieve remote paywalls, and browse templates.
A paywall is a remotely configured screen that presents products to a user. Because paywalls are fetched at runtime, you can change pricing, copy, and layout over the air without shipping an app update. Paywalls are built from templates and reference products from your catalog.
The paywall object#
idstringnamestringInternal name for the paywall.
templatestringThe template ID this paywall is built from, e.g. tmpl_hero.
productsstring[]The product IDs offered on the paywall, in display order.
is_publishedbooleanWhether the paywall is live to clients.
configobjectTemplate-specific content (headline, features, CTA copy, theme).
created_atstringISO 8601 creation timestamp.
List paywalls#
GET /v1/apps/{app}/paywalls
Returns the app's paywalls. Supports limit and cursor
pagination.
appstringrequiredThe app ID.
curl https://api.cashsdk.com/v1/apps/app_2mK4pQ/paywalls \
-H "Authorization: Bearer csk_sk_..."
{
"data": [
{
"id": "pw_7Xq2",
"name": "Onboarding paywall",
"template": "tmpl_hero",
"products": ["pro_monthly", "pro_annual"],
"is_published": true,
"created_at": "2026-06-01T12:00:00Z"
}
],
"has_more": false,
"next_cursor": null
}
Create a paywall#
POST /v1/apps/{app}/paywalls
appstringrequiredThe app ID.
namestringrequiredInternal name for the paywall.
templatestringrequiredA template ID from GET /v1/templates.
productsstring[]requiredProduct IDs to offer, in display order.
configobjectTemplate-specific content such as headline, features, and CTA copy.
is_publishedbooleanPublish immediately. Defaults to false (draft).
curl -X POST https://api.cashsdk.com/v1/apps/app_2mK4pQ/paywalls \
-H "Authorization: Bearer csk_sk_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Onboarding paywall",
"template": "tmpl_hero",
"products": ["pro_monthly", "pro_annual"],
"config": { "headline": "Unlock everything", "cta": "Start free trial" },
"is_published": true
}'
{
"id": "pw_7Xq2",
"name": "Onboarding paywall",
"template": "tmpl_hero",
"products": ["pro_monthly", "pro_annual"],
"is_published": true,
"config": { "headline": "Unlock everything", "cta": "Start free trial" },
"created_at": "2026-06-01T12:00:00Z"
}
Retrieve a paywall#
GET /v1/apps/{app}/paywalls/{id}
appstringrequiredThe app ID.
idstringrequiredThe paywall ID, e.g. pw_7Xq2.
curl https://api.cashsdk.com/v1/apps/app_2mK4pQ/paywalls/pw_7Xq2 \
-H "Authorization: Bearer csk_sk_..."
{
"id": "pw_7Xq2",
"name": "Onboarding paywall",
"template": "tmpl_hero",
"products": ["pro_monthly", "pro_annual"],
"is_published": true,
"config": { "headline": "Unlock everything", "cta": "Start free trial" },
"created_at": "2026-06-01T12:00:00Z"
}
List templates#
GET /v1/templates
Returns the available paywall templates. Templates are shared across apps and
define the layout a paywall's config fills in.
idstringTemplate identifier, e.g. tmpl_hero.
namestringHuman-readable template name.
fieldsstring[]The config keys this template accepts.
curl https://api.cashsdk.com/v1/templates \
-H "Authorization: Bearer csk_sk_..."
{
"data": [
{
"id": "tmpl_hero",
"name": "Hero",
"fields": ["headline", "subheadline", "features", "cta"]
},
{
"id": "tmpl_compact",
"name": "Compact",
"fields": ["headline", "cta"]
}
],
"has_more": false,
"next_cursor": null
}
Client SDKs fetch the published paywall at runtime with a publishable key. See the Paywalls guide for the client flow.