API REST
Fai dal tuo software ciò che fa l'app con i tuoi progetti, cartelle e prodotti, la tua organizzazione Enterprise e i tuoi contatti Open Guest; prova le richieste dalla pagina Sviluppatori e ricevi webhook quando succede qualcosa.
L'API REST permette al tuo software di fare ciò che fa l'app: progetti e relative misure, cartelle e catalogo prodotti; con Enterprise, la tua organizzazione, come la gestisce la pagina Enterprise; con Open Guest, il tuo link per ospiti, i progetti ospite e le richieste di preventivo. Risponde in JSON. Il riferimento completo, con ogni campo ed esempio, è la documentazione API; questa pagina ne è la panoramica.
Per aprire la documentazione dall'app, vai in Sviluppatori > REST API e premi Vedi la documentazione.
URL di base#
Ogni richiesta va a:
https://api.measuremaponline.com/api/v2
Autenticazione#
Invia la tua chiave API, così com'è, nell'intestazione Authorization di ogni
richiesta. Crea la chiave nella pagina Sviluppatori: vedi chiavi API.
curl https://api.measuremaponline.com/api/v2/projects/YOUR_PROJECT_ID \
-H "Authorization: YOUR_API_KEY"
Ogni richiesta viene verificata rispetto all'accesso della chiave (per esempio Progetti Lettura), al tuo abbonamento e, per una richiesta inviata da una pagina web, alle restrizioni per i siti web della chiave. Tieni sul tuo server le chiavi che possono modificare i dati: vedi tenere al sicuro la chiave.
Live e sandbox#
C'è un solo URL di base per entrambi. Decide la chiave: una chiave sandbox legge e scrive progetti, cartelle e prodotti sandbox, che le chiavi live non vedono mai. Gli utenti, i posti e i team della tua organizzazione sono gli stessi in entrambi, quindi per modificarli serve una chiave live. I progetti ospite creati con una chiave sandbox non vengono mai fatturati, e i progetti sandbox non si possono incorporare nel tuo sito web. I token riportano l'ambiente a cui appartengono.
Cosa copre l'API#
| Gruppo | Endpoint | Accesso della chiave necessario |
|---|---|---|
| Token di accesso | POST /auth/token, POST /auth/iframe/token |
Mappe incorporate (con Open Guest, Progetti degli ospiti) |
| Account | Il piano, i posti e la chiave dell'account con GET /account; le richieste API degli ultimi 30 giorni e, con Open Guest, i progetti ospite e il budget del periodo con GET /usage |
Account: Lettura |
| Progetti e cartelle | I tuoi progetti (GET /projects, il Cestino con trashed=true) e cartelle (GET /folders); ottieni un progetto, le sue misure (/projects/{pid}/data), i suoi commenti o il suo file .mmp (/projects/{pid}/mmp); crea, aggiorna e sposta progetti e cartelle; unisci progetti (POST /projects/merge); elimina nel Cestino e ripristina (POST /projects/{pid}/restore); le versioni di un progetto (/projects/{pid}/versions); rimuovi e ripristina commenti; condividi un progetto o una cartella via e-mail (PUT /projects/{pid}/members) |
Progetti: Lettura per leggere, Lettura e modifica per modificare |
| File e copie dei progetti | Esporta un progetto nei formati dell'app (POST /projects/{pid}/export) o ottieni il suo report PDF (GET /projects/{pid}/pdf), entrambi come link validi per 24 ore; copia un progetto, o crea un modello da esso (POST /projects/{pid}/copy) |
Progetti: Lettura; Lettura e modifica per copiare. I prezzi in un report richiedono Prodotti: Lettura |
| Preventivi | Il preventivo di un progetto, voce per voce (GET /projects/{pid}/estimate) |
Progetti e Prodotti: Lettura |
| Prodotti | GET /products, GET /products/{id}, crea, aggiorna e archivia con DELETE /products/{id} |
Prodotti: Lettura oppure Lettura e modifica |
| Profilo | Il profilo e le impostazioni email (/account/profile); per il cliente di un partner, chi gli paga il piano e i suoi inviti (/account/partner) |
Account: Lettura, Lettura e modifica |
| Importazioni | Importa file in un progetto (POST /projects/{pid}/imports), come fa Importa nell'app: aggiungi o sostituisci, poi segui l'avanzamento |
Progetti: Lettura e modifica |
| Chiavi e webhook | Le chiavi API dell'account (/keys: elenco, revoca, siti web; mai per intero, mai oltre l'accesso della chiave che chiama) e il suo webhook (/webhook) |
Sviluppatori: Lettura, Lettura e modifica |
| Partner | Clienti e inviti, piano, licenze, budget, pagamento e fatture di un cliente (/partner) |
Clienti: Lettura, Lettura e modifica |
| Enterprise: utenti, inviti, posti, team | Utenti (/enterprise/users): elenca, cambia il loro ruolo o i loro dati, disattiva e attiva, disconnetti ovunque, rimuovi dall'organizzazione, elimina, imposta i loro team, passa i loro progetti a un altro. Inviti (/enterprise/invitations): invita, elenca, reinvia, ritira. Posti (GET /enterprise/seats). Team (/enterprise/teams). Tutti i progetti dell'organizzazione (GET /enterprise/projects) e i progetti nei team |
Utenti: Lettura o Lettura e modifica; i progetti richiedono Progetti |
| Enterprise: l'organizzazione | Il suo profilo e la sua politica (/enterprise/organization), il single sign-on (GET /enterprise/sso), il suo registro attività (GET /enterprise/activity), e l'acquisto o la restituzione di posti (PUT /enterprise/seats) |
Organizzazione: Lettura oppure Lettura e modifica |
| Open Guest | Il tuo link per ospiti (/open-guest/link: ottieni, crea o sostituisci, metti in pausa, scegli la sua cartella); i progetti ospite (/open-guest/projects: elenca, avviane uno per un visitatore, ottienine uno); le richieste di preventivo con il preventivo (/open-guest/requests); l'utilizzo del periodo (GET /open-guest/usage) e il budget (PUT /open-guest/budget) |
Ospiti: Lettura; Lettura e modifica per modificare |
Alcune cose da sapere:
- Una chiave raggiunge i progetti del proprio account e, con Enterprise, quelli degli utenti dell'organizzazione.
- Eliminare un progetto lo mette nel Cestino, come nell'app, e può farlo solo
il suo creatore; eliminalo definitivamente dal Cestino con
forever=true. Eliminare una cartella mette i suoi progetti nel Cestino. - Nelle misurazioni di un progetto, una forma elenca i suoi prodotti in
productIds, in ordine;productIdè il primo di essi. /projects/{pid}/mmprestituisce lo stesso file.mmpche esporta l'app. Il suo schema è pubblicato su github.com/blueblinkone/mmp-validator. I nuovi elementi vengono sempre e solo aggiunti come facoltativi, quindi un lettore scritto per un file più vecchio continua a funzionare.- Con Open Guest, un progetto ospite avviato tramite l'API
(
POST /open-guest/projects) conta per il tuo utilizzo e il tuo budget Open Guest, come uno avviato dal tuo link per ospiti. - Con Open Guest, la sezione Link per ospiti ha la
guida Open Guest API, con il codice per il tuo server e la tua
pagina: il tuo server ottiene un token da
POST /auth/tokencon la tua chiave live e porta il visitatore su un nuovo progetto tutto suo, con i suoi dati già compilati. - Le persone entrano nella tua organizzazione solo su invito
(
POST /enterprise/invitations), come nella pagina Enterprise: chi non ha un account ne riceve uno e sceglie la propria password. L'API non crea mai un account e non imposta mai una password. - Rimuovere un utente (
POST /enterprise/users/{uid}/remove) gli lascia il suo account; eliminarlo (DELETE /enterprise/users/{uid}) elimina l'account. In entrambi i casi il lavoro che ha fatto resta all'organizzazione, in una nuova cartella con il suo nome che i tuoi amministratori condividono. - Quando un ospite chiede il tuo preventivo,
GET /open-guest/requests/{pid}risponde chi è, cosa ha scritto, cosa ha misurato e, con Prodotti: Lettura, il preventivo stesso. - Con Open Guest, i token avviano progetti ospite per i tuoi visitatori.
POST /auth/iframe/token, che fa accedere un visitatore a una mappa incorporata, è per le chiavi Enterprise. - I prodotti non vengono mai eliminati tramite l'API, solo archiviati, e il prezzo di costo di un prodotto non viene mai restituito.
- Le particelle catastali non fanno parte dell'API.
Risposte ed errori#
Una richiesta riuscita risponde con stato 200 e JSON (l'esportazione .mmp
risponde con XML). Una richiesta fallita risponde con uno stato di errore e un
corpo come:
{"errorCode": "insufficient_scope", "errorMessage": "This API key does not have the scope required for this endpoint"}
| Stato | errorCode |
Cosa controllare |
|---|---|---|
| 400 | invalid_body, invalid_uid, invalid_project_id, pagination_invalid_page_number, pagination_invalid_page_limit |
Un valore nella richiesta manca o non è accettato, come page e limit di un elenco a pagine. |
| 401 | unauthorized_action |
La richiesta è stata inviata da una pagina web di un sito che la chiave non consente, oppure l'elemento non appartiene al tuo account né a quelli dei tuoi membri. |
| 402 | budget_limit_reached |
Open Guest: hai raggiunto il limite del budget, quindi niente più progetti ospite in questo periodo. |
| 403 | invalid_api_key |
Nell'intestazione Authorization non è stata inviata nessuna chiave, oppure la chiave è sconosciuta, revocata o oltre le 24 ore dopo essere stata sostituita. |
| 403 | api_key_suspended |
L'accesso API sul tuo account è stato sospeso. Contatta il supporto. |
| 403 | subscription_expired, invalid_subscription |
L'abbonamento non è attivo, oppure il suo piano non include l'API. |
| 403 | insufficient_scope |
La chiave non ha l'accesso che questo endpoint richiede. |
| 403 | scope_not_in_plan |
Il tuo piano non include questo endpoint, per esempio la sezione Enterprise con Open Guest. |
| 403 | embed_needs_enterprise |
Le mappe incorporate fanno parte del piano Enterprise. Una chiave Open Guest apre solo i propri progetti ospite. |
| 404 | not_found, project_not_found, user_not_found |
L'elemento non esiste, o la persona non è un utente della tua organizzazione. |
| 409 | enterprise_add_users_limit |
Invitare qualcuno: tutti i posti sono occupati e i posti automatici sono disattivati. |
| 409 | project_not_in_trash |
È stato richiesto di ripristinare o eliminare definitivamente un progetto che non è nel Cestino. |
| 429 | too_many_requests |
Più di 600 token in un'ora. Attendi un po' e riprova. |
| 500 | server_error |
Non è stato possibile completare la richiesta. Controlla gli ID che hai inviato, riprova e, se persiste, contatta il supporto. |
Provare l'API dalla pagina Sviluppatori#
Sviluppatori > Prova l'API invia richieste reali con la tua chiave e mostra esattamente cosa torna indietro.
- Scegli Produzione oppure Sandbox.
- Scegli un Endpoint, come "Elenca i tuoi progetti", "Ottieni le misure" o "Ottieni l'account". L'elenco propone gli endpoint inclusi nel tuo piano.
- Compila i suoi parametri. Un progetto o un prodotto si sceglie per nome tra quelli che la chiave può leggere; dove serve una persona, il tuo account viene inserito al posto tuo.
- Premi Invia richiesta. Lo stato e la risposta compaiono sotto.
Vengono proposte solo richieste di lettura, quindi provare non cambia nulla, e queste richieste non rientrano nel tuo utilizzo. Se la tua chiave non ha l'accesso che un endpoint richiede, la pagina ti avvisa che risponderà 403.
Webhook#
Un webhook avvisa il tuo server quando succede qualcosa, come le email di notifica avvisano te. I webhook fanno parte dei piani Enterprise e Open Guest.
Configurare un webhook#
In Sviluppatori > Webhook:
- Scrivi il tuo URL dell'endpoint: un indirizzo
https://su internet. Gli indirizzi su reti private vengono rifiutati, e il controllo si ripete prima di ogni consegna. - Seleziona gli Eventi che vuoi (vedi eventi). Un nuovo endpoint parte con gli eventi che il tuo piano invia, e ne va selezionato almeno uno.
- Premi Salva. La prima volta, la pagina mostra per intero il tuo Segreto di firma. Copialo subito: in seguito ne vengono mostrati solo gli ultimi caratteri.
- Premi Invia evento di prova e scegli un evento.
Un test invia un esempio di quell'evento, con valori inventati e "test": true
nel suo data, al tuo endpoint salvato, anche quando l'evento non è selezionato
o l'endpoint è disattivato. Per fermare tutte le consegne, premi
Rimuovi: l'endpoint e il suo secret
vengono eliminati.
Sotto le impostazioni, il Riferimento webhook contiene ciò che serve per scrivere la parte ricevente: le intestazioni e il corpo, il codice che verifica la firma in Node.js, Python e PHP, e dati di esempio per ogni evento.
Cosa riceve il tuo server#
Ogni evento è una POST al tuo endpoint, con un corpo JSON:
{"id": "evt_3f9a1c2b7d4e5f60718293a4", "type": "project.created", "created": 1790000000000, "data": { ... }}
id è univoco per ogni evento, created indica quando è avvenuto in millisecondi
dal 1° gennaio 1970 (UTC), e il contenuto di data dipende dall'evento. La
richiesta ha anche queste intestazioni:
| Intestazione | Valore |
|---|---|
X-MMO-Event |
Il nome dell'evento, come type nel corpo. |
X-MMO-Delivery |
L'id dell'evento. |
X-MMO-Signature |
t=<milliseconds>,v1=<hex>: quando la consegna è stata firmata, e la sua firma. |
User-Agent |
MeasureMapOnline-Webhooks/1 |
- Rispondi con uno stato 2xx entro 8 secondi, prima di qualsiasi lavoro lento. Qualsiasi altro stato, un reindirizzamento o un timeout conta come errore.
- Ogni evento viene inviato una volta e mai ritentato. La sezione mostra Ultima consegna e Errori consecutivi.
- Dopo 10 errori di fila, l'endpoint viene disattivato e il proprietario riceve un'email. Correggi il tuo server e premi Salva per riattivarlo.
- Ogni tanto un evento arriva due volte o fuori ordine. Usa
idper ignorare le ripetizioni ecreatedper mettere gli eventi in ordine.
Verificare la firma#
Chiunque conosca il tuo indirizzo può inviarvi dati, quindi verifica ogni consegna prima di fidartene:
- Dividi l'intestazione
X-MMO-Signaturealla virgola intev1. - Calcola un HMAC-SHA256 di
t, un punto e il corpo grezzo della richiesta, con il tuo signing secret come chiave, scritto in esadecimale. - Confronta il risultato con
v1usando un confronto a tempo costante. - Rifiuta la consegna se
tdista più di 5 minuti dall'ora attuale.tè in millisecondi.
Usa il corpo esattamente come è arrivato: analizzare il JSON e riscriverlo lo modifica, e la firma non corrisponde più.
Ruota il segreto sostituisce subito il secret e mostra quello nuovo per intero, una sola volta. Aggiorna il tuo server appena lo ruoti.
Eventi#
| Evento | Inviato quando |
|---|---|
project.created |
Viene creato un progetto sul tuo account. Nell'app, tramite l'API o da un incorporamento. |
project.deleted |
Un progetto viene eliminato definitivamente (spostarlo nel cestino non conta). |
project.comment.added |
Qualcuno commenta un progetto, di solito il tuo cliente che risponde. |
guest.project.created (Open Guest) |
Un ospite avvia un progetto dal tuo link o tramite l'API. Solo quando l'indirizzo email dell'ospite è noto. |
guest.measurement.completed (Open Guest) |
Un ospite termina una misurazione e lascia i suoi dati di contatto. |
budget.warning_reached (Open Guest) |
La spesa a consumo supera la tua soglia di avviso. |
budget.limit_reached (Open Guest) |
La spesa a consumo raggiunge il tuo limite: ulteriori progetti ospite vengono rifiutati. |
enterprise.user.created (Enterprise) |
Viene aggiunto un posto alla tua organizzazione, anche tramite single sign-on. |
Hai ancora bisogno di aiuto?
Scrivi al nostro team di supporto e raccontaci cosa stavi cercando di fare. Gli screenshot aiutano.