POST /api/findatender/tenders/search
Price: 20 credits
Search Find a Tender notices of one kind — opportunities (pipelines, market engagements, planned procurements and live tenders), awarded contracts, or commercial tools (frameworks and dynamic markets) — by keyword, status, contracting authority, supplier suitability, CPV code, value and date range, with the buyer, supplier, value, key dates, CPV codes and delivery location of each notice.
Pick kind first: opportunity for anything not yet awarded, contract for awarded contracts with a supplier, commercial_tool for frameworks and dynamic markets, which come back one row per lot. Each kind accepts its own statuses, sorts and filters, so a filter from another kind returns 422. Use the ocid of a result to fetch its full OCDS record from findatender/tenders.
access-token string requiredtimeout integer — Max scrapping execution timeout (in seconds) (default: 300; min: 20; max: 1500)kind string required — Notice kind to search (one of: "opportunity", "contract", "commercial_tool")count integer required — Max number of results (min: 1; max: 1000)keyword string nullable — Full-text keyword (examples: "software"; minLength: 1)status array nullable — Notice statuses to include (one of: "pipeline", "pre_market_engagement", "planned", "tender", "active", "terminated", "upcoming", "closed"; minItems: 1)authority_name string nullable — Contracting authority name (examples: "Ministry of Defence"; minLength: 1)authority_type array nullable — Contracting authority types (one of: "central_government", "sub_central_government", "public_undertaking", "private_utility", "other"; minItems: 1)suitability array nullable — Supplier kinds the notice is marked suitable for (one of: "sme", "vcse")cpv string nullable — CPV code, eight digits; 48000000 matches every code of the 48 division (examples: "48000000", "72200000"; minLength: 1)value_min number nullable — Minimum total value in GBP (examples: 100000; min: 0)value_max number nullable — Maximum total value in GBP (examples: 5000000; min: 0)date_from string nullable — Earliest contract end date, inclusive (examples: "2026-01-01")date_to string nullable — Latest contract end date, inclusive (examples: "2026-06-30")tool_type array nullable — Commercial tool kinds (one of: "pa23_framework", "pcr15_framework", "pa23_dynamic_purchasing_system", "pa23_utilities_dynamic_purchasing_system", "pcr15_dynamic_purchasing_system"; minItems: 1)is_open_to_other_authorities boolean nullable — Whether other contracting authorities may use the toolsort string nullable — Result order (one of: "relevance", "newest", "oldest", "value_ascending", "value_descending", "end_date_ascending", "end_date_descending", "date_signed_ascending", "date_signed_descending", "title_ascending", "title_descending", "status_ascending", "status_descending", "tool_type_ascending", "tool_type_descending")@type string (default: "FindatenderTenderSummary")id string requiredocid string nullablekind string required (one of: "opportunity", "contract", "commercial_tool")lot_id string nullablelot_title string nullabledescription string nullablestatus string nullablestage string nullablebuyer object nullable@type string (default: "FindatenderPartyRef")id string nullablename string nullableauthority_type string nullable (one of: "central_government", "sub_central_government", "public_undertaking", "private_utility", "other")suppliers array (default: [])@type string (default: "FindatenderPartyRef")id string nullablename string nullableauthority_type string nullable (one of: "central_government", "sub_central_government", "public_undertaking", "private_utility", "other")value object nullable@type string (default: "FindatenderValue")amount number nullableamount_gross number nullablecurrency string nullabledates object nullable@type string (default: "FindatenderSummaryDates")deadline_date string nullableengagement_deadline_date string nullableestimated_publication_date string nullablestart_date string nullableend_date string nullablecpv array (default: [])@type string (default: "FindatenderClassification")scheme string nullablecode string nullabledescription string nullablecpv_hidden_count integer nullabledelivery_location string nullableis_sme_suitable boolean nullableis_vcse_suitable boolean nullabletool_type string nullableis_open_to_other_authorities boolean nullablecountry string (default: "GB")url string required422 — A filter, status or sort was passed for a notice kind that does not support it Check the fields against this schema. A URN with the wrong prefix is the most common cause.408 — The request ran past its time limit Raise `timeout` in the request body, up to the maximum this endpoint documents. Lowering `count` or turning off the `with_*` flags also helps, because less work finishes sooner.412 — The entity was not found, or a precondition failed Retrying will not help: either the entity does not exist, or the input points at a different one.429 — Too many requests: a rate limit or a usage window is exhausted When the response carries an X-Retry-After header, wait that many seconds and retry: the same number is in the body as `detail.retry_after`, and the limit clears once that window passes. The message in the body names the limit that was hit.500 — Something broke on our side Retrying will not help. If it keeps happening, send us the X-Request-ID from the response headers.529 — Rate limit reached, or the endpoint is overloaded Wait at least 30 seconds, then retry.X-Error — Error message text (present only on error)X-Request-ID — Unique request identifierX-Execution-Time — Execution time in secondsX-Result-Count — How many records the body carries. 0 means an empty result, which is a normal answer and not by itself an error. A non-zero count can come back together with X-Error when the failure happened partway through — read this header and X-Error independently.X-Total-Available-Results — How many records exist for this query, when the endpoint can say. On a `dry_run` request this is the answer and the body is empty. It saturates: the endpoint's documented maximum means 'at least that many', any smaller number is exact.X-Warning — Present when the request body carried keys this endpoint does not document. They were ignored, so any filter you meant to apply through them did not apply. Check the spelling against this schema and retry.X-Retry-After — Seconds to wait before retrying. Present only on 429.