SaaS Pricing Page → Normalized Plans JSON (PPE) avatar

SaaS Pricing Page → Normalized Plans JSON (PPE)

Pricing

from $20.00 / 1,000 pricing page parseds

Go to Apify Store
SaaS Pricing Page → Normalized Plans JSON (PPE)

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

kyaw kyaw

Maintained by Community

Actor 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_01
node src/main.js # default fixture
node src/main.js fixtures/sample-pricing.html
node src/main.js --url https://example.com/pricing # live public fetch
SPEC01_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"
}
FieldMeaning
plans[].priceNumber, or null for “contact sales” / unknown
plans[].periodmonth | year | custom | one_time | …
rawConfidence0–1 evidence-based confidence (priced plans + name quality)
parseStrategydata-attributes | card-heuristic | json-ld | text-proximity | spa-shell
billabletrue only if ≥1 non-null price (Free=0 counts) and conf ≥ 0.55 — drives PPE charge

Pricing (PPE — active on Store)

EventWhenPrice
apify-actor-startRun startsplatform default (~$0.00005 / GB)
pricing-page-parsedSuccessful normalized snapshot with ≥1 billable plan$0.02 / event (primary)
apify-default-dataset-itemEach dataset itemplatform 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_01
node src/main.js
npm 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

  • Public pricing pages only. Abort behind auth.
  • No trademark-implying Actor name.
  • Best-effort; Issues tab only; no custom SLAs.