pricing-trackerpor firecrawl
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.
npx skills add https://github.com/firecrawl/firecrawl-agent --skill pricing-trackerPricing 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: trueto 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
$0or"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
formatOutputonce 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 incurrencyand the unit inunit. - Do not guess. If a tier shows "Contact sales", put
nullinpriceand setenterpriseContactOnly: true. Never make up a number. - Model-tier grids count as tiers. For LLM pricing pages with many models, emit one
tierentry 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
- competitor-analysis — when pricing is one axis of a broader comparison
- structured-extraction — lower-level helper if your schema diverges from the default
- deep-research — for pricing that requires cross-referencing third-party sources