Measure MapAide
Ouvrir Measure Map

L'API REST

Travaillez sur vos projets, dossiers, produits et membres depuis votre propre logiciel, essayez des requêtes depuis la page Développeur et recevez des webhooks quand des événements se produisent.

L'API REST permet à votre propre logiciel de lire et de modifier le contenu de votre compte Measure Map Online : les projets et leurs mesures, les dossiers, le catalogue de produits et, avec Enterprise, les membres de votre organisation. Elle répond en JSON. La référence complète, avec chaque champ et des exemples, se trouve dans la documentation de l'API ; cette page en donne une vue d'ensemble.

Pour ouvrir la documentation depuis l'application, allez dans Développeur > API REST et appuyez sur Afficher la documentation.

La section API REST de la page Développeur

URL de base#

Chaque requête est envoyée à :

https://api.measuremaponline.com/api/v2

Authentification#

Envoyez votre clé d'API, telle quelle, dans l'en-tête Authorization de chaque requête. Créez la clé sur la page Développeur : voir les clés d'API.

curl https://api.measuremaponline.com/api/v2/projects/YOUR_PROJECT_ID \
  -H "Authorization: YOUR_API_KEY"

Chaque requête est vérifiée par rapport à l'accès de la clé (par exemple Projets en Lecture), à votre abonnement et, pour une requête envoyée depuis une page web, aux restrictions de site web de la clé. Gardez sur votre serveur les clés qui peuvent modifier des données : voir protéger votre clé.

Production et bac à sable#

Il n'y a qu'une URL de base pour les deux. C'est la clé qui décide : une clé de bac à sable lit et écrit les projets, dossiers et produits du bac à sable, que les clés de production ne voient jamais. Les membres sont les mêmes dans les deux, mais se connecter en tant que membre nécessite une clé de production. Les projets invités créés avec une clé de bac à sable ne sont jamais facturés, et les projets du bac à sable ne peuvent pas être intégrés à votre site web. Les jetons indiquent l'environnement auquel ils appartiennent.

Ce que couvre l'API#

Groupe Points de terminaison Accès de clé nécessaire
Jetons de connexion POST /auth/token, POST /auth/iframe/token Cartes intégrées
Projets et dossiers Lister les projets d'une personne (tous, ou page par page, jusqu'à 200 par page) et ses dossiers ; obtenir un projet, ses mesures (/projects/{pid}/data), ses commentaires ou son fichier .mmp (/projects/{pid}/mmp) ; obtenir un dossier ; créer, modifier et supprimer des projets et des dossiers Projets : Lecture pour lire, Lecture et modification pour modifier
Produits GET /products, GET /products/{id}, créer, modifier, et archiver avec DELETE /products/{id} Produits : Lecture ou Lecture et modification
Membres (Enterprise) GET /users, GET /users/{uid}, POST /users/new, PUT /users/{uid}, DELETE /users/{uid} Utilisateurs : Lecture ou Lecture et modification
Se connecter en tant que membre (Enterprise) POST /auth/{uid}/login fournit un jeton de connexion pour un membre de votre organisation Utilisateurs : Lecture et modification

Quelques points à connaître :

  • Une clé accède aux projets de son propre compte et, avec Enterprise, à ceux des membres de l'organisation.
  • Supprimer un projet ou un dossier via l'API est définitif : rien ne passe par la Corbeille. Un dossier emporte avec lui les dossiers et les projets qu'il contient et qui appartiennent à votre compte ou à vos membres.
  • Dans les mesures d'un projet, une forme liste ses produits dans productIds, dans l'ordre ; productId est le premier d'entre eux.
  • /projects/{pid}/mmp fournit le même fichier .mmp que celui exporté par l'application. Son schéma est publié sur github.com/blueblinkone/mmp-validator. Les nouveaux éléments ne sont jamais ajoutés qu'en tant qu'éléments facultatifs : un lecteur écrit pour un fichier plus ancien continue donc de fonctionner.
  • Avec Open Guest, un projet créé via l'API avec le niveau d'accès Open Guest compte dans votre utilisation et votre budget Open Guest, comme un projet démarré depuis votre lien invité.
  • Avec Open Guest, la section Lien invité contient le guide API Open Guest, avec du code pour votre serveur et votre page : votre serveur obtient un jeton de POST /auth/token avec votre clé de production et envoie le visiteur vers un nouveau projet à lui, ses coordonnées déjà remplies.
  • Créer un membre avec POST /users/new occupe une place, comme une invitation, et lui donne le rôle par défaut de votre organisation.
  • Un jeton obtenu avec POST /auth/{uid}/login ouvre le compte de ce membre : il faut donc une clé autorisée à modifier les membres, jamais la clé de vos intégrations. Il n'est pas délivré pour un Administrateur ni pour un Gestionnaire, ni avec une clé de bac à sable.
  • Les produits ne sont jamais supprimés via l'API, seulement archivés, et le prix de revient d'un produit n'est jamais renvoyé.
  • Les parcelles cadastrales ne font pas partie de l'API.

Réponses et erreurs#

Une requête réussie répond avec le code 200 et du JSON (l'export .mmp répond en XML). Une requête qui échoue répond avec un code d'erreur et un corps comme celui-ci :

{"errorCode": "insufficient_scope", "errorMessage": "This API key does not have the scope required for this endpoint"}
Code errorCode Ce qu'il faut vérifier
400 invalid_body, invalid_uid, invalid_project_id, pagination_invalid_page_number, pagination_invalid_page_limit Une valeur de la requête manque ou n'est pas acceptée, comme le page et le limit d'une liste paginée.
401 unauthorized_action La requête a été envoyée depuis une page web d'un site que la clé n'autorise pas, ou l'élément n'appartient ni à votre compte ni à vos membres.
402 budget_limit_reached Open Guest : votre limite de budget est atteinte, donc plus de projets invités sur cette période.
403 invalid_api_key Aucune clé n'a été envoyée dans l'en-tête Authorization, ou la clé est inconnue, révoquée ou au-delà de ses 24 heures après son remplacement.
403 api_key_suspended L'accès à l'API de votre compte a été suspendu. Contactez l'assistance.
403 subscription_expired, invalid_subscription L'abonnement n'est pas actif, ou son offre ne comprend pas l'API.
403 insufficient_scope La clé n'a pas l'accès dont ce point de terminaison a besoin.
403 scope_not_in_plan Votre offre ne comprend pas ce point de terminaison, par exemple les membres avec Open Guest.
404 not_found, project_not_found, user_not_found L'élément n'existe pas, ou la personne n'est pas membre de votre organisation.
409 enterprise_add_users_limit Création d'un membre : toutes les places sont prises.
429 too_many_requests Plus de 600 jetons en une heure. Patientez un peu et réessayez.
500 server_error La requête n'a pas pu aboutir. Vérifiez les identifiants envoyés, réessayez, et contactez l'assistance si le problème persiste.

Essayer l'API depuis la page Développeur#

Développeur > Essayer l’API envoie de vraies requêtes avec votre clé et affiche exactement ce qui est renvoyé.

  1. Choisissez Production ou Bac à sable.
  2. Choisissez un Endpoint, comme « Lister tous les projets » ou « Obtenir les mesures ».
  3. Renseignez ses paramètres. Un projet ou un produit se choisit par son nom parmi ceux que la clé peut lire ; quand il faut une personne, votre propre compte est rempli pour vous.
  4. Appuyez sur Envoyer la requête. Le code d'état et la réponse apparaissent en dessous.

Seules des requêtes de lecture sont proposées : essayer ne modifie donc rien, et ces requêtes ne comptent pas dans votre utilisation. Si votre clé n'a pas l'accès dont un point de terminaison a besoin, la page vous prévient qu'il répondra 403.

Essayer l'API avec une requête envoyée et sa réponse JSON

Les webhooks#

Un webhook prévient votre serveur quand quelque chose se produit, comme les e-mails de notification vous préviennent vous. Les webhooks font partie des offres Enterprise et Open Guest.

Configurer un webhook#

Dans Développeur > Webhooks :

  1. Saisissez votre URL du point de terminaison : une adresse https:// accessible sur Internet. Les adresses de réseaux privés sont refusées, et ce contrôle est refait avant chaque envoi.
  2. Cochez les Évènements voulus (voir les événements). Un nouveau point de terminaison démarre avec les événements que votre offre envoie, et au moins un doit rester coché.
  3. Appuyez sur Enregistrer. La première fois, la page affiche votre Secret de signature en entier. Copiez-le à ce moment-là : ensuite, seuls ses derniers caractères sont affichés.
  4. Appuyez sur Envoyer un évènement test et choisissez un événement.

Un test envoie un exemple de cet événement, avec des valeurs fictives et "test": true dans ses data, à votre point de terminaison enregistré, même quand l'événement n'est pas coché ou que le point de terminaison est désactivé. Pour arrêter tous les envois, appuyez sur Supprimer : le point de terminaison et son secret sont supprimés.

Sous les réglages, la Référence des webhooks contient ce qu'il vous faut pour écrire la partie qui reçoit les envois : les en-têtes et le corps, du code qui vérifie la signature en Node.js, Python et PHP, et des exemples de données pour chaque événement.

Webhooks avec un point de terminaison et les événements qu'il reçoit

Ce que reçoit votre serveur#

Chaque événement est un POST vers votre point de terminaison, avec un corps JSON :

{"id": "evt_3f9a1c2b7d4e5f60718293a4", "type": "project.created", "created": 1790000000000, "data": { ... }}

id est unique pour chaque événement, created indique quand il s'est produit, en millisecondes depuis le 1er janvier 1970 (UTC), et le contenu de data dépend de l'événement. La requête contient aussi ces en-têtes :

En-tête Valeur
X-MMO-Event Le nom de l'événement, comme type dans le corps.
X-MMO-Delivery L'id de l'événement.
X-MMO-Signature t=<milliseconds>,v1=<hex> : le moment où l'envoi a été signé, et sa signature.
User-Agent MeasureMapOnline-Webhooks/1
  • Répondez avec un code 2xx dans les 8 secondes, avant tout traitement long. Tout autre code, une redirection ou un délai dépassé compte comme un échec.
  • Chaque événement est envoyé une seule fois et n'est jamais renvoyé. La section affiche le Dernier envoi et les Échecs consécutifs.
  • Après 10 échecs consécutifs, le point de terminaison est désactivé et le propriétaire reçoit un e-mail. Réparez votre serveur et appuyez sur Enregistrer pour le réactiver.
  • Il arrive qu'un événement arrive deux fois ou dans le désordre. Utilisez id pour ignorer les doublons et created pour remettre les événements dans l'ordre.

Vérifier la signature#

N'importe qui connaissant votre adresse peut y envoyer des requêtes : vérifiez donc chaque envoi avant de lui faire confiance.

  1. Séparez l'en-tête X-MMO-Signature à la virgule en t et v1.
  2. Calculez un HMAC-SHA256 de t, d'un point et du corps brut de la requête, avec votre secret de signature comme clé, écrit en hexadécimal.
  3. Comparez le résultat à v1 avec une comparaison en temps constant.
  4. Rejetez l'envoi si t s'écarte de plus de 5 minutes de l'heure actuelle. t est en millisecondes.

Utilisez le corps exactement tel qu'il est arrivé : analyser le JSON puis le réécrire le modifie, et la signature ne correspond plus.

Renouveler le secret remplace le secret immédiatement et affiche le nouveau en entier, une seule fois. Mettez à jour votre serveur dès que vous l'avez renouvelé.

Les événements#

Événement Envoyé quand
project.created Un projet est créé sur votre compte. Dans l'application, via l'API ou depuis une intégration.
project.deleted Un projet est supprimé définitivement (le mettre à la corbeille ne compte pas).
project.comment.added Quelqu’un commente un projet — en général votre client qui répond.
guest.project.created (Invité Ouvert) Un invité démarre un projet depuis votre lien ou via l'API. Seulement quand l'adresse e-mail de l'invité est connue.
guest.measurement.completed (Invité Ouvert) Un invité termine une mesure et laisse ses coordonnées.
budget.warning_reached (Invité Ouvert) La dépense mesurée dépasse votre seuil d’alerte.
budget.limit_reached (Invité Ouvert) La dépense mesurée atteint votre limite — les nouveaux projets invités sont refusés.
enterprise.user.created (Enterprise) Un siège est ajouté à votre organisation, y compris via l’authentification unique.

Besoin d'aide supplémentaire ?

Écrivez à notre équipe d'assistance et dites-nous ce que vous essayiez de faire. Les captures d'écran nous aident.

Écrire à l'assistance