VoidhashDocs
DevelopersHelp centerGuidesAPI reference
voidhash.comOpen Studio
Essentials
API overview
Authentication
Event capture
Push device API
Webhooks
Webhook delivery
Webhook events
Projects & keys
Projects
API keys
Audit log
Customers & access
Persons
Products
Perks
Sandbox
Paywalls
Paywalls
Paywall locations
Components
Component registry
Assets
Experiments & flags
Experiments
Feature flags
Analytics & events
Analytics
Analytics alerts
Cohorts
Group types
Groups
Events
Ingest policy
VoidQL
Tracking domains
Ads
Ads
Ad accounts
Meta measurement
Payments & stores
Payment providers
Payment provider products
Purchase history imports
Payment sources
Webhooks & notifications
Webhooks
Push notifications
Push configurations
Automations
Organization & team
Organizations
Members
Invitations
Billing
Your account
Profile
Session
Notices
Connected apps
Terms of Service
Developer tools
Schema
SDK
List paywall locations
Create a paywall location
Retrieve a paywall location
Update a paywall location
Archive a paywall location
Place a paywall at a location
End a location's placement
List what a location has shown
List a location's pins
Pin an end user to a paywall
Remove a pin
List a location's rules
Replace a location's rules
Theme

Replace a location's rules

Replaces the rules of the location in one environment, in the order given; an empty list removes them.

The first rule whose conditions all hold for an end user and their app shows them its paywall's deployed build, in place of what the location shows everyone else, and keeps them out of an A/B test running there. Conditions are those of a feature flag's rule. Pins are read before rules. A production rule answers every app; a test rule answers apps using a test key only and is read first there. A rule shows only where the location shows something in that environment.

Guide: Paywalls in your app

PUT
/api/v1/projects/{projectId}/paywall-locations/{paywallLocationId}/rules

Authorization

AuthorizationBearer <token>

A project secret key: vh_sk_... for production, vh_sk_test_... for test. Keep it on your servers.

In: header

Path parameters

projectId*string

The project's id, proj_.... A secret key works only in the project it belongs to.

paywallLocationId*string

The location's id, pw_loc_....

Query parameters

environment?string

The environment whose rules are replaced: production, the default, whose rules answer every app, or test, whose rules answer apps using a test key only and are read first there.

Value in

  • "production"
  • "test"

Request body

application/json

TypeScript definitions

Use the request body type in TypeScript.

rules*array<>

Every rule the environment has from now on, in the order they are read, at most 20; an empty list removes them all.

Itemsitems <= 20

Examples

curl -X PUT "https://api.voidhash.com/api/v1/projects/proj_tz4a98xxat96iws9zmbrgj3a/paywall-locations/pw_loc_e2r5t8y1u4i7o0p3a6s9d2f5/rules" \  -H "Authorization: Bearer vh_sk_..." \  -H "Content-Type: application/json" \  -d '{    "rules": [      {        "name": "Germany and Austria",        "conditions": [          {            "attribute": "country",            "op": "in",            "values": [              "DE",              "AT"            ]          },          {            "attribute": "app_version",            "op": "gte",            "values": [              "2.4"            ]          }        ],        "paywallId": "pw_r3t6y9u2i5o8p1a4s7d0f3g6"      }    ]  }'
{  "rules": [    {      "id": "pw_loc_rule_k9m4x1c6v8b3n5q0w2e7h7d2",      "paywallLocationId": "pw_loc_e2r5t8y1u4i7o0p3a6s9d2f5",      "environment": "production",      "position": 0,      "name": "Germany and Austria",      "conditions": [        {          "attribute": "country",          "key": null,          "op": "in",          "values": [            "DE",            "AT"          ]        },        {          "attribute": "app_version",          "key": null,          "op": "gte",          "values": [            "2.4"          ]        }      ],      "paywallId": "pw_r3t6y9u2i5o8p1a4s7d0f3g6"    }  ]}
{  "error": {    "type": "invalid_request",    "code": "invalid_rules",    "message": "Rule 1: The condition on country needs at least one value.",    "param": "rules"  }}
{  "error": {    "type": "unauthenticated",    "code": "invalid_api_key",    "message": "This secret key is not valid."  }}
{  "error": {    "type": "permission_denied",    "code": "permission_denied",    "message": "Insufficient permissions."  }}

{  "error": {    "type": "not_found",    "code": "paywall_not_found",    "message": "This project has no paywall pw_h7d2k9m4x1c6v8b3n5q0w2e7.",    "param": "paywallId"  }}

{  "error": {    "type": "conflict",    "code": "paywall_not_deployed",    "message": "Paywall pw_h7d2k9m4x1c6v8b3n5q0w2e7 has no deployed build yet. Build it and deploy the build, then show it here.",    "param": "paywallId"  }}

{  "error": {    "type": "internal",    "code": "internal_error",    "message": "Something went wrong on our side. Try again, and contact support with the Request-Id header if it keeps failing."  }}

Response body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

Errors

StatustypecodeWhen
400invalid_requestinvalid_rulesFor a rule without conditions or with one that can't be read.
404not_foundpaywall_not_foundWhen the project has no such paywall.
409conflictpaywall_not_deployedWhen a paywall has no deployed build.
409conflictpaywall_location_archivedWhen the location is archived.

It can also fail with the errors every operation shares, such as unauthenticated; see Errors.

More in Paywall locations

  • List paywall locations GET
  • Create a paywall location POST
  • Retrieve a paywall location GET
  • Update a paywall location PATCH
  • Archive a paywall location POST
  • Place a paywall at a location PUT
  • End a location's placement DELETE
  • List what a location has shown GET
  • List a location's pins GET
  • Pin an end user to a paywall PUT
  • Remove a pin DELETE
  • List a location's rules GET

Something wrong or missing on this page? Tell us by email or on Discord.

PreviousList a location's rulesNextList components
© 2026 Voidhash s.r.o.
voidhash.comPricingTermsPrivacyDiscord

On this page

AuthorizationPath parametersQuery parametersRequest bodyExamplesResponse bodyErrorsMore in Paywall locations