REST API
通过你自己的软件完成应用对项目、文件夹和产品、Enterprise 组织以及 Open Guest 潜在客户所做的事,在“开发者”页面试用请求,并在有事件发生时接收 webhook。
REST API 让你自己的软件可以做应用能做的事:项目及其测量、文件夹和产品目录;在 Enterprise 中,是你的组织,就像Enterprise页面所管理的那样;在 Open Guest 中,是你的访客链接、访客项目和估价请求。它以 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"
每个请求都会根据密钥的权限(例如 Projects 读取)、你的订阅,以及对于从网页发出的请求,密钥的网站限制进行检查。能够更改数据的密钥请保存在你的服务器上:参见保管好你的密钥。
正式环境与沙盒#
两者使用同一个基础 URL,由密钥决定:沙盒密钥读写沙盒项目、文件夹和产品,正式密钥永远看不到它们。你的组织的用户、席位和团队在两者中是相同的,因此更改它们需要正式密钥。用沙盒密钥创建的访客项目永远不会计费,沙盒项目也不能嵌入你的网站。令牌会报告它们所属的环境。
API 涵盖的内容#
| 分组 | 端点 | 所需的密钥权限 |
|---|---|---|
| 登录令牌 | POST /auth/token, POST /auth/iframe/token |
嵌入的地图(在 Open Guest 中为 访客项目) |
| 账户 | 通过 GET /account 获取账户的套餐、席位和密钥;通过 GET /usage 获取最近 30 天的 API 请求,在 Open Guest 中还有当期的访客项目和预算 |
账户:读取 |
| 项目和文件夹 | 你的项目(GET /projects,加 trashed=true 为回收站)和文件夹(GET /folders);获取项目、它的测量(/projects/{pid}/data)、评论或 .mmp 文件(/projects/{pid}/mmp);创建、更新和移动项目与文件夹;合并项目(POST /projects/merge);删除到回收站并恢复(POST /projects/{pid}/restore);项目的版本(/projects/{pid}/versions);移除和恢复评论;通过电子邮件共享项目或文件夹(PUT /projects/{pid}/members) |
项目:读取需要 读取,更改需要 读取和更改 |
| 项目文件和副本 | 以应用的格式导出项目(POST /projects/{pid}/export)或获取它的 PDF 报告(GET /projects/{pid}/pdf),两者都以 24 小时内有效的链接提供;复制项目,或用它制作模板(POST /projects/{pid}/copy) |
项目:读取;复制需要 读取和更改。报告中的价格需要 产品:读取 |
| 估算 | 项目的估算,逐行列出(GET /projects/{pid}/estimate) |
项目 和 产品:读取 |
| 产品 | GET /products, GET /products/{id},创建、更新,以及用 DELETE /products/{id} 归档 |
产品:读取 或 读取和更改 |
| 个人资料 | 个人资料和邮件设置(/account/profile);对合作伙伴的客户,谁为其套餐付费以及邀请(/account/partner) |
账户:读取、读取和更改 |
| 导入 | 将文件导入项目(POST /projects/{pid}/imports),与应用中的导入相同:添加或替换,然后跟踪进度 |
项目:读取和更改 |
| 密钥和 Webhook | 账户的 API 密钥(/keys:列出、吊销、网站;从不返回完整密钥,从不超出调用密钥的权限)及其 Webhook(/webhook) |
开发者:读取、读取和更改 |
| 合作伙伴 | 客户和邀请、客户的套餐、席位、预算、付款和发票(/partner) |
客户:读取、读取和更改 |
| Enterprise:用户、邀请、席位、团队 | 用户(/enterprise/users):列出、更改其角色或资料、停用和启用、在所有设备上退出登录、从组织中移除、删除、设置其团队、移交其项目。邀请(/enterprise/invitations):邀请、列出、重新发送、撤回。席位(GET /enterprise/seats)。团队(/enterprise/teams)。组织中的所有项目(GET /enterprise/projects)以及团队中的项目 |
用户:读取或读取和更改;项目需要 项目 |
| Enterprise:组织 | 组织的资料和政策(/enterprise/organization)、单点登录(GET /enterprise/sso)、活动日志(GET /enterprise/activity),以及购买或退还席位(PUT /enterprise/seats) |
组织:读取 或 读取和更改 |
| Open Guest | 你的访客链接(/open-guest/link:获取、创建或替换、暂停、选择其文件夹);访客项目(/open-guest/projects:列出、为访客启动一个、获取一个);带有估价的估价请求(/open-guest/requests);本期用量(GET /open-guest/usage)和预算(PUT /open-guest/budget) |
访客:读取;更改需要读取和更改 |
需要了解的几点:
- 密钥可以访问自己账户的项目,在 Enterprise 中还可以访问组织用户的项目。
- 删除项目会像在应用中一样把它放入回收站,并且只有创建者可以这样做;要永久删除,请在回收站中使用
forever=true删除。删除文件夹会把其中的项目放入回收站。 - 在项目的测量结果中,图形按顺序在
productIds中列出它的产品;productId是其中的第一个。 /projects/{pid}/mmp返回的.mmp文件与应用导出的相同。它的模式发布在 github.com/blueblinkone/mmp-validator。新元素只会作为可选元素添加,因此为旧文件编写的读取程序可以继续使用。- 在 Open Guest 中,通过 API 启动的访客项目(
POST /open-guest/projects)与从你的访客链接启动的项目一样,计入你的 Open Guest 用量和预算。 - 在 Open Guest 中,访客链接 部分提供 Open Guest API 指南,其中有适用于你的服务器和页面的代码:你的服务器用正式密钥从
POST /auth/token获取令牌,并把访客带到一个属于他们自己的新项目,其个人信息已经填好。 - 人们只能通过邀请(
POST /enterprise/invitations)加入你的组织,与Enterprise页面相同:没有账户的人会获得一个账户,并自己选择密码。API 从不创建账户或设置密码。 - 移除用户(
POST /enterprise/users/{uid}/remove)会保留其账户;删除用户(DELETE /enterprise/users/{uid})则删除其账户。无论哪种方式,其创建的工作都会留在组织中,放在以其姓名命名的新文件夹里,由你的管理员共享。 - 当访客请求你的估价时,
GET /open-guest/requests/{pid}会返回他们是谁、写了什么、测量了什么,并且在有 产品:读取时,返回估价本身。 - 在 Open Guest 中,令牌用于为你的访客发起访客项目。让访客登录嵌入地图的
POST /auth/iframe/token适用于 Enterprise 密钥。 - 产品绝不会通过 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 中的 Enterprise 部分。 |
| 403 | embed_needs_enterprise |
嵌入地图属于 Enterprise 套餐。Open Guest 密钥只能打开它自己的访客项目。 |
| 404 | not_found, project_not_found, user_not_found |
该项目不存在,或此人不是你的组织的用户。 |
| 409 | enterprise_add_users_limit |
邀请某人时:所有席位都已占用,且自动席位已关闭。 |
| 409 | project_not_in_trash |
对不在回收站中的项目请求了恢复或永久删除。 |
| 429 | too_many_requests |
一小时内超过 600 个令牌。请稍等片刻后重试。 |
| 500 | server_error |
请求无法完成。请检查你发送的 ID,重试一次;如果问题仍然存在,请联系支持团队。 |
在“开发者”页面试用 API#
开发者 > 试用 API 会用你的密钥发送真实的请求,并准确显示返回的内容。
- 选择 正式 或 沙盒。
- 选择一个 端点,例如“列出你的项目”、“获取测量数据”或“获取账户”。列表中提供的是你的套餐所包含的端点。
- 填写它的参数。项目或产品按名称从该密钥可以读取的范围中选择;需要指定某个人时,会自动填入你自己的账户。
- 按 发送请求。状态和响应会显示在下方。
这里只提供读取类请求,所以试用不会更改任何内容,并且这些请求不计入你的用量。如果你的密钥没有某个端点所需的权限,页面会提醒你它将返回 403。
Webhook#
Webhook 会在有事情发生时通知你的服务器,就像通知邮件通知你一样。Webhook 是 Enterprise 和 Open Guest 套餐的一部分。
设置 webhook#
在 开发者 > Webhooks 中:
- 输入你的 端点 URL:一个互联网上的
https://地址。私有网络上的地址会被拒绝,并且每次投递前都会再次检查。 - 勾选你想要的 事件(参见事件)。新的端点默认包含你的套餐所发送的事件,并且至少要勾选一个。
- 按 保存。首次保存时,页面会完整显示你的 签名密钥。请此时复制它:之后只会显示它的最后几个字符。
- 按 发送测试事件 并选择一个事件。
测试会向你已保存的端点发送该事件的示例,其中的值是虚构的,并且 data 中带有 "test": true,即使该事件没有被勾选,或端点已关闭也会发送。若要停止所有投递,请按 移除:端点及其密钥都会被删除。
在设置下方,Webhook 参考 提供了编写接收端所需的内容:标头和请求体、在 Node.js、Python 和 PHP 中校验签名的代码,以及每个事件的示例数据。
你的服务器会收到什么#
每个事件都是发往你端点的一次 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 状态。任何其他状态、重定向或超时都算作失败。
- 每个事件只发送一次,绝不重试。该部分会显示 最近一次推送 和 连续失败次数。
- 连续失败 10 次后,端点会被关闭,所有者会收到一封电子邮件。请修复你的服务器,然后按 保存 重新开启。
- 事件偶尔会重复到达或乱序到达。请用
id忽略重复的事件,用created为事件排序。
校验签名#
任何知道你地址的人都可以向它发送请求,所以在信任每次投递之前都要先校验:
- 将
X-MMO-Signature标头在逗号处拆分为t和v1。 - 以你的签名密钥作为密钥,对
t、一个句点和原始请求体计算 HMAC-SHA256,并以十六进制表示。 - 用恒定时间比较将结果与
v1比较。 - 如果
t与当前时间相差超过 5 分钟,则拒绝该投递。t以毫秒为单位。
请使用与收到时完全一致的请求体:解析 JSON 后再重新输出会改变它,签名就不再匹配。
轮换密钥 会立即替换密钥,并完整显示一次新密钥。轮换后请立即更新你的服务器。
事件#
| 事件 | 发送时机 |
|---|---|
project.created |
你的账户下创建了项目。 无论是在应用中、通过 API 还是从嵌入中。 |
project.deleted |
项目被永久删除(移到回收站不算)。 |
project.comment.added |
有人对项目发表评论,通常是你的客户在回复。 |
guest.project.created (Open Guest) |
访客通过你的链接或 API 开始一个项目。 仅当已知访客的电子邮件地址时。 |
guest.measurement.completed (Open Guest) |
访客完成一次测量并留下联系方式。 |
budget.warning_reached (Open Guest) |
计量支出超过你的预警阈值。 |
budget.limit_reached (Open Guest) |
计量支出达到你的上限,将拒绝后续的访客项目。 |
enterprise.user.created (Enterprise) |
你的组织新增了一个席位,包括通过单点登录新增。 |
仍需要帮助?
给我们的支持团队写信,告诉我们你想做什么。附上截图会更有帮助。