Documentatie

Aan de slag

veritra.io monitort openbare aanbestedingen in de hele EU. U kunt het gebruiken via het webdashboard of integreren via REST API.

Webgebruik

Aan de slag in het dashboard

Niets te installeren of te coderen. Een browser en een e-mailadres zijn voldoende.

1. Maak een account aan

Ga naar /register en vul uw e-mailadres, naam en optioneel een Tsjechisch bedrijfs-ID (IČO) in. Als u een IČO opgeeft, worden de bedrijfsnaam, het btw-nummer en het adres automatisch ingevuld vanuit het ARES-register.

Voer nog geen wachtwoord in — u stelt dit in de volgende stap in nadat u op de verificatielink hebt geklikt.

2. Verifieer het e-mailadres en stel een wachtwoord in

Binnen enkele seconden ontvangt u een e-mail met een verificatielink. Klik erop. U komt op een pagina terecht waar u uw wachtwoord instelt (min. 8 tekens).

Zodra het wachtwoord is ingesteld, bent u ingelogd en kunt u direct naar het dashboard gaan.

3. Maak uw eerste aanbestedingsfilter aan

Klik in het dashboard op Aanbestedingen → Nieuw filter. Een filter is een opgeslagen set criteria die het systeem gebruikt om u overeenkomende aanbestedingen te sturen:

  1. Regio — regio of meerdere regio's (Praag, Midden-Bohemen, …)
  2. Sector — aanbestedingscategorie (Gebouwen, IT-ontwikkeling, …) of CPV-code
  3. Trefwoorden — woorden die in de titel of omschrijving moeten voorkomen (bijv. "brugrestauratie")
  4. Waarde — minimale/maximale verwachte aanbestedingswaarde

Een gedetailleerde beschrijving van alle filterparameters vindt u in de Lead Watcher-documentatie.

4. Schakel de e-maildigest in

Elk filter kan een dagelijkse e-maildigest hebben. Elke dag om 7:00 ontvangt u een e-mail met aanbestedingen die die dag zijn toegevoegd en overeenkomen met uw filter.

De digest wordt in- of uitgeschakeld via de filterdetails — de schakelaar "E-maildigest" bovenaan. U kunt meerdere filters hebben, elk met een eigen digest-instelling.

API-integratie

REST API

Als u de gegevens programmatisch wilt gebruiken — bijvoorbeeld om ze in uw ERP of CRM te laden — gebruik dan de REST API. Alle eindpunten bevinden zich onder /api/v2, authenticatie verloopt via een API-sleutel. De meeste eindpunten retourneren JSON in een envelope met één 'data'-sleutel; uitzonderingen zijn factuur-PDF's (binair), matchexport (CSV/XLSX tenzij u format=json instelt) en documentvoorvertoning (302-redirect naar een ondertekende URL).

Hello world

Met een sleutel ziet de aanroep er als volgt uit:

curl -H "X-Api-Key: mrw_live_…" \
  "https://veritra.io/api/v2/leads/tenders/search?qText=bridge%20reconstruction&limit=5"

Geeft JSON terug met de meest recente openstaande aanbestedingen. Volledige zoekparameters vindt u in de Lead Watcher-documentatie.

Hoe u een sleutel verkrijgt

Uw eerste API-sleutel wordt aangemaakt via het dashboard: registreer u op de website, verifieer uw e-mailadres en klik vervolgens in Instellingen → Integraties op "Sleutel genereren". De sleutel wordt eenmalig getoond — sla hem onmiddellijk op (bijv. in env / secrets store). Als u hem kwijtraakt, maak dan een nieuwe aan en verwijder de oude.

De sleutel gebruiken met MCP-clients (Claude Desktop, Cursor, …)

De sleutel is hetzelfde als voor de REST API. Alleen de manier waarop de client hem verzendt verschilt: de MCP-server draait op /api/mcp en de sleutel wordt meegegeven in de X-Api-Key-handshake-header. De volledige configuratie voor Claude Desktop, Cursor en generieke HTTP-clients vindt u in de MCP-documentatie.

Authenticatie

Alle /api/v2-eindpunten authenticeren met één API-sleutel (formaat mrw_live_HEX64). De sleutel kan worden meegestuurd als X-Api-Key-header of als Bearer-token:

# header X-Api-Key
curl -H "X-Api-Key: mrw_live_…" https://veritra.io/api/v2/account/me

# nebo Bearer (kompatibilní s OpenAPI client generators)
curl -H "Authorization: Bearer mrw_live_…" https://veritra.io/api/v2/account/me

De sleutel bevat de gebruikersidentiteit. Welke services ermee kunnen worden aangeroepen, wordt bepaald door het abonnement (zie de sectie Abonnementen). U kunt maximaal 5 actieve sleutels hebben — handig om prod / dev / per systeem te scheiden.

Respons-envelop

Alle v2-eindpunten retourneren een uniforme JSON-envelop. Enkele resource onder data, gepagineerde lijsten onder data + pagination, fouten onder error.

Geslaagd

// Enkele resource
{ "data": { "id": "…", "field": "…" } }

// Gepagineerde lijst
{
  "data": [{ "…": "…" }],
  "pagination": { "nextCursor": "abc123…", "totalCount": 42 }
}

Fout

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Field 'url' must be a valid HTTPS URL.",
    "details": { "field": "url" }
  }
}

Stabiele foutcodes: UNAUTHORIZED, FORBIDDEN, NOT_FOUND, VALIDATION_ERROR, CONFLICT, RATE_LIMITED, ENTITLEMENT_REQUIRED, INTERNAL. Clients dienen te vertakken op code, niet op message — de HTTP-statuscode wordt automatisch aan code gekoppeld.

Snelheidslimieten

ParameterTypeBeschrijving
Account-API — lezen60/min, 5.000/dagGET op /api/v2/account/*
Account-API — schrijven10/min, 200/dagPOST, PUT, PATCH, DELETE
Service-API's100/u/sleutelMaandelijks quotum is afhankelijk van de service — zie de servicedocumentatie

Bij overschrijding retourneert de API HTTP 429 met een Retry-After header (seconden).

Proefperiode en facturering

Na het aanmaken van een account ontvangt u een gratis proefperiode van 7 dagen van Lead Watcher — geen creditcard of factureringsprofiel vereist. Daarna heeft u een creditcard of een betaalde proforma-factuur nodig, anders wordt de service SUSPENDED en retourneren verdere aanroepen 403. Geen tierbundels — betaal per service, op elk moment opzegbaar.

Account-API

Beheer account, sleutels, facturering en webhooks. Alle /api/v2/account/*-eindpunten vereisen sleutelauthenticatie.

GET/api/v2/account/me

Equivalent aan /profile + /subscriptions + apiKey-info. Handig voor de initiële laadbeurt in UI-clients.

{
  "data": {
    "account": { "email": "…", "name": "…", "company": "…", "ico": "…", "country": "CZ", "locale": "cs", "isComplete": true },
    "subscriptions": [
      { "service": "LEADS", "scope": "CZ", "state": "ACTIVE", "tier": "PAID", "trialEndsAt": null, "paidUntil": "2026-06-30T22:00:00.000Z", "cancelAtPeriodEnd": false }
    ],
    "apiKey": { "keyPrefix": "mrw_live_7fa7785c", "lastUsedAt": "…", "requestsMonth": 120, "requestsLimit": 500 }
  }
}
GET/api/v2/account/profile
PATCH/api/v2/account/profile

Wachtwoord en sessie

GET/api/v2/account/password
POST/api/v2/account/password
POST/api/v2/account/sessions/revoke

API-sleutels

De sleutel authenticeert tegen de volledige API. U kunt maximaal 5 actieve sleutels hebben. De onbewerkte sleutel wordt alleen geretourneerd bij aanmaak of rotatie — daarna alleen opvraagbaar door een nieuwe aan te maken.

GET/api/v2/account/keys
POST/api/v2/account/keys
{ "label": "Production ERP" }
{
  "data": {
    "id": "cm…",
    "key": "mrw_live_<hex64>",
    "keyPrefix": "mrw_live_7fa7785c",
    "label": "Production ERP",
    "createdAt": "…"
  }
}

De sleutel in de respons is hier alleen in zijn geheel beschikbaar. De server slaat alleen de SHA-256-hash op; de onbewerkte sleutel kan later niet worden opgehaald. Indien verloren, maak een nieuwe aan en verwijder de oude.

GET/api/v2/account/keys/:id
PATCH/api/v2/account/keys/:id
DELETE/api/v2/account/keys/:id
POST/api/v2/account/keys/:id/rotate

Serviceabonnementen

Proefactivering, statusoverzicht, geplande annulering op paidUntil/trialEndsAt. Gebruik /billing/checkout voor activering met betaalkaart.

GET/api/v2/account/subscriptions
POST/api/v2/account/subscriptions
{ "service": "LEADS", "scope": "CZ", "mode": "trial" }
POST/api/v2/account/subscriptions/batch
{ "service": "LEADS", "scopes": ["CZ","SK","DE"], "mode": "trial" }
PATCH/api/v2/account/subscriptions/:service
{ "cancelAtPeriodEnd": true }

API-gebruik

Dagelijks aggregaat van API-sleuteloproepen voor de afgelopen N dagen (standaard 30). Voor bewaking van het verbruik van de snelheidslimiet.

GET/api/v2/account/usage?days=30

Facturering

GET/api/v2/account/billing
PATCH/api/v2/account/billing
POST/api/v2/account/billing/checkout
POST/api/v2/account/billing/customer-portal
POST/api/v2/account/billing/proforma
{ "cycle": "MONTHLY", "currency": "CZK", "scopes": ["CZ","SK"] }
GET/api/v2/account/billing/invoices
GET/api/v2/account/billing/invoices/:invoiceId

Gegevensexport (AVG)

GET/api/v2/account/export
POST/api/v2/account/export

Accountopzegging

POST/api/v2/account/cancel/request
{ "action": "DEACTIVATE" }
POST/api/v2/account/cancel/confirm

Webhooks

Webhooks op accountniveau — één eindpunt dekt alle filters en toekomstige services. Elke gebeurtenis bevat een HMAC-SHA256-handtekening in X-Signature-256, een idempotentiesleutel in X-Idempotency-Key en het type in X-Event-Type. Opnieuw proberen met exponentiële terugval tot ~33 uur.

Max. 5 eindpunten per account. Ondersteunde gebeurtenissen en payload-schema's zijn per service gedocumenteerd.

GET/api/v2/account/webhooks
POST/api/v2/account/webhooks
{
  "url": "https://yourapp.cz/api/veritra-webhook",
  "enabledEvents": ["leads.match.created"],
  "description": "production"
}
GET/api/v2/account/webhooks/:id
PATCH/api/v2/account/webhooks/:id
DELETE/api/v2/account/webhooks/:id
POST/api/v2/account/webhooks/:id/rotate-secret

Meldingen

GET/api/v2/account/notifications
PATCH/api/v2/account/notifications

Feedback

POST/api/v2/feedback

OpenAPI 3.1-specificatie

De volledige machine-leesbare API-specificatie is beschikbaar op /openapi.json. Gebruik deze om getypeerde clients te genereren in elke gewenste taal (TypeScript, Python, Go, Rust, …) of om te importeren in Postman / Insomnia / Swagger UI.

# Generate TypeScript client
npx openapi-typescript https://veritra.io/openapi.json -o ./veritra-types.ts

# Generate Python client (openapi-python-client)
openapi-python-client generate --url https://veritra.io/openapi.json

Foutcodes

CodeBetekenis
400Ontbrekend veld, ongeldige JSON, ongeldig formaat
401Ontbrekende X-Api-Key / Bearer, verlopen / ongeldig token
402Geen actief abonnement voor de service
403Token behoort niet tot dit account, of service bevindt zich in bèta zonder whitelist
404Sleutel / token / endpoint niet gevonden
409E-mail al geregistreerd / sleutel bestaat al / endpointlimiet (5) / filterlimiet (20)
410Token of code verlopen of al gebruikt
412E-mail niet geverifieerd — stap 2 nog niet voltooid
429Limiet voor aanvragen overschreden (Retry-After header)
500Serverfout