UK PPE & Safety Equipment Shelf Monitor avatar

UK PPE & Safety Equipment Shelf Monitor

Pricing

from $3.00 / 1,000 trade shelf rows

Go to Apify Store
UK PPE & Safety Equipment Shelf Monitor

UK PPE & Safety Equipment Shelf Monitor

The whole priced UK safety-equipment trade catalogue in seconds: ex-VAT and inc-VAT price, minimum order quantity, unit, brand, category and the product lifecycle stage that flags a discontinuation early. Delta mode annotates every row with what moved.

Pricing

from $3.00 / 1,000 trade shelf rows

Rating

0.0

(0)

Developer

Sami

Sami

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

Categories

Share

UK PPE & Safety Equipment Shelf Monitor — The Whole Trade Catalogue (2026)

The complete priced catalogue of the UK's largest safety-equipment distributor, in about eight seconds: ex-VAT trade price, inc-VAT price, minimum order quantity and order interval, unit, brand, category, promotion, product URL — and the field nobody else exposes, the product lifecycle stage.

Measured on 2026-07-25: 14,843 catalogue entries in 16 requests, 8.2 seconds. No API key to obtain, no browser, no proxy.

Why the lifecycle field is the reason to run this

Every line carries one of four stages, populated on 100% of rows:

StageCount (measured)What it tells you
ESTABLISHED12,524Core range
INTRO 1 / INTRO 21,514 / 359New lines entering the range — what your competitor just started stocking
EXIT1387Being discontinued

A SKU moving ESTABLISHED → EXIT1 is a discontinuation warning that arrives weeks before the line disappears from the shelf. If you buy, sell or specify safety equipment, that is the difference between resourcing calmly and being told a product is gone when you order it. And it exists nowhere as a feed — only by comparing today's catalogue against a stored one, which is exactly what delta mode does.

What a row looks like

{
"sku": "5535821",
"productName": "Arco Medium-Duty Sack Truck Solid Wheel",
"brand": "ARCO",
"category": "Manual Handling",
"netPriceExVat": 89.50,
"grossPriceIncVat": 107.40,
"vatRatePct": 20.0,
"currency": "GBP",
"minOrderQuantity": 2,
"orderQuantityInterval": 1,
"unit": "Each",
"productLifecycle": "ESTABLISHED",
"promotion": null,
"isPriceable": true,
"suspiciousPrice": false,
"productUrl": "https://www.arco.co.uk/products/5535821",
"scrapedAt": "2026-07-25T21:40:00Z"
}

Delta mode — every row says what moved

With deltaMode: true, the first run records a baseline and every later run returns the shelf annotated:

changeTypeMeaning
lifecycle_changeStage transition, with previousLifecycle — the discontinuation warning
price_up / price_downTrade price moved, with priceChange and priceChangePct
supply_terms_changeMinimum order quantity or order interval moved — a supply signal
promo_changePromotion on the line changed
new / delistedLine entered or left the catalogue

Deliberately, the default returns the WHOLE shelf every run, with movement as an annotation — because a price file you cannot join to yesterday's is not a price file. If you are feeding an alerting pipeline that already holds the catalogue, returnChangesOnly: true gives you just the movers. Unchanged rows are billed at the ordinary row rate, never the change rate.

delisted only fires after a full sweep. On a filtered run the Actor sees a subset by design, and calling those SKUs delisted would be a lie.

{
"maxProducts": 20000,
"deltaMode": true,
"deltaStateKey": "weekly-shelf"
}

Who this is for

BuyerJob
Safety and PPE brandsWhere your lines sit against competitors on the biggest UK trade shelf, at what trade price, and which of your SKUs the distributor has moved to EXIT
Distributors and resellersA complete competitor price file, refreshed weekly, with MOQ and pack terms included
Procurement and facilities teamsBenchmark quoted prices against the published trade price, and catch discontinuations before a reorder fails
Industrial and construction analystsAssortment breadth, own-brand share and price movement across ~15,000 SKUs as an input-cost read
Marketplace sellersSourcing terms — MOQ, order interval, unit — in one normalised grid

Sizing your run

SetupRequestsRowsAt $0.003/row
Full catalogue, one-off16~14,800$44
Full catalogue, weekly cron16/week~14,800/week~$192/month
One brand (e.g. 3M)1-2a few hundredcents
Only the lines being discontinued (product_lifecycle:"4 EXIT1")1~390$1.17

That last row is the cheapest useful query on this Actor: one request tells you everything the distributor is dropping.

Pricing

EventPriceWhat it is
product-row$0.003One catalogue line, full field set
shelf-change$0.02One line that moved in delta mode, with its previous values

Index entries with no name or price are skipped and never charged (59 of 14,843 when measured).

Limitations, stated plainly

  • This is one distributor's catalogue — the UK's largest safety-equipment supplier, which is what most UK PPE pricing is benchmarked against, but it is one source and the data says so.
  • Some lines carry placeholder prices. A sack truck at £0.01 is not a bargain, it is a catalogue artefact. Those rows are returned with suspiciousPrice: true so they never poison an average.
  • Trade prices are list prices, not your negotiated account price. That is precisely what makes them a benchmark.
  • Ordinary pagination does not work on this source — page 2 returns zero rows with a success status. This Actor walks a price watermark instead, which is why it gets the whole catalogue where a naive scraper would silently return 1,000 rows and look fine.
  • No history before your first run. Prices and lifecycle stages cannot be backfilled.
  • If the storefront rotates its public search key, the run fails loudly with that reason and charges nothing — it does not return an empty catalogue.

FAQ

Do I need a proxy? No. Verified from an ordinary IP with no challenge.

Why does the full catalogue only take 16 requests? Because it is harvested by price watermark at 1,000 rows a request, rather than page by page.

Can I get just the discontinued lines? Yes — filterExpression: product_lifecycle:"4 EXIT1". One request, ~390 rows.

Why is my first delta run the whole shelf? It is the baseline, billed at the row rate. From the second run every row carries what moved.

Other scrapers by Zhorex

This Actor reads publicly visible commercial catalogue data: product names, trade prices, order terms and lifecycle stages. It collects no personal data and places no orders. Respect the distributor's terms and applicable law in your jurisdiction, and use the data for analysis rather than redistribution.