Dokumentacja

Pierwsze kroki

Veritra monitoruje publiczne przetargi zamówień w całej UE. Możesz korzystać z platformy przez panel webowy lub integrować się za pomocą REST API.

Korzystanie przez przeglądarkę

Zacznij pracę w panelu

Nic do instalowania ani kodowania. Wystarczy przeglądarka i adres e-mail.

1. Utwórz konto

Przejdź do /register i podaj swój adres e-mail, imię i nazwisko oraz opcjonalnie czeski numer identyfikacyjny firmy (IČO). Jeśli podasz IČO, nazwa firmy, VAT i adres zostaną automatycznie uzupełnione z rejestru ARES.

Na razie nie ustawiaj hasła — zrobisz to w kolejnym kroku po kliknięciu linku weryfikacyjnego.

2. Zweryfikuj adres e-mail i ustaw hasło

W ciągu kilku sekund otrzymasz wiadomość e-mail z linkiem weryfikacyjnym. Kliknij go. Zostaniesz przekierowany na stronę, gdzie ustawisz hasło (min. 8 znaków).

Po ustawieniu hasła zostaniesz zalogowany i możesz od razu przejść do panelu głównego.

3. Utwórz swój pierwszy filtr przetargów

W panelu głównym kliknij Przetargi → Nowy filtr. Filtr to zapisany zestaw kryteriów, których system używa do wysyłania Ci pasujących przetargów:

  1. Region — region lub kilka regionów (Praga, Czechy Środkowe, …)
  2. Branża — kategoria przetargu (Budownictwo, Rozwój IT, …) lub kod CPV
  3. Słowa kluczowe — słowa, które muszą pojawić się w tytule lub opisie (np. „remont mostu")
  4. Wartość — minimalna/maksymalna przewidywana wartość przetargu

Szczegółowy opis wszystkich parametrów filtrów znajdziesz w dokumentacji Lead Watcheró

4. Włącz codzienny digest e-mail

Każdy filtr może mieć codzienny digest e-mail. Każdego dnia o godzinie 7:00 otrzymujesz wiadomość e-mail z przetargami dodanymi tego dnia, które odpowiadają Twojemu filtrowi.

Digest jest przełączany w szczegółach filtra — przełącznik „Digest e-mail" u góry. Możesz mieć wiele filtrów, każdy z własnym ustawieniem digestu.

Integracja API

REST API

Jeśli potrzebujesz danych w sposób programowy — np. aby przesłać je do swojego systemu ERP lub CRM — skorzystaj z REST API. Wszystkie punkty końcowe znajdują się pod /api/v2, uwierzytelnianie odbywa się za pomocą klucza API. Większość punktów końcowych zwraca JSON w kopercie z pojedynczym kluczem 'data'; wyjątkami są faktury PDF (binarne), eksport dopasowań (CSV/XLSX, chyba że ustawisz format=json) oraz podgląd dokumentu (przekierowanie 302 do podpisanego URL).

Hello world

Z kluczem wywołanie wygląda następująco:

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

Zwraca JSON z najnowszymi otwartymi przetargami. Pełne parametry wyszukiwania znajdują się w dokumentacji Lead Watcher"

Jak uzyskać klucz

Twój pierwszy klucz API jest tworzony przez panel: zarejestruj się w wersji webowej, zweryfikuj adres e-mail, a następnie w Ustawienia → Integracje kliknij „Wygeneruj klucz". Klucz jest pokazywany tylko raz — zapisz go natychmiast (np. w zmiennych środowiskowych lub magazynie sekretów). Jeśli go utracisz, utwórz nowy i usuń stary.

Używanie klucza z klientami MCP (Claude Desktop, Cursor, …)

Klucz jest taki sam jak dla REST API. Różni się jedynie sposób, w jaki klient go wysyła: serwer MCP działa pod adresem /api/mcp, a klucz przekazywany jest w nagłówku uzgadniania X-Api-Key. Pełna konfiguracja dla Claude Desktop, Cursor oraz ogólnych klientów HTTP znajduje się w dokumentacji MCP.

Uwierzytelnianie

Wszystkie punkty końcowe /api/v2 uwierzytelniają się za pomocą jednego klucza API (format mrw_live_HEX64). Klucz można przekazać jako nagłówek X-Api-Key lub jako token Bearer:

# 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

Klucz niesie ze sobą tożsamość użytkownika. To, które usługi może wywoływać, jest określone przez subskrypcję (patrz sekcja Subskrypcje). Możesz mieć do 5 aktywnych kluczy — przydatne do rozdzielenia środowisk prod / dev / per-system.

Koperta odpowiedzi

Wszystkie punkty końcowe v2 zwracają ujednoliconą kopertę JSON. Pojedynczy zasób pod kluczem data, listy paginowane pod data + pagination, błędy pod error.

Sukces

// Pojedynczy zasób
{ "data": { "id": "…", "field": "…" } }

// Lista paginowana
{
  "data": [{ "…": "…" }],
  "pagination": { "nextCursor": "abc123…", "totalCount": 42 }
}

Błąd

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

Stabilne kody błędów: UNAUTHORIZED, FORBIDDEN, NOT_FOUND, VALIDATION_ERROR, CONFLICT, RATE_LIMITED, ENTITLEMENT_REQUIRED, INTERNAL. Klienci powinni rozgałęziać się na podstawie code, nie message — status HTTP jest automatycznie mapowany na kod.

Limity zapytań

ParametrTypOpis
Account API — odczyt60/min, 5 000/dzieńGET na /api/v2/account/*
Account API — zapis10/min, 200/dzieńPOST, PUT, PATCH, DELETE
Service APIs100/h/kluczMiesięczny limit zależy od usługi — patrz dokumentacja usługi

W przypadku przekroczenia limitu API zwraca HTTP 429 z nagłówkiem Retry-After (sekundy).

Okres próbny i rozliczenia

Po utworzeniu konta otrzymujesz 7-dniowy bezpłatny okres próbny usługi Lead Watcher — bez karty, bez profilu rozliczeniowego. Po jego zakończeniu wymagana jest karta płatnicza lub opłacona faktura proforma, w przeciwnym razie usługa przechodzi w tryb SUSPENDED a kolejne wywołania zwracają 403. Bez pakietów poziomów — płatność za usługę, rezygnacja w dowolnym momencie.

Account API

Zarządzanie kontem, kluczami, rozliczeniami i webhookami. Wszystkie punkty końcowe /api/v2/account/* wymagają uwierzytelnienia kluczem.

GET/api/v2/account/me

Odpowiednik /profile + /subscriptions + informacje o apiKey. Przydatne podczas początkowego ładowania w klientach UI.

{
  "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

Hasło i sesja

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

Klucze API

Klucz uwierzytelnia się względem całego API. Możesz mieć maksymalnie 5 aktywnych kluczy. Surowy klucz jest zwracany wyłącznie przy tworzeniu lub rotacji — później można go uzyskać jedynie poprzez utworzenie nowego.

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": "…"
  }
}

Klucz w odpowiedzi jest dostępny w pełnej formie tylko tutaj. Serwer przechowuje wyłącznie skrót SHA-256; surowego klucza nie można odzyskać później. W razie utraty utwórz nowy i usuń stary.

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

Subskrypcje usług

Aktywacja wersji próbnej, przegląd stanu, zaplanowane anulowanie przy paidUntil/trialEndsAt. Aby aktywować płatną kartę, użyj /billing/checkout.

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 }

Użycie API

Dzienny agregat wywołań klucza API z ostatnich N dni (domyślnie 30). Służy do monitorowania zużycia limitu zapytań.

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

Rozliczenia

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

Eksport danych (RODO)

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

Zamknięcie konta

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

Webhooki

Webhooki na poziomie konta — jeden punkt końcowy obejmuje wszystkie filtry i przyszłe usługi. Każde zdarzenie zawiera sygnaturę HMAC-SHA256 w X-Signature-256, klucz idempotentności w X-Idempotency-Key oraz typ w X-Event-Type. Ponowne próby z wykładniczym opóźnieniem do ~33 h.

Maksymalnie 5 punktów końcowych na konto. Obsługiwane zdarzenia i schematy ładunków są udokumentowane dla każdej usługi.

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

Powiadomienia

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

Opinie

POST/api/v2/feedback

Specyfikacja OpenAPI 3.1

Pełna, czytelna maszynowo specyfikacja API znajduje się pod adresem /openapi.json. Użyj jej do automatycznego generowania typowanych klientów w dowolnym języku (TypeScript, Python, Go, Rust, …) lub do importu do 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

Kody błędów

KodZnaczenie
400Brakujące pole, nieprawidłowy JSON, nieprawidłowy format
401Brak X-Api-Key / Bearer, wygasły lub nieprawidłowy token
402Brak aktywnej subskrypcji dla usługi
403Token nie należy do tego konta lub usługa jest w wersji beta bez listy dozwolonych
404Klucz / token / endpoint nie został znaleziony
409E-mail już zarejestrowany / klucz już istnieje / limit endpointów (5) / limit filtrów (20)
410Token lub kod wygasł albo został już wykorzystany
412E-mail niezweryfikowany — krok 2 nie został jeszcze ukończony
429Limit zapytań (nagłówek Retry-After)
500Błąd serwera