Table of Contents
- TenderBot — API Documentatie
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TenderBot — API Documentatie
TenderBot is een AI-assistent voor Nederlandse aanbestedingen. De bot helpt opdrachtgevers en inkopers bij het opstellen van kwalitatieve aanbestedingsdocumenten conform de Aanbestedingswet 2012, het ARW 2016, de Gids Proportionaliteit en de geldende EU-richtlijnen. Onder de motorkap draait llama-3.3-70b-versatile via de Groq API.
De API is gebouwd met FastAPI en biedt sessiegebaseerde chat met optionele gestructureerde context per sessie. Interactieve documentatie is beschikbaar op /docs (Swagger UI) en /redoc.
Endpoints
POST /sessions — Nieuwe sessie aanmaken
Maakt een nieuwe chatsessie aan. Optioneel kunt u context meegeven (string of JSON-object) die bij elke vraag als achtergrondkennis aan het AI-model wordt gekoppeld.
Request body
{
"context": {
"beschrijving": "Aanbesteding HR-software voor middelgrote gemeente",
"aanbestedingstype": "Europese openbare procedure",
"sector": "ICT / HR",
"eisen_categorieen": [
{"categorie": "Functioneel", "toelichting": "Salarisadministratie en verlofregistratie"},
{"categorie": "Security", "toelichting": "ISO 27001 en NEN 7510"}
]
},
"username": "j.devries"
}
Response 200
{
"session_id": "f7c3e1a4-...-9b21",
"context": { "...": "..." },
"username": "j.devries"
}
Curl-voorbeeld
curl -X POST https://tenderbot.example.nl/sessions \
-H "Content-Type: application/json" \
-d '{"context": "HR-software aanbesteding voor gemeenten", "username": "j.devries"}'
POST /chat — Bericht versturen
Stuurt een gebruikersbericht naar TenderBot binnen een bestaande sessie en ontvangt het antwoord van de assistent. Berichten worden opgeslagen in de geschiedenis.
Request body
{
"session_id": "f7c3e1a4-...-9b21",
"message": "Welke uitsluitingsgronden zijn verplicht onder Aw 2012?"
}
Response 200
{
"session_id": "f7c3e1a4-...-9b21",
"reply": "De verplichte uitsluitingsgronden zijn opgenomen in artikel 2.86 Aw 2012..."
}
Fouten
400— Bericht is leeg500—GROQ_API_KEYontbreekt
Curl-voorbeeld
curl -X POST https://tenderbot.example.nl/chat \
-H "Content-Type: application/json" \
-d '{"session_id": "f7c3e1a4-...-9b21", "message": "Welke gunningscriteria past het beste?"}'
GET /sessions — Lijst alle sessies
Response 200
{ "sessions": ["f7c3e1a4-...-9b21", "a12b..."] }
Curl-voorbeeld
curl https://tenderbot.example.nl/sessions
GET /sessions/{session_id}/history — Geschiedenis ophalen
Response 200
{
"session_id": "f7c3e1a4-...-9b21",
"messages": [
{"role": "user", "content": "Welke procedure adviseert u?"},
{"role": "assistant", "content": "Op basis van de opdrachtwaarde..."}
]
}
Fouten: 404 als sessie niet bestaat.
Curl-voorbeeld
curl https://tenderbot.example.nl/sessions/f7c3e1a4-.../history
DELETE /sessions/{session_id} — Sessie verwijderen
Response 200
{ "detail": "Sessie verwijderd." }
Fouten: 404 als sessie niet bestaat.
Curl-voorbeeld
curl -X DELETE https://tenderbot.example.nl/sessions/f7c3e1a4-...
GET /health — Gezondheidsstatus
Response 200
{ "status": "ok" }
Sessie context
Het context-veld op POST /sessions accepteert zowel een vrije string als een gestructureerd JSON-object. Wanneer een gestructureerd object wordt meegegeven, formatteert TenderBot dit automatisch tot een leesbare contextblok dat aan de system prompt wordt toegevoegd.
Gestructureerd schema
| Veld | Type | Beschrijving |
|---|---|---|
beschrijving |
string | Korte omschrijving van de opdracht |
aanbestedingstype |
string | Type procedure (openbaar, niet-openbaar, MCD, etc.) |
sector |
string | Sector of branche van de opdracht |
eisen_categorieen |
array van objecten | Lijst met categorieën van eisen die geformuleerd moeten worden |
eisen_categorieen[].categorie |
string | Naam van de categorie (bv. "Functioneel", "Security") |
eisen_categorieen[].toelichting |
string | Optionele toelichting bij de categorie |
Aanvullende sleutels worden eveneens meegestuurd als key: value-regels.
Volledig JSON-voorbeeld
{
"context": {
"beschrijving": "Aanbesteding voor een nieuw HR- en salarissysteem voor gemeente Voorbeeldstad",
"aanbestedingstype": "Europese openbare procedure",
"sector": "ICT / Personeel & Organisatie",
"eisen_categorieen": [
{
"categorie": "Functionele eisen",
"toelichting": "Salarisadministratie, verlof- en verzuimregistratie, self-service"
},
{
"categorie": "Technische eisen",
"toelichting": "SaaS-oplossing, koppeling met financieel pakket via REST"
},
{
"categorie": "Security & privacy",
"toelichting": "ISO 27001, NEN 7510, AVG-compliance, data binnen EU"
},
{
"categorie": "Duurzaamheid",
"toelichting": "MVI-criteria Rijksoverheid, CO₂-Prestatieladder niveau 3"
},
{
"categorie": "SLA & support",
"toelichting": "Beschikbaarheid 99,5%, support 08:00–18:00"
}
],
"geschatte_waarde": "€ 850.000 over 4 jaar",
"looptijd": "4 jaar met optie tot verlenging 2x 1 jaar"
},
"username": "j.devries"
}
Configuratie
| Variabele | Standaard | Beschrijving |
|---|---|---|
GROQ_API_KEY |
(verplicht) | API-sleutel voor de Groq inference service |
TENDERBOT_DB |
/opt/tenderbot/tenderbot.db |
Pad naar het SQLite-databasebestand |