Website Change Tracker - Pricing History avatar

Website Change Tracker - Pricing History

Pricing

from $7.00 / 1,000 content changes

Go to Apify Store
Website Change Tracker - Pricing History

Website Change Tracker - Pricing History

When did a competitor last raise prices, rename a plan or swap analytics? The Internet Archive knows but only reports byte changes — measured on one page, 62% of those changed nothing a person would read. This extracts prices, headings and third-party scripts and diffs those instead.

Pricing

from $7.00 / 1,000 content changes

Rating

0.0

(0)

Developer

Datalayer

Datalayer

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Website Change Tracker — Pricing & Copy History

When did your competitor last raise prices? Rename a plan? Swap analytics providers? The Internet Archive has the answer and gives it away free. The problem is that the archive cannot tell you when a page changed — only when its bytes differed.

The problem with archive diffs

The archive stores a content digest per capture, and collapse=digest drops adjacent duplicates. It is tempting to call what survives "the times this page changed." Measured on stripe.com/pricing, January 2024 alone:

Byte-distinct captures9
Consecutive comparisons8
Comparisons where nothing readable changed5 (62%)
Real content changes3

A rotated CSP nonce, a rebuilt asset filename, a new build hash or a fresh session cookie all change the digest. None of them change the page.

This Actor extracts what a person would call the content — title, headings, prices, rates, third-party scripts — and diffs that. Over the same two and a half years, stripe.com/pricing has 588 byte-distinct captures in the archive. Sampled quarterly, 11 comparisons, every one a real change.

What it finds

Price changes, with before and after:

2026-04-01 prices -$249.00, $349.00 +$0.02, $0.03, $0.05, $0.07
2026-08-01 prices -$0.02, $0.07 +$100,000.00

Messaging shifts — when positioning moved:

2025-01-01 title "Pricing & Fees | Stripe Official Site" -> "Pricing & Fees"

Tech-stack switches — the set of third-party script hosts, capture by capture. When a competitor drops Segment for Amplitude, or adds a support-chat vendor, it shows up here. Usually a bigger signal than the copy edit filed the same day.

New and retired plans — H2 headings on a pricing page are the plan names. headingsAdded catches a tier launching; headingsRemoved catches one being quietly killed.

Who uses this

  • Competitive intelligence — a dated price history for every competitor, without having monitored them at the time
  • Sales and RevOps — "they raised prices in April" is a usable talking point
  • Pricing teams — what the market actually did, not what analysts said
  • Due diligence — how often a company repositioned, and when
  • SEO — when a page's title and headings were rewritten, next to your rank history

Input

{
"urls": ["stripe.com/pricing", "vercel.com/pricing"],
"startDate": "2024-01-01",
"cadence": "monthly",
"watchPricesOnly": true
}
FieldDefaultNotes
urls["stripe.com/pricing"]Bare domains or full URLs both work.
startDate2024-01-01YYYY-MM-DD.
endDateYYYY-MM-DD.
cadencemonthlyall when you need the exact day a price moved.
maxSnapshotsPerUrl40Ceiling per page.
changesOnlytrueOff shows the comparisons that prove nothing moved.
watchPricesOnlyfalseNarrow to currency changes only.
includeSnapshotsfalseEmit the extracted content of every capture.
includeTextfalseAttach visible page text to snapshot rows.

Output

change — one row per real change:

{
"type": "change",
"url": "stripe.com/pricing",
"changedBetween": "2026-01-01T14:10:14.000Z -> 2026-04-01T20:32:16.000Z",
"changeTypes": ["pricing", "rates", "messaging"],
"summary": "prices -$249.00, $349.00 +$0.02, $0.03; rates +3.5%; +8 heading(s); -9 heading(s)",
"priceChanged": true,
"pricesRemoved": ["$249.00", "$349.00"],
"pricesAdded": ["$0.02", "$0.03", "$0.05", "$0.07"],
"previousArchiveUrl": "https://web.archive.org/web/.../https://stripe.com/pricing",
"archiveUrl": "https://web.archive.org/web/.../https://stripe.com/pricing"
}

Both archive links are on the row, so any finding can be eyeballed in one click.

url_summary — how much of the archive's churn was noise:

{ "type": "url_summary", "distinctCapturesInArchive": 588,
"snapshotsCompared": 12, "contentChanges": 11, "noiseRatio": 0 }

snapshot — the extracted content of each capture, when requested.

Reliability

  • Public, unauthenticated Internet Archive endpoints. Nothing is scraped from the live site, so no target is ever touched.
  • Captures are fetched with the id_ suffix, which returns the original archived bytes with no Wayback rewriting and no injected banner. Without it you extract the archive's markup instead of the site's.
  • Those original bytes are frequently still gzip-compressed. Verified live: a Stripe capture arrives beginning 1f 8b. Decompression is by magic-byte sniffing, not by trusting a header.
  • The archive returns 503 under load more than most APIs and recovers in seconds — measured live, two empty responses then a clean 200. Retries use exponential backoff.
  • One unreadable capture never fails the page; it lands in RUN_SUMMARY.

Limits

  • Only what the archive captured. Pages behind a login, geo-gated pages and robots-excluded pages have no history to read.
  • Prices are read from the rendered HTML. A page that builds its pricing table in JavaScript after load will have been captured without it.
  • Currency amounts and percentages are reported separately on purpose. A marketing page carries statistics ("326% growth") beside its real rates, so only currency movement is labelled pricing.
  • Sampling picks the first capture in each period. Two changes inside one month at monthly cadence read as one. Use all for exact dates.
  • Amounts inside <script> and <style> blocks are excluded — a JS string literal is not a published price.