| name | pricing-tracker |
| description | 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.
|
| category | Research |
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
await agent.run({
prompt: 'Get OpenAI API pricing for every model',
urls: ['https://openai.com/api/pricing'],
skills: ['pricing-tracker'],
format: 'json',
})
await agent.run({
prompt: 'Track Vercel Pro pricing',
urls: ['https://vercel.com/pricing'],
skills: ['pricing-tracker'],
exportSkill: true,
})
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