Pricing Tracker
Extract pricing tiers from a vendor's pricing page and normalize them into a consistent shape. Optimized for SaaS, API, cloud, LLM, and CDN pricing pages — all of which share similar structure but inconsistent naming.
When to use
- User provides a pricing URL: "get pricing from https://openai.com/api/pricing"
- User names a vendor: "what does Vercel cost?", "get Anthropic API pricing"
- User wants to compare prices across vendors (delegate per-vendor extraction to this skill, then aggregate)
- User wants to monitor pricing on a schedule (combine with
exportSkill: true to generate a standalone workflow)
Do NOT use for e-commerce SKU pricing — use e-commerce instead.
Strategy
Find the pricing URL.
- If the user provided one, use it.
- Otherwise search
"<vendor> pricing" and take the top result from the vendor's own domain.
Scrape with only-main-content. Pricing pages are heavy on nav and testimonials that waste context.
Identify the unit. Every pricing page has one of these shapes — pick the right one:
- Per seat — SaaS (Notion, Linear, Vercel)
- Per request / token / call — API and LLM (OpenAI, Anthropic)
- Per GB / TB — storage, bandwidth, CDN
- Per minute / hour — compute (Modal, Replicate)
- Flat monthly — simple SaaS tiers
- Usage-based with tiers — cloud (AWS, GCP)
Extract every tier. Include Free and Enterprise even when their price is $0 or "Contact sales" — users care about those as much as the paid tiers.
Flag the gotchas.
- Annual vs monthly pricing (often a 20% discount buried on annual)
- Overage rates past the included quota
- Seat minimums ("Team plan starts at 5 seats")
- Features gated to higher tiers
- "Free tier" that requires a credit card
Call formatOutput once with the full pricing object.
Quick start
// Single vendor
await agent.run({
prompt: 'Get OpenAI API pricing for every model',
urls: ['https://openai.com/api/pricing'],
skills: ['pricing-tracker'],
format: 'json',
})
// Export as cron-friendly workflow for price monitoring
await agent.run({
prompt: 'Track Vercel Pro pricing',
urls: ['https://vercel.com/pricing'],
skills: ['pricing-tracker'],
exportSkill: true,
})
// exportedSkill.workflow → standalone script you can run on a schedule
Output schema
{
"vendor": "OpenAI",
"url": "https://openai.com/api/pricing",
"currency": "USD",
"billingPeriod": "monthly",
"unit": "per 1M tokens",
"tiers": [
{
"name": "gpt-4o",
"price": 2.5,
"unit": "per 1M input tokens",
"includedQuota": null,
"features": [],
"limits": {},
"enterpriseOnly": false
}
],
"freeTierAvailable": false,
"enterpriseContactOnly": false,
"notes": "Output tokens priced separately at $10 / 1M. Batch API is 50% off.",
"capturedAt": "2026-04-15",
"sources": ["https://openai.com/api/pricing"]
}
Tips
- Numbers are numbers, not strings. Price
2.5, never "$2.50". Strip currency symbols and commas. Put the currency in currency and the unit in unit.
- Do not guess. If a tier shows "Contact sales", put
null in price and set enterpriseContactOnly: true. Never make up a number.
- Model-tier grids count as tiers. For LLM pricing pages with many models, emit one
tier entry per model.
- Capture
capturedAt: <date> in every output. Makes downstream diffing against a previous run trivial.
- Annual vs monthly: if both are shown, capture the monthly rate as the primary price and note the annual discount in
notes.
- Always include
sources: [...] — at minimum the scraped pricing URL.
See also
1---2name: pricing-tracker3description: Extract and normalize pricing tiers from any SaaS, API, cloud, or LLM vendor's pricing page. Use this skill whenever the user says "pricing for X", "how much does X cost", "pricing tiers", "cost comparison", provides a URL ending in `/pricing` or `/plans`, or asks to monitor pricing over time. Pairs well with `exportSkill` to turn a run into a cron-friendly workflow. Scrape-driven; no interact needed for typical pricing pages.4---56# Pricing Tracker78Extract pricing tiers from a vendor's pricing page and normalize them into a consistent shape. Optimized for SaaS, API, cloud, LLM, and CDN pricing pages — all of which share similar structure but inconsistent naming.910## When to use1112- User provides a pricing URL: "get pricing from https://openai.com/api/pricing"13- User names a vendor: "what does Vercel cost?", "get Anthropic API pricing"14- User wants to compare prices across vendors (delegate per-vendor extraction to this skill, then aggregate)15- User wants to monitor pricing on a schedule (combine with `exportSkill: true` to generate a standalone workflow)1617Do NOT use for e-commerce SKU pricing — use `e-commerce` instead.1819## Strategy20211. **Find the pricing URL.**22 - If the user provided one, use it.23 - Otherwise search `"<vendor> pricing"` and take the top result from the vendor's own domain.24252. **Scrape with `only-main-content`.** Pricing pages are heavy on nav and testimonials that waste context.26273. **Identify the unit.** Every pricing page has one of these shapes — pick the right one:28 - **Per seat** — SaaS (Notion, Linear, Vercel)29 - **Per request / token / call** — API and LLM (OpenAI, Anthropic)30 - **Per GB / TB** — storage, bandwidth, CDN31 - **Per minute / hour** — compute (Modal, Replicate)32 - **Flat monthly** — simple SaaS tiers33 - **Usage-based with tiers** — cloud (AWS, GCP)34354. **Extract every tier.** Include Free and Enterprise even when their price is `$0` or `"Contact sales"` — users care about those as much as the paid tiers.36375. **Flag the gotchas.**38 - Annual vs monthly pricing (often a 20% discount buried on annual)39 - Overage rates past the included quota40 - Seat minimums ("Team plan starts at 5 seats")41 - Features gated to higher tiers42 - "Free tier" that requires a credit card43446. **Call `formatOutput` once** with the full pricing object.4546## Quick start4748```typescript49// Single vendor50await agent.run({51 prompt: 'Get OpenAI API pricing for every model',52 urls: ['https://openai.com/api/pricing'],53 skills: ['pricing-tracker'],54 format: 'json',55})56```5758```typescript59// Export as cron-friendly workflow for price monitoring60await agent.run({61 prompt: 'Track Vercel Pro pricing',62 urls: ['https://vercel.com/pricing'],63 skills: ['pricing-tracker'],64 exportSkill: true,65})66// exportedSkill.workflow → standalone script you can run on a schedule67```6869## Output schema7071```json72{73 "vendor": "OpenAI",74 "url": "https://openai.com/api/pricing",75 "currency": "USD",76 "billingPeriod": "monthly",77 "unit": "per 1M tokens",78 "tiers": [79 {80 "name": "gpt-4o",81 "price": 2.5,82 "unit": "per 1M input tokens",83 "includedQuota": null,84 "features": [],85 "limits": {},86 "enterpriseOnly": false87 }88 ],89 "freeTierAvailable": false,90 "enterpriseContactOnly": false,91 "notes": "Output tokens priced separately at $10 / 1M. Batch API is 50% off.",92 "capturedAt": "2026-04-15",93 "sources": ["https://openai.com/api/pricing"]94}95```9697## Tips9899- **Numbers are numbers, not strings.** Price `2.5`, never `"$2.50"`. Strip currency symbols and commas. Put the currency in `currency` and the unit in `unit`.100- **Do not guess.** If a tier shows "Contact sales", put `null` in `price` and set `enterpriseContactOnly: true`. Never make up a number.101- **Model-tier grids count as tiers.** For LLM pricing pages with many models, emit one `tier` entry per model.102- **Capture `capturedAt: <date>` in every output.** Makes downstream diffing against a previous run trivial.103- **Annual vs monthly:** if both are shown, capture the monthly rate as the primary price and note the annual discount in `notes`.104- **Always include `sources: [...]`** — at minimum the scraped pricing URL.105106## See also107108- [competitor-analysis](../competitor-analysis/SKILL.md) — when pricing is one axis of a broader comparison109- [structured-extraction](../structured-extraction/SKILL.md) — lower-level helper if your schema diverges from the default110- [deep-research](../deep-research/SKILL.md) — for pricing that requires cross-referencing third-party sources