Le présent document décrit le fonctionnement de l'API développée pour rendre disponible les données de contrats et de subventions de la Ville de Montréal. L'API sert d'assise pour l'outil de visualisation des contrats et est également rendue disponible pour quiconque souhaite explorer les contrats.
Le code de l'API est disponible sous licence BSD 3 clauses sur Github et peut être installé et modifié.
Quelques éléments généraux concernant l'API et son fonctionnement
L'API fonctionne selon la logique "REST", à savoir:
- Chaque requête est indépendante des autres, le serveur ne gère pas de session ou d'état;
- L'API repose largement sur les fonctionnalités fournies par le protocole HTTP 1.1;
- Seul l'accès en lecture (GET) est possible;
- Conséquemment, l'ensemble des requêtes peuvent être réalisées à travers un navigateur web.
Les listes de contrats sont formattées selon le format Open Contracting Data Standard (OCDS) dans sa sérialisation en JSON. Un contrat ou une subvention est représenté dans la logique OCDS par le concept de release
. De part la structure des données disponible, chaque release
contient exactement un award
, un tender
et un supplier
.
En plus des attributs fournis dans la spécification officielle, les champs suivants ont été ajouté pour transmettre certaines informations spécifiques au contexte de la Ville de Montréal:
subject
: Liste de valeur en text libre obligatoire contenant les domaines d'activité selon la structure de la Ville de Montréal ("Infrastructure", "transport", etc.);subOrganisationOf
: Champ optionnel pouvant contenir la direction dont dépend un service;repartition
: Champ optionnel pouvant contenir l'information de répartition de la dépense (souvent la ville, l'agglomération, etc.)
Par ailleurs, le champ procurementMethodRationale
est utilisé pour distinguer les contrats et les subventions.
De manière à rester cohérent, les autres points d'accès sont au format JSON mais selon une structure développée pour les besoins de l'API.
Pour être cohérent avec le format OCDS, les attributs utilisent le vocabulaire anglais suivant:
release
: contrat ou subvention;supplier
: fournisseur;buyer
: donneur d'ouvrage (généralement un service de la Ville de Montréal);procuring entity
: entité ayant, dans le cas de la ville de Montréal, approuvé le contrat (conseil municipal, fonctionnaire, etc.)
Plusieurs fonctionnalités d'optimisation de contenu ont été mises en oeuvre dans l'API pour améliorer le temps de réponse:
- Cache interne: le premier accès à une ressource nécessite un calcul complet mais les appels suivants font appels à une cache interne. La cache est maintenue tant que des nouvelles données ne sont pas ajoutées;
- eTag: L'API fournit un attribut
etag
dans toutes les réponses. Un client peut renvoyer la valeur du etag dans une requête via l'attributIf-None-Match
. Si le etag n'a pas changé, le serveur renvoie une réponse sans contenue et avec le code HTTP 304 signifiant que la ressource n'a pas changé, sinon la réponse en renvoyée au complet avec un code HTTP 200. L'attribut etag est calculé en utilisant un hash de la réponse. - Compression gzip: Si la requête contient l'attribut
Accept-Encoding: gzip
, l'API retournera le contenu compressé en gzip, permettant généralement un gain de 80-90% en volume de données et donc en temps de téléchargement de la ressource.
Par ailleurs, l'API supporte la fonctionnalité CORS: L'API envoie l'attribut HTTP Access-Control-Allow-Origin: *
permettant d'envoyer des requêtes à partir d'un site web avec un autre nom de domaine que celui de l'API.
L'API décompose les données de contrat selon plusieurs points d'accès. Les points d'accès peuvent être séparé en 3 catégories:
- La racine
- Les données de support
- Les contrats et les données de contrat groupées
URL: /api/
Le point d'accès racine contient les champs suivants:
endpoint
: Une liste de points d'accès pour les contratsurl
: chemin relatif du point d'accèsdescription
: description du point d'accèsaccepted_parameters
: Liste des paramètres acceptés pour filtrer le contenuaccepted_order_by
: Liste des valeurs acceptés pour ordonner les résultats
parameters_description
: Description des paramètres de filtrage acceptéssources
: Liste des sources de données utilisées par l'APIreleases_count
: Nombre de contrats actuellement gérés dans l'APIreleases_value
: Valeur totale des contrats gérés dans l'APIsupplier_count
: Nombre de fournisseurs listés dans l'APIbuyer_count
: Nombre de donneurs d'ordre listés dans l'APIlast_update
: Dernière date de mise à jour des données
Les points d'accès de support permettent d'accéder à certaines listes utiles pour développer des visualisations et des interfaces basées sur l'API.
- URL: /api/helpers/buyer_slugs
- Description: Fournit une liste complète des donneurs d'ouvrage avec leur nom et leur identifiant
- Champs:
name
: Nom complet du donneur d'ouvrageslug
: Identifiant unique du donneur d'ouvrage (utilisé pour filtrer les données)
- URL: /api/helpers/supplier_slugs
- Description: Fournit une liste complète des fournisserus avec leur nom et leur identifiant
- Champs
name
: Nom complet du fournisseurslug
: Identifiant unique du fournisseur (utilisé pour filtrer les données)
- URL: /api/helpers/activity_list
- Description: Pour faciliter l'utilisation des données, les contrats sont regroupés par domaines d'activité (environnement, transport, etc.). Le point d'accès
activity_list
fournit la liste des domaines d'activités déclarés. - Champs
name
: Nom complet du domaine d'activitécolor_code
: Code couleur utilisé pour affiché le domaine d'activité dans l'interface graphique de la Ville de Montréal.
Les points d'accès aux données permettent d'accéder à la liste des contrats ainsi qu'à obtenir certaines valeurs calculées par l'API, notamment permettant groupements selon différentes facettes.
Les points d'accès aux données partagent une série de paramètres permettant de filtrer et de trier le contenu. Ces paramètres doivent êtres fournis comme paramètre d'URL, par exemple /api/releases?q=test&date_gt=2014-01-01
La liste ci-dessous décrit la totalité des paramètres existants tandis qu'une liste des paramètres acceptés est fournie pour chaque point d'accès.
Les filtres
q
: Paramètre de recheche en texte libre. Plusieurs termes peuvent être fournis, séparé par un espace. Par exemple:/api/releases?q=excavation%20chaussée
. À noter que les accents sont acceptés mais que l'ensemble des recherches est effectué en mode 'désaccentué'.highlight
: Paramètre permettant d'ajouter une balise<em>
aux termes recherchés avec le paramètreq
. Par exemple/api/releases?q=excavation%20chaussée&highlight=True
. Important: le moteur de recherche peut retourner des valeurs proches (par exemple une occurrence au pluriel d'un mot recherché au singulier). C'est pour cette raison que s'il est nécessaire pour l'application de surligner les résultats de recherche, il est important de laisser l'API mettre les balises de surlignage.value_gt
: Paramère filtrant les contrats dont le montant est supérieur ou égal à la valeur fournie dans le paramètre. Accepte seulement un nombre entier. Par exemple:/api/releases?value_gt=100000
value_lt
: Paramère filtrant les contrats dont le montant est inférieur ou égal à la valeur fournie dans le paramètre. Accepte seulement un nombre entier. Par exemple:/api/releases?value_lt=100000
date_gt
: Paramère filtrant les contrats dont la date est postérieure ou égale à la date fournie dans le paramètre. Format accepté:AAAA-MM-JJ
. Par exemple:/api/releases?date_gt=2014-01-01
date_lt
: Paramère filtrant les contrats dont la date est antérieure ou égale à la date fournie dans le paramètre. Format accepté:AAAA-MM-JJ
. Par exemple:/api/releases?date_lt=2014-01-01
buyer
: Paramère filtrant les contrats dont le donneur d'ouvrage est celui fourni dans le paramètre. La valeur correspond à l'identifiant unique du donneur d'ouvrage disponible dans le champsslug
du point d'accès/api/helpers/buyer_slugs
ou dans le champbuyer.identifier.id
dans la structure du contract (release
). Par exemple:/api/releases?buyer=service-du-developpement-economique
. Plusieurs acheteurs peuvent être demandés en séparant les identifiants de ces derniers par un point-virgule;
.supplier
: Paramère filtrant les contrats dont le fournisseur est celui fourni dans le paramètre. La valeur correspond à l'identifiant unique du fournisseur disponible dans le champsslug
du point d'accès/api/helpers/supplier_slugs
ou dans le champawards.suppliers.identifier.id
dans la structure du contract (release
). Par exemple:/api/releases?supplier=hydro-quebec
. Plusieurs fournisseurs peuvent être demandés en séparant les identifiants de ces derniers par un point-virgule;
.procuring_entity
: Paramère filtrant les contrats dont l'autorité d'approbation est celle fourni dans le paramètre. La valeur correspond à celle fournie danstender.procuringEntity.identifier.id
dans la structure du contract (release
). Par exemple:/api/releases?procuring_entity=fonctionnaires
. Plusieurs autoritées peuvent être demandées en séparant les identifiants de ces derniers par un point-virgule;
.activity
: Paramère filtrant les contrats appartenant au domaine d'activité fourni dans le paramètre. La valeur correspond à celle fournie dans le champssubject
dans la structure du contract (release
) ou dans le champsname
du point d'accès/api/helpers/activity_list
. Par exemple:/api/releases?activity=Arrondissements
. Plusieurs activités peuvent être demandées en séparant les identifiants de ces derniers par un point-virgule;
.type
: Paramère permettant de sélectionner les contrats ou les subventions. Valeurs acceptés:contract
pour les contrats,subvention
pour les subventions. Si le paramètre n'est pas fourni, l'API renvoie par défaut les contrats. Par exemple:/api/releases?type=subvention
.aggregate
: Paramère spécifique au point d'accès/api/releases/by_month_activity
. Ce paramètre permet d'agréger les résultats par activité avec les 4 principales activités. Les valeurs acceptées sontvalue
pour agréger par valeur totale des contrats oucount
pour agréger par nombre de contrat. Par exemple/api/releases/by_month_activity?aggregate=value&date_gt=2014-01-01
va calculer les 4 principales activités par montant (top 4) pour les contrats postérieurs au 1er janvier 2014. Le top 4 sera affiché normalement et les autres activités seront agrégée dans une activité "Autres".bucket
: Paramère spécifique au point d'accès/api/releases/by_value
. Ce paramètre permet de définir des segments de valeur dans lesquels regrouper les valeurs des contrat. Le paramètre contient trois valeurs séparées par une virgule. Les deux premières valeurs sont les montants minimum et maximum qui devraient être les mêmes quevalue_lt
etvalue_gt
si fournis. La dernière valeur représente le nombre de séparateurs de segment. Ainsi en mettant la valeur19
on obtient 20 segments. La valeur par défaut est0,100000000,19
. Par exemple:/api/releases/by_value?bucket=0,10000000,19
va créer 20 segments de 500 000$.
Tri et pagination
order_by
: Paramètre permettant de trier les résultats selon un champ particulier. Les valeurs varient en fonction du point d'accès.order_dir
: paramètre à utiliser en conjonction deorder_by
pour définir l'order de tri. Les valeurs acceptés sontdesc
pour un tri descendant etasc
pour un tri ascendant. Par exemple:/api/releases?order_by=date&order_dir=desc
limit
: Paramètre permettant de limiter le nombre de résultat retourné lors d'un requête. Pour les listes de contrats, la valeur par défaut est 50. La valeur maximale acceptée est 10 000.offset
: Paramètre permettant de définir quel est le rang du premier résultat à retourné. Ce paramètre est à utiliser avec le paramètrelimit
pour obtenir une pagination. Par exemple:/api/releases?limit=10&offset=50
permet d'obtenir les contrats entre le 50ème et le 60ème rang.
Format de données
Pour les listes de contrats (point d'accès /api/releases
), il est possible de choisir plusieurs formats.
json
(valeur par défaut): permet d'obtenir un résultat sérialisé en JSON avec une structuremeta
fournissant des informations de contexte (voir plus bas)ocds
: permet d'obtenir un fichier suivant la spécification Open Contracting Data Standard.csv
: permet d'obtenir un fichier au format CSV (comma separated value ou champs séparé par des virgules).xlsx
: permet d'obtenir un fichier au format Open Office XML compatible avec Microsoft Office 2007 et versions suivantespdf
: permet d'obtenir un fichier au format Adobe PDF.
- URL : /api/releases
- Description : Point d'accès permettant d'accéder à une liste des contrats au format Open Contracting Data Stardard (à moins qu'un autre
format
soit fourni). - Champs: En plus de la structure OCDS, l'API retourne une structure
meta
contenant les champs suivants:count
: Nombre total de contrats correspondant aux filtres demandéstotal_value
: Montant total des contrats correspondant aux filtres demandésmax_value
: Montant du contrat le plus élevé correspondant aux filtres demandésmin_value
: Montant du contrat le plus petit correspondant aux filtres demandéspagination
: retourne les informations de paginationlimit
etoffset
correspondant aux paramètres d'URL fournis ou des valeurs par défaut.
- Filtres acceptés:
q
,offset
,limit
,value_gt
,value_lt
,date_gt
,date_lt
,buyer
,activity
,supplier
,order_by
,order_dir
,type
,supplier_size
,procuring_entity
,highlight
,format
- Paramètre de tri acceptés:
value
,buyer
(alphabétique),supplier
(alphabétique),id
(alphabétique),date
- URL : /api/releases/by_supplier
- Description : Point d'accès groupant les contrats par fournisseurs
- Champs:
supplier
: Nom complet du fournisseursupplier_slug
: Identifiant du fournisseurcount
: Nombre total de contrats attibués à ce fournisseur et correspondant aux filtres demandéstotal_value
: Valeure totale des contrats alloués à ce fournisseur et correspondant aux filtres demandés
- Filtres acceptés:
q
,offset
,limit
,value_gt
,value_lt
,date_gt
,date_lt
,buyer
,activity
,supplier
,order_by
,order_dir
,type
,procuring_entity
- Paramètre de tri acceptés:
total_value
,count
,buyer_slug
(alphabétique)
- URL : /api/releases/by_buyer
- Description : Point d'accès groupant les contrats par donneur d'ouvrage
- Champs. Liste d'acheteurs, chaque élément contenant les champs suivants:
buyer
: Nom complet du donneur d'ouvragebuyer_slug
: Identifiant du donneur d'ouvragecount
: Nombre total de contrats attibués par ce donneur d'ouvrage et correspondant aux filtres demandéstotal_value
: Valeur totale des contrats attribués par ce donneur d'ouvrage et correspondant aux filtres demandés
- Filtres acceptés:
q
,offset
,limit
,value_gt
,value_lt
,date_gt
,date_lt
,buyer
,activity
,supplier
,order_by
,order_dir
,type
,procuring_entity
- Paramètre de tri acceptés:
total_value
,count
,buyer_slug
(alphabétique)
- URL : /api/releases/by_procuring_entity
- Description : Point d'accès groupant les contrats par entité d'autorisation
- Champs. Liste des entités, chaque élément contenant les champs suivants:
procuring_entity
: Nom complet de l'entité d'autorisationbuyer_slug
: Identifiant de l'entité d'autorisationcount
: Nombre total de contrats autorisés par cette entité et correspondant aux filtres demandéstotal_value
: Valeur totale des contrats autorisés par cette entité et correspondant aux filtres demandés
- Filtres acceptés:
q
,offset
,limit
,value_gt
,value_lt
,date_gt
,date_lt
,buyer
,activity
,supplier
,order_by
,order_dir
,type
,procuring_entity
- Paramètre de tri acceptés:
total_value
,count
,procuring_entity
(alphabétique)
- URL : /api/releases/by_value
- Description : Point d'accès groupant les contrats selon des segments de valeur déterminé via le paramètre
bucket
. Important: Le client se doit de calculer lui-même la valeur maximale et minimale de chaque segment. Les segments vide ne sont pas retournés. - Champs. Le point d'accès renvoie une liste de segment avec les champs suivants:
segment
: Rang du segment retourné (nombre entier)count
: Nombre total de contrats inclus dans le segment et correspondant aux filtres demandéstotal_value
: Valeur totale des contrats inclus dans le segment et correspondant aux filtres demandés
- Filtres acceptés:
q
,offset
,limit
,value_gt
,value_lt
,date_gt
,date_lt
,buyer
,activity
,supplier
,order_by
,order_dir
,type
,procuring_entity
,bucket
- Paramètre de tri acceptés:
total_value
,count
,procuring_entity
(alphabétique)
- URL : /api/releases/by_month
- Description : Point d'accès groupant les contrats pour chaque mois et année de la période couverte par les données
- Champs:
month
: Mois-année au formatAAAA-MM
count
: Nombre total de contrats inclus dans ce mois-année et correspondant aux filtres demandéstotal_value
: Valeur totale des contrats inclus ce mois-année et correspondant aux filtres demandés
- Filtres acceptés:
q
,offset
,limit
,value_gt
,value_lt
,date_gt
,date_lt
,buyer
,activity
,supplier
,order_by
,order_dir
,type
,procuring_entity
- Paramètre de tri acceptés:
total_value
,count
,month
(alphabétique)
- URL : /api/releases/by_month_activity
- Description : Point d'accès groupant les contrats par mois puis par domaine d'activité. Ce point d'appel est utilisé pour créer le principal graphique de l'application web de visualisation de contrat. Ce point d'appel support un paramètre spécifique,
aggregate
permettant d'agréger dans la catégories "Autres" les activités après les 4 principales. - Champs: Le point d'accès fournit une liste de mois-années ayant chacune la structure suivante:
month
: Moins-année au formatAAAA-MM
- Liste d'activité, chaque élément ayant la structure:
activity
: Nom de l'activitécount
: Nombre total de contrats appartenant à l'activité pour le mois-année parent et correspondant aux filtres demandéstotal_value
: Valeur totale des contrats appartenant à l'activité pour le mois-année parent et correspondant aux filtres demandés
- Filtres acceptés:
q
,offset
,limit
,value_gt
,value_lt
,date_gt
,date_lt
,buyer
,activity
,supplier
,order_by
,order_dir
,type
,procuring_entity
,aggregate
. - Paramètre de tri acceptés:
month