SaaS Pricing Page → Normalized Plans JSON (PPE)
Pricing
from $20.00 / 1,000 pricing page parseds
SaaS Pricing Page → Normalized Plans JSON (PPE)
Extract public SaaS pricing pages into a stable plan schema: name, price, period, currency, limits. One URL in, structured JSON out. Pay-per-event on successful parse.
Pricing
from $20.00 / 1,000 pricing page parseds
Rating
0.0
(0)
Developer
kyaw kyaw
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Store: apify.com/kyawkyaw/saas-pricing-normalizer
Author profile: apify.com/kyawkyaw
Status: Published on Apify Store · PPE active
Charge: Actor.charge for pricing-page-parsed since build 0.2.3
Spec: ../../specs/SPEC_01_saas_pricing_diff.md
As-of: 19 Oct 2026 (Asia/Rangoon)
Short description
Extract public SaaS pricing pages into a stable plan schema agents can trust: plan name, price, period, currency, and limits[] — one URL in, structured JSON out. Pay-per-event on each successful pricing-page-parsed.
Why this Actor
Builders and AI agents need “what does vendor X charge now?” without maintaining scrapers. Generic page scrapers dump HTML; this Actor normalizes plan tiers into a predictable schema for MCP / pipelines / competitive intel.
- Tight input (
startUrl) - Stable output (
plans[]+rawConfidence) - Fixture-tested parsers aimed at marketing-page churn
- Public pages only — no logins, no bypasses
Input examples
1) Live public URL (Store / production path)
{"startUrl": "https://www.notion.so/pricing","vendorName": "Notion","currencyPreference": "USD"}
2) Another vendor
{"startUrl": "https://vercel.com/pricing","vendorName": "Vercel","currencyPreference": "USD"}
3) Local fixture (dev only — do not use on Store)
{"useFixture": true,"fixturePath": "fixtures/sample-pricing.html","vendorName": "ExampleCo"}
CLI equivalents (box / Mac, no token):
cd scaffold/SPEC_01node src/main.js # default fixturenode src/main.js fixtures/sample-pricing.htmlnode src/main.js --url https://example.com/pricing # live public fetchSPEC01_PRINT_PLANS=1 node src/main.js # also dump full JSON
Output schema
{"vendor": "ExampleCo","url": "https://example.com/pricing","fetchedAt": "2026-10-18T06:34:37.252Z","plans": [{"name": "Starter","price": 12,"period": "month","currency": "USD","limits": ["3 seats", "10 GB storage"]}],"rawConfidence": 0.9,"mode": "fixture","parseStrategy": "data-attributes"}
| Field | Meaning |
|---|---|
plans[].price | Number, or null for “contact sales” / unknown |
plans[].period | month | year | custom | one_time | … |
rawConfidence | 0–1 evidence-based confidence (priced plans + name quality) |
parseStrategy | data-attributes | card-heuristic | json-ld | text-proximity | spa-shell |
billable | true only if ≥1 non-null price (Free=0 counts) and conf ≥ 0.55 — drives PPE charge |
Pricing (PPE — active on Store)
| Event | When | Price |
|---|---|---|
apify-actor-start | Run starts | platform default (~$0.00005 / GB) |
pricing-page-parsed | Successful normalized snapshot with ≥1 billable plan | $0.02 / event (primary) |
apify-default-dataset-item | Each dataset item | platform default (~$0.00001) |
Notes: Actor.charge({ eventName: 'pricing-page-parsed' }) runs only on the Apify platform for billable parses (not local / fixture). Spec band was $0.01–$0.05; live primary event is $0.02.
Run locally (no Apify token, no spend)
cd /workspace/global-online-revenue-oct2026/week1-apify/scaffold/SPEC_01node src/main.jsnpm test # or: node test/verify-fixture.mjs
Writes storage/datasets/default/000000001.json. Zero npm install required for fixture + native-fetch live mode.
Live URL path uses Node built-in fetch only (no residential proxies, no Apify paid infra). Auth walls / private hosts are refused.
Layout
SPEC_01/├── README.md├── package.json├── Dockerfile├── .actor/actor.json├── .actor/input_schema.json├── src/main.js ← entry (fixture | live) + Actor.charge on platform├── src/parse.js ← HTML → plans[]├── src/input.js ← CLI / INPUT.json / env├── fixtures/ ← regression HTML├── test/verify-fixture.mjs└── storage/ ← local dataset mirror
Legal / support
- Public pricing pages only. Abort behind auth.
- No trademark-implying Actor name.
- Best-effort; Issues tab only; no custom SLAs.