# Inventory and price freshness

> An agent that cannot tell whether an item is in stock will quote a stale offer to a buyer. The fix: declare availability and price validity.

- Source: /checks/inventory-freshness
- Site: AgenticWebScore
- Language: English

---
An agent that cannot tell whether an item is in stock — or when a price was last valid — will quote a stale offer to a buyer, or refuse to quote at all.

| Property | Value |
| --- | --- |
| Check id | `inventory-freshness` |
| Dimension | Commerce Protocols (15%) |
| Tier | Recommended — pool 20 pts |
| Weight inside tier | 2 |
| Impact | High |
| Maturity | Adopted — A ratified standard with real deployment. |
| Conditional | No |
| Publishing skill | `inventory-freshness` |
| Standards | schema.org/Offer |

## What the scanner requests

- `/products`
- `/shop`

It also reads documents it has already fetched: `$home`.

## What is measured

Profile-scoped: reported as not scored and excluded from the denominator unless the e-commerce or marketplace profile has been positively identified, and this check never creates that identification itself. In scope, the scanner flattens the Product/Offer JSON-LD it already holds from the homepage and, when reachable, /products and /shop, and passes every Offer that carries an `availability` from the schema.org ItemAvailability set (InStock, OutOfStock, PreOrder, BackOrder, SoldOut, LimitedAvailability) together with an ISO-date `priceValidUntil`; an Offer with availability but no price validity is a partial (0.7), and an Offer with neither is a fail.

## Reproduce it yourself

You do not have to take our word for any of this. Run the same measurement against your own domain:

```bash
DOMAIN=shop.example.com
curl -sL "https://$DOMAIN/" | perl -0777 -ne 'while (m{<script[^>]*application/ld\+json[^>]*>(.*?)</script>}gsi) { print "$1\n" }' | jq -r '.. | objects | select((."@type"? | if type == "array" then .[] else . end) == "Offer") | [(.url // "NO url"), (.availability // "NO availability"), (.priceValidUntil // "NO priceValidUntil")] | @tsv'
```

## The fix

This is the artifact to ship. It is the complete change, not a description of one.

```json
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Aurora Desk Lamp",
  "sku": "ADL-100-BLK",
  "offers": {
    "@type": "Offer",
    "url": "https://shop.example.com/products/aurora-desk-lamp",
    "price": "1299.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "priceValidUntil": "2026-12-31"
  }
}
```

> Emit availability and priceValidUntil from live stock and your pricing calendar on every render, because a cached InStock on a sold-out SKU, or a priceValidUntil already in the past, is read as a stale offer that a purchase agent will refuse to quote.

## Standards referenced

- `schema.org/Offer`

## Related checks

| Check | Tier | Impact | Same skill |
| --- | --- | --- | --- |
| `product-schema` — Product/catalog schema | Essential | Critical | — |
| `payment-protocols` — Agent payment standard support (AP2/ACP/x402/UCP) | Recommended | High | — |
| `agent-purchase` — Agent purchase policy | Recommended | High | — |
| `ucp-manifest` — UCP manifest (/.well-known/ucp) | Emerging | Medium | — |
| `returns` — Return and shipping terms machine-readable | Recommended | Medium | — |
| `agent-analytics` — Agent traffic measurement | Emerging | Low | — |
| `seller-identity` — Seller identity declared | Recommended | Medium | — |
| `shipping-costs` — Shipping cost and delivery declared | Recommended | High | — |
