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.
Utiliser via le web
Pour la majorité des utilisateurs. Inscription, filtres, digest par e-mail, application mobile.
Accéder ↓Intégration via l'API
Pour les développeurs. API REST, webhooks, spécification OpenAPI, MCP pour les agents IA.
Accéder ↓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 :
- Région — un département ou plusieurs départements (Paris, Île-de-France, …)
- Secteur — catégorie d'appels d'offres (Travaux de construction, Développement informatique, …) ou code CPV
- Mots-clés — mots devant figurer dans l'intitulé ou la description (ex. : « réhabilitation de pont »)
- 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.
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ètre | Type | Description |
|---|---|---|
| Account API — lecture | 60/min, 5 000/jour | GET sur /api/v2/account/* |
| Account API — écriture | 10/min, 200/jour | POST, PUT, PATCH, DELETE |
| API de service | 100/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é.
/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 }
}
}/api/v2/account/profile/api/v2/account/profileMot de passe et session
/api/v2/account/password/api/v2/account/password/api/v2/account/sessions/revokeClé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é.
/api/v2/account/keys/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.
/api/v2/account/keys/:id/api/v2/account/keys/:id/api/v2/account/keys/:id/api/v2/account/keys/:id/rotateAbonnements 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.
/api/v2/account/subscriptions/api/v2/account/subscriptions{ "service": "LEADS", "scope": "CZ", "mode": "trial" }/api/v2/account/subscriptions/batch{ "service": "LEADS", "scopes": ["CZ","SK","DE"], "mode": "trial" }/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.
/api/v2/account/usage?days=30Facturation
/api/v2/account/billing/api/v2/account/billing/api/v2/account/billing/checkout/api/v2/account/billing/customer-portal/api/v2/account/billing/proforma{ "cycle": "MONTHLY", "currency": "CZK", "scopes": ["CZ","SK"] }/api/v2/account/billing/invoices/api/v2/account/billing/invoices/:invoiceIdExport des données (RGPD)
/api/v2/account/export/api/v2/account/exportRésiliation du compte
/api/v2/account/cancel/request{ "action": "DEACTIVATE" }/api/v2/account/cancel/confirmWebhooks
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.
/api/v2/account/webhooks/api/v2/account/webhooks{
"url": "https://yourapp.cz/api/veritra-webhook",
"enabledEvents": ["leads.match.created"],
"description": "production"
}/api/v2/account/webhooks/:id/api/v2/account/webhooks/:id/api/v2/account/webhooks/:id/api/v2/account/webhooks/:id/rotate-secretNotifications
/api/v2/account/notifications/api/v2/account/notificationsFeedback
/api/v2/feedbackSpé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
| Code | Signification |
|---|---|
| 400 | Champ manquant, JSON invalide, format invalide |
| 401 | X-Api-Key / Bearer absent, token expiré ou invalide |
| 402 | Aucun abonnement actif pour le service concerné |
| 403 | Le token n'appartient pas à ce compte, ou le service est en bêta sans liste blanche |
| 404 | Clé / token / endpoint introuvable |
| 409 | L'e-mail est déjà enregistré / la clé existe déjà / limite d'endpoints (5) / limite de filtres (20) |
| 410 | Le token ou le code a expiré, ou a déjà été utilisé |
| 412 | L'e-mail n'est pas vérifié — l'étape 2 n'a pas encore été complétée |
| 429 | Limite de débit (Retry-After dans l'en-tête) |
| 500 | Erreur serveur |
Services API disponibles
L'Account API (ci-dessus) est commun à tous — onboarding, clés, facturation, webhooks. Les données spécifiques se trouvent dans les API de domaine :
Surveillance des marchés publics
Marchés issus de 7 portails — filtres, digest quotidien, REST API et webhooks
Postes de prix des travaux
Prix des postes de construction — moyenne, min/max issus des contrats
Gestion des appels d'offres
Soumission programmatique d'offres sur les portails (NEN, E-ZAK, TenderArena)
MCP — pour les agents IA
Connexion à Claude Desktop ou à votre propre agent LLM via les outils JSON-RPC
Des questions ? michal@veritra.io