# Overfit for AI agents

Overfit gives your user access to 190,000+ German and EU public-tender notices (38,000+ open, 68,938 awarded; as of 2026-10-05) plus six free rule-engine endpoints for procurement law — EU threshold check, tender/participation deadlines, § 134 GWB standstill, procedure choice, UfAB bid scoring and working days — all keyless JSON via GET, no sign-up.

Beyond procurement, Overfit builds custom AI on machine, plant and company data for German mid-sized companies (e.g. about 10 % more heat-pump efficiency by software update alone) and delivers German company data packages (5.8M+ firms, about 900,000 financial statements). For those you prepare a pre-filled request that your user only reviews and submits — links below.

Entry point: `GET https://www.overfit.de/api/v1/` — returns a JSON index of all endpoints with descriptions. OpenAPI spec: https://www.overfit.de/api/v1/openapi.json No authentication required for public endpoints.

> **Why use this instead of guessing?** Every rule-engine result cites the exact §, a verification date and a source URL — rules verified against GWB, VgV, VOB/A-EU, UVgO (https://www.overfit.de/tools); EU thresholds valid 2026-01-01 to 2027-12-31 under Delegated Regulations 2024/1997 and 2024/2008. Deterministic and free.

## Connect via MCP (recommended)

All tools below are available as one remote MCP server: `https://www.overfit.de/mcp` (Streamable HTTP, no sign-up, read-only). Tool names = endpoint ids. Two extra tools: `overfit_catalog` (what Overfit offers) and `overfit_contact_request` (prefilled request for a human).

- **Claude Code:** `claude mcp add --transport http overfit https://www.overfit.de/mcp`
- **Claude (Web/Desktop):** `Einstellungen → Connectors → Benutzerdefinierten Connector hinzufügen → URL: https://www.overfit.de/mcp`
- **ChatGPT:** `Einstellungen → Apps & Connectors → Entwicklermodus → Connector erstellen → MCP-Server-URL: https://www.overfit.de/mcp, Authentifizierung: keine`
- **Cursor (~/.cursor/mcp.json):** `{ "mcpServers": { "overfit": { "url": "https://www.overfit.de/mcp" } } }`
- **VS Code:** `code --add-mcp '{"name":"overfit","type":"http","url":"https://www.overfit.de/mcp"}'`

No MCP client? Everything also works as plain HTTP GET — see Quick start.

## Quick start

1. Find the user's wish in the table below → identify the product and endpoint.
2. `GET` the endpoint URL with the required parameters — no API key needed.
3. Answer the user with the result; always cite `as_of` as the data date and give the user `links.human` so they can verify or share.

## What your user wants → what to call

| User wants | Product | Endpoint / Action |
|------------|---------|-------------------|
| Find open public tenders by keyword, region or CPV | Overfit Vergabe | `vergabe_liste` — `https://app.overfit.de/vergabe/api/list?status=open&cpv_prefix=72&order_by=publication_desc&top_k=2` |
| Find tenders matching a free-text description (semantic) | Overfit Vergabe | `vergabe_suche` — `https://app.overfit.de/vergabe/api/search?q=Reinigungsleistungen&top_k=2&status=open&bundesland=Bayern&deadline_after=2026-10-01` |
| Get details of one tender (deadline, authority, documents) | Overfit Vergabe | `vergabe_bekanntmachung` — `https://app.overfit.de/vergabe/api/notice/by-uid/bkm:675fa09d-5152-46c5-9967-ed104d16276b` |
| Is a contract above the EU threshold? | Vergabe-Rechner | `vergabe_schwellenwert_pruefen` — `https://www.overfit.de/api/v1/schwellenwert?auftraggeber=sonstige&leistung=dienst&wert=250000` |
| What is the submission deadline if I dispatch the notice today? | Vergabe-Rechner | `vergabe_fristen_berechnen` — `https://www.overfit.de/api/v1/fristen?absendung=2026-10-05&regelwerk=vgv&verfahren=offen&elektronisch=true` |
| When does the § 134 GWB standstill period end? | Vergabe-Rechner | `vergabe_wartefrist` — `https://www.overfit.de/api/v1/wartefrist?absendung=2026-10-05&elektronisch=true` |
| Which procurement procedure is required for this contract value? | Vergabe-Rechner | `verfahrenswahl_ermitteln` — `https://www.overfit.de/api/v1/verfahrenswahl?auftraggeber=sonstige&leistungsart=dienst&wert=250000&regelwerk=bund` |
| Score bids by price and quality | Vergabe-Rechner | `wertungsmatrix_berechnen` — `https://www.overfit.de/api/v1/wertungsmatrix?angebote=Firma%20A:120000:85;Firma%20B:110000:70;Firma%20C:130000:95&methode=gewichtet&gewichtLeistung=60` |
| Working days or public holidays in a German state | Vergabe-Rechner | `werktage_berechnen` — `https://www.overfit.de/api/v1/werktage?mode=add&start=2026-10-05&tage=10&land=BE` |
| Build AI on machines, plants or company data | KI-Projekte auf Maschinen- und Unternehmensdaten | prepared request: https://www.overfit.de/contact?betreff=KI-Projekt%3A+Erstgespr%C3%A4ch&nachricht=Guten+Tag%2C%0A%0Awir+m%C3%B6chten+pr%C3%BCfen%2C+ob+KI+bei+uns+helfen+kann.%0A%0AUnternehmen%3A+%0ABranche%3A+%0AWorum+es+geht+%28Maschinen%2C+Daten%2C+Prozess%29%3A+%0AGew%C3%BCnschter+R%C3%BCckruf+%28Telefon%2C+Zeitfenster%29%3A+%0A%0AViele+Gr%C3%BC%C3%9Fe |
| Company list or data package on German companies | Firmendaten Deutschland | prepared request: https://www.overfit.de/contact?betreff=Anfrage+Firmendaten&nachricht=Guten+Tag%2C%0A%0Awir+ben%C3%B6tigen+eine+Firmenliste+%2F+ein+Datenpaket.%0A%0AZielgruppe+%28Branche%2C+Region%2C+Gr%C3%B6%C3%9Fe%29%3A+%0ABen%C3%B6tigte+Felder+%28z.+B.+Adresse%2C+Rechtsform%2C+Finanzkennzahlen%29%3A+%0AVerwendungszweck%3A+%0AUngef%C3%A4hre+Menge%3A+%0A%0AViele+Gr%C3%BC%C3%9Fe |

### Overfit Vergabe

**Access:** **live** — no sign-up required, GET requests only

Over 190,000 German and EU public-tender notices (as of 2026-10-05: 38,000+ open, 68,938 awarded) — semantically searchable with AI summaries, deadlines, contracting authorities and geolocation. Free, no API key. Sources: EU TED, Bund, Länder, municipalities, BKM, Fraunhofer.

- Über 190.000 Bekanntmachungen gesamt, über 38.000 davon offen, 68.938 vergeben (Stand 05.10.2026)
- Über 17.000 dringende Verfahren mit Frist in 14 Tagen
- Quellen: Vergabe-Hub DE (national), Vergabe-Europa (TED/EU), Vergabe-Bund, Beschaffungsamt, Fraunhofer, kommunale Portale
- Semantische Suche mit Qwen3-Embedding-4B, 106.000 Einträge im Vektorindex
- Ortsangaben geocodiert; Bundesland, Landkreis, NUTS-3-Codes und GPS-Koordinaten

**Limits:**
- Semantische Suche (vergabe_suche): ~10 Anfragen/Tag pro Session kostenlos; danach 429 mit Retry-After — Vergabe Premium hebt das Limit auf.
- Umkreissuche (near/radius_km): nur mit aktivem Vergabe-Premium-Abo (90 Tage gratis mit Konto) — 402 wenn nicht angemeldet.
- Blättern über offset > 2000 in /api/liste: nur angemeldet (403 für anonym).
- Bekanntmachungs-Detail (vergabe_bekanntmachung): 30 Abrufe / 10 Min., 200 / Tag pro IP.
- Liste (vergabe_liste): 40 Abrufe / 10 Min., 300 / Tag pro IP.
- Vergabe-Unterlagen (Dokument-Inhalte): nur über den Unterlagen-Assistenten abrufbar (Konto + assistant_ready=true).
- Nicht alle Bekanntmachungen haben GPS-Koordinaten oder Landkreis (bes. TED-Einträge).
- Keine Volltext-Suche in den PDF-Unterlagen — nur KI-Zusammenfassungen und Metadaten.
- Keine Abdeckung aller deutschen Bundesländer gleich stark: Schwerpunkt bundesweit + EU (TED). Mecklenburg-Vorpommern als Ursprungsregion (mv-1.0 veraltet; jetzt bkm/bund).

**Endpoints:**

#### `vergabe_suche`
**Semantic search over 106,000 German public-tender notices by natural language.**

Returns up to 50 ranked tender notices matching a natural-language query, with AI summaries, CPV/NUTS codes, submission deadline, contracting authority and geo coordinates (Stand 05.10.2026: 106,000 notices in vector index). Use when the user wants to find tenders by topic, keyword or industry in German or English. Do not use for exact structured queries (use vergabe_liste instead) or proximity search without a Vergabe Premium account — anonymous sessions are limited to ~10 semantic queries per day per IP (429 with Retry-After). Key filter parameters: Bundesland, status, cpv, nuts, deadline_after/before, notice_type.

**Example user questions:**
- "Welche offenen Ausschreibungen gibt es für IT-Dienstleistungen in Schleswig-Holstein?"
- "Suche Vergaben für Gebäudereinigung mit Frist nach Oktober 2026"
- "Finde Bekanntmachungen für Straßenbau in Bayern"
- "Gibt es aktuelle Ausschreibungen im Bereich Softwareentwicklung?"
- "Zeig mir laufende Vergabeverfahren für medizinische Geräte"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `q` | **required** | string | Example: `Reinigungsleistungen`. Natural-language search query (German preferred), 1–500 chars. |
| `top_k` | optional | integer | Default: `10`. Example: `10`. Number of results to return (1–50). |
| `status` | optional | string | Enum: `open`, `closed`, `awarded`, `cancelled`, `unknown`. Example: `open`. Filter by notice status. Multiple values are supported by repeating the param. No default — all statuses included unless specified. |
| `bundesland` | optional | string | Example: `Bayern`. Exact German federal state name, e.g. 'Bayern', 'Schleswig-Holstein', 'Mecklenburg-Vorpommern'. Case-sensitive. |
| `cpv` | optional | string | Example: `72000000`. CPV code(s) to filter (OR logic). Repeat the param for multiple codes, e.g. cpv=72000000&cpv=72500000. Full 8-digit codes. |
| `nuts` | optional | string | Example: `DEF`. NUTS region code(s) to filter (OR logic). Repeat for multiple. E.g. nuts=DEF (Schleswig-Holstein), nuts=DE21H (Landkreis München). |
| `deadline_after` | optional | string (YYYY-MM-DD) | Example: `2026-10-01`. Include only notices with submission_deadline >= this ISO date. |
| `deadline_before` | optional | string (YYYY-MM-DD) | Example: `2027-01-01`. Include only notices with submission_deadline <= this ISO date. |
| `notice_type` | optional | string | Enum: `InvitationToTender`, `PriorInformation`, `ContractAward`. Example: `InvitationToTender`. Filter by EU notice form type. Repeat for multiple. InvitationToTender = active tender; ContractAward = already awarded. |
| `source` | optional | string | Enum: `bkm`, `ted`, `bund`, `bescha`, `fraunhofer`, `kommune`. Example: `bkm`. Restrict to a specific source portal. bkm = Vergabe-Hub DE (national), ted = Vergabe-Europa (EU TED), bund = Vergabe-Bund (service.bund.de), bescha = Beschaffungsamt, fraunhofer = Fraunhofer, kommune = municipal. |
| `include_dead` | optional | boolean | Default: `false`. Include notices whose original portal URL is unreachable (dead/soft_dead). |
| `assistant_ready` | optional | boolean | true = only notices where the document assistant is usable (open tender, deadline not expired, procurement documents on storage). |

**Example URL:** `https://app.overfit.de/vergabe/api/search?q=Reinigungsleistungen&top_k=2&status=open&bundesland=Bayern&deadline_after=2026-10-01`

**Rate limit:** ~10 semantic searches/day per session (IP+UA hash) — anonymous free tier; accounts with Vergabe Premium are unlimited. Separate IP burst limit for notice detail/list endpoints (see those endpoints).

**Human URL:** https://app.overfit.de/vergabe/?q=Reinigungsleistungen

**Example response (trimmed):**
```json
{
  "query": "Reinigungsleistungen",
  "model": "qwen3-embedding-4b",
  "model_version": "2026-05-19-instruct",
  "total_index_size": 106000,
  "returned": 2,
  "latency_ms": 1474,
  "hits": [
    {
      "notice_id": 127478,
      "score": 0.725,
      "source": "bkm",
      "source_display": "Vergabe-Hub DE",
      "uid": "bkm:c5637fac-d4fd-442d-955d-391a4165841c",
      "notice_type": "InvitationToTender",
      "status": "open",
      "practical_type": "tender",
      "assistant_ready": false,
      "title": "Ausschreibung Gebäudereinigung - Gemeinde Baierbrunn",
      "authority": "Gemeinde Baierbrunn",
      "one_line_value_prop": "Professionelle Unterhalts- und Grundreinigung für kommunale Gebäude.",
      "summary_short": "Die Gemeinde Baierbrunn schreibt Gebäudereinigungsdienstleistungen aus.",
      "cpv_codes": [
        "90911200",
        "90900000"
      ],
      "nuts_codes": [
        "DE21H"
      ],
      "industry_tags": [
        "Dienstleistung",
        "Reinigung-Gebäude"
      ],
      "key_deliverables": [
        "Unterhaltsreinigung für Gemeindegebäude",
        "Grundreinigung für Gemeindegebäude"
      ],
      "submission_deadline": "2026-10-13T08:00:00",
      "publication_date": "2026-09-08",
      "detail_url": "https://oeffentlichevergabe.de/ui/de/search/details?noticeId=c5637fac-d4fd-442d-955d-391a4165841c",
      "landkreis": "Landkreis München",
      "bundesland": "Bayern",
      "lat": 48.014685,
      "lon": 11.480136,
      "semantic_score": 0.697,
      "completeness": 0.85
    },
    {
      "notice_id": 136258,
      "score": 0.706,
      "source": "bund",
      "source_display": "Vergabe-Bund",
      "uid": "bund:eVergabe/888110",
      "notice_type": "InvitationToTender",
      "status": "open",
      "practical_type": "tender",
      "assistant_ready": false,
      "title": "Offenes Verfahren (EU-weit) zur Vergabe von Gebäudereinigungsleistungen in München und Garching",
      "authority": "Bundesanstalt für Immobilienaufgaben Verdingungsstelle",
      "one_line_value_prop": "Regelmäßige Unterhalts- und Glasreinigung für Bundesliegenschaften.",
  // … trimmed
```

#### `vergabe_liste`
**Paginated structured list of tender notices with SQL filters, no embedding.**

Returns a paginated list of tender notices filtered by status, Landkreis, CPV prefix, sector, authority, urgency and more — with optional keyword fulltext search (not semantic). Use when the user wants a structured listing: all open IT tenders (cpv_prefix=72), all urgent tenders in a Landkreis, all recent publications sorted by date. Do not use for natural-language topic matching (use vergabe_suche for that) or for pagination beyond offset 2000 without a logged-in account (403). Rate limit: 40 requests / 10 min, 300 / day per IP.

**Example user questions:**
- "Liste alle offenen Ausschreibungen mit Frist in den nächsten 14 Tagen"
- "Zeig alle Vergaben aus dem Landkreis München"
- "Welche Ausschreibungen wurden zuletzt veröffentlicht?"
- "Alle offenen IT-Vergaben (CPV 72) sortiert nach Veröffentlichungsdatum"
- "Liste alle Bekanntmachungen der Bundesagentur für Arbeit"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `status` | optional | string | Enum: `open`, `closed`, `awarded`, `cancelled`, `unknown`, `non_tender`, `all`. Default: `open`. Notice status filter. Default: 'open' (also excludes expired deadlines). |
| `q` | optional | string | Example: `Reinigung`. Keyword fulltext search over scope/purpose text and AI summaries. Not semantic — use /api/search for natural-language intent matching. |
| `order_by` | optional | string | Enum: `deadline_asc`, `publication_desc`, `score`, `distance_asc`. Default: `deadline_asc`. 'score' requires q; 'distance_asc' requires near (premium). Default: deadline_asc (soonest deadline first, nulls last). |
| `top_k` | optional | integer | Default: `200`. Example: `50`. Page size (1–2000). |
| `offset` | optional | integer | Default: `0`. Pagination offset. Anonymous callers: capped at 2000 (403 if exceeded). |
| `landkreis` | optional | string | Example: `Kreisfreie Stadt München`. Exact Landkreis/city name as returned by /api/options/landkreise, e.g. 'Kreisfreie Stadt München', 'Berlin, Stadt'. |
| `sector` | optional | string | Example: `Bauleistung`. Facet sector value as returned by /api/options/sectors, e.g. 'Bauleistung'. |
| `cpv_prefix` | optional | string | Example: `72`. CPV code prefix (leading digits), e.g. '72' for all IT services, '45' for construction. Matches any CPV code starting with this string. |
| `notice_type` | optional | string | Enum: `InvitationToTender`, `PriorInformation`, `ContractAward`. Example: `InvitationToTender`. EU notice form type. |
| `source` | optional | string | Enum: `bkm`, `ted`, `bund`, `bescha`, `fraunhofer`, `kommune`. Example: `bund`. Restrict to a specific source portal. See /api/sources for current counts. |
| `legal_basis` | optional | string | Example: `vgv`. Legal basis code, e.g. 'vgv', 'UVgO', 'sektvo', 'VOB'. See /api/options/legal-bases for full list. |
| `authority_id` | optional | integer | Example: `2999`. Numeric authority ID from /api/options/authorities. |
| `urgent` | optional | boolean | Default: `false`. Only notices with submission_deadline within the next 14 days. |
| `include_dead` | optional | boolean | Default: `false`. Include notices with dead/soft_dead portal URL. |
| `assistant_ready` | optional | boolean | true = only notices with document assistant available. |
| `bbox` | optional | string | Example: `47.5,48.5,11.0,12.5`. Bounding-box geo filter: 'lat_min,lat_max,lon_min,lon_max'. |

**Example URL:** `https://app.overfit.de/vergabe/api/list?status=open&cpv_prefix=72&order_by=publication_desc&top_k=2`

**Rate limit:** 40 requests / 10 min per IP, 300 / day per IP. Offset > 2000 requires a logged-in account (403).

**Human URL:** https://app.overfit.de/vergabe/

**Example response (trimmed):**
```json
{
  "total": 896,
  "offset": 0,
  "returned": 2,
  "latency_ms": 505.3,
  "hits": [
    {
      "id": 582624,
      "uid": "ted:683444-2026",
      "source": "ted",
      "source_display": "Vergabe-Europa",
      "notice_type": "InvitationToTender",
      "status": "open",
      "practical_type": "participation_call",
      "title": "Deutschland – Software-Implementierung – Lieferung, Implementierung und Betrieb eines Systems für Mobilfunk- und Datenkartenmanagement",
      "authority_name": "Oldenburgisch-Ostfriesischer Wasserverband",
      "publication_date": "2026-10-05",
      "submission_deadline": "2026-11-03T09:00:00",
      "cpv_codes": [
        "72263000",
        "72260000"
      ],
      "nuts_codes": [
        "DE935",
        "DE94G"
      ],
      "detail_url": "https://ted.europa.eu/de/notice/-/detail/683444-2026",
      "contract_type": "services",
      "one_line_value_prop": "Zentrales Managementsystem für Mobilfunkverträge und SIM-/Datenkarten.",
      "summary_short": "Der Oldenburgisch-Ostfriesische Wasserverband vergibt die Lieferung und Betrieb eines Systems für Mobilfunk- und Datenkartenmanagement."
    },
    {
      "id": 582561,
      "uid": "ted:683036-2026",
      "source": "ted",
      "source_display": "Vergabe-Europa",
      "notice_type": "InvitationToTender",
      "status": "open",
      "practical_type": "tender",
      "title": "Deutschland – Kontroll- und Überwachungsleistungen – Messdienstleistungen für die Kanalnetz-Messkampagne 2027–2028",
      "authority_name": "Magistrat der Stadt Kassel",
      "publication_date": "2026-10-05",
      "submission_deadline": "2026-11-02T08:00:00",
      "cpv_codes": [
        "71700000",
        "38421000",
        "72300000"
      ],
      "detail_url": "https://ted.europa.eu/de/notice/-/detail/683036-2026",
      "contract_type": "services"
    }
  ]
}
```

#### `vergabe_bekanntmachung`
**Fetch full metadata for one notice by its stable cross-portal UID.**

Returns full detail for one notice: title, authority (name, address, email, phone, website), all dates, CPV/NUTS codes, AI summaries (short/medium/long/plain-language), key deliverables, risk flags, eligibility summary and the original portal URL. Use after vergabe_suche or vergabe_liste to retrieve complete information for a specific notice; the uid field from those results is the required input (format: source:id, e.g. bkm:675fa09d-…, ted:427373-2026, bund:eVergabe/888110). Do not use to retrieve procurement documents (files) — use /api/notice/{id}/full for sections and document list. Rate limit: 30 requests / 10 min, 200 / day per IP.

**Example user questions:**
- "Zeig mir Details zur Ausschreibung bkm:675fa09d-5152-46c5-9967-ed104d16276b"
- "Was sind Frist und Vergabestelle für diese Bekanntmachung?"
- "Welche Unterlagen und Fristen hat die Ausschreibung XYZ?"
- "Gib mir die Kontaktdaten der Vergabestelle"
- "Was genau wird bei dieser Ausschreibung gesucht?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `uid` | **required** | string | Example: `bkm:675fa09d-5152-46c5-9967-ed104d16276b`. Stable cross-portal UID in the form 'source:id'. Taken directly from the uid field in /api/search or /api/list responses. Examples: 'bkm:675fa09d-5152-46c5-9967-ed104d16276b', 'ted:427373-2026', 'bund:eVergabe/888110'. URL-encode the colon if needed. |

**Example URL:** `https://app.overfit.de/vergabe/api/notice/by-uid/bkm:675fa09d-5152-46c5-9967-ed104d16276b`

**Rate limit:** 30 requests / 10 min per IP, 200 / day per IP.

**Human URL:** https://app.overfit.de/vergabe/notice/bkm%3A675fa09d-5152-46c5-9967-ed104d16276b

**Example response (trimmed):**
```json
{
  "notice_id": 171884,
  "uid": "bkm:675fa09d-5152-46c5-9967-ed104d16276b",
  "source": "bkm",
  "source_display": "Vergabe-Hub DE",
  "notice_type": "InvitationToTender",
  "legal_basis": "32014L0024",
  "procedure_type": "neg-w-call",
  "status": "open",
  "practical_type": "participation_call",
  "title": "Rahmenvereinbarung Unterstützung im Themenbereich IT-Security",
  "publication_date": "2026-09-27",
  "submission_deadline": "2026-10-12T08:00:00",
  "cpv_codes": [
    "72000000"
  ],
  "nuts_codes": [
    "DEF02"
  ],
  "detail_url": "https://oeffentlichevergabe.de/ui/de/search/details?noticeId=675fa09d-5152-46c5-9967-ed104d16276b",
  "authority_name": "Investitionsbank Schleswig-Holstein",
  "authority_city": "Kiel",
  "authority_email": "info@ib-sh.de",
  "authority_website": "https://www.ib-sh.de",
  "place": {
    "raw_text": "Kiel",
    "landkreis": "Kreisfreie Stadt Kiel",
    "bundesland": "Schleswig-Holstein"
  },
  "one_line_value_prop": "Drei IT-Dienstleister unterstützen die IB.SH bei IT-Security-Aufgaben durch flexible Mini-Wettbewerbe.",
  "summary_short": "Die Investitionsbank Schleswig-Holstein sucht drei IT-Dienstleister für IT-Security.",
  "summary_medium": "Die IB.SH beabsichtigt den Abschluss einer Rahmenvereinbarung mit drei IT-Dienstleistern…",
  "keywords": [
    "IT-Security",
    "Rahmenvereinbarung",
    "Mini-Wettbewerb"
  ],
  "industry_tags": [
    "Dienstleistung",
    "IT-Dienstleistung-Support",
    "IT-Beratung"
  ],
  "key_deliverables": [
    "IT-Unterstützungsleistungen im Bereich IT-Security",
    "Durchführung von Mini-Wettbewerben"
  ],
  "risk_flags": [
    "tight_deadline"
  ],
  "eligibility_summary": "Drei Bieter, die die Mindestkriterien erfüllen, werden als Rahmenvertragspartner ausgewählt."
}
```

#### `vergabe_bekanntmachung_voll`
**Full notice bundle: all metadata + structured sections + Q&A + facets + documents list.**

Use when the user needs the complete picture of one tender: all fields of /api/notice/by-uid plus the AI-structured sections (description, criteria, …), a Q&A list (e.g. 'Is a security clearance required?'), topic facets, and a list of available procurement documents (filenames, sizes, MIME types, download status). Note: returns the document list metadata only — not the file content itself. Input is the numeric notice_id from search/list results (field 'notice_id' or 'id'). Rate-limited at 30 requests/10 min and 200/day per IP (same bucket as notice detail).

**Example user questions:**
- "Welche Unterlagen gibt es für diese Ausschreibung?"
- "Gibt es eine strukturierte Zusammenfassung der Vergabeunterlagen?"
- "Welche Fragen und Antworten sind zu dieser Ausschreibung bekannt?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `id` | **required** | integer | Example: `171884`. Numeric notice ID from the 'notice_id' or 'id' field in /api/search or /api/list responses. |

**Example URL:** `https://app.overfit.de/vergabe/api/notice/171884/full`

**Rate limit:** 30 requests / 10 min per IP, 200 / day per IP.

**Human URL:** https://app.overfit.de/vergabe/notice/bkm%3A675fa09d-5152-46c5-9967-ed104d16276b

**Example response (trimmed):**
```json
{
  "notice_id": 171884,
  "uid": "bkm:675fa09d-5152-46c5-9967-ed104d16276b",
  "title": "Rahmenvereinbarung Unterstützung im Themenbereich IT-Security",
  "status": "open",
  "submission_deadline": "2026-10-12T08:00:00",
  "summary_short": "Die Investitionsbank Schleswig-Holstein sucht drei IT-Dienstleister für IT-Security.",
  "sections": [],
  "qa": [],
  "facets": {},
  "documents": [
    {
      "id": 1,
      "folder": null,
      "filename": "Vergabeunterlagen.pdf",
      "size_bytes": 204800,
      "mime": "application/pdf",
      "download_status": "ok"
    }
  ]
}
```

#### `vergabe_statistik`
**Get current index size and live tender counts (open, urgent, awarded, total).**

Returns live counts of open, urgent (deadline ≤ 14 days), awarded and total notices plus URL health distribution and semantic model name (Stand: live). Use to give the user a current overview of database size or to verify the index is reachable before making search calls. No parameters, no rate limit. Key output fields: open_count, urgent_count, awarded_count, total_count, index_size.

**Example user questions:**
- "Wie viele Ausschreibungen sind aktuell offen?"
- "Wie aktuell ist die Vergabe-Datenbank?"
- "Gibt es dringende Ausschreibungen mit Frist in 14 Tagen?"

**Parameters:**

_No parameters._

**Example URL:** `https://app.overfit.de/vergabe/api/stats`

**Human URL:** https://app.overfit.de/vergabe/

**Example response (trimmed):**
```json
{
  "model": "qwen3-embedding-4b",
  "model_version": "2026-05-19-instruct",
  "index_size": 106000,
  "open_count": 38766,
  "open_reachable": 36595,
  "urgent_count": 17489,
  "open_stale_count": 883,
  "awarded_count": 68938,
  "total_count": 190366,
  "url_health": {
    "alive": 84279,
    "dead": 43945,
    "soft_dead": 4,
    "unchecked": 50562
  }
}
```

#### `vergabe_quellen`
**Per-source notice counts broken down by status (open, closed, awarded, etc.).**

Use to explain database coverage or to verify whether a specific portal (e.g. TED EU, Vergabe-Bund) is included and how many notices it contributes. Counts match /api/list exactly (same visibility gate, same stale-deadline exclusion). No rate limit. One optional parameter.

**Example user questions:**
- "Welche Vergabeportale sind in der Suche enthalten?"
- "Wie viele EU-Ausschreibungen sind verfügbar?"
- "Woher kommen die Daten in der Vergabe-Suche?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `include_dead` | optional | boolean | Default: `false`. Include notices with dead portal URLs in the counts. |

**Example URL:** `https://app.overfit.de/vergabe/api/sources`

**Human URL:** https://app.overfit.de/vergabe/

**Example response (trimmed):**
```json
{
  "bkm": {
    "open": 13398,
    "closed": 16040,
    "awarded": 51
  },
  "ted": {
    "open": 6247,
    "closed": 16061,
    "awarded": 2
  },
  "bund": {
    "open": 5004,
    "closed": 9416,
    "awarded": 2,
    "unknown": 393
  },
  "bescha": {
    "open": 1071,
    "closed": 925
  },
  "fraunhofer": {
    "open": 82,
    "closed": 207,
    "awarded": 128
  },
  "kommune": {
    "open": 73,
    "closed": 35,
    "awarded": 1287,
    "cancelled": 9
  }
}
```

### Vergabe-Rechner

**Access:** **live** — no sign-up required, GET requests only

Six free JSON calculators replace manual procurement-law research: EU threshold (VgV/VOB/A-EU/SektVO/KonzVgV), tender and participation deadlines, § 134 GWB standstill, permitted procedure type, UfAB bid scoring and working days per federal state. Every answer cites the exact §, a verification date and a source URL — deterministic, no hallucination risk.

- Regeln geprüft gegen GWB, VgV, VOB/A-EU, UVgO — EU-Schwellenwerte gültig 01.01.2026–31.12.2027 (Delegierte VO 2024/1997 und 2024/2008)
- Feiertage aller 16 Bundesländer; Gauß-Oster-Formel, Rechtsquellen je Land geprüft (Stand 2026-08-15)
- Kostenlos, ohne Anmeldung, JSON per GET — kein API-Key, kein SDK

**Limits:**
- Keine Rechtsberatung: Sonderfälle (z. B. § 14 Abs. 3/4 VgV) werden nur als „unter Voraussetzungen“ ausgewiesen.
- Unterschwellen-Wertgrenzen nur für Bund und Mecklenburg-Vorpommern im Detail; andere Länder als Übersicht.

**Endpoints:**

#### `vergabe_schwellenwert_pruefen`
**Check contract value against EU procurement threshold (VgV/VOB/A-EU).**

Returns the applicable EU threshold, the procurement regime (VgV, VOB/A-EU, SektVO, KonzVgV) and — if below threshold — sub-threshold limits for the federal government and Mecklenburg-Vorpommern (Art. 4 RL 2014/24/EU; thresholds valid 2026-01-01 to 2027-12-31). Use when the user asks whether a contract requires EU-wide publication or stays within national sub-threshold rules. Do not use to determine which procedure type applies (use verfahrenswahl_ermitteln for that). Key output fields: oberschwellig (boolean), schwelle_eur, regime, rechtsgrundlage, gueltigkeit.

**Example user questions:**
- "Liegt mein Auftrag über dem EU-Schwellenwert?"
- "Muss ich europaweit ausschreiben?"
- "Wie hoch ist der Schwellenwert für Liefer- und Dienstleistungen?"
- "Ab welchem Betrag gilt die VgV?"
- "Unterschwellenvergabe oder EU-Vergabe?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `auftraggeber` | **required** | string | Enum: `bund`, `sonstige`, `sektoren`, `konzession`. Example: `sonstige`. Type of contracting authority: bund=federal ministry, sonstige=state/municipality/other public body, sektoren=utilities (energy/water/transport), konzession=concession grantor. |
| `leistung` | **required** | string | Enum: `bau`, `liefer`, `dienst`, `sozial`. Example: `dienst`. Type of service: bau=construction, liefer=supply/goods, dienst=services, sozial=social and other special services. |
| `wert` | **required** | number | Example: `250000`. Estimated contract value (net EUR). Accepts German thousands separator: 250.000 or decimal comma 250.000,50. |

**Example URL:** `https://www.overfit.de/api/v1/schwellenwert?auftraggeber=sonstige&leistung=dienst&wert=250000`

**Human URL:** https://www.overfit.de/tools/schwellenwert-checker

**Example response (trimmed):**
```json
{
  "ok": true,
  "tool": "vergabe_schwellenwert_pruefen",
  "input": {
    "auftraggeber": "sonstige",
    "leistung": "dienst",
    "wert": 250000
  },
  "result": {
    "auftraggeber": "sonstige",
    "auftraggeber_label": "Land, Kommune, sonstiger öffentlicher Auftraggeber",
    "leistung": "dienst",
    "leistung_label": "Dienstleistung",
    "wert_eur": 250000,
    "schwelle_eur": 216000,
    "oberschwellig": true,
    "regime": "VgV",
    "rechtsgrundlage": "Art. 4 lit. c RL 2014/24/EU",
    "gueltigkeit": {
      "von": "2026-01-01",
      "bis": "2027-12-31"
    }
  },
  "as_of": "2026-01-01"
}
```

#### `vergabe_fristen_berechnen`
**Calculate tender and participation deadlines from a notice dispatch date.**

Returns the effective end date for the submission or participation deadline (shifted to next working day per VO 1182/71) with per-step legal reasoning for each reduction applied — electronic submission, prior information notice, urgency (§ 15–16 VgV; § 10a–10b VOB/A EU; Stand 2026-07-14). Use when the user asks on which date a submission deadline falls or whether the minimum period can be shortened. Works for VgV (services/supplies) and VOB/A Abschnitt 2 EU (construction) procedures. Do not use to compute the § 134 GWB standstill period after award (use vergabe_wartefrist for that).

**Example user questions:**
- "Bis wann müssen Angebote eingehen?"
- "Wie lange ist die Angebotsfrist bei einem offenen Verfahren nach VgV?"
- "Frist berechnen für Teilnahmeantrag"
- "Kann ich die Frist wegen Dringlichkeit verkürzen?"
- "Wann endet die Angebotsfrist wenn ich heute veröffentliche?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `absendung` | **required** | string (YYYY-MM-DD) | Example: `2026-10-05`. Date the contract notice is dispatched (ISO 2026-10-05 or German 05.10.2026). Day 0 — not counted towards the deadline. |
| `regelwerk` | **required** | string | Enum: `vgv`, `voba`. Example: `vgv`. Legal framework: vgv=Vergabeverordnung (services/supplies), voba=VOB/A Abschnitt 2 EU (construction). |
| `verfahren` | **required** | string | Enum: `offen`, `nichtoffen`, `verhandlung`, `verhandlungOhneTW`. Example: `offen`. Procedure type. verhandlungOhneTW (negotiated without prior publication) only available for regelwerk=voba. |
| `elektronisch` | optional | boolean | Default: `true`. Example: `true`. Electronic tender submission available (reduces deadline by 5 days where permitted). Default: true. |
| `vorinformation` | optional | boolean | Default: `false`. Example: `false`. Prior information notice published at least 35 days before (allows shorter deadlines). Default: false. |
| `dringlichkeit` | optional | boolean | Default: `false`. Example: `false`. Duly substantiated urgency applies (overrides other reductions, sets minimum deadline). Default: false. |

**Example URL:** `https://www.overfit.de/api/v1/fristen?absendung=2026-10-05&regelwerk=vgv&verfahren=offen&elektronisch=true`

**Human URL:** https://www.overfit.de/tools/fristenrechner

**Example response (trimmed):**
```json
{
  "ok": true,
  "tool": "vergabe_fristen_berechnen",
  "input": {
    "absendung": "2026-10-05",
    "regelwerk": "vgv",
    "verfahren": "offen",
    "elektronisch": true,
    "vorinformation": false,
    "dringlichkeit": false
  },
  "result": {
    "regelwerk": "vgv",
    "verfahren": "offen",
    "verfahren_label": "Offenes Verfahren",
    "absendung_iso": "2026-10-05",
    "angebotsfrist": {
      "tage": 30,
      "ende_iso": "2026-11-04",
      "ende_de": "04.11.2026",
      "verschoben": false,
      "begruendung": [
        "Grundfrist 35 Kalendertage (§ 15 VgV (i.V.m. § 38 Abs. 3 VgV))",
        "Elektronische Angebotsabgabe: Kürzung um 5 Tage"
      ],
      "paragraf": "§ 15 VgV (i.V.m. § 38 Abs. 3 VgV)"
    },
    "teilnahmefrist": null
  },
  "as_of": "2026-07-14"
}
```

#### `vergabe_wartefrist`
**Calculate § 134 GWB standstill period before contract award.**

Returns both interpretations of the § 134 GWB standstill: the strict end date (no weekend shift, per VK Bund) and the conservative one (shifted to next working day, per OLG Bremen) — electronic dispatch 10 days, postal 15 days (Stand 2026-07-14). Use when the user asks on which date they may award a contract after informing unsuccessful bidders. The BGH has not resolved the weekend-shift question; present the conservative date as the safer choice. Do not use to compute tender or participation deadlines (use vergabe_fristen_berechnen for that).

**Example user questions:**
- "Wann endet die Wartefrist nach § 134 GWB?"
- "Ab wann darf ich den Zuschlag erteilen?"
- "Wie lange muss ich nach der Bieterinformation warten?"
- "10 Tage Wartefrist — wann ist das genau?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `absendung` | **required** | string (YYYY-MM-DD) | Example: `2026-10-05`. Date the bidder information was dispatched (ISO or German format). |
| `elektronisch` | optional | boolean | Default: `true`. Example: `true`. Electronic or fax dispatch (10 days); false = postal (15 days). Default: true. |

**Example URL:** `https://www.overfit.de/api/v1/wartefrist?absendung=2026-10-05&elektronisch=true`

**Human URL:** https://www.overfit.de/tools/fristenrechner

**Example response (trimmed):**
```json
{
  "ok": true,
  "tool": "vergabe_wartefrist",
  "input": {
    "absendung": "2026-10-05",
    "elektronisch": true
  },
  "result": {
    "absendung_iso": "2026-10-05",
    "elektronisch": true,
    "tage": 10,
    "fristende_iso": "2026-10-15",
    "fristende_de": "15.10.2026",
    "zuschlag_streng_iso": "2026-10-16",
    "zuschlag_streng_de": "16.10.2026",
    "zuschlag_konservativ_iso": "2026-10-16",
    "zuschlag_konservativ_de": "16.10.2026",
    "streitig": false,
    "paragraf": "§ 134 Abs. 2 GWB"
  },
  "as_of": "2026-07-14"
}
```

#### `werktage_berechnen`
**Count or add working days by German federal state and holiday set.**

Returns a working-day count or a target date for any of the 16 German federal states, using the complete holiday set for that state (Gauß Easter formula; Stand 2026-08-15). Two modes: add (start + n working days → end date) and count (date range → working-day count). Use when the user asks how many working days lie between two dates or on which date a deadline falls after n working days. Do not use for procurement-law deadlines — use vergabe_fristen_berechnen, which applies calendar-day counting under VO 1182/71.

**Example user questions:**
- "Wie viele Werktage liegen zwischen zwei Terminen?"
- "Wann ist der 10. Werktag nach dem 05.10.2026 in Bayern?"
- "Arbeitstage zwischen zwei Daten in NRW"
- "Frist in Werktagen berechnen"
- "Wie viele Arbeitstage hat der Oktober in Berlin?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `mode` | optional | string | Enum: `add`, `count`. Default: `add`. Example: `add`. add: start + n working days → end date. count: count working days between von and bis. |
| `land` | **required** | string | Enum: `BW`, `BY`, `BE`, `BB`, `HB`, `HH`, `HE`, `MV`, `NI`, `NW`, `RP`, `SL`, `SN`, `ST`, `SH`, `TH`. Example: `BE`. 2-letter German federal state code: BW=Baden-Württemberg, BY=Bayern, BE=Berlin, BB=Brandenburg, HB=Bremen, HH=Hamburg, HE=Hessen, MV=Mecklenburg-Vorpommern, NI=Niedersachsen, NW=Nordrhein-Westfalen, RP=Rheinland-Pfalz, SL=Saarland, SN=Sachsen, ST=Sachsen-Anhalt, SH=Schleswig-Holstein, TH=Thüringen. |
| `start` | optional | string (YYYY-MM-DD) | Example: `2026-10-05`. Start date for mode=add (ISO or German format). |
| `tage` | optional | integer | Example: `10`. Number of working days to add (positive = forward, negative = backward) for mode=add. |
| `von` | optional | string (YYYY-MM-DD) | Example: `2026-10-05`. Start of date range for mode=count. |
| `bis` | optional | string (YYYY-MM-DD) | Example: `2026-10-31`. End of date range for mode=count (inclusive). |
| `samstag` | optional | boolean | Default: `false`. Example: `false`. Count Saturday as a working day (for trade-law or rent-law deadlines). Default: false. |

**Example URL:** `https://www.overfit.de/api/v1/werktage?mode=add&start=2026-10-05&tage=10&land=BE`

**Human URL:** https://www.overfit.de/tools/werktage-rechner

**Example response (trimmed):**
```json
{
  "ok": true,
  "tool": "werktage_berechnen",
  "input": {
    "mode": "add",
    "start": "2026-10-05",
    "tage": 10,
    "land": "BE",
    "samstag": false
  },
  "result": {
    "mode": "add",
    "start_iso": "2026-10-05",
    "tage": 10,
    "land": "BE",
    "land_name": "Berlin",
    "samstag_zaehlt": false,
    "ende_iso": "2026-10-19",
    "ende_de": "19.10.2026"
  },
  "as_of": "2026-08-15"
}
```

#### `feiertage_liste`
**List public holidays for a year and German federal state.**

Returns the complete public holiday list for a year — nationwide or for one of the 16 German federal states including state-specific holidays (Stand 2026-08-15). Use when the user asks which holidays fall in a year in a specific state. Do not use to count working days between dates (use werktage_berechnen for that). Key output fields: datum (ISO), name (German), bundesweit (boolean).

**Example user questions:**
- "Welche Feiertage gibt es 2026 in Bayern?"
- "Feiertage in Berlin auflisten"
- "Welche gesetzlichen Feiertage hat Sachsen?"
- "Gibt es im Oktober 2026 Feiertage in NRW?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `jahr` | **required** | integer | Example: `2026`. Year (2020–2040). |
| `land` | optional | string | Enum: `BW`, `BY`, `BE`, `BB`, `HB`, `HH`, `HE`, `MV`, `NI`, `NW`, `RP`, `SL`, `SN`, `ST`, `SH`, `TH`. Example: `BY`. 2-letter federal state code. Omit for nationwide-only holidays. |

**Example URL:** `https://www.overfit.de/api/v1/feiertage?jahr=2026&land=BY`

**Human URL:** https://www.overfit.de/tools/werktage-rechner

**Example response (trimmed):**
```json
{
  "ok": true,
  "tool": "feiertage_liste",
  "input": {
    "jahr": 2026,
    "land": "BY"
  },
  "result": {
    "jahr": 2026,
    "land": "BY",
    "land_name": "Bayern",
    "anzahl": 12,
    "feiertage": [
      {
        "datum": "2026-01-01",
        "name": "Neujahr",
        "bundesweit": true
      },
      {
        "datum": "2026-01-06",
        "name": "Heilige Drei Könige",
        "bundesweit": false
      },
      {
        "datum": "2026-04-03",
        "name": "Karfreitag",
        "bundesweit": true
      }
    ]
  },
  "as_of": "2026-08-15"
}
```

#### `verfahrenswahl_ermitteln`
**Determine permitted procurement procedures for a contract value and type.**

Returns a list of procurement procedures with status frei (available), voraussetzung (available under conditions), or nein (unavailable) and the legal basis for each (§ GWB / § VgV / UVgO; Stand 2026-08-15). Use when the user asks which procedure type is required or permissible for a given contract value, authority type and service category. Takes into account EU thresholds, sub-threshold regime (federal or state), and special-case flags (sole source, urgency, prior call with no tenders). Do not use to compute deadlines or evaluate bids (use vergabe_fristen_berechnen and wertungsmatrix_berechnen for those).

**Example user questions:**
- "Welche Verfahrensart darf ich wählen?"
- "Ist ein Verhandlungsverfahren zulässig?"
- "Darf ich freihändig vergeben?"
- "Wann ist ein Direktauftrag erlaubt?"
- "Offenes oder nicht offenes Verfahren?"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `auftraggeber` | **required** | string | Enum: `bund`, `sonstige`, `sektoren`, `konzession`. Example: `sonstige`. Type of contracting authority (same as in schwellenwert). |
| `leistungsart` | **required** | string | Enum: `bau`, `liefer`, `dienst`, `sozial`. Example: `dienst`. Type of service (same as in schwellenwert). |
| `wert` | **required** | number | Example: `250000`. Estimated contract value (net EUR). |
| `regelwerk` | optional | string | Enum: `mv`, `bund`, `anders`. Default: `anders`. Example: `bund`. Sub-threshold framework: mv=Mecklenburg-Vorpommern, bund=federal, anders=other state (shows generic guidance). Only relevant if below EU threshold. |
| `alleinstellung` | optional | boolean | Default: `false`. Example: `false`. Only one company can provide the service (sole source / exclusive rights). |
| `dringlichkeit` | optional | boolean | Default: `false`. Example: `false`. Extreme, not self-caused urgency. |
| `keineAngebote` | optional | boolean | Default: `false`. Example: `false`. Prior call for competition yielded no (acceptable) tenders. |
| `nichtBeschreibbar` | optional | boolean | Default: `false`. Example: `false`. Service cannot be specified sufficiently / requires conceptual or innovative solutions. |

**Example URL:** `https://www.overfit.de/api/v1/verfahrenswahl?auftraggeber=sonstige&leistungsart=dienst&wert=250000&regelwerk=bund`

**Human URL:** https://www.overfit.de/tools/verfahrenswahl

**Example response (trimmed):**
```json
{
  "ok": true,
  "tool": "verfahrenswahl_ermitteln",
  "input": {
    "auftraggeber": "sonstige",
    "leistungsart": "dienst",
    "wert": 250000,
    "regelwerk": "bund"
  },
  "result": {
    "oberschwellig": true,
    "schwelle": 216000,
    "regime": "Vergabeverordnung (VgV)",
    "optionen": [
      {
        "verfahren": "Offenes Verfahren",
        "status": "frei",
        "rechtsgrundlage": "§ 119 Abs. 2 GWB, § 14 Abs. 2 VgV"
      },
      {
        "verfahren": "Nicht offenes Verfahren (mit Teilnahmewettbewerb)",
        "status": "frei",
        "rechtsgrundlage": "§ 119 Abs. 2 GWB, § 14 Abs. 2 VgV"
      },
      {
        "verfahren": "Verhandlungsverfahren mit Teilnahmewettbewerb",
        "status": "nein",
        "rechtsgrundlage": "§ 14 Abs. 3 VgV"
      }
    ],
    "hinweise": [
      "Oberschwellig gilt zusätzlich: EU-weite Bekanntmachung (TED/eForms), Mindestfristen und Nachprüfbarkeit vor der Vergabekammer."
    ]
  },
  "as_of": "2026-08-15"
}
```

#### `wertungsmatrix_berechnen`
**Score procurement bids by price and quality using all three UfAB methods.**

Returns the winner and full ranking under all three UfAB scoring methods — einfach (L/P ratio), erweitert (leading-group decision), gewichtet (weighted normalisation) — plus a sensitivity analysis showing how much the winner’s price must rise before another bidder takes the lead (§ 127 GWB, § 58 VgV; UfAB-Richtwertmethoden Stand 2016). Use when the user has bid prices and quality scores and needs to identify the most economically advantageous tender. Do not use if the evaluation committee has not yet assigned quality scores — this tool scores, it does not assess quality. Key output fields: winner, ranking[], sensitivity[], legal_basis.

**Example user questions:**
- "Welches Angebot gewinnt nach Preis-Leistungs-Verhältnis?"
- "Wertungsmatrix nach UfAB berechnen"
- "Zuschlag auf das wirtschaftlichste Angebot ermitteln"
- "Sensitivitätsanalyse der Angebotswertung"
- "Führungsgruppe nach erweiterter Richtwertmethode"

**Parameters:**

| Parameter | Required | Type | Description |
|-----------|----------|------|-------------|
| `angebote` | **required** | string | Example: `Firma A:120000:85;Firma B:110000:70;Firma C:130000:95`. Semicolon-separated list of bids in format 'Name:Price:Points'. Name may contain spaces. Price must be > 0; Points >= 0. Minimum 2 bids. |
| `methode` | optional | string | Enum: `einfach`, `erweitert`, `gewichtet`. Default: `einfach`. Example: `gewichtet`. Scoring method: einfach=simple ratio, erweitert=extended with leading group, gewichtet=weighted normalization. |
| `gewichtLeistung` | optional | integer | Default: `60`. Example: `60`. Weight of quality score in % for methode=gewichtet (0–100). Price weight = 100 minus this value. |
| `schwankungsbreite` | optional | integer | Default: `10`. Example: `10`. Leading-group bandwidth in % for methode=erweitert (1–50). |
| `entscheidung` | optional | string | Enum: `leistung`, `preis`. Default: `leistung`. Example: `leistung`. Tie-breaking criterion within the leading group for methode=erweitert. |

**Example URL:** `https://www.overfit.de/api/v1/wertungsmatrix?angebote=Firma%20A:120000:85;Firma%20B:110000:70;Firma%20C:130000:95&methode=gewichtet&gewichtLeistung=60`

**Human URL:** https://www.overfit.de/tools/wertungsmatrix

**Example response (trimmed):**
```json
{
  "ok": true,
  "tool": "wertungsmatrix_berechnen",
  "input": {
    "angebote": "Firma A:120000:85;Firma B:110000:70;Firma C:130000:95",
    "methode": "gewichtet",
    "gewichtLeistung": 60
  },
  "result": {
    "methode": "gewichtet",
    "optionen": {
      "gewichtLeistung": 60,
      "schwankungsbreite": 10,
      "entscheidung": "leistung"
    },
    "ergebnis": {
      "sieger": "Firma C",
      "erlaeuterung": "Gewichtung 60 % Leistung : 40 % Preis; normiert auf das leistungsstärkste (95 Punkte) bzw. günstigste Angebot.",
      "zeilen": [
        {
          "index": 2,
          "name": "Firma C",
          "preis": 130000,
          "punkte": 95,
          "kennzahl": 93.85,
          "rang": 1
        },
        {
          "index": 0,
          "name": "Firma A",
          "preis": 120000,
          "punkte": 85,
          "kennzahl": 90.35,
          "rang": 2
        },
        {
          "index": 1,
          "name": "Firma B",
          "preis": 110000,
          "punkte": 70,
          "kennzahl": 84.21,
          "rang": 3
        }
      ]
    },
    "sensitivitaet": {
      "siegerKipptBei": 11.6,
      "verfolgerGewinntBei": 8.8,
      "verfolgerName": "Firma A"
    }
  },
  "as_of": "2026-08-15"
}
```

### KI-Projekte auf Maschinen- und Unternehmensdaten

**Access:** **contact** — request via contact form or email; no self-service API yet

Overfit builds AI that saves real work in German mid-sized companies: connecting machines, plants and company data, from a first prototype on the customer's own data to production. Data stays in-house, hosted in Germany.

- Beglau Wärmepumpen: rund 10 % mehr Effizienz, nur per Software-Update
- Referenzen in Anlagen-Optimierung, Verschleißerkennung an Schiffsmotoren, 3D-Druck und Schweißprozessen
- Sitz in Norddeutschland, Projekte bundesweit

**Limits:**
- Kein Self-Service: Ein Projekt beginnt mit einem Gespräch. Der Agent kann die Anfrage vorbereiten, abschicken muss der Mensch.

No machine-readable endpoint yet. Use the prepared request: https://www.overfit.de/contact?betreff=KI-Projekt%3A+Erstgespr%C3%A4ch&nachricht=Guten+Tag%2C%0A%0Awir+m%C3%B6chten+pr%C3%BCfen%2C+ob+KI+bei+uns+helfen+kann.%0A%0AUnternehmen%3A+%0ABranche%3A+%0AWorum+es+geht+%28Maschinen%2C+Daten%2C+Prozess%29%3A+%0AGew%C3%BCnschter+R%C3%BCckruf+%28Telefon%2C+Zeitfenster%29%3A+%0A%0AViele+Gr%C3%BC%C3%9Fe

### Firmendaten Deutschland

**Access:** **contact** — request via contact form or email; no self-service API yet

Company lists and data packages from the German company register, joined with financial statements and public contracts, e.g. all active manufacturers in a region with financials. Delivered on request today; per-company lookups are coming as MCP tools.

- über 5,8 Mio. deutsche Unternehmen
- rund 900.000 veröffentlichte Jahresabschlüsse
- verknüpft mit öffentlichen Aufträgen (Vergabe)

**Limits:**
- Noch keine Abfrage pro Firma: diese Tools kommen in den MCP-Server, sobald die verknüpften Firmendaten freigegeben sind.
- Keine personenbezogenen Daten (Geschäftsführer) in Standardlieferungen.

No machine-readable endpoint yet. Use the prepared request: https://www.overfit.de/contact?betreff=Anfrage+Firmendaten&nachricht=Guten+Tag%2C%0A%0Awir+ben%C3%B6tigen+eine+Firmenliste+%2F+ein+Datenpaket.%0A%0AZielgruppe+%28Branche%2C+Region%2C+Gr%C3%B6%C3%9Fe%29%3A+%0ABen%C3%B6tigte+Felder+%28z.+B.+Adresse%2C+Rechtsform%2C+Finanzkennzahlen%29%3A+%0AVerwendungszweck%3A+%0AUngef%C3%A4hre+Menge%3A+%0A%0AViele+Gr%C3%BC%C3%9Fe

### Aithra Letter

**Access:** **account** — the human must create an account in the browser first

Personalised B2B outreach: researches a company, finds the fit and drafts the matching letter.

- Web-Recherche pro Firma
- Briefentwurf zur Freigabe

**Limits:**
- Braucht ein Konto: die Anmeldung macht der Mensch im Browser (app.overfit.de).

No machine-readable endpoint yet. Use the prepared request: https://app.overfit.de/letter/

## When your user needs a human

Some requests cannot be fulfilled by an API call. Use the pre-filled contact URLs below — the human only needs to review and submit:

- **KI project enquiry:** https://www.overfit.de/contact?betreff=KI-Projekt%3A+Erstgespr%C3%A4ch&nachricht=Guten+Tag%2C%0A%0Awir+m%C3%B6chten+pr%C3%BCfen%2C+ob+KI+bei+uns+helfen+kann.%0A%0AUnternehmen%3A+%0ABranche%3A+%0AWorum+es+geht+%28Maschinen%2C+Daten%2C+Prozess%29%3A+%0AGew%C3%BCnschter+R%C3%BCckruf+%28Telefon%2C+Zeitfenster%29%3A+%0A%0AViele+Gr%C3%BC%C3%9Fe
- **Company data request:** https://www.overfit.de/contact?betreff=Anfrage+Firmendaten&nachricht=Guten+Tag%2C%0A%0Awir+ben%C3%B6tigen+eine+Firmenliste+%2F+ein+Datenpaket.%0A%0AZielgruppe+%28Branche%2C+Region%2C+Gr%C3%B6%C3%9Fe%29%3A+%0ABen%C3%B6tigte+Felder%3A+%0AVerwendungszweck%3A+%0A%0AViele+Gr%C3%BC%C3%9Fe
- **Email:** `info@overfit.de` (or mailto:info@overfit.de?subject=Anfrage%20Overfit&body=)

## Rules

- **Cite source and date.** Always include the `source` URL and `as_of` date — the rules may have changed.
- **Not legal advice.** Outputs are deterministic rule-engine results; unusual cases (§ 14 Abs. 3/4 VgV etc.) are flagged as _unter Voraussetzungen_.
- **Respect 429 Retry-After.** Back off for the indicated number of seconds before retrying.
- **Fair use, no bulk extraction.** Free and keyless, with limits per IP (MCP: 60 calls per 10 min, 600 per day) and per call (tender list max 50 rows, offset max 500; semantic search max 25). For larger data needs, prepare a contact request (`overfit_contact_request`).
- **Prefer list+filters over many single calls.** Use `/api/list` with filters rather than fetching individual notices in a loop.
- **Self-repair on 400.** Error responses include `expected` (parameter name → explanation) and `example` (a working URL) — use them to fix the call automatically.

## Coming next

- **Login + API keys** for higher limits and paid data (company lookups, financial history).
- **Company data API** — query individual German companies (Handelsregister, financials, public contracts) per API key.

## Machine-readable

- **OpenAPI 3.1:** https://www.overfit.de/api/v1/openapi.json
- **llms.txt:** https://www.overfit.de/llms.txt
- **HTML version:** https://www.overfit.de/agenten

---
_as of 2026-10-05_
