# Tender Match

A UK business → the live public-sector contracts that fit what it does.

Reads what a business does, scans open Contracts Finder notices, and returns the matches with a fit score and the reason for each.

The public sector spends billions a year with outside suppliers and wants more of it with small firms, but finding the right notice means reading hundreds a week on Contracts Finder. This endpoint does the reading: give it a business (name or website) and it reads what the business actually does, scans the open notices published in the last week (or up to 30 days), and returns the ones that fit, each with a fit score and a one-line reason.

- Price: 3 credits
- Page: https://meetkatalis.com/apis/tender-match
- OpenAPI: https://meetkatalis.com/openapi.yaml

## Endpoints

- `GET /api/v1/tender-match?q=…` — A business name or website; optional &days=1–30 (default 7)

## Call it

```bash
curl -H "x-api-key: $KATALIS_API_KEY" \
  "https://meetkatalis.com/api/v1/tender-match?q=softcat.com"
```

```javascript
const res = await fetch("https://meetkatalis.com/api/v1/tender-match?q=softcat.com", {
  headers: { "x-api-key": process.env.KATALIS_API_KEY },
});
if (!res.ok) throw new Error(`Katalis ${res.status}: ${await res.text()}`);
console.log(await res.json());
```

```python
import os, requests

r = requests.get(
    "https://meetkatalis.com/api/v1/tender-match?q=softcat.com",
    headers={"x-api-key": os.environ["KATALIS_API_KEY"]},
    timeout=60,
)
r.raise_for_status()
print(r.json())
```

## Example response (a real reply)

```json
{
  "business": { "name": "SOFTCAT PLC", "website": "softcat.com", "whatTheyDo": "Leading UK IT solutions provider offering services in Cyber Security, Hybrid Platforms, Networking/Connectivity and Data, Automation & AI.", "companyNumber": "02174990" },
  "days": 7,
  "scanned": 33,
  "matches": [
    { "cpv": "IT services: consulting, software development, Internet and support", "url": "https://www.contractsfinder.service.gov.uk/Notice/49e986f0-e867-4d68-8b8c-d9120e633d16", "buyer": "London Borough of Brent", "title": "Adobe Licenses for the London Borough of Lewisham", "value": "£55,000", "deadline": "2026-11-13T12:00:00Z", "smeSuitable": true, "fit": 80, "why": "They need software licensing, you provide IT solutions including licensing." },
    { "cpv": "Financial consultancy, financial transaction processing and clearing-house services", "url": "https://www.contractsfinder.service.gov.uk/Notice/5f4d9841-b30a-42bb-b122-3f7758606443", "buyer": "Ryde Town Council", "title": "GDPR Data Audit", "deadline": "2026-10-26T12:00:00Z", "smeSuitable": true, "fit": 70, "why": "They need a data audit, you offer advisory services in data compliance." }
  ]
}
```

## What you'd build with it

- **Bid consultancies.** Run every client through it each Monday; the fit reasons become the shortlist email.
- **CRMs and trade bodies.** Show members the live tenders that match them, inside the tools they already use.
- **Sales teams selling to suppliers.** Find which prospects are chasing public work right now.

## Why this one

- **Reads the business first.** Matches against what the business actually does (from its own website), not keywords typed into a search box.
- **Open notices only.** Contracts Finder and Find a Tender notices still open for bids, deduplicated, with ones closing within two days left out.
- **A reason with every match.** Each fit comes with one line of why, so a person can decide in seconds.
- **The engine behind Tender Radar.** The same matching our free tool and members' watch use every week.

## Conventions

- Auth: `x-api-key: kat_live_…` on every request (free key at https://meetkatalis.com/developers: a verified email and mobile, 100 credits a month, no card).
- One credit balance across every API; each endpoint's price is on its page and in `x-credits` in https://meetkatalis.com/openapi.yaml.
- Keys are camelCase everywhere. A registered company is `company: { name, number, status, statusDetail?, filingsOverdue? }` on the register endpoints; the enrichment family (enrich, score, assess, brand-kit, ai-visibility, tender-match) keeps `business` / `profile` with `companyNumber`.
- Every error has `code` and `requestId`; every reply an `x-request-id` header; a charged reply `x-credits-remaining`; a reply that gave credits back `x-credits-refunded`. Missing = 404 with `query`.
- Burst ceiling 60 requests a minute per key (429, `Retry-After`, no credits used). A failure on our side (5xx) gives the call's credits back.
- Company data contains public sector information licensed under the Open Government Licence v3.0.

Provided "as is"; results come from public sources and, in places, AI, and may be inaccurate or out of date; not legal, professional or credit advice. Terms: https://meetkatalis.com/apis/terms