---
title: "Get data freshness metrics"
method: GET
path: "/api/freshness"
---

# Get data freshness metrics

`GET /api/freshness`

## Request

- Base URL: `https://agentdeals.dev`
- URL: `https://agentdeals.dev/api/freshness`
- Auth: none required

Returns data quality metrics. Two counts are reported side by side and they are not interchangeable: confirmed_* counts offers whose published terms the verification store can source to a read that confirmed them, and stamped_* counts offers by the catalogue date beside the entry, which records when it was last written and is not a confirmation. freshness_score is computed from the confirmed count; the catalogue-date share is published separately as stamp_score.

## Response `200`

Data freshness metrics

- object
  - `total_offers` integer
  - `stamped_within_7_days` integer: Offers whose catalogue date (verifiedDate) falls within 7 days. The catalogue date records when the entry was last written and is not a confirmation.
  - `stamped_within_30_days` integer: Offers whose catalogue date falls within 30 days.
  - `stamped_within_90_days` integer: Offers whose catalogue date falls within 90 days. This count was published as verified_within_90_days until 2026-09-14.
  - `stamped_within_180_days` integer: Offers whose catalogue date falls within 180 days.
  - `confirmed_within_7_days` integer: Offers whose published terms the verification store can source to a read that confirmed them within 7 days.
  - `confirmed_within_30_days` integer: Offers confirmed by a read within 30 days.
  - `confirmed_within_90_days` integer: Offers confirmed by a read within 90 days. freshness_score is computed from this.
  - `confirmed_within_180_days` integer: Offers confirmed by a read within 180 days.
  - `offers_holding_a_confirmation` integer: Offers for which the verification store holds any confirmation at all.
  - `oldest_confirmation_held` string, date, nullable: The oldest confirmation still held for any offer. This is not the date the store opened — a confirmation superseded by a later read is no longer held.
  - `attempted_within_90_days` integer: Offers the verification store attempted to re-read within 90 days, whether or not the read confirmed anything. Read against confirmed_within_90_days this separates offers we have not reached from offers we reached without confirming.
  - `freshness_score` integer: confirmed_within_90_days as a percentage of total_offers — the share of the catalogue whose published terms we can source to a read that confirmed them. This field reported the catalogue-date share until 2026-09-14; that share is now published as stamp_score.
  - `stamp_score` integer: stamped_within_90_days as a percentage of total_offers.
  - `stalest_entries` object[]
    - `vendor` string
    - `category` string
    - `verifiedDate` string, date
    - `last_read_date` string, date
    - `confirmed_on` string, date, nullable: The date the store confirmed these terms, or null where it holds none.
    - `url` string, uri
    - `days_since_verified` integer
    - `days_since_read` integer
  - `freshest_entries` object[]
    - `vendor` string
    - `category` string
    - `verifiedDate` string, date
    - `last_read_date` string, date
    - `confirmed_on` string, date, nullable: The date the store confirmed these terms, or null where it holds none.
    - `url` string, uri
    - `days_since_verified` integer
    - `days_since_read` integer
  - `by_category` object[]
    - `category` string
    - `count` integer
    - `avg_days_since_verified` integer: Mean age in days of the category's catalogue dates. Not a confirmation age.
    - `freshness_score` integer: confirmed_within_90_days as a percentage of the category's count.
    - `stamp_score` integer: stamped_within_90_days as a percentage of the category's count.
    - `confirmed_within_90_days` integer
    - `stamped_within_90_days` integer
  - `quarantine` object: Offers the re-verification job has stopped checking daily because three consecutive checks failed. They are retried on a backoff; the entry says what failed and when it is next due.
    - `count` integer
    - `retry_after_days` integer
    - `by_reason` object
    - `entries` object[]
      - `vendor` string
      - `url` string, uri
      - `consecutive_failures` integer
      - `failure_category` string, nullable
      - `last_error` string, nullable
      - `last_attempt_at` string, date, nullable
      - `last_success` string, date, nullable
      - `quarantined_since` string, date, nullable
      - `next_retry` string, date, nullable
  - `superseded_terms` object: Offers whose stored description one of our own in-force change records names as the previous terms. Neither freshness_score nor stamp_score counts them: a read that finds a change records what it found in the change log and leaves the catalogue entry saying the old thing, so the entry is neither confirmed nor restated. The vendor page for such an offer withholds our stored terms and quotes the reading instead.
    - `offers_whose_stored_terms_a_record_supersedes` integer: Offers our own in-force change log contradicts.
    - `offers_we_could_restate_from_a_sourced_reading` integer: How many of those records carry a dated reading with a source URL — the sentence the vendor page already shows in place of our terms.
    - `oldest_reading_we_are_withholding_behind` string, date, nullable: The oldest such reading. How far back the longest-standing withheld entry goes.
    - `offers_we_may_restate_from_their_reading` integer: Withheld offers where the reading answers for the tier the entry describes, so it may be stored as our terms, attributed to the reading and to the date it was read.
    - `offers_we_refuse_to_restate` object: The rest, counted by the ground we refuse on. A reading that prices a different plan than the entry describes is not a restatement of that entry. Nor is one that reports on the page it was read from rather than stating that page's terms, one that states no figure where the terms it would replace state several, or one that drops the cap on how many people may use the free tier — a restatement may drop a caveat, but not the fact that decides the tier. One ground is not a rule and says so in its name: it counts the readings held back by name, each of which is waiting on a rule that should reach it. One counts entries whose restatement was put back by hand: the record it was taken from may not restate it a second time, though a newer record contradicting the entry still may.
    - `offers_re_read_since_the_record_and_still_withheld` integer: Withheld offers whose cited page we have read again since the reading and which we still cannot answer from our own stored terms.
    - `restatements_keeping_the_stored_sentence_saying_what_the_product_is` integer: How many of the restatements we may make open on the stored clause saying what the product is, with only the terms after it replaced. The rest hold no such clause and take the reading whole.
    - `offers_whose_terms_came_from_a_reading` integer: Offers whose stored description was taken from a dated reading of the vendor's page rather than written by us or confirmed against that page. This is a fourth state beside confirmed, stamped and read — a read disagreed with us and we took its words — and it is counted here and nowhere else, because neither verifiedDate nor the confirmation date may move on a restatement.
    - `offers_restated_by_change_type` object: Those offers counted by the verdict of the change record the reading came from.
    - `oldest_reading_we_publish_as_our_terms` string, date, nullable: The oldest reading standing as an offer's terms. How far back the longest-standing restatement goes.
    - `newest_reading_we_publish_as_our_terms` string, date, nullable: The newest such reading.

---

[API](https://skmtc.dev/agentdeals/apis/agentdeals-api.md) · [All operations](https://skmtc.dev/agentdeals/apis/agentdeals-api/llms.txt) · [OpenAPI document](https://skmtc.dev/agentdeals/apis/agentdeals-api/revisions/2b80deacb326?raw)
