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.
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 ;productIdest le premier d'entre eux. /projects/{pid}/mmpfournit le même fichier.mmpque 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/tokenavec 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/newoccupe une place, comme une invitation, et lui donne le rôle par défaut de votre organisation. - Un jeton obtenu avec
POST /auth/{uid}/loginouvre 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é.
- Choisissez Production ou Bac à sable.
- Choisissez un Endpoint, comme « Lister tous les projets » ou « Obtenir les mesures ».
- 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.
- 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.
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 :
- 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. - 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é.
- 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.
- 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.
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
idpour ignorer les doublons etcreatedpour 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.
- Séparez l'en-tête
X-MMO-Signatureà la virgule entetv1. - 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. - Comparez le résultat à
v1avec une comparaison en temps constant. - Rejetez l'envoi si
ts'écarte de plus de 5 minutes de l'heure actuelle.test 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.