Gov APItenders.gov.uk ↗
Search and retrieve UK government tender notices from Find a Tender in OCDS format. Filter by status, CPV code, value, and date across 5 endpoints.
What is the Gov API?
The tenders.gov.uk API provides access to UK public procurement notices from the Find a Tender service across 5 endpoints. Use search_notices to query live tender opportunities by keyword, status, notice type, and contract value, or call get_notice_detail to retrieve a full OCDS release package for any specific notice. Response fields include OCDS-structured parties, tender details, awards, contracts, and publisher metadata.
curl -X GET 'https://api.parse.bot/scraper/8cba9203-9364-4487-950d-0a8c2e3c9fd3/search_notices?page=1&query=construction&sort_by=publish_date_desc&statuses=planning&max_value=1000000&min_value=10000¬ice_types=1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace tenders-gov-uk-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Find a Tender (UK Gov) SDK — bounded, re-runnable; every call capped."""
from parse_apis.find_a_tender_uk_gov_api import FindATender, NoticeStatus, NoticeNotFound
client = FindATender()
# Search for active tenders in the planning stage
for notice in client.notices.search(query="construction", statuses=NoticeStatus.PLANNING, limit=5):
print(notice.title, notice.organisation, notice.published_date)
# Drill-down: take one notice and retrieve its full OCDS release package
notice = client.notices.search(query="cleaning", limit=1).first()
if notice:
package = notice.detail()
print(package.published_date, package.publisher.name)
for release in package.releases:
print(release.id, release.ocid, release.tag)
# Bulk OCDS release extraction
for release in client.releasepackages.fetch(limit=3):
print(release.id, release.date, release.ocid)
# Browse CPV procurement categories
for cpv in client.cpvcodes.list(limit=10):
print(cpv.code, cpv.description, cpv.has_children)
# Typed error handling: catch NoticeNotFound for a deleted/invalid notice
try:
bad_notice = client.notice(id="000000-0000")
bad_notice.record()
except NoticeNotFound as exc:
print(f"Notice not found: {exc.notice_id}")
print("exercised: notices.search / notice.detail / releasepackages.fetch / cpvcodes.list / notice.record")
Full-text search over UK government tender notices on the Find a Tender service. Returns a paginated list of notice summaries with metadata including organisation, notice type, contract value, location, and publication date. Supports filtering by procurement stage (status), notice type, and contract value range. Each page returns up to ~20 results; use the page parameter to advance. The total_results count reflects the full matching set across all pages.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based). |
| query | string | Search keywords to match against notice titles and descriptions. |
| sort_by | string | Sort order for results. |
| statuses | string | Comma-separated statuses to filter by. Accepted values: planning, tender, contract, pipeline, award, termination. If omitted, all statuses are included. |
| max_value | string | Maximum contract value filter. |
| min_value | string | Minimum contract value filter. |
| notice_types | string | Comma-separated notice type filter values. |
{
"type": "object",
"fields": {
"items": "array of notice summary objects",
"total_results": "integer total number of matching notices"
},
"sample": {
"data": {
"items": [
{
"id": "054954-2026",
"url": "https://www.find-tender.service.gov.uk/Notice/054954-2026",
"title": "B329/26 - Provision of Portable Appliance Equipment Testing",
"location": "UKL17 - Bridgend and Neath Port Talbot",
"notice_type": "UK6: Contract award notice",
"organisation": "Bridgend County Borough Council",
"contract_value": null,
"published_date": "10 June 2026, 7:44pm",
"description_summary": "This is a UK6 notice for B329/26 - Provision of Portable Appliance Equipment Testing."
}
],
"total_results": 279836
},
"status": "success"
}
}About the Gov API
Searching and Filtering Notices
The search_notices endpoint accepts keyword queries alongside filters for statuses (planning, tender, contract, pipeline, award, termination), notice_types, and a contract value range via min_value and max_value. Results are paginated using the page parameter and return an array of summary objects — each carrying id, title, url, organisation, notice_type, contract_value, location, and published_date — plus a total_results count for determining page depth.
Notice Detail and OCDS Records
get_notice_detail accepts a notice_id in NNNNNN-YYYY format and returns a full OCDS release package: a releases array with parties, tender, awards, and contracts sub-objects; a publisher object carrying name, scheme, uid, and uri; and the publishedDate ISO datetime. For tracking the complete procurement lifecycle across multiple releases, get_notice_ocds_record returns an OCDS record package with compiledRelease and versionedRelease fields alongside all related release objects.
Bulk Extraction and CPV Codes
get_ocds_release_packages supports bulk retrieval of notices with cursor-based pagination — pass the cursor value from links.next to walk through large result sets — and accepts updated_from / updated_to ISO datetime filters to scope results to a time window. The browse_cpv_codes endpoint returns top-level Common Procurement Vocabulary codes, each with a code string, a description, and a has_children boolean indicating whether subcategories exist under that classification.
The Gov API is a managed, monitored endpoint for tenders.gov.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when tenders.gov.uk changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official tenders.gov.uk API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor new tender opportunities matching specific CPV categories or keyword terms
- Track the full procurement lifecycle of a contract using OCDS versioned release data
- Bulk-export recent notices by date range for competitive intelligence or compliance reporting
- Filter active tenders by contract value range to surface opportunities within budget thresholds
- Map procurement spend by organisation using
organisationandcontract_valuefields from search results - Integrate tender award data into CRM pipelines to identify awarded contracts and winning suppliers
- Build CPV-code taxonomies for categorising procurement data in analytics dashboards
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Find a Tender have an official developer API?+
What does `get_ocds_release_packages` return and how does pagination work?+
links object containing a next cursor URL. Pass that cursor value as the cursor parameter in your next call to retrieve the following page. The updated_from and updated_to parameters accept ISO-format datetimes so you can scope bulk pulls to a specific window.Does the API return sub-level CPV codes, not just top-level entries?+
browse_cpv_codes returns only top-level CPV codes. Each entry includes a has_children boolean flagging whether subcategories exist, but drilling into child codes is not exposed as a separate endpoint. You can fork this API on Parse and revise it to add a child-code lookup endpoint for any parent CPV code.Can I filter search results by a specific buying organisation or region?+
search_notices endpoint currently supports filtering by status, notice type, and contract value range. Organisation-level or region-level filtering parameters are not directly exposed. You can fork the API on Parse and revise it to add those filter parameters if your use case requires narrowing by buyer or geography.How fresh is the notice data returned by the search and detail endpoints?+
get_ocds_release_packages endpoint includes updated_from and updated_to filters, which lets you pull only notices updated within a specific time window. Individual notice freshness depends on when the contracting authority publishes or amends a record on Find a Tender.