Documentation

Prise en main

veritra.io surveille les appels d'offres publics dans toute l'UE. Vous pouvez utiliser le service via le tableau de bord web ou vous connecter via l'API REST.

Utilisation via le web

Démarrer avec le tableau de bord

Aucune installation ni programmation nécessaire. Il vous suffit d'un navigateur et d'une adresse e-mail.

1. Créez votre compte

Rendez-vous sur /register et renseignez votre adresse e-mail, votre nom et, facultativement, le numéro SIRET de votre entreprise. Si vous indiquez le numéro SIRET, la raison sociale, le numéro de TVA et l'adresse sont automatiquement récupérés depuis le registre ARES.

Vous ne définissez pas encore de mot de passe — vous le configurerez à l'étape suivante en cliquant sur le lien de vérification reçu par e-mail.

2. Vérifiez votre e-mail et définissez votre mot de passe

En quelques secondes, vous recevrez un e-mail contenant un lien de vérification. Cliquez dessus. Une page s'ouvrira pour vous permettre de définir votre mot de passe (8 caractères minimum).

Une fois le mot de passe défini, vous êtes connecté et pouvez accéder directement au tableau de bord.

3. Créez votre premier filtre d'appels d'offres

Dans le tableau de bord, cliquez sur Appels d'offres → Nouveau filtre. Un filtre est un ensemble de critères enregistrés selon lesquels le système vous envoie des appels d'offres :

  1. Région — un département ou plusieurs départements (Paris, Île-de-France, …)
  2. Secteur — catégorie d'appels d'offres (Travaux de construction, Développement informatique, …) ou code CPV
  3. Mots-clés — mots devant figurer dans l'intitulé ou la description (ex. : « réhabilitation de pont »)
  4. Valeur — valeur estimée minimale/maximale du marché

La description détaillée de tous les paramètres du filtre est disponible dans la documentation du Gestionnaire d'appels d'offres.

4. Activez le récapitulatif e-mail quotidien

Pour chaque filtre, vous pouvez activer un récapitulatif e-mail quotidien. Chaque jour à 7h00, vous recevrez un e-mail listant les appels d'offres apparus ce jour-là et correspondant à votre filtre.

Le récapitulatif s'active directement dans le détail du filtre — via le bouton « Récapitulatif e-mail » en haut de page. Vous pouvez avoir plusieurs filtres, chacun avec ses propres paramètres de récapitulatif.

Intégration via API

REST API

Si vous souhaitez accéder aux données par programmation — par exemple les connecter à votre ERP ou CRM — utilisez le REST API. Tous les endpoints se trouvent sous /api/v2, l'authentification s'effectue via une clé API. La plupart des endpoints renvoient du JSON dans une enveloppe avec une clé unique 'data' ; les exceptions sont les factures PDF (binaire), l'export des correspondances (CSV/XLSX, sauf si vous choisissez format=json) et l'aperçu de document (redirection 302 vers une URL signée).

Hello world

Une fois votre clé obtenue, vous appelez l'API comme suit :

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

Renvoie un JSON avec les appels d'offres ouverts les plus récents. Les paramètres de recherche complets sont disponibles dans la documentation du Gestionnaire d'appels d'offres.

Comment obtenir une clé

La première clé API est générée depuis le tableau de bord : inscrivez-vous sur le site, vérifiez votre e-mail, puis rendez-vous dans Paramètres → Intégrations cliquez sur « Générer la clé ». La clé s'affiche une seule fois — enregistrez-la immédiatement (par ex. dans env / secrets store). Si vous la perdez, créez-en une nouvelle et supprimez l'ancienne.

Utilisation dans les clients MCP (Claude Desktop, Cursor, …)

La clé est identique à celle de l'API REST. Seule la manière dont le client l'envoie diffère : le serveur MCP s'exécute sur /api/mcp et la clé est transmise dans le header X-Api-Key lors du handshake. La configuration complète pour Claude Desktop, Cursor et les clients HTTP génériques se trouve dans la documentation MCP.

Authentification

Tous les endpoints /api/v2 s'authentifient avec une seule clé API (format mrw_live_HEX64). Vous pouvez envoyer la clé en tant que header X-Api-Key ou comme 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

La clé porte l'identité de l'utilisateur. Les services qu'elle peut appeler sont régis par son abonnement (voir la section Subscriptions). Vous pouvez avoir jusqu'à 5 clés actives — utile pour séparer prod / dev / par système.

Enveloppe de réponse

Tous les endpoints v2 retournent une enveloppe JSON unifiée. Ressource unique sous data, listes paginées sous data + pagination, erreurs sous error.

Succès

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

// Paginated list
{
  "data": [{ "…": "…" }],
  "pagination": { "nextCursor": "abc123…", "totalCount": 42 }
}

Erreur

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

Codes d'erreur stables : UNAUTHORIZED, FORBIDDEN, NOT_FOUND, VALIDATION_ERROR, CONFLICT, RATE_LIMITED, ENTITLEMENT_REQUIRED, INTERNAL. Le client doit brancher sur code, et non sur message — le statut HTTP est mappé automatiquement sur le code.

Limites de débit

ParamètreTypeDescription
Account API — lecture60/min, 5 000/jourGET sur /api/v2/account/*
Account API — écriture10/min, 200/jourPOST, PUT, PATCH, DELETE
API de service100/h/cléQuota mensuel selon le service concerné — voir la documentation du service

En cas de dépassement, l'API retourne HTTP 429 et le header Retry-After (secondes).

Période d'essai et facturation

Après la création du compte, vous bénéficiez de 1 jour d'essai gratuit pour le Moniteur de marchés publics — sans carte, sans profil de facturation. Ensuite, une carte enregistrée ou une facture d'acompte réglée est requise, faute de quoi le service passe en SUSPENDED et les appels suivants retournent 403. Aucun forfait par palier — vous payez pour un service spécifique, résiliable à tout moment.

Account API

Gestion du compte, des clés, de la facturation et des webhooks. Tous les endpoints /api/v2/account/* requièrent une authentification par clé.

GET/api/v2/account/me

Équivalent de /profile + /subscriptions + infos apiKey. Recommandé pour le chargement initial dans les clients 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

Mot de passe et session

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

Clés API

La clé authentifie l'accès à l'ensemble de l'API. Vous pouvez avoir jusqu'à 5 clés actives. La clé brute n'est retournée qu'à la création ou à la rotation — elle ne peut ensuite être récupérée qu'en créant une nouvelle clé.

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

La clé dans la réponse n'est disponible en clair qu'à cet endroit. Le serveur ne conserve que le hachage SHA-256 ; la clé brute ne peut plus être récupérée ensuite. En cas de perte, créez une nouvelle clé et supprimez l'ancienne.

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

Abonnements aux services

Activation de l'essai, aperçu de l'état, annulation planifiée à la date paidUntil/trialEndsAt. Pour les activations payantes (par carte), utilisez /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 }

Utilisation de l'API

Agrégat journalier du nombre d'appels de la clé API sur les N derniers jours (défaut 30). Pour la surveillance de la consommation des limites de débit.

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

Facturation

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

Export des données (RGPD)

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

Résiliation du compte

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

Webhooks

Webhooks au niveau du compte — un seul endpoint couvre tous les filtres et les futurs services. Chaque événement porte une signature HMAC-SHA256 dans X-Signature-256, une clé d'idempotence dans X-Idempotency-Key et le type dans X-Event-Type. Nouvelle tentative avec backoff exponentiel jusqu'à ~33 h.

Maximum 5 endpoints par compte. Les événements pris en charge et les schémas de payload sont documentés dans la documentation de chaque service.

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

Notifications

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

Feedback

POST/api/v2/feedback

Spécification OpenAPI 3.1

La spécification complète lisible par machine de l'API est disponible sur /openapi.json. Utilisez-la pour générer automatiquement un client typé dans n'importe quel langage (TypeScript, Python, Go, Rust, …) ou pour l'importer dans 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

Codes d'erreur

CodeSignification
400Champ manquant, JSON invalide, format invalide
401X-Api-Key / Bearer absent, token expiré ou invalide
402Aucun abonnement actif pour le service concerné
403Le token n'appartient pas à ce compte, ou le service est en bêta sans liste blanche
404Clé / token / endpoint introuvable
409L'e-mail est déjà enregistré / la clé existe déjà / limite d'endpoints (5) / limite de filtres (20)
410Le token ou le code a expiré, ou a déjà été utilisé
412L'e-mail n'est pas vérifié — l'étape 2 n'a pas encore été complétée
429Limite de débit (Retry-After dans l'en-tête)
500Erreur serveur

Des questions ? michal@veritra.io