<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[UK Tender Check]]></title><description><![CDATA[UK Tender Check]]></description><link>https://uktendercheck.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>UK Tender Check</title><link>https://uktendercheck.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 05:42:50 GMT</lastBuildDate><atom:link href="https://uktendercheck.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Designing a tender-fit API that says “unknown” when the source is silent]]></title><description><![CDATA[Public-data APIs often look precise before you ask what each field can prove. A procurement notice can have a title, buyer, value, classifications, dates, location, and a long description. That is eno]]></description><link>https://uktendercheck.hashnode.dev/designing-a-tender-fit-api-that-says-unknown-when-the-source-is-silent</link><guid isPermaLink="true">https://uktendercheck.hashnode.dev/designing-a-tender-fit-api-that-says-unknown-when-the-source-is-silent</guid><category><![CDATA[api]]></category><category><![CDATA[OpenApi]]></category><category><![CDATA[data]]></category><category><![CDATA[API Design]]></category><dc:creator><![CDATA[UK Tender Check]]></dc:creator><pubDate>Sat, 15 Aug 2026 01:54:26 GMT</pubDate><content:encoded><![CDATA[<p>Public-data APIs often look precise before you ask what each field can prove. A procurement notice can have a title, buyer, value, classifications, dates, location, and a long description. That is enough to build a useful search. It is not automatically enough to decide whether a particular supplier is eligible or likely to win.</p>
<p>That difference shaped the API behind UK Tender Check. The product searches notices indexed from official UK procurement sources, then lets a supplier compare a selected notice with facts it provides. The output is a decision-support checklist, not an eligibility decision. This article describes the design choices that make that boundary visible.</p>
<h2>1. Preserve provenance as product data</h2>
<p>A source URL should not be a footnote added after ranking or scoring. It should travel with the tender record. At minimum, the client needs the source system, source notice identifier, official URL, retrieval context, and the fields as they were available to the application.</p>
<p>That lets the interface offer two equally important actions: continue the product workflow, or open the official notice. The second is not a failed conversion. It is how the user verifies what the software is summarising.</p>
<p>Provenance also changes error handling. If the source identifier is unknown, return a real not-found result. If a known record lacks a value or deadline, preserve the record and return the field as missing. Redirecting both cases to a generic result page would erase useful distinctions.</p>
<h2>2. Model “unknown” separately from “does not match”</h2>
<p>Suppose a supplier profile says the company holds Cyber Essentials, but a notice record contains no accessible security requirement. The API must not say the company fails the requirement. It must also not say the company satisfies it. The supportable answer is that the observable record does not provide enough evidence for that check.</p>
<p>A fit response therefore needs more than a total score. It should expose:</p>
<ul>
<li>the profile fact used;</li>
<li>the notice evidence used;</li>
<li>the rule or comparison that ran;</li>
<li>the result of that comparison;</li>
<li>missing information and follow-up questions;</li>
<li>confidence or evidence quality where defined;</li>
<li>the scoring-rule version.</li>
</ul>
<p>This structure makes a “fit” result auditable. It also lets the UI distinguish a mismatch from a question the supplier must verify in the procurement documents.</p>
<h2>3. Keep supplied facts separate from inferred facts</h2>
<p>A public tender record describes an opportunity. It does not prove a supplier’s turnover, certifications, delivery regions, references, capacity, or conflicts. Those facts should come from the supplier or an explicitly authorised source.</p>
<p>The API input makes that separation visible: a <code>profile</code> contains supplier-provided capabilities, regions, and evidence, while a <code>tender</code> identifies the source notice. The service can compare the two without pretending it independently verified the private company data.</p>
<p>The production OpenAPI document is available at <code>https://uktendercheck.co.uk/openapi.json</code>. Before copying an example into another system, check the current schema rather than relying on this article: API fields can evolve, while the provenance boundary should remain stable.</p>
<h2>4. Version deterministic rules</h2>
<p>“Deterministic” does not mean permanent. A scoring rule can change after a bug fix, a better field mapping, or a clearer product policy. If the response includes a rule version, a user can tell whether two reports were produced under the same logic.</p>
<p>Versioning is also useful for support. A report can be discussed in terms of its source record and rule version rather than a screenshot of an unexplained number.</p>
<h2>5. Make the limitation part of the interface</h2>
<p>The most important copy in a scoring product may be the sentence explaining what the score is not. For UK Tender Check, the result is not legal or procurement advice, a definitive eligibility/compliance determination, bid-writing output, or an award prediction. Users must review the official notice and procurement documents.</p>
<p>This is not a disclaimer pasted over an otherwise overconfident product. The API shape, source link, missing-field behaviour, and rule metadata should all support the same boundary.</p>
<h2>A developer path</h2>
<p>After production verification, developers can inspect the OpenAPI document, use the Postman collection, or connect through MCP. A typical Bearer-authenticated tender search uses:</p>
<pre><code class="language-http">GET https://uktendercheck.co.uk/api/v1/tenders?q=software&amp;source=all&amp;limit=10
Authorization: Bearer &lt;YOUR_API_KEY&gt;
</code></pre>
<p>The fit endpoint is:</p>
<pre><code class="language-http">POST https://uktendercheck.co.uk/api/v1/fit
Authorization: Bearer &lt;YOUR_API_KEY&gt;
Content-Type: application/json
</code></pre>
<p>Use the live OpenAPI schema for the request body and current response. Do not put an API key, session cookie, customer record, or wallet proof into an article, public collection, issue, or code sample.</p>
<h2>Closing question</h2>
<p>The broader design lesson is simple: incomplete public data does not become complete because an API returns a number. A useful decision-support system preserves the source, represents the unknown, and explains the rule it applied.</p>
<p>If you build ranking or fit systems over sparse data, what information do you retain so a user can reconstruct why a result appeared?</p>
<p><strong>Disclosure:</strong> UK Tender Check publishes this article about its own API. AI-assisted editorial drafting was reviewed and fact-checked before publication. Product: <a href="https://uktendercheck.co.uk/developers?utm_source=hashnode&amp;utm_medium=developer&amp;utm_campaign=organic_launch_2026&amp;utm_content=unknown_data_article">UK Tender Check developer documentation</a>.</p>
]]></content:encoded></item></channel></rss>