REST API
自分のソフトウェアからプロジェクト、フォルダ、製品、メンバーを操作し、開発者ページからリクエストを試し、出来事があったときに Webhook を受け取る方法を説明します。
REST API を使うと、自分のソフトウェアから Measure Map Online のアカウントの内容を読み取り、変更できます。対象は、プロジェクトとその計測値、フォルダ、製品カタログ、Enterprise では組織のメンバーです。応答は JSON で返されます。すべてのフィールドと例を含む完全なリファレンスは API ドキュメントにあり、このページはその概要です。
アプリからドキュメントを開くには、開発者 > REST API に移動し、ドキュメンテーションを見る を押します。
ベース URL#
すべてのリクエストの送信先は次のとおりです。
https://api.measuremaponline.com/api/v2
認証#
すべてのリクエストの Authorization ヘッダーに、API キーをそのまま入れて送ります。キーは開発者ページで作成します。詳しくはAPI キーを参照してください。
curl https://api.measuremaponline.com/api/v2/projects/YOUR_PROJECT_ID \
-H "Authorization: YOUR_API_KEY"
各リクエストは、キーのアクセス権(たとえば、プロジェクトの 読み取り)、サブスクリプション、そして Web ページから送られたリクエストの場合はキーのウェブサイトの制限に照らして確認されます。データを変更できるキーは、サーバーで保管してください。詳しくはキーを安全に保つを参照してください。
本番とサンドボックス#
ベース URL は両方で共通です。どちらになるかはキーで決まります。サンドボックスのキーは、本番のキーからは見えないサンドボックスのプロジェクト、フォルダ、製品を読み書きします。メンバーは両方で共通ですが、メンバーとしてサインインするには本番のキーが必要です。サンドボックスのキーで作成したゲストプロジェクトは課金されず、サンドボックスのプロジェクトはウェブサイトに埋め込めません。トークンは、自分が属する環境を示します。
API の対象#
| グループ | エンドポイント | 必要なキーのアクセス権 |
|---|---|---|
| サインイン用トークン | POST /auth/token、POST /auth/iframe/token |
埋め込みマップ |
| プロジェクトとフォルダ | 人のプロジェクト(全件、またはページ単位で 1 ページ最大 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 |
キーが許可していないウェブサイトの Web ページからリクエストが送られた。または、その項目が自分のアカウントにもメンバーのアカウントにもない。 |
| 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 |
1 時間に 600 個を超えるトークンを要求した。少し待ってから再試行する。 |
| 500 | server_error |
リクエストを完了できなかった。送信した ID を確認して再試行し、解決しない場合はサポートに連絡する。 |
開発者ページから API を試す#
開発者 > API を試す では、キーを使って実際のリクエストを送り、返ってきた内容をそのまま表示します。
- 本番 または サンドボックス を選びます。
- 「すべてのプロジェクトを一覧」や「計測値を取得」などの エンドポイント を選びます。
- パラメーターを入力します。プロジェクトや製品は、キーで読み取れるものの中から名前で選びます。人を指定するパラメーターには、自分のアカウントが入力されます。
- リクエスト送信 を押します。ステータスと応答が下に表示されます。
表示されるのは読み取りのリクエストだけなので、試しても何も変更されず、これらのリクエストは利用状況にも数えられません。キーにエンドポイントに必要なアクセス権がない場合は、403 が返されることが警告として表示されます。
Webhook#
Webhook は、通知メールが自分に知らせるのと同じように、何かが起きたことをサーバーに知らせます。Webhook は Enterprise プランと Open Guest プランの機能です。
Webhook を設定する#
開発者 > Webhook で次のようにします。
- エンドポイント URL を入力します。インターネット上の
https://のアドレスである必要があります。プライベートネットワーク上のアドレスは拒否され、この確認は配信のたびに改めて行われます。 - 受け取る イベント にチェックを入れます(イベントを参照)。新しいエンドポイントでは、プランが送るイベントにチェックが入った状態で始まります。少なくとも 1 つはチェックが必要です。
- 保存 を押します。初回は、署名シークレット がすべて表示されます。そのときにコピーしてください。その後は末尾の数文字だけが表示されます。
- テストイベントを送信 を押し、イベントを選びます。
テストでは、そのイベントのサンプルが、架空の値と data 内の "test": true 付きで、保存したエンドポイントに送られます。そのイベントにチェックが入っていない場合や、エンドポイントがオフになっている場合でも送られます。すべての配信を止めるには、削除 を押します。エンドポイントとそのシークレットが削除されます。
設定の下にある Webhook リファレンス には、受信側を作るのに必要なものがそろっています。ヘッダーと本文、Node.js、Python、PHP で署名を確認するコード、すべてのイベントのデータの例です。
サーバーが受け取るもの#
各イベントは、エンドポイントへの 1 回の POST で、本文は JSON です。
{"id": "evt_3f9a1c2b7d4e5f60718293a4", "type": "project.created", "created": 1790000000000, "data": { ... }}
id はイベントごとに一意で、created はイベントが起きた時刻(1970 年 1 月 1 日(UTC)からのミリ秒)です。data の内容はイベントによって異なります。リクエストには、次のヘッダーも含まれます。
| ヘッダー | 値 |
|---|---|
X-MMO-Event |
イベント名。本文の type と同じです。 |
X-MMO-Delivery |
イベントの id。 |
X-MMO-Signature |
t=<milliseconds>,v1=<hex>:配信が署名された時刻と、その署名。 |
User-Agent |
MeasureMapOnline-Webhooks/1 |
- 時間のかかる処理をする前に、8 秒以内に 2xx のステータスで応答してください。それ以外のステータス、リダイレクト、タイムアウトは失敗として扱われます。
- 各イベントは 1 回だけ送られ、再送はされません。このセクションには、最後の配信 と 連続失敗回数 が表示されます。
- 10 回連続で失敗すると、エンドポイントはオフになり、オーナーにメールが届きます。サーバーを修正し、保存 を押して再びオンにしてください。
- まれに、同じイベントが 2 回届いたり、順序が入れ替わって届いたりします。
idで重複を無視し、createdでイベントを並べ替えてください。
署名を確認する#
アドレスを知っている人なら誰でもそこに送信できるため、配信を信頼する前に毎回確認してください。
X-MMO-Signatureヘッダーをカンマで分けて、tとv1を取り出します。t、ピリオド、受け取ったままのリクエスト本文をつないだものについて、署名シークレットをキーとして HMAC-SHA256 を計算し、16 進数で表します。- その結果を、一定時間で比較する方法で
v1と比較します。 tが現在時刻から 5 分以上ずれている場合は、その配信を拒否します。tの単位はミリ秒です。
本文は届いたままの形で使ってください。JSON を解析して書き出し直すと本文が変わり、署名が一致しなくなります。
シークレットを再生成 を押すと、シークレットがすぐに置き換えられ、新しいシークレットが 1 回だけすべて表示されます。ローテーションしたら、すぐにサーバーを更新してください。
イベント#
| イベント | 送られるとき |
|---|---|
project.created |
アカウントでプロジェクトが作成されたとき。アプリ、API、埋め込みのどれで作成された場合も送られます。 |
project.deleted |
プロジェクトが完全に削除されたとき(ゴミ箱への移動は対象外)。 |
project.comment.added |
プロジェクトにコメントが付いたとき(多くは顧客からの返信)。 |
guest.project.created(オープンゲスト) |
ゲストがあなたのリンクまたは API からプロジェクトを開始します。ゲストのメールアドレスがわかっている場合だけです。 |
guest.measurement.completed(オープンゲスト) |
ゲストが計測を完了し、連絡先を残したとき。 |
budget.warning_reached(オープンゲスト) |
従量課金の見込み額が警告のしきい値を超えたとき。 |
budget.limit_reached(オープンゲスト) |
従量課金が上限に達したとき。以降のゲストプロジェクトは拒否されます。 |
enterprise.user.created(企業) |
組織にシートが追加されたとき(シングルサインオン経由を含む)。 |
解決しない場合は
サポートチームにメールで、何をしようとしていたかをお知らせください。スクリーンショットがあると助かります。