Quick answer
UK Contracts Finder publishes every public-sector tender and award — councils, NHS trusts, central government — as Open Contracting Data Standard (OCDS) JSON: deeply nested tender/award/parties objects that are a genuine pain to flatten correctly. The UK Contracts Finder Tenders Scraper queries the public OCDS search API, handles the nesting and the pagination edge cases below, and returns one buyer-ready row per notice at $4.05 per 1,000 results.
Three things that break a naive OCDS client 🧵
The notice URL isn't the full release ID — and getting this wrong silently breaks almost every row. Contracts Finder's release.id looks like a GUID but usually isn't just one: production values come back as {guid}-{award-sequence}, e.g. c3867725-...-25f960a44aae-911904. The trailing -911904 is an award sequence number, not part of the public Notice URL. A regex that requires the entire id to match the GUID shape never fires on real data — it silently nulls notice_url on nearly every production row while still returning a "successful" run. Worse, the untruncated full id 200s on the live site, but to a generic signed-out interstitial, not the notice — a false-positive that looks like it worked. This Actor anchors on the leading GUID only, confirmed against the live site, so notice_url resolves for real.
The buyer isn't always where you'd look first. Some releases carry buyer.name directly; a lot of others only populate it inside parties[], keyed by a "buyer" role rather than a top-level field. Read only release.buyer and you'll get a null buyer name for a meaningful slice of live notices — exactly the field a bid team is filtering on. This Actor checks release.buyer.name first and falls back to scanning parties[] for the buyer role before giving up.
The API never tells you when you're done. There's no hasMore flag and no total-count field in the response — you only find out pagination is exhausted by noticing the next page repeats the same release IDs, or comes back shorter than a full page. A client that just increments page until a request errors will either loop past the real end or stop one page early depending on how the data happens to land. This Actor tracks the previous page's release-ID set and treats a repeat or a short page as the stop signal, not a guess.
The judgement call: capping a single run at 300 rows 🔒
Every OCDS release here carries the full nested tender/award/parties payload before it's flattened — roughly 310 KB per notice, even though the Actor only keeps 17 fields from it. That's an unusually heavy page weight for what looks like a simple search API.
Rather than let a run silently balloon in bandwidth (and cost) because someone left maxResults uncapped, this Actor hard-caps a single run at 300 rows. It's a deliberate ceiling, not a platform limit — if you need a bigger pull, that's a signal to run it in scheduled batches with a date-range filter rather than one unbounded call.
What you get per row
Notice ID, OCID (the ID grouping every release in one procurement process), the notice URL, notice type (tender/award/contract/planning), title, description, buyer name, status, contract value + currency, deduplicated CPV classification codes, publish date, closing date, and — when a contract has already been awarded — award status, award value + currency, and the deduplicated list of winning supplier names. Pre-award notices simply carry null/empty award fields rather than a fabricated zero, so a live tender never gets mistaken for a $0 award in your filters.
Filter by keyword, notice type, publish-date window, and min/max contract value (applied client-side, since Contracts Finder's own API doesn't expose a value filter).
What it costs
Pay-per-event: a $0.05 flat start fee plus $0.004 per contract notice row. A thousand notices runs about $4.05 — no subscription, no per-seat license, and Apify hands new accounts $5 of free credit to try it with no card. Confirmed working with a live SUCCEEDED run against the production API today.
Where it fits
Bid-team pipelines pulling new tenders in a CPV area every day, market intelligence on which public bodies are buying what and at what value, award tracking to see who won the contracts you bid on, and prospecting lists of buyers actively issuing work in your sector.
Top comments (0)