UK Tenders — Find a Tender + Contracts Finder OCDS
Pricing
from $3.00 / 1,000 tender notice cards
UK Tenders — Find a Tender + Contracts Finder OCDS
UK public tenders from the official Find a Tender + Contracts Finder OCDS APIs (no HTML scraping, no API key). Filter by keywords, buyer, CPV, dates. One Markdown tender card + JSON per notice. 256 MB. Failed rows free. No email/phone harvesting.
Pricing
from $3.00 / 1,000 tender notice cards
Rating
0.0
(0)
Developer
新世紀書僮
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Get UK public-sector tender and contract notices from the two official government OCDS APIs, Find a Tender (FTS) and Contracts Finder (CF). Each notice becomes a clean JSON row and a Markdown tender card you can read, paste into a CRM, or feed to an LLM / RAG pipeline.
- Official APIs only. Open Contracting Data Standard (OCDS) JSON endpoints published by the Cabinet Office. No HTML scraping of the find-tender or Contracts Finder websites.
- No API key, no login. Both feeds are open data under the Open Government Licence v3.0.
- Light: 256 MB default memory, newest-first paging, stops when it has enough matches.
- Failures are free. Not-found IDs, empty searches, rate limits, timeouts and server errors are logged as free rows.
- No contact harvesting. Buyer contact emails and phone numbers are never copied. Emails and phone numbers inside free text are replaced with
[contact removed].
What you get
Dataset: one row per notice:
| Field | Example |
|---|---|
ocid, noticeId | ocds-h6vhtk-06dab4, 093588-2026 |
source | find_a_tender | contracts_finder |
title, buyer, buyerId | "(CIH) Training and Qualification Provision", "VICO HOMES LIMITED" |
value, valueGross, currency | 160000, 192000, GBP |
publishedDate, deadline, contractStart, contractEnd | ISO 8601 |
stage, status, procedure, procedureDetails, mainCategory | tender, active, open, "Below threshold - open competition", services |
cpvCodes[], regions[], lots, suitableForSme, suitableForVcse | [{"id":"80500000","description":"Training services"}] |
awards[] | status, date, value, supplier names |
description | redacted excerpt (default 800 chars) |
documents[] | title, type, url, format, datePublished |
noticeUrl, apiUrl | official notice page link + the OCDS API endpoint used |
markdown | the tender card |
result, errorClass, hint | ok / failed / empty |
Key-value store
REPORT.md: summary table plus one Markdown card per notice, followed by a "Not charged" sectionSUMMARY/OUTPUT: counts, filters, scanned releases, requests, charged events, duration, peak memory
Example card
### (CIH) Training and Qualification Provision- **Buyer:** VICO HOMES LIMITED- **Source:** Find a Tender · notice `093588-2026` · [view notice](https://www.find-tender.service.gov.uk/Notice/093588-2026)- **OCID:** `ocds-h6vhtk-06dab4`- **Stage / status:** tender / active- **Procedure:** open — Below threshold - open competition- **Value:** £160,000 GBP (gross £192,000 GBP)- **Dates:** published 2026-10-05 · **deadline 2026-10-23 12:00 (+0100)**- **CPV:** `80500000` Training services- **Delivery:** UKE, UKF- **Suitable for:** SME> This agreement will be for the provision of providing CIH commercial qualifications …**Documents / links**- [Tender notice on Find a Tender](https://www.find-tender.service.gov.uk/Notice/093588-2026) — tenderNotice, 2026-10-05
How search works
The official OCDS search endpoints filter only by date window and paging. They have no keyword, buyer or CPV search. This Actor therefore:
- pages each selected source newest first within your date window (
dateFrom/dateTo, or the lastdaysBackdays), - applies your filters to every release (stages, query, keywords, buyer, CPV, open-only, minimum value),
- stops when it has
maxNoticesmatches or has scannedmaxPagesPerSourcepages (100 releases per page), - keeps the newest release per procurement (OCID), merges both sources newest-first, and writes the cards.
For narrow filters over long windows, raise maxPagesPerSource. If a source has no matches, you get one free no_matches row with the number of releases scanned.
Client-side filtering. The OCDS search APIs have no reliable server-side keyword, buyer or CPV search (Contracts Finder silently ignores keyword; Find a Tender returns 400 for unknown params). Stages, query, keywords, buyer, CPV, open-only and minimum value are therefore applied client-side as each page of releases is scanned. Stage filtering also runs client-side on OCDS tags (FTS stages= under-returns).
Contracts Finder + default stages. Since the Procurement Act 2023 went live, most new opportunities are published on Find a Tender. Contracts Finder currently carries mostly award notices. The default stages: ["tender"] therefore often yields a free CF no_matches row even when FTS returns tenders. To include Contracts Finder results, set stages to include "award" (for example ["tender", "award"], or ["award"] with sources: "contracts_finder").
Input
| Field | Default | Notes |
|---|---|---|
query | — | All words must match (title / description / buyer / CPV text). Use "quotes" for phrases |
keywords | — | Any-of list, combined with query as AND |
buyerName | — | Case-insensitive substring of the buyer name |
cpvCodes | — | Prefix match. Trailing zeros widen: 72000000 = all IT services |
sources | both | both | find_a_tender | contracts_finder |
stages | ["tender"] | planning, tender, award. Empty = all |
dateFrom / dateTo | last 7 days | YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS (CF: published, FTS: updated) |
daysBack | 7 | Used when dateFrom is empty |
openOnly | false | Keep only notices whose deadline is in the future |
minValue | — | Keep notices with value ≥ this amount |
noticeIds / releaseUrls | — | Direct fetch (see below). Skips search unless searchAlsoWithIds |
maxNotices | 50 | Max cards (and charges) per run |
maxPagesPerSource | 10 | Up to 100 releases per page |
latestPerOcid | true | One card per procurement |
descriptionMaxChars | 800 | Excerpt length |
maxConcurrency | 2 | Max 4, kept low to respect the services |
maxRetries | 3 | 429, CF 403 rate-limit page, 5xx, timeouts. Retry-After is honoured |
requestTimeoutSecs | 60 |
Direct fetch
noticeIds accepts:
- Find a Tender notice IDs
093588-2026or OCIDsocds-h6vhtk-06dab4(the newest release is used) - Contracts Finder notice GUIDs (from
contractsfinder.service.gov.uk/Notice/<guid>) or release IDs<guid>-NNNNNN - Official notice URLs or OCDS API URLs on those two services, converted to API calls. HTML is never fetched
Contracts Finder OCIDs (ocds-b5fd17-…) have no reliable keyless lookup. Pass the notice GUID instead; otherwise you get a free cf_ocid_unsupported row.
Example inputs
{ "query": "software", "stages": ["tender"], "openOnly": true, "daysBack": 14, "maxNotices": 25 }
{ "sources": "find_a_tender", "cpvCodes": ["45000000"], "buyerName": "council", "minValue": 1000000 }
{ "sources": "contracts_finder", "stages": ["award"], "keywords": ["cyber", "security"], "daysBack": 30 }
{ "noticeIds": ["093588-2026", "https://www.contractsfinder.service.gov.uk/Notice/91ac2c18-297c-4746-a349-4c78d487a796"] }
Pricing (pay-per-event)
| Event | Price | When |
|---|---|---|
apify-actor-start | $0.001 | Once per run |
tender-notice | $0.003 | Each successful notice card saved to the dataset |
Free: not-found / invalid IDs, no_matches rows, rate-limited / timeout / server-error rows after retries. Your maximum charge per run is respected: the Actor stops writing billable cards when the limit is reached.
Rate limits and etiquette
Requests send a User-Agent that identifies this Actor. Requests to each host are spaced out, and 429 responses (and Contracts Finder's 403 "rate limit" page) back off with Retry-After or exponential delays. Contracts Finder asks clients to pause about 5 minutes after a rate-limit response. If retries run out, the source is reported as a free rate_limited row.
Data licence
Notice data © Crown copyright, available under the Open Government Licence v3.0. Source APIs: Find a Tender OCDS, Contracts Finder OCDS Search.
Not included
- HTML scraping of tender websites or attached documents
- Contact emails, phone numbers or named contact lists. This is not a lead-generation tool
- EU TED notices (the UK left TED after 2020; FTS replaces it for UK notices)