Prices and paths
Set a price per path in the dashboard with simple patterns. The first matching rule wins.
Prices live in the dashboard, per site, as a list of rules. Each rule is a path pattern and a price in euro. Changes reach your integration within a minute, without a deploy.
Patterns
| Pattern | Matches | Doesn't match |
|---|---|---|
/about | /about | /about/team |
/blog/* | /blog/post-1 | /blog/a/b |
/premium/** | /premium, /premium/a/b | /premiums |
/**/*.pdf | /report.pdf, /docs/2026/q3.pdf | /report.pdf.html |
Matching is case-sensitive and ignores the query string. * is one path segment, ** any depth.
Order and defaults
- Rules are checked from top to bottom; the first match wins. Put specific rules above general ones.
- A price of
0makes a path free, for example/free/**at0above/**at0.01. - Paths without a matching rule cost the site's default price. Set it to
0to keep everything free unless a rule says otherwise.
Check a price
The config API tells you which rule a path matches and what it costs:
Terminal
curl -s "https://api.pennipay.eu/v1/sites/$PENNI_SITE_ID/config?path=/blog/hello" \ -H "Authorization: Bearer $PENNI_API_KEY" | jq .match # { "path": "/blog/hello", "pattern": "/blog/*", "price": "0.02", "free": false }
Descriptions and discovery
A rule can carry a description and a response MIME type. They appear in the 402, and, when the site is opted in, in the discovery catalog, where agents find your paid resources.