Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the UK Tenders API page →
Government & Tenders

UK Tenders API & Scraper

The UK Tenders API returns contract opportunities and awards published by UK public bodies on Contracts Finder — central government, the NHS, councils and universities — as clean JSON, with no api_key.

2 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary search endpoint returns notices with id, url, notice_identifier, title, the full notice description, the buyer, notice_type, status, published_at, deadline, contract_start and contract_end, value_low, value_high and value_currency, plus awarded_value, awarded_supplier and awarded_at once a contract is let, the cpv_codes with their description, region, postcode and the suitable_for_sme flag — alongside total_matches. notice expands one record into every award row (supplier, supplier address, value, dates and procedure type), coordinates, sector and the buyer's published contact. It is built for public-sector bid pipelines and procurement-market analysis. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

The value fields, and the one you must never sum

Contract values on Contracts Finder are the part everyone gets wrong, because a framework agreement publishes the same ceiling in several places and none of the numbers mean what they look like. Every figure below is from a measured notice.

FieldMeasuredWhat it actually is
value_low / value_high before award0.0 and 500,000,000.0 on a framework; 100,000.0 and 500,000.0 on an ordinary contractthe buyer's published estimate range. A 0.0 low means not stated, not free.
value_low / value_high after award0.0 and 0.0 with value_currency nullemptied once status becomes Awarded — read awarded_value instead
awarded_value49,999,999.66the contract or framework ceiling, not one supplier's share
awards[].valuethe identical 49,999,999.66 on all 43 suppliers⚠️ never sum this column. 43 × £50m would report £2.15bn for a £50m framework.
awarded_value on an unawarded notice0.0 with awarded_supplier null and awarded_at null0.0 here means no award has been made, not a contract worth nothing
awarded_supplier"TechnologyOne UK Ltd"only the first entry of awards[]. A multi-provider framework has many.
id vs notice_identifier3c4f68ee-869e-… vs a14fba33-802d-…two different UUIDs on one notice. The public URL and the notice action both use id.
cpv_codes["48422000"] with cpv_description "Software package suites"8-digit EU CPV classification, the reliable way to scope a sector
region"Any region" · or all twelve UK regions comma-joined into one stringfree text, not an array and not an enum — split on commas at your own risk
awards[].duns_number"739837958"the supplier's DUNS, which is what joins an award to a company database

search returns historical notices by default, newest first — a measured query returned notices from 2022 and 2024 with status Closed and Awarded. A full description and a populated deadline are not evidence a tender is open. Filter on status and check that deadline is in the future before you put anything in front of a bid team.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/uk-tenders/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "q": "web scraping",
    "limit": 10
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "uk-tenders",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1552.5,
    "record_count": 10,
    "bytes": 28952,
    "cache_hit": false,
    "stop_reason": "limit_reached",
    "method": "keyless_public_json_api_bare_dc_curl_cffi",
    "source": "contractsfinder.service.gov.uk",
    "sort_applied": "newest",
    "upstream_sort_supported": false,
    "filters": [
      "keyword"
    ]
  },
  "data": {
    "notices": [
      {
        "id": "a03c5aa[redacted-phone]fc-ab14-6a80b6e5ac01",
        "url": "https://www.contractsfinder.service.gov.uk/Notice/a03c5aa[redacted-phone]fc-ab14-6a80b6e5ac01",
        "notice_identifier": "IT-514-532-P/REF 00000532 - AWARD",
        "title": "Knowing the Heritage Sector Phase 4 - catalogue of heritage enterprises in England - UID 148 - AWARD",
        "description": "Historic England is commissioning Phase 4 of its \"Knowing the Heritage Sector\" programme to address the lack of reliable market intelligence about heritage enterprises in England. This phase will deliver a minimum viable product (MVP) comprising an initial catalogue of heritage enterprises, aligned to consistent data structures and standards, and accompanied by three static dashboard design concepts to illustrate potential data presentation formats. The catalogue will draw on multiple data sources and employ methods such as web-scraping and machine learning, supplemented by manual review, to a",
        "buyer": "Historic England",
        "notice_type": "Contract",
        "status": "Awarded",
        "published_at": "[redacted-phone]T16:26:59Z",
        "deadline": "[redacted-phone]T09:30:00Z",
        "approach_market_date": null,
        "contract_start": "[redacted-phone]T00:00:00Z",
        "contract_end": "[redacted-phone]T00:00:00Z",
        "value_low": 0,
        "value_high": 229617.5,
        "value_currency": "GBP",
        "awarded_value": 229617.5,
        "awarded_supplier": "The Audience Agency",
        "awarded_at": "[redacted-phone]T23:00:00Z",
        "awarded_to_sme": false,
        "cpv_codes": [
          "73000000",
          "73200000",
          "79000000"
        ],
        "cpv_description": "Research and development services and related consultancy services, Research and development consultancy services, Business services: law, marketing, consulting, recruitment, printing and security, Market and economic research; polling and statistics, Market research services, Survey services, Research and experimental development services",
        "region": "Any region",
        "postcode": "SN2 2EH",
        "sector": null,
        "suitable_for_sme": false,
        "is_sub_notice": false,
        "last_updated": "[redacted-phone]T16:26:59Z"
      },
      {
        "id": "310e578d-ead1-4bc1-b971-6c1d850783c1",
        "url": "https://www.contractsfinder.service.gov.uk/Notice/310e578d-ead1-4bc1-b971-6c1d850783c1",
        "notice_identifier": "CF-0025300D8d000009sg5IEAQ",
        "title": "Tender for Provision of Proactive Monitoring and Take Down Service",
        "description": "This is an award notice related to FTS Notice reference: 2024/S [redacted-phone].\n\nThe FCA is seeking to appoint a supplier to provide web scanning and cybercrime disruption services\nin relation to investment scams that target UK consumers.\nThe FCA requires services that will support the FCA in its proactive identification and takedown of websites, telephone numbers and social media accounts containing infringing\ncontent, with a particular focus on illegal financial promotions of products and services of\ninvestments or financial services. We are also looking for the supplier to have strong dat",
        "buyer": "FCA",
        "notice_type": "Contract",
        "status": "Awarded",
        "published_at": "[redacted-phone]T11:59:53Z",
        "deadline": "[redacted-phone]T12:00:00Z",
        "approach_market_date": null,
        "contract_start": "[redacted-phone]T23:00:00Z",
        "contract_end": "[redacted-phone]T23:00:00Z",
        "value_low": 295946,
        "value_high": 466858,
        "value_currency": "GBP",
        "awarded_value": 295946,
        "awarded_supplier": "Incopro Limited",
        "awarded_at": "[redacted-phone]T23:00:00Z",
        "awarded_to_sme": false,
        "cpv_codes": [
          "66000000",
          "66100000",
          "66150000"
        ],
        "cpv_description": "Financial and insurance services, Banking and investment services, Financial markets administration services",
        "region": "London",
        "postcode": "E20 1JN",
        "sector": null,
        "suitable_for_sme": true,
        "is_sub_notice": false,
        "last_updated": "[redacted-phone]T11:59:53Z"
      },
      {
        "id": "ec641d32-1f15-48f3-9458-bc4cd94b04c5",
        "url": "https://www.contractsfinder.service.gov.uk/Notice/ec641d32-1f15-48f3-9458-bc4cd94b04c5",
        "notice_identifier": "CF-0021000D8d000009sg5IEAQ",
        "title": "Provision of Web Scraping API",
        "description": "Provision of Web Scraping API",
        "buyer": "Financial Conduct Authority",
        "notice_type": "Contract",
        "status": "Awarded",
        "published_at": "[redacted-phone]T15:27:39Z",
        "deadline": "[redacted-phone]T12:00:00Z",
        "approach_market_date": null,
        "contract_start": "[redacted-phone]T00:00:00Z",
        "contract_end": "[redacted-phone]T00:00:00Z",
        "value_low": 192212,
        "value_high": 192212,
        "value_currency": "GBP",
        "awarded_value": 192212,
        "awarded_supplier": "ScrapingBee",
        "awarded_at": "[redacted-phone]T00:00:00Z",
        "awarded_to_sme": false,
        "cpv_codes": [
          "48000000"
        ],
        "cpv_description": "Software package and information systems",
        "region": "Any region",
        "postcode": "E20 1JN",
        "sector": null,
        "suitable_for_sme": true,
        "is_sub_notice": false,
        "last_updated": "[redacted-phone]T15:27:39Z"
      }
    ],
    "total_matches": 12,
    "returned": 10,
    "query_sent": "\"web scraping\"",
    "phrase": true,
    "truncated": true,
    "paging_supported": false,
    "source": "contractsfinder.service.gov.uk"
  }
}
Actions

What the UK Tenders API does

ActionDescriptionConcrete use caseKey params
searchSearch UK public-sector contract notices by phrase, status, value, deadline, CPV code and publication date. Every hit already carries the FULL notice text (no second call), plus the money: the published value range for live tenders, and the winning supplier, the awarded amount and the contract end date for awards.GovCon business-development teams call search to search UK public-sector contract notices by phrase, status, value, deadline, CPV code and pub….q, phrase, statuses, notice_types, published_from, ...
noticeOne notice in full by id: the buyer's published contact details (name, e-mail, phone, address), the 'how to respond' instructions with the portal link, the procedure type, the number of times the notice has been viewed (a competition signal), and the complete award block — every winning supplier with their address, the amount and the contract start and end dates. None of this is in the search response.Bid and capture teams call notice to get one notice in full by id.id
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/uk-tenders/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"q":"web scraping","limit":10}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.uk-tenders.search with {"q":"web scraping","limit":10}.
Use cases

Who uses this API and why

  • Public-sector sales teams call search with statuses: ["Open"] — an unfiltered search returns mostly Awarded and Closed notices — and add deadline_from to keep only tenders there is still time to answer.
  • Procurement analysts read awarded_supplier and awarded_value across award notices to size a market and see who is winning it.
  • SME-focused bid teams filter on suitable_for_sme and the value range to find contracts they can realistically win.
  • Competitive-intelligence tools use notice to read every award row on a framework, including supplier address and procedure type.
FAQ

Questions developers ask before integrating

Can I add up awards[].value to get what a framework was worth?

No, and this is the single most expensive mistake with this data. A measured multi-provider framework returned 43 award rows, and every one of them carried the identical value of 49,999,999.66 — that is the framework's ceiling repeated per supplier, not each supplier's slice. Contracts Finder does not publish the split. Summing that column reports £2.15bn for a £50m framework. Take awarded_value from the notice for the ceiling, count awards[] for the number of suppliers, and accept that per-supplier value is not available.

awarded_value came back as 0.0. Was the contract worth nothing?

No — it means no award has been made yet. A measured open notice returned awarded_value 0.0 alongside awarded_supplier null and awarded_at null, which is the honest reading: nothing has been awarded. Do not treat 0.0 as a real amount. Check awarded_supplier or status before you use awarded_value at all, and note the mirror image after an award lands: value_low and value_high both go to 0.0 with value_currency null, so the pre-award estimate disappears once the real number exists.

Why does one notice have two UUIDs?

id and notice_identifier are different values on the same record — a measured notice returned id 3c4f68ee-869e-4c04-b644-a5ee66bba046 and notice_identifier a14fba33-802d-4003-9f99-1fdee242f097. id is the one that appears in the contractsfinder.service.gov.uk/Notice/ URL and the one the notice action takes. Store id as your key. notice_identifier belongs to the publishing system and is not interchangeable with it.

Why does a search for open tenders return closed ones?

Because search covers the whole published archive, not just live opportunities, and sorts newest first — a measured query returned notices from 2022 and 2024 with status Closed and Awarded, each with a full description and a deadline field that had long passed. Filter on status, and independently check that deadline is in the future. This is the reason a bid pipeline built naively on this endpoint fills up with dead work.

Is region a list I can filter on?

Not as returned. It is free text, and it varies wildly in shape: one measured notice returned "Any region", another returned all twelve UK regions concatenated into a single comma-separated string starting "North East,North West,Yorkshire and The Humber…". There is no array and no code. If you need geography, cpv_codes plus the buyer name gets you further, and the notice action adds postcode and coordinates that the search row leaves null.

What does the notice action add over a search row?

The award detail, which is where the analysis actually lives. A measured notice expanded into awards[], each entry carrying supplier, supplier_address as free text, value, awarded_at, contract_start and contract_end, procedure_type (measured "Open"), awarded_to_sme, awarded_to_vcso and duns_number. It also fills in postcode and coordinates. If you are mapping who wins public work, duns_number is the field that joins these rows to a company register without name matching.

How do I find contracts an SME can realistically win?

Filter on suitable_for_sme and pair it with a value range. A measured cyber-security search with that filter returned 1,466 total matches, including a £100k–£500k contract and a £10k–£50k one, both flagged suitable_for_sme true. total_matches is returned on every search so you can size a niche before paging it — the cheap way to answer whether a sector is worth building a bid function around. At award time, awards[].awarded_to_sme tells you whether SMEs actually won, which is a different and more useful question.

Which buyers does this cover?

Every UK public body that publishes to Contracts Finder — central government, the NHS, local councils and universities. Measured buyers in one session ranged from East Sussex County Council to Crescent Purchasing Limited, a purchasing consortium buying on behalf of its members. That last case matters: the buyer named on the notice is not always the organization that will use the contract, so a framework's buyer field understates its real reach.

What is the UK Tenders API?

UK Tenders API is a ReefAPI endpoint group for uk public-sector tender notices and awards with values, deadlines and buyers. It returns live JSON through POST requests under /uk-tenders/v1.

Is the UK Tenders API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. UK Tenders calls use the same shared credit balance as every other ReefAPI engine.

Do I need an UK Tenders login or account?

No login to UK Tenders is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the UK Tenders data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the UK Tenders API use?

UK Tenders actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call UK Tenders from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call uk-tenders actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / uk-tenders

UK Tenders

UK public-sector tender notices and awards with values, deadlines and buyers.

base /uk-tenders/v12 endpoints
post/uk-tenders/v1/notice1 credit

One notice in full by id: the buyer's published contact details (name, e-mail, phone, address), the 'how to respond' instructions with the portal link, the procedure type, the number of times the notice has been viewed (a competition signal), and the complete award block — every winning supplier with their address, the amount and the contract start and end dates. None of this is in the search response.

ParameterAllowed / rangeDescription
idrequiredThe Contracts Finder notice UUID, as returned by `search` in `id`. A full notice URL also works — the id is read out of it.
Try in playground →