Measure MapHelp
Measure Map openen

REST API

Doe vanuit je eigen software wat de app doet met je projecten, mappen en producten, je Enterprise-organisatie en je Open Guest-leads; probeer verzoeken uit op de pagina Ontwikkelaar en ontvang webhooks wanneer er iets gebeurt.

Met de REST API kan je eigen software doen wat de app doet: projecten en hun metingen, mappen en de productcatalogus; bij Enterprise je organisatie, zoals de pagina Enterprise die beheert; bij Open Guest je gastlink, gastprojecten en offerteaanvragen. Hij antwoordt in JSON. De volledige referentie, met elk veld en voorbeeld, is de API-documentatie; deze pagina is het overzicht.

Om de documentatie vanuit de app te openen, ga je naar Ontwikkelaar > REST API en druk je op Documentatie bekijken.

Het onderdeel REST API van de pagina Ontwikkelaar

Basis-URL#

Elk verzoek gaat naar:

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

Authenticatie#

Stuur je API-sleutel, zoals hij is, mee in de Authorization-header van elk verzoek. Maak de sleutel aan op de pagina Ontwikkelaar: zie API-sleutels.

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

Elk verzoek wordt gecontroleerd op de toegang van de sleutel (bijvoorbeeld Projecten Lezen), je abonnement en, bij een verzoek vanaf een webpagina, de websitebeperkingen van de sleutel. Houd sleutels die gegevens kunnen wijzigen op je server: zie houd je sleutel veilig.

Live en sandbox#

Er is één basis-URL voor beide. De sleutel bepaalt het: een sandbox-sleutel leest en schrijft sandbox-projecten, -mappen en -producten, die livesleutels nooit zien. De gebruikers, plekken en teams van je organisatie zijn in beide hetzelfde, dus om ze te wijzigen heb je een livesleutel nodig. Gastprojecten die met een sandbox-sleutel zijn gemaakt, worden nooit gefactureerd en sandbox-projecten kunnen niet op je website worden ingesloten. Tokens geven aan bij welke omgeving ze horen.

Wat de API omvat#

Groep Endpoints Benodigde sleuteltoegang
Inlogtokens POST /auth/token, POST /auth/iframe/token Ingesloten kaarten (bij Open Guest Gastprojecten)
Account Het abonnement, de seats en de sleutel van het account met GET /account; de API-verzoeken van de laatste 30 dagen en, bij Open Guest, de gastprojecten en het budget van de periode met GET /usage Account: Lezen
Projecten en mappen Je projecten (GET /projects, de Prullenbak met trashed=true) en mappen (GET /folders); een project, zijn metingen (/projects/{pid}/data), zijn opmerkingen of zijn .mmp-bestand (/projects/{pid}/mmp) ophalen; projecten en mappen maken, bijwerken en verplaatsen; projecten samenvoegen (POST /projects/merge); naar de Prullenbak verwijderen en herstellen (POST /projects/{pid}/restore); de versies van een project (/projects/{pid}/versions); opmerkingen verwijderen en herstellen; een project of map per e-mail delen (PUT /projects/{pid}/members) Projecten: Lezen om te lezen, Lezen en wijzigen om te wijzigen
Projectbestanden en kopieën Een project exporteren in de formaten van de app (POST /projects/{pid}/export) of zijn pdf-rapport ophalen (GET /projects/{pid}/pdf), beide als links die 24 uur werken; een project kopiëren, of er een sjabloon van maken (POST /projects/{pid}/copy) Projecten: Lezen; Lezen en wijzigen om te kopiëren. Prijzen in een rapport vereisen Producten: Lezen
Offertes De offerte van een project, regel voor regel (GET /projects/{pid}/estimate) Projecten en Producten: Lezen
Producten GET /products, GET /products/{id}, maken, bijwerken en archiveren met DELETE /products/{id} Producten: Lezen of Lezen en wijzigen
Profiel Het profiel en de e-mailinstellingen (/account/profile); voor de klant van een partner: wie zijn plan betaalt, en zijn uitnodigingen (/account/partner) Account: Lezen, Lezen en wijzigen
Imports Bestanden in een project importeren (POST /projects/{pid}/imports), zoals Importeren in de app: toevoegen of vervangen, en dan volgen Projecten: Lezen en wijzigen
Sleutels en webhook De API-sleutels van het account (/keys: weergeven, intrekken, websites; nooit volledig, nooit verder dan de toegang van de aanroepende sleutel) en de webhook (/webhook) Ontwikkelaar: Lezen, Lezen en wijzigen
Partner Klanten en uitnodigingen, het plan, de licenties, het budget, de betaling en de facturen van een klant (/partner) Klanten: Lezen, Lezen en wijzigen
Enterprise: gebruikers, uitnodigingen, plekken, teams Gebruikers (/enterprise/users): weergeven, hun rol of gegevens wijzigen, uitschakelen en inschakelen, overal uitloggen, uit de organisatie verwijderen, verwijderen, hun teams instellen, hun projecten overdragen. Uitnodigingen (/enterprise/invitations): uitnodigen, weergeven, opnieuw versturen, intrekken. Plekken (GET /enterprise/seats). Teams (/enterprise/teams). Elk project van de organisatie (GET /enterprise/projects) en projecten in teams Gebruikers: Lezen of Lezen en wijzigen; de projecten vereisen Projecten
Enterprise: de organisatie Het profiel en beleid (/enterprise/organization), single sign-on (GET /enterprise/sso), het activiteitenlogboek (GET /enterprise/activity) en het kopen of teruggeven van plekken (PUT /enterprise/seats) Organisatie: Lezen of Lezen en wijzigen
Open Guest Je gastlink (/open-guest/link: ophalen, maken of vervangen, pauzeren, de map kiezen); gastprojecten (/open-guest/projects: weergeven, er een starten voor een bezoeker, er een ophalen); offerteaanvragen met de offerte (/open-guest/requests); het gebruik van deze periode (GET /open-guest/usage) en het budget (PUT /open-guest/budget) Gasten: Lezen; Lezen en wijzigen om te wijzigen

Een paar dingen om te weten:

  • Een sleutel bereikt de projecten van het eigen account en, bij Enterprise, die van de gebruikers van de organisatie.
  • Een project verwijderen zet het in de Prullenbak, zoals in de app, en alleen de maker kan dat; verwijder het definitief uit de Prullenbak met forever=true. Een map verwijderen zet de projecten erin in de Prullenbak.
  • In de metingen van een project noemt een vorm zijn producten in productIds, op volgorde; productId is de eerste ervan.
  • /projects/{pid}/mmp geeft hetzelfde .mmp-bestand dat de app exporteert. Het schema is gepubliceerd op github.com/blueblinkone/mmp-validator. Nieuwe elementen worden alleen als optionele toegevoegd, zodat een lezer die voor een ouder bestand is geschreven blijft werken.
  • Bij Open Guest telt een gastproject dat via de API is gestart (POST /open-guest/projects) mee voor je Open Guest-gebruik en -budget, net als een project dat via je gastlink is gestart.
  • Bij Open Guest heeft het onderdeel Gastlink de handleiding Open Guest API, met code voor je server en je pagina: je server haalt met je livesleutel een token op via POST /auth/token en stuurt de bezoeker naar een nieuw eigen project, met zijn of haar gegevens al ingevuld.
  • Mensen komen alleen via een uitnodiging in je organisatie (POST /enterprise/invitations), zoals op de pagina Enterprise: wie geen account heeft, krijgt er een en kiest zelf een wachtwoord. De API maakt nooit een account aan en stelt nooit een wachtwoord in.
  • Een gebruiker verwijderen uit de organisatie (POST /enterprise/users/{uid}/remove) laat hun account bestaan; er een verwijderen (DELETE /enterprise/users/{uid}) verwijdert het account. In beide gevallen blijft het werk dat ze maakten bij de organisatie, in een nieuwe map met hun naam die je beheerders delen.
  • Wanneer een gast om je offerte vraagt, antwoordt GET /open-guest/requests/{pid} wie het is, wat de gast schreef, wat de gast mat en, met Producten: Lezen, de offerte zelf.
  • Bij Open Guest starten tokens gastprojecten voor je bezoekers. POST /auth/iframe/token, dat een bezoeker inlogt in een ingesloten kaart, is voor Enterprise-sleutels.
  • Producten worden via de API nooit verwijderd, alleen gearchiveerd, en de kostprijs van een product wordt nooit teruggegeven.
  • Kadastrale percelen maken geen deel uit van de API.

Antwoorden en fouten#

Een geslaagd verzoek antwoordt met status 200 en JSON (de .mmp-export antwoordt met XML). Een mislukt verzoek antwoordt met een foutstatus en een body zoals:

{"errorCode": "insufficient_scope", "errorMessage": "This API key does not have the scope required for this endpoint"}
Status errorCode Wat je controleert
400 invalid_body, invalid_uid, invalid_project_id, pagination_invalid_page_number, pagination_invalid_page_limit Een waarde in het verzoek ontbreekt of wordt niet geaccepteerd, zoals de page en limit van een lijst met pagina's.
401 unauthorized_action Het verzoek is vanaf een webpagina verstuurd op een website die de sleutel niet toestaat, of het item hoort niet bij jouw account of dat van je leden.
402 budget_limit_reached Open Guest: je budgetlimiet is bereikt, dus geen gastprojecten meer deze periode.
403 invalid_api_key Er is geen sleutel meegestuurd in de Authorization-header, of de sleutel is onbekend, ingetrokken of voorbij zijn 24 uur nadat hij is vervangen.
403 api_key_suspended De API-toegang van je account is opgeschort. Neem contact op met support.
403 subscription_expired, invalid_subscription Het abonnement is niet actief, of het abonnement heeft geen API.
403 insufficient_scope De sleutel heeft niet de toegang die dit endpoint nodig heeft.
403 scope_not_in_plan Je abonnement bevat dit endpoint niet, bijvoorbeeld het onderdeel Enterprise bij Open Guest.
403 embed_needs_enterprise Ingesloten kaarten horen bij het Enterprise-abonnement. Een Open Guest-sleutel opent alleen zijn eigen gastprojecten.
404 not_found, project_not_found, user_not_found Het item bestaat niet, of de persoon is geen gebruiker van je organisatie.
409 enterprise_add_users_limit Iemand uitnodigen: alle plekken zijn bezet en automatische plekken staan uit.
409 project_not_in_trash Herstellen of definitief verwijderen is gevraagd voor een project dat niet in de Prullenbak staat.
429 too_many_requests Meer dan 600 tokens in een uur. Wacht even en probeer het opnieuw.
500 server_error Het verzoek kon niet worden voltooid. Controleer de ID's die je hebt gestuurd, probeer het opnieuw en neem contact op met support als het blijft gebeuren.

De API proberen op de pagina Ontwikkelaar#

Ontwikkelaar > De API uitproberen verstuurt echte verzoeken met je sleutel en toont precies wat er terugkomt.

  1. Kies Live of Sandbox.
  2. Kies een Endpoint, zoals "Je projecten weergeven", "Metingen ophalen" of "Het account ophalen". De lijst biedt de endpoints die je abonnement bevat.
  3. Vul de parameters in. Een project of product kies je op naam uit degene die de sleutel kan lezen; waar een persoon nodig is, wordt je eigen account voor je ingevuld.
  4. Druk op Verzoek verzenden. De status en het antwoord verschijnen eronder.

Alleen verzoeken die lezen worden aangeboden, dus uitproberen wijzigt niets, en deze verzoeken tellen niet mee in je gebruik. Als je sleutel niet de toegang heeft die een endpoint nodig heeft, waarschuwt de pagina dat het met 403 zal antwoorden.

De API proberen met een verstuurd verzoek en het JSON-antwoord

Webhooks#

Een webhook vertelt je server wanneer er iets gebeurt, zoals de meldingsmails jou dat vertellen. Webhooks horen bij de abonnementen Enterprise en Open Guest.

Een webhook instellen#

In Ontwikkelaar > Webhooks:

  1. Typ je Endpoint-URL: een https://-adres op internet. Adressen op privénetwerken worden geweigerd, en dit wordt voor elke aflevering opnieuw gecontroleerd.
  2. Vink de Gebeurtenissen aan die je wilt (zie gebeurtenissen). Een nieuw endpoint begint met de gebeurtenissen die je abonnement verstuurt en er moet er minstens één zijn aangevinkt.
  3. Druk op Opslaan. De eerste keer toont de pagina je Ondertekeningssecret volledig. Kopieer hem dan: daarna worden alleen de laatste tekens getoond.
  4. Druk op Testgebeurtenis verzenden en kies een gebeurtenis.

Een test verstuurt een voorbeeld van die gebeurtenis, met verzonnen waarden en "test": true in de data, naar je opgeslagen endpoint, ook als de gebeurtenis niet is aangevinkt of het endpoint uit staat. Om alle afleveringen te stoppen, druk je op Verwijderen: het endpoint en zijn secret worden verwijderd.

Onder de instellingen heeft de Webhook-referentie wat je nodig hebt om de ontvangende kant te schrijven: de headers en de body, code die de handtekening controleert in Node.js, Python en PHP, en voorbeeldgegevens voor elke gebeurtenis.

Webhooks met een endpoint en de gebeurtenissen die het ontvangt

Wat je server ontvangt#

Elke gebeurtenis is één POST naar je endpoint, met een JSON-body:

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

id is uniek voor elke gebeurtenis, created is wanneer het gebeurde in milliseconden sinds 1 januari 1970 (UTC), en wat data bevat hangt af van de gebeurtenis. Het verzoek heeft ook deze headers:

Header Waarde
X-MMO-Event De naam van de gebeurtenis, als type in de body.
X-MMO-Delivery De id van de gebeurtenis.
X-MMO-Signature t=<milliseconds>,v1=<hex>: wanneer de aflevering is ondertekend, en de handtekening ervan.
User-Agent MeasureMapOnline-Webhooks/1
  • Antwoord met een 2xx-status binnen 8 seconden, vóór al het trage werk. Elke andere status, een redirect of een time-out telt als mislukt.
  • Elke gebeurtenis wordt één keer verstuurd en nooit opnieuw geprobeerd. Het onderdeel toont de Laatste levering en de Opeenvolgende fouten.
  • Na 10 mislukkingen op rij wordt het endpoint uitgezet en krijgt de eigenaar een e-mail. Herstel je server en druk op Opslaan om het weer aan te zetten.
  • Af en toe komt een gebeurtenis twee keer of in de verkeerde volgorde aan. Gebruik id om herhalingen te negeren en created om gebeurtenissen op volgorde te zetten.

De handtekening controleren#

Iedereen die je adres kent, kan er iets naartoe sturen, dus controleer elke aflevering voordat je haar vertrouwt:

  1. Splits de X-MMO-Signature-header bij de komma in t en v1.
  2. Bereken een HMAC-SHA256 van t, een punt en de ruwe body van het verzoek, met je signing secret als sleutel, hexadecimaal geschreven.
  3. Vergelijk het resultaat met v1 met een vergelijking in constante tijd.
  4. Weiger de aflevering als t meer dan 5 minuten van de huidige tijd afwijkt. t is in milliseconden.

Gebruik de body precies zoals hij is aangekomen: het JSON parseren en weer uitschrijven verandert hem, en dan klopt de handtekening niet meer.

Secret vernieuwen vervangt het secret meteen en toont het nieuwe één keer volledig. Werk je server bij zodra je het vernieuwt.

Gebeurtenissen#

Gebeurtenis Verstuurd wanneer
project.created Er wordt een project aangemaakt op je account. In de app, via de API of vanuit een embed.
project.deleted Een project wordt definitief verwijderd (verplaatsen naar de prullenbak telt niet).
project.comment.added Iemand reageert op een project, meestal je klant die antwoordt.
guest.project.created (Open Guest) Een gast start een project via je link of via de API. Alleen als het e-mailadres van de gast bekend is.
guest.measurement.completed (Open Guest) Een gast rondt een meting af en laat zijn contactgegevens achter.
budget.warning_reached (Open Guest) Het gemeten verbruik passeert je waarschuwingsdrempel.
budget.limit_reached (Open Guest) Het gemeten verbruik bereikt je limiet: verdere gastprojecten worden geweigerd.
enterprise.user.created (Enterprise) Er wordt een seat aan je organisatie toegevoegd, ook via single sign-on.

Hulp nodig?

Schrijf naar ons supportteam en vertel wat je probeerde te doen. Screenshots helpen.

Mail de support