REST API
Работайте с проектами, папками, продуктами и участниками из собственных программ, пробуйте запросы на странице «Разработчик» и получайте вебхуки о событиях.
REST API позволяет вашим программам читать и изменять содержимое аккаунта Measure Map Online: проекты и их измерения, папки, каталог продуктов и, на тарифе Enterprise, участников вашей организации. Ответы приходят в формате JSON. Полный справочник со всеми полями и примерами — это документация по API; эта страница — обзор.
Чтобы открыть документацию из приложения, перейдите в Разработчик > REST API и нажмите Просмотреть документацию.
Базовый URL#
Все запросы отправляются на:
https://api.measuremaponline.com/api/v2
Аутентификация#
Передавайте свой API-ключ как есть в заголовке Authorization каждого
запроса. Создайте ключ на странице «Разработчик»: см.
API-ключи.
curl https://api.measuremaponline.com/api/v2/projects/YOUR_PROJECT_ID \
-H "Authorization: YOUR_API_KEY"
Каждый запрос проверяется на соответствие доступу ключа (например, «Проекты: Чтение»), вашей подписке и — для запроса, отправленного с веб-страницы, — ограничениям ключа по сайтам. Ключи, которые могут изменять данные, храните на своём сервере: см. как защитить ключ.
Рабочая среда и песочница#
Базовый URL у них общий. Всё решает ключ: ключ песочницы читает и записывает проекты, папки и продукты песочницы, которых рабочие ключи никогда не видят. Участники в обеих средах одни и те же, но для входа от имени участника нужен рабочий ключ. Гостевые проекты, созданные ключом песочницы, никогда не оплачиваются, а проекты песочницы нельзя встроить на ваш сайт. Токены сообщают, к какой среде они относятся.
Что охватывает API#
| Группа | Эндпоинты | Нужный доступ ключа |
|---|---|---|
| Токены входа | POST /auth/token, POST /auth/iframe/token |
Встроенные карты |
| Проекты и папки | Список проектов пользователя (все сразу или постранично, до 200 на страницу) и его папок; получение проекта, его измерений (/projects/{pid}/data), комментариев или файла .mmp (/projects/{pid}/mmp); получение папки; создание, изменение и удаление проектов и папок |
Проекты: Чтение для чтения, Чтение и изменение для изменений |
| Продукты | GET /products, GET /products/{id}, создание, изменение и архивирование через DELETE /products/{id} |
Продукты: Чтение или Чтение и изменение |
| Участники (Enterprise) | GET /users, GET /users/{uid}, POST /users/new, PUT /users/{uid}, DELETE /users/{uid} |
Пользователи: Чтение или Чтение и изменение |
| Вход от имени участника (Enterprise) | POST /auth/{uid}/login выдаёт токен входа для участника вашей организации |
Пользователи: Чтение и изменение |
Что нужно знать:
- Ключ имеет доступ к проектам своего аккаунта, а на тарифе Enterprise — и к проектам участников организации.
- Удаление проекта или папки через API окончательно: ничего не попадает в раздел «Корзина». Папка удаляется вместе с вложенными папками и проектами, которые принадлежат вашему аккаунту или вашим участникам.
- В измерениях проекта фигура перечисляет свои продукты в
productIdsпо порядку;productId— первый из них. /projects/{pid}/mmpотдаёт тот же файл.mmp, который экспортирует приложение. Его схема опубликована на github.com/blueblinkone/mmp-validator. Новые элементы добавляются только как необязательные, поэтому программа, написанная для более старого файла, продолжает работать.- На тарифе Open Guest проект, созданный через API с уровнем доступа Open Guest, учитывается в использовании и бюджете Open Guest так же, как проект, начатый по вашей гостевой ссылке.
- На тарифе Open Guest в разделе Гостевая ссылка
есть руководство Open Guest API с кодом для вашего сервера и
страницы: сервер получает токен через
POST /auth/tokenс вашим рабочим ключом и отправляет посетителя в его собственный новый проект с уже заполненными данными. - Создание участника через
POST /users/newзанимает место, как и приглашение, и даёт ему роль по умолчанию вашей организации. - Токен от
POST /auth/{uid}/loginоткрывает аккаунт этого участника, поэтому для него нужен ключ, которому разрешено изменять участников, и никогда не ключ из ваших встроенных карт. Его не выдают для участников с ролью «Администратор» или «Менеджер», а также с ключом песочницы. - Продукты через API никогда не удаляются, а только архивируются, а себестоимость продукта никогда не возвращается.
- Кадастровые участки в API не входят.
Ответы и ошибки#
Успешный запрос возвращает статус 200 и JSON (экспорт .mmp возвращает XML).
Неудачный возвращает статус ошибки и тело, например:
{"errorCode": "insufficient_scope", "errorMessage": "This API key does not have the scope required for this endpoint"}
| Статус | errorCode |
Что проверить |
|---|---|---|
| 400 | invalid_body, invalid_uid, invalid_project_id, pagination_invalid_page_number, pagination_invalid_page_limit |
Значение в запросе отсутствует или не принимается, например page и limit постраничного списка. |
| 401 | unauthorized_action |
Запрос отправлен с веб-страницы сайта, который ключ не разрешает, либо объект не принадлежит ни вашему аккаунту, ни вашим участникам. |
| 402 | budget_limit_reached |
Open Guest: достигнут лимит бюджета, поэтому в этом периоде новых гостевых проектов больше не будет. |
| 403 | invalid_api_key |
В заголовке Authorization не передан ключ, либо ключ неизвестен, отозван или заменён более 24 часов назад. |
| 403 | api_key_suspended |
Доступ к API для вашего аккаунта приостановлен. Обратитесь в поддержку. |
| 403 | subscription_expired, invalid_subscription |
Подписка не активна или её тариф не включает API. |
| 403 | insufficient_scope |
У ключа нет доступа, нужного этому эндпоинту. |
| 403 | scope_not_in_plan |
Ваш тариф не включает этот эндпоинт, например участников на Open Guest. |
| 404 | not_found, project_not_found, user_not_found |
Объект не существует, или человек не является участником вашей организации. |
| 409 | enterprise_add_users_limit |
При создании участника: все места заняты. |
| 429 | too_many_requests |
Больше 600 токенов за час. Немного подождите и повторите попытку. |
| 500 | server_error |
Запрос не удалось выполнить. Проверьте переданные идентификаторы, повторите попытку и, если ошибка не исчезает, обратитесь в поддержку. |
Попробуйте API на странице «Разработчик»#
Разработчик > Попробовать API отправляет настоящие запросы с вашим ключом и показывает, что именно приходит в ответ.
- Выберите Рабочая или Песочница.
- Выберите Эндпоинт, например «Список всех проектов» или «Получить измерения».
- Заполните его параметры. Проект или продукт выбирается по названию из тех, что может прочитать ключ; если нужен пользователь, ваш аккаунт подставляется автоматически.
- Нажмите Отправить запрос. Статус и ответ появятся ниже.
Предлагаются только запросы на чтение, поэтому пробные запросы ничего не меняют и не учитываются в вашем использовании. Если у вашего ключа нет доступа, нужного эндпоинту, страница предупредит, что он ответит 403.
Вебхуки#
Вебхук сообщает вашему серверу о событиях так же, как уведомления по электронной почте сообщают вам. Вебхуки входят в тарифы Enterprise и Open Guest.
Настройте вебхук#
В Разработчик > Вебхуки:
- Введите URL эндпоинта: адрес
https://, доступный из интернета. Адреса в частных сетях не принимаются, и это проверяется заново перед каждой доставкой. - Отметьте нужные События (см. события). Новый адрес изначально получает события, которые отправляет ваш тариф, и хотя бы одно должно быть отмечено.
- Нажмите Сохранить. В первый раз страница показывает ваш Секрет подписи полностью. Скопируйте его сразу: потом видны только его последние символы.
- Нажмите Отправить тестовое событие и выберите событие.
Тест отправляет на сохранённый адрес образец этого события с вымышленными
значениями и "test": true в его data — даже если событие не отмечено или
адрес отключён. Чтобы прекратить все доставки, нажмите Удалить: адрес и его секрет удаляются.
Под настройками, в разделе Справочник по вебхукам, есть всё, что нужно, чтобы написать принимающую сторону: заголовки и тело, код проверки подписи на Node.js, Python и PHP, а также примеры данных для каждого события.
Что получает ваш сервер#
Каждое событие — это один запрос POST на ваш адрес с телом в формате JSON:
{"id": "evt_3f9a1c2b7d4e5f60718293a4", "type": "project.created", "created": 1790000000000, "data": { ... }}
id уникален для каждого события, created — время события в миллисекундах
с 1 января 1970 года (UTC), а содержимое data зависит от события. У запроса
также есть такие заголовки:
| Заголовок | Значение |
|---|---|
X-MMO-Event |
Название события, как type в теле. |
X-MMO-Delivery |
id события. |
X-MMO-Signature |
t=<milliseconds>,v1=<hex>: когда доставка была подписана, и её подпись. |
User-Agent |
MeasureMapOnline-Webhooks/1 |
- Ответьте статусом 2xx в течение 8 секунд, до любой долгой работы. Любой другой статус, перенаправление или превышение времени ожидания считается неудачей.
- Каждое событие отправляется один раз и никогда не повторяется. В разделе показаны Последняя доставка и Неудач подряд.
- После 10 неудач подряд адрес отключается, а владелец получает письмо. Исправьте сервер и нажмите Сохранить, чтобы снова его включить.
- Изредка событие приходит дважды или не по порядку. Используйте
id, чтобы пропускать повторы, иcreated, чтобы упорядочивать события.
Проверьте подпись#
Отправить запрос на ваш адрес может любой, кто его знает, поэтому проверяйте каждую доставку, прежде чем ей доверять:
- Разделите заголовок
X-MMO-Signatureпо запятой наtиv1. - Вычислите HMAC-SHA256 от
t, точки и необработанного тела запроса с секретом подписи в качестве ключа, в шестнадцатеричной записи. - Сравните результат с
v1сравнением с постоянным временем выполнения. - Отклоните доставку, если
tотличается от текущего времени больше чем на 5 минут.tуказано в миллисекундах.
Используйте тело точно в том виде, в каком оно пришло: если разобрать JSON и записать его заново, он изменится, и подпись больше не совпадёт.
Сменить секрет сразу заменяет секрет и один раз показывает новый полностью. Обновите сервер сразу после смены секрета.
События#
| Событие | Когда отправляется |
|---|---|
project.created |
В вашем аккаунте создан проект. В приложении, через API или из встроенной карты. |
project.deleted |
Проект удалён безвозвратно (перемещение в корзину не считается). |
project.comment.added |
Кто-то комментирует проект — обычно это ответ вашего клиента. |
guest.project.created (Открытый гость) |
Гость начинает проект по вашей ссылке или через API. Только если известен адрес электронной почты гостя. |
guest.measurement.completed (Открытый гость) |
Гость завершил измерение и оставил контактные данные. |
budget.warning_reached (Открытый гость) |
Расход по счётчику превысил ваш порог предупреждения. |
budget.limit_reached (Открытый гость) |
Расход по счётчику достиг лимита — новые гостевые проекты отклоняются. |
enterprise.user.created (Предприятие) |
В вашу организацию добавлено место, в том числе через единый вход. |
Всё ещё нужна помощь?
Напишите в нашу службу поддержки и расскажите, что вы пытались сделать. Скриншоты помогут.