1.Aperçu
API REST
Les données de votre compte en JSON, sur HTTPS, en lecture seule.
Serveur MCP
Les mêmes données pour vos agents IA (Claude, Cursor, VS Code, Codex…), par le protocole MCP. Outils en lecture seule.
Accès
Forfait Équipe. Les autres forfaits reçoivent une réponse 402 plan_required. L'API et le MCP partagent les mêmes clés et les mêmes plafonds.
2.Démarrer
Créez une clé
Le titulaire du compte crée la clé dans Réglages › API et MCP. La clé complète ne s'affiche qu'une fois : gardez-la dans un gestionnaire de secrets. Au plus 3 clés actives par compte.
Authentifiez chaque requête
Envoyez la clé dans l'en-tête
Authorization: Bearer dsk_live_…. Sans clé valide, l'API répond 401.Appelez l'API
Toutes les routes sont sous
https://api.discer.ca/api/v1. Par exemple, chercher les avis ouverts qui contiennent « pavage » :
export DISCER_API_KEY="dsk_live_VOTRE_CLE"
curl "https://api.discer.ca/api/v1/tenders?q=pavage®ion=5&limit=20" \
-H "Authorization: Bearer $DISCER_API_KEY"import os
import requests
response = requests.get(
"https://api.discer.ca/api/v1/tenders",
params={"q": "pavage", "region": 5, "limit": 20},
headers={"Authorization": f"Bearer {os.environ['DISCER_API_KEY']}"},
timeout=30,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{response.status_code} {body['error']['code']}: {body['error']['message']}")
for tender in body["data"]:
print(tender["id"], tender["closes_at"], tender["title"])const params = new URLSearchParams({ q: "pavage", region: "5", limit: "20" });
const response = await fetch(`https://api.discer.ca/api/v1/tenders?${params}`, {
headers: { Authorization: `Bearer ${process.env.DISCER_API_KEY}` },
});
const body = await response.json();
if (!response.ok) {
throw new Error(`${response.status} ${body.error.code}: ${body.error.message}`);
}
for (const tender of body.data) {
console.log(tender.id, tender.closes_at, tender.title);
}{
"data": [
{
"id": "1234567",
"source": "seao",
"title": "Réfection de pavage, rue des Exemples",
"buyer": "Ville de Exempleville",
"buyer_city": "Exempleville",
"region_code": 5,
"region": "Estrie",
"province": "QC",
"published_at": "2026-10-01T09:00:00-04:00",
"closes_at": "2026-10-22T14:00:00-04:00",
"days_left": 19,
"estimated_value": 850000,
"unspsc": "72141100",
"language": "fr",
"relevance": null
}
],
"pagination": {
"next_cursor": "eyJvIjoyMCwiZiI6ImFiYzEyMyJ9",
"has_more": true,
"total": 37
}
}Portée d'une clé : lecture. L'API et le serveur MCP sont en lecture seule.
3.Conventions
- Réponses en JSON :
{"data": …}; les listes ajoutentpagination. - Horodatages : ISO 8601 avec décalage horaire, par exemple
2026-10-22T14:00:00-04:00. - Filtres de dates (
published_after,closing_before…) : jours civils à l'heure du Québec (America/Toronto) ;_afterest inclus,_beforeest exclu. - Montants : dollars canadiens, tels que publiés. Les champs qui finissent par
_2026_dollarssont indexés en dollars de 2026. - Statistiques : chiffres
{value, n, period: {from, to}, source}, oùnest la taille de l'échantillon. Citez-les avecnet la période. - Notes explicatives (
note,definition), libellés et certaines valeurs énumérées sont en français. - Aucune coordonnée de personne n'est renvoyée : seuls les organismes publics et les entreprises soumissionnaires, telles que publiées au SEAO, sont nommés.
4.Pagination
Les listes paginées renvoient pagination.next_cursor, pagination.has_more et pagination.total. Renvoyez le curseur dans le paramètre cursor, avec les mêmes filtres : un curseur émis pour d'autres filtres est refusé (422 invalid_cursor).
limit va de 1 à 100 (50 par défaut). Une requête filtrée s'arrête à 1 000 résultats (422 pagination_limit) : affinez les filtres pour aller plus loin. La recherche d'avis et les renouvellements exigent au moins un filtre.
url = "https://api.discer.ca/api/v1/tenders"
headers = {"Authorization": f"Bearer {os.environ['DISCER_API_KEY']}"}
params = {"q": "pavage", "region": 5, "limit": 100}
tenders = []
while True:
body = requests.get(url, params=params, headers=headers, timeout=30).json()
tenders.extend(body["data"])
if not body["pagination"]["has_more"]:
break
params["cursor"] = body["pagination"]["next_cursor"]5.Routes
Les 19 opérations de la version 1.2.0, tirées de la définition OpenAPI de l'API. Chaque route exige une clé ; les statuts possibles sont indiqués sous chaque route.
Compte
/meVotre compte, votre forfait et votre clé
Le compte de la clé, son forfait et les portées de la clé. Sert à tester une clé.
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
Avis
/tendersPaginéeChercher des avis ouverts
Avis ouverts aujourd'hui. Au moins un filtre est obligatoire. Les dates _after sont incluses, les dates _before exclues. Chaque ligne renvoyée compte dans les lignes de listes du compte.
Paramètres
qstringrequêtefacultatifMots du titre ou du nom du donneur d'ouvrage, par exemple
pavage.200 caractères au plus
sourcestringrequêtefacultatifSource de l'avis.
Valeurs :
seao,canadabuys,torontoprovincestring[]requêtefacultatifrépétableCode ISO de province (QC, ON…), répétable. Les avis pancanadiens sont inclus.
regioninteger[]requêtefacultatifrépétableCode de région administrative du Québec (1 à 17), répétable.
unspscstringrequêtefacultatifDébut de code UNSPSC, de 2 à 8 chiffres, par exemple
7214.Motif :
^\d{2,8}$buyerstringrequêtefacultatifPartie du nom du donneur d'ouvrage, par exemple
Ville de Lévis.200 caractères au plus
published_afterdaterequêtefacultatifDate AAAA-MM-JJ, heure du Québec (America/Toronto). Incluse.
published_beforedaterequêtefacultatifDate AAAA-MM-JJ, heure du Québec (America/Toronto). Exclue.
closing_afterdaterequêtefacultatifDate AAAA-MM-JJ, heure du Québec (America/Toronto). Incluse.
closing_beforedaterequêtefacultatifDate AAAA-MM-JJ, heure du Québec (America/Toronto). Exclue.
profilestringrequêtefacultatifId d'un profil de veille (
principalou un id de /watch-profiles) : ajouterelevanceet classe par score ;sortest alors ignoré.40 caractères au plus
sortstringrequêtefacultatifclosing_asc: fermeture la plus proche d'abord ;published_desc: plus récents d'abord.Défaut :
closing_ascValeurs :closing_asc,published_desclimitintegerrequêtefacultatifTaille de la page, de 1 à 100.
Défaut :
50De 1 à 100cursorstringrequêtefacultatifpagination.next_cursorde la page précédente. Envoyez les mêmes filtres avec lui.200 caractères au plus
Succès : 200 · Erreurs possibles : 401, 402, 403, 404, 409, 422, 429
/tenders/{tender_id}Fiche d'un avis et son intelligence
Faits de l'avis et, pour les avis SEAO, son intelligence : l'essentiel, probabilité de gain (si le segment est calibré), fourchette des prix gagnants (même sous-catégorie quand elle existe), soumissionnaires attendus et leurs chances de soumissionner, compétitivité et position de prix (avis ouverts), historique du donneur d'ouvrage pour ce type d'avis, avenants. Compte comme une fiche d'avis distincte dans les plafonds du jour et du mois.
Paramètres
tender_idstringcheminobligatoireidde l'avis venant de /tenders : numéro SEAO, ou CB-…, TOR-… pour les autres sources.40 caractères au plus
intelligencebooleanrequêtefacultatifInclure le bloc d'intelligence (avis SEAO).
Défaut :
true
Succès : 200 · Erreurs possibles : 401, 402, 403, 404, 422, 429
Vos données
/bidsPaginéeVotre Pipeline (avis par étape)
Cartes du Pipeline du compte, sans les cartes écartées : étape, prix soumis, pertinence, avis suivis et leurs nouveautés (addendas, changements de fermeture, résultat publié). Ne compte pas dans les lignes de listes.
Paramètres
statusstringrequêtefacultatifÉtape du Pipeline.
Valeurs :
to_evaluate,preparing,submitted,won,lostlimitintegerrequêtefacultatifTaille de la page, de 1 à 100.
Défaut :
50De 1 à 100cursorstringrequêtefacultatifpagination.next_cursorde la page précédente. Envoyez les mêmes filtres avec lui.200 caractères au plus
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
/watch-profilesProfils de veille (leur id sert dans /tenders?profile=)
Profils de veille du compte : types d'avis UNSPSC, mots-clés, régions, valeurs.
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
Marché
- GET /renewals
- GET /companies
- GET /companies/{neq}
- GET /buyers
- GET /buyers/{buyer_id}
- GET /market
- GET /market/competitors
- GET /market/portrait
/renewalsPaginéeRenouvellements à venir (contrats qui se terminent, avec leurs titulaires)
Contrats issus d'appels d'offres (pas de gré à gré) dont la fin prévue tombe dans l'horizon, avec leurs titulaires ; les contrats de votre entreprise d'abord (is_you). Un nouvel appel d'offres n'est pas confirmé. Au moins un des filtres family, region, buyer_id ou for_me est obligatoire. Chaque ligne renvoyée compte dans les lignes de listes du compte.
Paramètres
familystringrequêtefacultatifDébut de code UNSPSC, 2 ou 4 chiffres, par exemple
7214.Motif :
^\d{2,4}$regionintegerrequêtefacultatifCode de région administrative du Québec (1 à 17).
De 1 à 17
buyer_idintegerrequêtefacultatifId du donneur d'ouvrage venant de /buyers.
Au moins 1
horizon_monthsintegerrequêtefacultatifContrats dont la fin prévue tombe dans les N prochains mois.
Défaut :
12De 1 à 24for_mebooleanrequêtefacultatifSeulement votre créneau (types d'avis, mots-clés et régions du profil de veille), comme la page Renouvellements.
Défaut :
falseall_regionsbooleanrequêtefacultatifAvec
for_meet un profil « tout le Québec » qui a des régions prioritaires : tout le Québec plutôt que ces régions.Défaut :
falselimitintegerrequêtefacultatifTaille de la page, de 1 à 100.
Défaut :
50De 1 à 100cursorstringrequêtefacultatifpagination.next_cursorde la page précédente. Envoyez les mêmes filtres avec lui.200 caractères au plus
Succès : 200 · Erreurs possibles : 401, 402, 403, 409, 422, 429, 503
/companiesChercher une entreprise par nom ou NEQ
Entreprises qui ont soumissionné au SEAO, trouvées par nom (sans égard aux accents, à la casse ni aux suffixes juridiques) ou par NEQ, 10 au plus. Chaque résultat compte dans les lignes de listes du compte.
Paramètres
qstringrequêteobligatoirePartie du nom de l'entreprise, ou début de son NEQ (3 à 10 chiffres).
De 2 à 80 caractères
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
/companies/{neq}Fiche d'une entreprise (historique SEAO)
Soumissions, contrats obtenus, taux de succès, principaux donneurs d'ouvrage, types d'avis, régions, principaux concurrents avec duels, dernières soumissions et leurs prix, force sur son marché, avenants de ses contrats. Compte comme une fiche d'entreprise distincte.
Paramètres
neqstringcheminobligatoireNuméro d'entreprise du Québec, 10 chiffres.
Succès : 200 · Erreurs possibles : 401, 402, 403, 404, 422, 429
/buyersChercher un donneur d'ouvrage par nom
Donneurs d'ouvrage publics (villes, ministères, centres de services scolaires…), les plus actifs d'abord, 10 au plus. Chaque résultat compte dans les lignes de listes du compte.
Paramètres
qstringrequêteobligatoirePartie du nom du donneur d'ouvrage, par exemple
Ville de Québec.De 2 à 120 caractères
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
/buyers/{buyer_id}Fiche d'un donneur d'ouvrage (achats, gagnants, prix, gré à gré, avenants)
Achats par type d'avis UNSPSC sur 5 ans, principaux gagnants, fourchettes de prix, présence sur le marché, contrats de gré à gré et avenants. Compte comme une fiche de donneur d'ouvrage distincte.
Paramètres
buyer_idintegercheminobligatoireId du donneur d'ouvrage venant de /buyers.
Succès : 200 · Erreurs possibles : 401, 402, 403, 404, 422, 429
/marketVotre bilan de marché (historique SEAO de votre entreprise, concurrents, avis ratés)
Bilan de marché de l'entreprise du compte : créneau, chiffres, concurrents, avis ratés. report est nul si le compte n'a pas de NEQ ; un NEQ non vérifié donne le bilan public.
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
/market/competitorsEntreprises qui gagnent le plus dans votre créneau
Entreprises qui ont obtenu le plus de contrats dans votre créneau en 36 mois (vos soumissions, sinon votre profil de veille) : contrats obtenus, soumissions, taux de victoire, dernière soumission, et le taux médian des entreprises actives. Utile aussi à une entreprise qui soumissionne peu ou jamais ; la vôtre n'y figure pas.
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
/market/portraitChiffres du marché de votre créneau
Pour les 3 premiers types d'avis UNSPSC de votre créneau (vos soumissions, sinon votre profil de veille) : avis publiés, avis ouverts, soumissionnaires par avis, montants octroyés, principaux donneurs d'ouvrage, avis par mois. Votre région si le profil n'en a qu'une, sinon tout le Québec.
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
Avis conclus
/concluded-tendersPaginéeChercher des avis conclus (gagnants, montants, soumissionnaires)
Avis du SEAO conclus depuis 2015, comme la page Historique : gagnant, montant gagnant, nombre de soumissionnaires, écart entre les deux plus bas prix soumissionnés, votre propre résultat. Au moins un filtre est obligatoire. Les dates _after sont incluses, les dates _before exclues (date de conclusion, sinon de publication). Chaque ligne renvoyée compte dans les lignes de listes du compte.
Paramètres
qstringrequêtefacultatifMots du titre, par exemple
pavage.200 caractères au plus
unspscstringrequêtefacultatifType d'avis UNSPSC (4 chiffres) ou segment (2 chiffres), par exemple
7214.Motif :
^\d{2}(\d{2})?$buyer_idintegerrequêtefacultatifId du donneur d'ouvrage venant de /buyers.
Au moins 1
regionintegerrequêtefacultatifCode de région administrative du Québec (1 à 17).
De 1 à 17
concluded_afterdaterequêtefacultatifDate AAAA-MM-JJ, heure du Québec (America/Toronto). Incluse.
concluded_beforedaterequêtefacultatifDate AAAA-MM-JJ, heure du Québec (America/Toronto). Exclue.
min_amountnumberrequêtefacultatifMontant gagnant minimal, en dollars canadiens.
Au moins 0
max_amountnumberrequêtefacultatifMontant gagnant maximal, en dollars canadiens.
Au moins 0
companystringrequêtefacultatifNEQ d'une entreprise qui a soumissionné (ou gagné, avec
role=won).Motif :
^\d{10}$rolestringrequêtefacultatifAvec
company: les avis où elle a soumissionné, ou ceux qu'elle a gagnés.Défaut :
bidValeurs :bid,wonminebooleanrequêtefacultatifSeulement les avis où votre entreprise a soumissionné (NEQ vérifié).
Défaut :
falsemin_biddersintegerrequêtefacultatifNombre minimal de soumissionnaires.
De 1 à 500
max_biddersintegerrequêtefacultatifNombre maximal de soumissionnaires.
De 1 à 500
pricesstringrequêtefacultatifwith: tous les prix publiés ;without: prix non publiés.Valeurs :
with,withoutsortstringrequêtefacultatifrecent: plus récents d'abord ;amount: montant le plus élevé d'abord ;gap: plus grand écart entre les deux plus bas prix soumissionnés d'abord.Défaut :
recentValeurs :recent,amount,gaplimitintegerrequêtefacultatifTaille de la page, de 1 à 50.
Défaut :
25De 1 à 50cursorstringrequêtefacultatifpagination.next_cursorde la page précédente. Envoyez les mêmes filtres avec lui.200 caractères au plus
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429, 503
/concluded-tenders/{tender_id}Un avis conclu : chaque soumission et son prix
Chaque soumissionnaire avec son prix, son rang et son écart au gagnant, deuxième plus bas prix, dispersion des prix, avenants du contrat, avis conclus semblables. Compte comme une fiche d'avis distincte.
Paramètres
tender_idstringcheminobligatoireNuméro SEAO venant de /concluded-tenders.
Motif :
^\d{1,12}$
Succès : 200 · Erreurs possibles : 401, 402, 403, 404, 422, 429, 503
Sous-traitance
/subcontracting/openPaginéeAvis ouverts où l'un de vos métiers peut être requis
Avis ouverts où l'un des métiers de vos réglages de sous-traitance peut être requis (licence RBQ en construction, analyse des documents ailleurs), comme la page Sous-traitance. Vide si le compte n'a aucun métier. Chaque ligne renvoyée compte dans les lignes de listes du compte.
Paramètres
tradestringrequêtefacultatifUn de vos métiers (code de
trade_codes: sous-catégorie RBQ comme4.1, code de service oulibre:…).90 caractères au plus
regionintegerrequêtefacultatifCode de région administrative du Québec (1 à 17).
De 1 à 17
min_amountnumberrequêtefacultatifValeur estimée minimale, en dollars canadiens.
Au moins 0
max_amountnumberrequêtefacultatifValeur estimée maximale, en dollars canadiens.
Au moins 0
since_daysintegerrequêtefacultatifPubliés depuis N jours.
De 1 à 365
limitintegerrequêtefacultatifTaille de la page, de 1 à 50.
Défaut :
25De 1 à 50cursorstringrequêtefacultatifpagination.next_cursorde la page précédente. Envoyez les mêmes filtres avec lui.200 caractères au plus
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429, 503
/subcontracting/awardedPaginéeAvis adjugés dans vos métiers : gagnants à contacter
Avis adjugés dans vos métiers, votre région et votre plage de montants : l'entreprise gagnante à contacter pour de la sous-traitance (nom, NEQ, ville), montant, métiers. Le contact publié par le SEAO se lit dans Discer seulement. Chaque ligne renvoyée compte dans les lignes de listes du compte.
Paramètres
tradestringrequêtefacultatifUn de vos métiers (code de
trade_codes: sous-catégorie RBQ comme4.1, code de service oulibre:…).90 caractères au plus
regionintegerrequêtefacultatifCode de région administrative du Québec (1 à 17).
De 1 à 17
min_amountnumberrequêtefacultatifMontant gagnant minimal, en dollars canadiens.
Au moins 0
max_amountnumberrequêtefacultatifMontant gagnant maximal, en dollars canadiens.
Au moins 0
since_daysintegerrequêtefacultatifConclus depuis 30, 90 ou 365 jours.
Défaut :
90De 30 à 365winnerstringrequêtefacultatifSeulement les avis gagnés par ce NEQ (tous métiers).
Motif :
^\d{10}$buyer_idintegerrequêtefacultatifSeulement les avis de ce donneur d'ouvrage (tous métiers).
Au moins 1
limitintegerrequêtefacultatifTaille de la page, de 1 à 50.
Défaut :
25De 1 à 50cursorstringrequêtefacultatifpagination.next_cursorde la page précédente. Envoyez les mêmes filtres avec lui.200 caractères au plus
Succès : 200 · Erreurs possibles : 401, 402, 403, 422, 429
Avis privés
/private-tendersAvis privés envoyés à votre organisation
Avis privés publiés sur Discer par des donneurs d'ouvrage publics et privés. Lecture seule : l'intérêt, les questions et les soumissions se donnent dans Discer. Chaque ligne renvoyée compte dans les lignes de listes du compte.
Paramètres
viewstringrequêtefacultatiffor_you: les avis privés où votre organisation est invitée ou ciblée ;all: tous les avis privés ouverts.Défaut :
for_youValeurs :for_you,all
Succès : 200 · Erreurs possibles : 401, 402, 403, 404, 422, 429
/private-tenders/{private_tender_id}Un avis privé
L'avis privé tel que votre organisation le voit. Le lire ici n'enregistre ni intérêt ni lecture (l'ouvrir dans Discer le fait). Compte comme une fiche d'avis distincte.
Paramètres
private_tender_idstringcheminobligatoireidvenant de /private-tenders.40 caractères au plus
Succès : 200 · Erreurs possibles : 401, 402, 403, 404, 422, 429
6.Erreurs
Toute erreur renvoie un objet error avec code, message et, au besoin, details. Le code est stable ; le message, en anglais, peut changer.
{
"error": {
"code": "invalid_parameter",
"message": "Invalid parameters.",
"details": {
"errors": [
{
"parameter": "limit",
"message": "Input should be less than or equal to 100"
}
]
}
}
}- 401
missing_api_keyAucun en-têteAuthorization: Bearer. - 401
invalid_api_keyClé inconnue ou mal formée. - 401
revoked_api_keyLa clé a été révoquée dans les Réglages. - 402
plan_requiredLe compte n'est pas au forfait Équipe, ou son abonnement est inactif. - 402
subscription_pausedL'abonnement est en pause : l'accès reprend avec lui. - 402
first_payment_requiredPériode d'essai : l'API et le MCP s'ouvrent au premier paiement. - 403
api_key_suspendedLa clé est suspendue en attente d'une revue, après un usage inhabituel. - 403
account_under_reviewL'API, le MCP, l'assistant et les exports sont en pause en attente d'une revue. - 403
account_disabledLe compte est désactivé. - 404
not_foundAvis, entreprise, donneur d'ouvrage, profil de veille ou chemin inconnu. - 405
method_not_allowedMéthode HTTP non prise en charge sur ce chemin. - 409
profile_inactiveCe profil de veille est inactif au forfait actuel. - 409
profile_incompletefor_meexige un profil de veille avec des catégories ou des mots-clés. - 422
invalid_parameterUn paramètre manque ou est invalide (details.errorsles énumère). - 422
invalid_cursorLe curseur est mal formé ou a été émis pour d'autres filtres. - 422
filter_required/tenderset/renewalsexigent au moins un filtre. - 422
pagination_limitLa pagination s'arrête au plafond de résultats d'une requête filtrée : affinez les filtres. - 429
rate_limitedTrop de requêtes dans la dernière minute. - 429
quota_exceededPlafond quotidien ou mensuel de requêtes atteint. - 429
entity_quota_exceededPlafond quotidien ou mensuel de fiches distinctes atteint. - 429
row_quota_exceededPlafond quotidien ou mensuel de lignes de listes atteint. - 429
temporarily_blockedAccès en pause pendant 24 heures après un usage inhabituel. - 500
internal_errorErreur inattendue du serveur : réessayez ; écrivez à thomas@contact.discer.ca si elle persiste. - 503
not_readyLes renouvellements sont en cours de calcul : réessayez plus tard.
Les réponses 429 portent l'en-tête Retry-After, en secondes.
7.Limites et garde-fous
Discer sert aux équipes qui préparent leurs propres soumissions, pas à copier sa base. Plafonds par compte, toutes clés et le serveur MCP confondus ; jours et mois à l'heure du Québec.
| Mesure | Par jour | Par mois |
|---|---|---|
| Requêtes (API et MCP)et 60 par minute | 2 000 | 30 000 |
| Fiches d'avis distinctes | 300 | 3 000 |
| Fiches d'entreprises distinctes | 200 | 2 000 |
| Fiches de donneurs d'ouvrage distinctes | 100 | 600 |
| Lignes de listes renvoyées | 5 000 | 60 000 |
- Une fiche déjà consultée ce mois-ci ne compte pas deux fois.
- Au plus 3 clés actives par compte ; au plus 1 000 résultats par requête filtrée.
- Au-delà d'un plafond : 429 avec l'en-tête
Retry-After. - Un usage systématique (fiches demandées dans l'ordre, pagination profonde) ralentit le compte, puis le met en pause, puis suspend ses clés en attente d'une revue (403
api_key_suspended). - L'extraction systématique, la revente, la reconstitution d'une base et l'entraînement de modèles avec les données de Discer sont interdits : voir les conditions d'utilisation. Vous acceptez ces règles en créant une clé.
8.Serveur MCP
Le serveur MCP donne les données de Discer à un agent IA, avec la même clé et les mêmes plafonds que l'API.
- URL
https://api.discer.ca/mcp- En-tête
Authorization: Bearer dsk_live_…- Transport
- HTTP streamable, sans état, réponses JSON.
/mcpet/mcp/répondent tous deux.
Configurer votre client
Une commande dans le terminal. Ajoutez --scope user pour l'avoir dans tous vos projets.
claude mcp add --transport http discer https://api.discer.ca/mcp \
--header "Authorization: Bearer dsk_live_VOTRE_CLE"Dans claude_desktop_config.json (Settings › Developer › Edit Config), puis redémarrez Claude Desktop. Demande Node.js : mcp-remote relaie le serveur distant. L'en-tête passe par une variable d'environnement, car Claude Desktop sous Windows n'échappe pas les espaces des arguments.
{
"mcpServers": {
"discer": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.discer.ca/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer dsk_live_VOTRE_CLE"
}
}
}
}Dans ~/.cursor/mcp.json (tous vos projets) ou .cursor/mcp.json (un projet). Cursor lit la clé dans la variable d'environnement DISCER_API_KEY.
{
"mcpServers": {
"discer": {
"url": "https://api.discer.ca/mcp",
"headers": {
"Authorization": "Bearer ${env:DISCER_API_KEY}"
}
}
}
}Dans .vscode/mcp.json. VS Code demande la clé au premier démarrage du serveur et la conserve de façon sécurisée.
{
"inputs": [
{
"type": "promptString",
"id": "discer-api-key",
"description": "Clé d'API Discer",
"password": true
}
],
"servers": {
"discer": {
"type": "http",
"url": "https://api.discer.ca/mcp",
"headers": {
"Authorization": "Bearer ${input:discer-api-key}"
}
}
}
}Dans ~/.codex/config.toml. Codex lit la clé dans la variable d'environnement DISCER_API_KEY.
[mcp_servers.discer]
url = "https://api.discer.ca/mcp"
bearer_token_env_var = "DISCER_API_KEY"Avec le SDK officiel mcp pour Python, version 2 : la liste des outils, puis un appel.
# pip install "mcp>=2.2"
import asyncio
import os
import httpx2
from mcp import Client
from mcp.client.streamable_http import streamable_http_client
async def main() -> None:
headers = {"Authorization": f"Bearer {os.environ['DISCER_API_KEY']}"}
async with httpx2.AsyncClient(headers=headers, timeout=60) as http:
transport = streamable_http_client("https://api.discer.ca/mcp", http_client=http)
async with Client(transport) as client:
tools = await client.list_tools()
print([tool.name for tool in tools.tools])
result = await client.call_tool("search_open_tenders", {"query": "pavage", "limit": 5})
print(result.content[0].text)
asyncio.run(main())Ne versionnez jamais une clé : préférez une variable d'environnement ou le stockage de secrets de votre client. Révoquez une clé exposée dans Réglages › API et MCP ; l'effet est immédiat.
9.Outils MCP
14 outils en lecture seule. Chaque outil renvoie du JSON compact ; les plafonds de l'API s'appliquent.
search_open_tendersLecture seuleCherche les avis OUVERTS aujourd'hui (SEAO et autres sources canadiennes) : id, titre, donneur d'ouvrage, date de fermeture, jours restants, valeur estimée, lien, et le nombre total de résultats. Ne révèle jamais qui prépare une soumission sur un avis ouvert.
Arguments
querystringfacultatifMots du titre ou du nom du donneur d'ouvrage, en français de préférence, par exemple « pavage ».
unspscstringfacultatifDébut de code UNSPSC, de 2 à 8 chiffres, par exemple « 7214 ».
Motif :
^\d{2,8}$regionstringfacultatifRégion administrative du Québec : code 1 à 17 ou nom, par exemple « Montérégie ».
buyerstringfacultatifPartie du nom du donneur d'ouvrage, par exemple « Ville de Lévis ».
sourcestringfacultatifseao, canadabuys ou toronto.
closing_within_daysintegerfacultatifSeulement les avis qui ferment dans les N prochains jours (heure du Québec).
De 1 à 365
use_watch_profilebooleanfacultatifClasser selon le profil de veille principal du compte (score 0 à 100).
Défaut :
falselimitintegerfacultatifNombre d'avis, de 1 à 25.
Défaut :
10De 1 à 25
get_tender_intelligenceLecture seuleIntelligence complète d'un avis : l'essentiel (en français), probabilité de gain calibrée de votre entreprise (seulement si le segment est calibré), fourchette des prix gagnants chez ce donneur d'ouvrage et pour ce type d'avis (dollars de 2026, avec n et période), écart attendu entre les deux plus bas prix soumissionnés, compétitivité et position de prix (avis ouverts), soumissionnaires attendus et leurs chances de soumissionner, historique du donneur d'ouvrage. De l'information, pas une recommandation. Compte comme une fiche d'avis distincte.
Arguments
tender_idstringobligatoireId de l'avis venant de search_open_tenders (numéro SEAO, par exemple « 20158453 »).
get_winning_priceLecture seulePrix gagnants observés pour un avis : P10 à P90 des soumissions gagnantes comparables (même sous-catégorie quand elle existe ; dollars de 2026, avec n et période), prix par 12 mois des services récurrents, écart attendu entre le plus bas et le deuxième prix, ratio prix gagnant sur estimation du donneur d'ouvrage, et position de prix des soumissions passées (avis ouverts). De l'information calculée sur l'historique, jamais une recommandation ni une garantie.
Arguments
tender_idstringobligatoireNuméro SEAO de l'avis, par exemple « 20158453 ».
get_likely_biddersLecture seuleEntreprises susceptibles de soumissionner sur un avis : soumissionnaires des avis conclus les plus semblables (ou 36 mois d'historique SEAO chez ce donneur d'ouvrage, pour ce type d'avis et cette région), avec leurs chances de soumissionner quand le modèle de Discer les a calculées, soumissions et contrats obtenus chez ce donneur d'ouvrage, et duels avec votre entreprise.
Arguments
tender_idstringobligatoireNuméro SEAO de l'avis, par exemple « 20158453 ».
get_buyer_profileLecture seuleFiche d'un donneur d'ouvrage public : achats par type d'avis UNSPSC (5 ans), principaux gagnants, fourchettes de prix, contrats de gré à gré et avenants. Donnez buyer_id, ou un nom : plusieurs résultats renvoient les candidats avec leur buyer_id.
Arguments
buyer_idintegerfacultatifId Discer du donneur d'ouvrage (venant d'un résultat précédent).
namestringfacultatifNom du donneur d'ouvrage à chercher, par exemple « Ville de Québec ».
get_company_profileLecture seuleHistorique SEAO d'une entreprise : soumissions, contrats obtenus, taux de succès, principaux donneurs d'ouvrage, types d'avis, régions, principaux concurrents avec duels, dernières soumissions et leurs prix. Donnez un NEQ, ou un nom : plusieurs résultats renvoient les candidats avec leur NEQ.
Arguments
neqstringfacultatifNuméro d'entreprise du Québec (10 chiffres).
Motif :
^\d{10}$namestringfacultatifNom de l'entreprise à chercher.
list_my_bidsLecture seulePipeline du compte (avis par étape, sans les cartes écartées) : avis, donneur d'ouvrage, étape, prix soumis, date de fermeture, notes, pertinence, avis suivis et leurs nouveautés (titres des addendas, changements de fermeture, résultat publié et gagnant, annulation).
Arguments
statusstringfacultatifÉtape du Pipeline : to_evaluate, preparing, submitted, won ou lost.
Valeurs :
to_evaluate,preparing,submitted,won,lostlimitintegerfacultatifNombre de cartes, de 1 à 100.
Défaut :
50De 1 à 100
list_upcoming_renewalsLecture seuleContrats issus d'appels d'offres dont la fin prévue tombe dans l'horizon, avec le titulaire : appels d'offres possibles (non confirmés). Donneur d'ouvrage, titre, fin prévue (AAAA-MM-JJ), montant, titulaires ; les contrats de votre entreprise d'abord (is_you). Sans family, region ni buyer_id : votre créneau (for_me).
Arguments
familystringfacultatifDébut de code UNSPSC, 2 ou 4 chiffres, par exemple « 7214 ».
Motif :
^\d{2,4}$regionstringfacultatifCode de région du Québec (1 à 17) ou nom, par exemple « Laurentides ».
buyer_idintegerfacultatifId Discer du donneur d'ouvrage (venant de get_buyer_profile).
Au moins 1
horizon_monthsintegerfacultatifFin prévue dans les N prochains mois.
Défaut :
12De 1 à 24for_mebooleanfacultatifSeulement le créneau du compte (profil de veille), comme la page Renouvellements.
Défaut :
falselimitintegerfacultatifNombre de contrats, de 1 à 50.
Défaut :
20De 1 à 50
search_concluded_tendersLecture seuleCherche les avis du SEAO conclus depuis 2015 : gagnant, montant gagnant (dollars canadiens), nombre de soumissionnaires, écart entre les deux plus bas prix soumissionnés, résultat du compte, et le nombre total de résultats. Donnez au moins un filtre.
Arguments
querystringfacultatifMots du titre, en français de préférence, par exemple « pavage ».
unspscstringfacultatifType d'avis UNSPSC (4 chiffres) ou segment (2 chiffres), par exemple « 7214 ».
Motif :
^\d{2}(\d{2})?$regionstringfacultatifRégion administrative du Québec : code 1 à 17 ou nom, par exemple « Montérégie ».
buyer_idintegerfacultatifId Discer du donneur d'ouvrage (venant de get_buyer_profile).
Au moins 1
company_neqstringfacultatifSeulement les avis où cette entreprise a soumissionné.
Motif :
^\d{10}$won_onlybooleanfacultatifAvec company_neq : seulement les avis qu'elle a gagnés.
Défaut :
falseminebooleanfacultatifSeulement les avis où l'entreprise du compte a soumissionné.
Défaut :
falseconcluded_within_monthsintegerfacultatifConclus dans les N derniers mois.
De 1 à 144
sortstringfacultatifrecent, amount (montant le plus élevé d'abord) ou gap (plus grand écart d'abord).
Défaut :
recentValeurs :recent,amount,gaplimitintegerfacultatifNombre d'avis, de 1 à 25.
Défaut :
10De 1 à 25
get_concluded_tenderLecture seuleUn avis conclu : chaque soumissionnaire avec son prix (dollars canadiens), son rang et son écart au gagnant, deuxième plus bas prix, avenants du contrat. Compte comme une fiche d'avis distincte.
Arguments
tender_idstringobligatoireNuméro SEAO d'un avis conclu.
Motif :
^\d{1,12}$
list_subcontracting_opportunitiesLecture seuleSous-traitance, d'après les métiers des réglages de sous-traitance du compte : avis ouverts où un métier peut être requis, ou avis adjugés avec l'entreprise gagnante à contacter (nom, NEQ, ville ; son contact publié se lit dans Discer seulement).
Arguments
kindstringfacultatifopen : avis ouverts où l'un des métiers du compte peut être requis ; awarded : avis adjugés dans ses métiers, avec le gagnant à contacter.
Défaut :
openValeurs :open,awardedtradestringfacultatifUn code de métier du compte (voir trade_codes dans un résultat précédent).
regionstringfacultatifCode de région du Québec (1 à 17) ou nom.
since_daysintegerfacultatifopen : publiés depuis N jours ; awarded : 30, 90 ou 365 (90 par défaut).
De 1 à 365
limitintegerfacultatifNombre d'avis, de 1 à 25.
Défaut :
10De 1 à 25
get_niche_marketLecture seuleLe créneau du compte (ses soumissions, sinon son profil de veille) : les entreprises qui y gagnent le plus en 36 mois (contrats obtenus, soumissions, taux de victoire) et les chiffres du marché pour ses 3 premiers types d'avis UNSPSC (avis publiés, soumissionnaires par avis, montants, principaux donneurs d'ouvrage). Utile aussi à une entreprise qui soumissionne peu ou jamais.
list_private_tendersLecture seuleAvis privés publiés sur Discer par des donneurs d'ouvrage (publics ou privés) : titre, donneur d'ouvrage, ville, date de fermeture, statut, invitation de l'organisation du compte et dépôt. Lecture seule.
Arguments
viewstringfacultatiffor_you : invité ou ciblé ; all : tous les avis privés ouverts.
Défaut :
for_youValeurs :for_you,all
get_private_tenderLecture seuleUn avis privé tel que l'organisation du compte le voit : portée, contraintes, dates, noms des documents, addendas, questions et réponses publiées, analyse des documents par Discer ; après l'ouverture, le résultat du compte et, au forfait Équipe, les soumissionnaires, les prix et le gagnant. Le lire ici n'enregistre aucun intérêt (l'ouvrir dans Discer le fait).
Arguments
private_tender_idstringobligatoireid venant de list_private_tenders.
10.Version et changements
Version actuelle : 1.2.0.
- 3 octobre 2026
/mcp/(barre finale) accepté sans redirection ; filtres de dates à l'heure du Québec ; paramètresourcelimité aux sources qui publient des avis (seao,canadabuys,toronto) ; erreurs 405, 500 et caractère nul au formaterror; schémas de réponse détaillés dans l'OpenAPI. - 29 septembre 2026 · 1.0.0Première version : 12 chemins, 8 outils MCP.