How do I track website changes over time?
Building a history of what your site actually served, so you can answer "when did this break" instead of guessing.
Snapshot the measured state on a schedule and compare successive snapshots. The valuable question is rarely "what is my score" — it is "what is different from last week", and only a stored history can answer that.
Why a point-in-time audit is not enough
A single audit tells you the current state. It cannot tell you whether that state is new, and the second question is usually the operational one.
- Was that header always missing, or did it disappear on Tuesday?
- Did our accessibility score drop after the redesign, or before it?
- When did the certificate change issuer?
- Has the third-party script count been creeping up all quarter?
Each of these is trivial with history and unanswerable without it. Reconstructing the past from memory and deploy logs is much harder than it sounds, particularly for changes nobody deployed.
Reading the stored history
curl -s "https://outrings.com/api/v1/history?url=example.com" | jq '{
snapshotHost,
points: [.history[] | {at, score, grade}]
}'This endpoint reads history only and never fetches the target, so it still works while the site is down — which is exactly when you most want to know what changed.
example.com when it redirects to www.example.com and the history lives under the second. The response reports which one it used as snapshotHost, so you are never guessing.Comparing two points
curl -s "https://outrings.com/api/v1/changes?url=example.com" | jq '{
comparable,
scoreDelta,
categories: [.categories[]? | select(.delta != 0) | {category, from, to, delta}],
appeared: [.newProblems[]?.id],
cleared: [.resolved[]?.id]
}'This re-audits, compares against the most recent stored snapshot, and reports the difference. comparable: false means there was nothing earlier to compare with — history starting, not an error.
What to keep an eye on longitudinally
| Trend | What it usually means |
|---|---|
| Third-party script count rising | Marketing tags accumulating; privacy and performance both degrading quietly |
| Accessibility drifting downward | New components shipped without the checks the old ones had |
| Security flat then a sudden drop | An edge or CDN configuration change, not a deploy |
| Content scores falling as pages grow | Publishing volume outpacing editing standards |
| Certificate issuer changing unexpectedly | Worth confirming it was intentional |
The first row is the one that catches most teams. No single tag addition is significant, and twenty of them over a year is a different website.
A sensible cadence
- Snapshot daily, or on every production deploy if you ship less often than that.
- Alert on new high and critical findings, not on score movement.
- Review the trend monthly rather than the daily numbers — that is the timescale at which drift becomes visible.
- Before concluding anything from a comparison, check the ruleset version matches.
Snapshots are stored at most once per site every six hours, so a daily job is a natural fit and more frequent runs will not produce more history.
What our audit reports about this
Every item below is measured directly, not inferred. Run it against your own site and the result names the exact rule or header responsible.
- Stored snapshots per site with a history endpoint that never re-fetches the target.
- A comparison endpoint reporting new problems, resolved findings and per-category deltas.
- Snapshot host resolution after redirects, reported explicitly so history is never silently filed under a host you did not expect.
- Version stamps on every snapshot, so a longitudinal comparison can be validated as like for like.
For agents and scripts, the same measurement is at
/api/v1/summary?url=yoursite.com —
see the API documentation.
Related questions
How long is history kept?
Snapshots accumulate per site at a maximum of one every six hours. The history endpoint returns what has been stored for that host, oldest to newest.
Is page content stored in the history?
No. Snapshots hold the hostname, the scores, and which checks failed — never page content, paths or query strings. The privacy page itemises every field that is written.
Why is my history empty?
Most often the redirect issue: history is filed under the final host after redirects. Check the snapshotHost field in the response — asking about the apex when the site serves from www will look empty until you ask about the right one.
Can I export it?
Yes — the history endpoint returns JSON, so it drops straight into a spreadsheet, a dashboard or a notebook without any scraping.
Read next
How do I monitor a website for regressions automatically?
Catching the silent breakages — an expired certificate, a stripped header, a robots.txt that started blocking Google — before anyone reports them.
ReadWhy did my website score change when I did not change anything?
The four causes of an unexplained score movement, and how to tell which one you are looking at in under a minute.
ReadHow do I add a website check to my CI pipeline?
Blocking a deploy when it would break your headers, certificate, indexability or accessibility — with copy-paste config for GitHub Actions and GitLab.
ReadHow do I compare two websites objectively?
Benchmarking against a competitor without fooling yourself — what is fair to compare, and what is not comparable at all.
Read