HTTP API 接口

LocationNotes API 文档

当您需要网站和 Android 应用程序背后的真实 HTTP 路由、查询参数、身份验证规则以及复制粘贴示例时,请使用此页面。 公共站点、经过身份验证的网站流和 Android 客户端都与同一域上的同一 API 表面进行通信。

需要端点背后的产品模型吗? 什么是用户?, 什么是团队?, 什么是注释?, 和 什么是可追踪?, 和 什么是外部链接?, 和 什么是图像?什么是支持请求? 解释这些路由所作用的对象。 对于逐步可跟踪序列,请使用 经过身份验证的可跟踪 API 流, 匿名可追踪 API 流, 和 可跟踪错误参考 页。

基础 URL 和约定

基础 URL

本页上的所有示例均假定当前生产主机:

https://www.locationnotes.com

格式

请求和响应使用JSON。 GUIDs 是跨笔记、类别、团队和设备的主要标识符。

授权

专用、同步和团队端点需要 Authorization: Bearer <access token> 除非该路由在下面被标记为公开。

语言

公共和管理阅读可以通过 contentLanguage=en-US 或其他支持的内容语言来过滤返回的 note/category 内容。

身份验证和不记名令牌

网站登录页面和外部提供商设置记录在 认证 页。当呼叫者还没有LocationNotes帐户时,请先注册。 想要持有者令牌的 API 客户端应使用身份 API 登录路由并关闭 cookie,这与 Android 应用程序使用的模式相同。

POST /api/auth/register 匿名

注册请求体

{
  "email": "tester@example.com",
  "password": "StrongP@ssw0rd!"
}

注册行为

成功的注册调用会创建帐户,但不会取代登录。当客户端需要专用、同步、团队或管理路由的访问令牌时,接下来调用承载登录路由。

POST /api/auth/login?useCookies=false&useSessionCookies=false 匿名

请求正文

{
  "email": "tester@example.com",
  "password": "StrongP@ssw0rd!"
}

回复摘录

{
  "tokenType": "Bearer",
  "accessToken": "eyJhbGciOi..."
}
curl -X POST "https://www.locationnotes.com/api/auth/login?useCookies=false&useSessionCookies=false" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "tester@example.com",
    "password": "StrongP@ssw0rd!"
  }'

下面的完整路由清单还列出了 /api/auth. 下当前框架管理的身份路由 如果您需要完整的交互式网站流程、提供商回调、帐户安全页面或提供商链接行为,请使用 认证页面.

地图范围内的公共注释

将此端点用于公共地图窗口和按区域浏览体验。这是主页地图使用的路线。

GET /api/notes/public/bounds 匿名
  • 所需的查询字符串: minLatitude, minLongitude, maxLatitude, maxLongitude
  • 可选查询字符串: contentLanguage
  • 响应受到网站公共数据暴露限制的限制,目前默认为 500,并且首先按最近的活动排序。

这些公共地图读取包括正常的公共注释和仅在它们仍然没有关联的可追踪项时使用 VisibleOnceAssociatedTrackableAccessed 的注释。一旦附加了可追踪项,注释就会退出匿名公共地图发现,直到查看者解锁页面级路线上的关联可追踪项之一。

curl "https://www.locationnotes.com/api/notes/public/bounds?minLatitude=41.78&minLongitude=-87.75&maxLatitude=41.96&maxLongitude=-87.54&contentLanguage=en-US"
[
  {
    "noteId": "4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3",
    "ownerUserId": "a7cfd28f-c17f-4cf7-8913-47fa10fd0d1f",
    "categoryId": "4de6bb76-f25d-4c73-b8e3-81b9ca3bf08f",
    "title": "Dock gate closed",
    "body": "Security redirected vehicles to the south entrance.",
    "contentLanguage": "en-US",
    "latitude": 41.8818,
    "longitude": -87.6231,
    "visibility": "Public",
    "isDeleted": false,
    "updatedUtc": "2026-03-13T20:10:00Z",
    "clientMutationId": "web-demo-public-1",
    "teamId": null
  }
]

某个点附近的公共注释

当客户端已经知道中心点并需要距离限制的结果集而不是矩形地图窗口时,请使用此端点。

GET /api/notes/public/nearby 匿名
  • 所需的查询字符串: latitude, longitude
  • 可选查询字符串: radiusKm (默认 5), contentLanguage
  • 附近结果受到网站公共数据暴露限制的限制,目前默认为 500。

此处适用与边界端点相同的可见性规则:通常包含公共注释,并且仅包含 VisibleOnceAssociatedTrackableAccessed 注释,直到它们获得第一个关联的可跟踪为止。

curl "https://www.locationnotes.com/api/notes/public/nearby?latitude=41.8818&longitude=-87.6231&radiusKm=8&contentLanguage=en-US"

公共资料和团队页面注释流

这些路线返回公共资料和公共团队页面上发布的地图和注释条。它们使用与页面本身相同的注释访问规则,并接受附近的中心点或完整的地图边界。

GET /api/public/profiles/{userName}/notes/nearby 匿名或不记名
GET /api/public/teams/{teamName}/notes/nearby 匿名或不记名

所需的查询字符串: latitude, longitude 或完整地图边界 minLatitude, minLongitude, maxLatitude, maxLongitude.

可选查询字符串: radiusKm (默认 5), contentLanguage, includeAllLanguages

网站通常将当前路线语言发送为 contentLanguage,因此 /en-US 和 /tlh 公共页面默认情况下不会在同一地图或地带中混合创作注释语言。

仅当客户端有意构建多语言浏览界面而不是镜像网站页面时,才设置 includeAllLanguages=true。

curl "https://www.locationnotes.com/api/public/profiles/michael-kappel/notes/nearby?minLatitude=41.87&minLongitude=-87.64&maxLatitude=41.89&maxLongitude=-87.62&contentLanguage=en-US"

离线同步周期

同步客户端应首先推送本地脏数据,然后拉取当前区域中的用户、活跃团队和公共注释的服务器更改。 两条同步路由都需要承载身份验证。

POST /api/sync/push 承载者
{
  "deviceId": "5dd06ca7-34a5-4f2e-812d-3f1ef3e48290",
  "notes": [
    {
      "noteId": "ef90c4ca-88a9-4a9b-b3a8-36e2649c5dcb",
      "ownerUserId": "a7cfd28f-c17f-4cf7-8913-47fa10fd0d1f",
      "categoryId": "4de6bb76-f25d-4c73-b8e3-81b9ca3bf08f",
      "title": "Offline inspection",
      "body": "Saved while disconnected.",
      "contentLanguage": "en-US",
      "latitude": null,
      "longitude": null,
      "visibility": "Private",
      "externalLinkUrl": "https://example.com/offline-inspection",
      "externalLinkDescription": "",
      "applyExternalLinkChanges": true,
      "isDeleted": false,
      "updatedUtc": "2026-03-13T20:12:00Z",
      "clientMutationId": "android-offline-42",
      "teamId": null
    }
  ],
  "categories": []
}
{
  "appliedNoteIds": [
    "ef90c4ca-88a9-4a9b-b3a8-36e2649c5dcb"
  ],
  "appliedCategoryIds": [],
  "conflicts": []
}
POST /api/sync/pull 承载者
{
  "lastSyncUtc": "2026-03-13T19:45:00Z",
  "publicArea": {
    "minLatitude": 41.78,
    "minLongitude": -87.75,
    "maxLatitude": 41.96,
    "maxLongitude": -87.54
  }
}
{
  "serverSyncUtc": "2026-03-13T20:13:02Z",
  "userNotes": [],
  "userCategories": [],
  "teamCategories": [],
  "publicNotes": [],
  "teamNotes": []
}

同步端点拒绝匿名请求。如果服务器阻止较旧的 Android beta 版本,请检查 GET /api/system/status 最低兼容版本和 beta 页面 URL。

个人笔记和类别

这些路由返回登录的网站工作区和个人 Android 同步状态。全部都需要不记名身份验证。

阅读个人笔记

GET /api/notes/mine 承载者

可选查询字符串: contentLanguage 和完整的地图边界 minLatitude, minLongitude, maxLatitude, maxLongitude.

注意读取有效负载现在包括 lastActivityUtc 因此客户端可以与持久性/update时间戳分开显示最近的活动。

创建注释

POST /api/notes/mine 承载者
{
  "categoryId": "4de6bb76-f25d-4c73-b8e3-81b9ca3bf08f",
  "title": "Category-only feedback",
  "body": "This note stays off the map on purpose.",
  "contentLanguage": "en-US",
  "externalLinkUrl": "https://example.com/field-guide",
  "externalLinkDescription": "",
  "latitude": null,
  "longitude": null,
  "visibility": "VisibleOnceAssociatedTrackableAccessed",
  "commentPolicy": "LoggedInUsers"
}

可见性接受 Private、Public 和 VisibleOnceAssociatedTrackableAccessed。关联可追踪模式的行为类似于公共,直到注释具有一个或多个关联可追踪。此后,公开发现和注释页访问要求查看者已经解锁这些关联的可跟踪项之一。

  • 尚无关联的可跟踪项:该注释的行为类似于公共注释。
  • 第一次关联后:该笔记退出匿名公开发现和正常的公共笔记页面访问。
  • 已解锁的查看者:已解锁相关可追踪项的人可以打开笔记页面并使用连接的公共笔记页面 API 路线。
  • 所有者或授权团队成员:保留正常的笔记访问和管理权限。

注意页面读取和操作

GET /api/public/notes/{noteId} 匿名或不记名
GET /api/public/notes/{noteId}/comments 匿名或不记名
POST /api/public/notes/{noteId}/comments 承载者
GET /api/public/notes/{noteId}/trackables 匿名或不记名
POST /api/public/notes/{noteId}/trackables 承载者
{
  "body": "I found it too."
}
{
  "trackableSecretCodes": "LN4C8R2Z",
  "selectedActiveTrackableIds": [
    "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31"
  ],
  "activeTrackableAttachMode": "Self"
}

这些笔记页面路由遵循笔记访问规则,包括私人笔记和由关联可跟踪访问控制的笔记。如果调用者可以打开注释页面,API 可以返回该注释的注释和可见可跟踪项。附加可跟踪项需要笔记所有者或团队管理员。

  • 在第一个关联的可跟踪对象存在之前,这些路由的行为类似于普通的公共注释页面路由。
  • 至少存在一个关联后,无法访问一个关联可跟踪项的调用者应该会收到来自公共注释页面路由的 404,即使该注释仍然存在。
  • 对于所有者、授权团队成员或已解锁关联可追踪项的查看者,同一条注释仍可返回 200。

阅读类别

GET /api/categories/mine 承载者
GET /api/categories/mine/tree 承载者

工作区树助手

GET /api/categories/mine/tree/sections 承载者
GET /api/categories/mine/tree/children?parentCategoryId={categoryId} 承载者

使用这些更轻的辅助路径来实现延迟加载的类别选择器和侧边栏树。树/sections按contentLanguage对根类别进行分组。 tree/children 返回一个父节点的直接子节点,并包含 childCategoryCount,以便客户端可以决定是否在加载孙子节点之前显示扩展可供性。

[
  {
    "contentLanguage": "en-US",
    "rootCategories": [
      {
        "categoryId": "68cb4c9b-d9bd-4bde-8c6a-a03a4c70b283",
        "name": "Field Reports",
        "contentLanguage": "en-US",
        "parentCategoryId": null,
        "childCategoryCount": 2
      }
    ]
  }
]
[
  {
    "categoryId": "c4b2e65f-5cf2-4ab6-8577-a89dfb51407f",
    "name": "Dock checks",
    "contentLanguage": "en-US",
    "parentCategoryId": "68cb4c9b-d9bd-4bde-8c6a-a03a4c70b283",
    "childCategoryCount": 0
  }
]

创建或移动类别

POST /api/categories/mine 承载者
POST /api/categories/mine/{categoryId}/move 承载者
{
  "name": "Field Reports",
  "contentLanguage": "en-US",
  "parentCategoryId": null
}

个人 GPX 航路点切换

GET /api/notes/mine/gpx 承载者

GET /api/notes/mine/gpx 仅导出映射的个人注释,并将坐标保存为 GPX 1.1 航路点。

POST /api/notes/mine/gpx 承载者

POST /api/notes/mine/gpx 接受具有文件、可见性和可选 contentLanguage 的多部分表单数据。导入仅读取航路点条目,创建法线映射注释,并且绝不会覆盖现有注释。

重复检查保留在选定的个人范围内。具有相同注释文本的匹配标题加坐标将被报告为重复项。匹配的标题加坐标与不同的注释文本将被跳过以避免覆盖。

curl "https://www.locationnotes.com/api/notes/mine/gpx" \
  -H "Authorization: Bearer <access token>"
curl -X POST "https://www.locationnotes.com/api/notes/mine/gpx" \
  -H "Authorization: Bearer <access token>" \
  -F "file=@waypoints.gpx;type=application/gpx+xml" \
  -F "visibility=Private" \
  -F "contentLanguage=en-US"

什么是导入和导出? 介绍 GPX 航点交换与完整的 JSON 和便携式 ZIP 帐户导出有何不同。

团队端点

团队路线涵盖成员资格、邀请、设置、团队注释和团队类别。所有这些都需要承载身份验证,并且服务器对每个路由强制执行 admin/member 权限。

常见读物

  • GET /api/teams
  • GET /api/teams/{teamId}/notes
  • GET /api/teams/{teamId}/categories
  • GET /api/teams/{teamId}/categories/tree
  • GET /api/teams/{teamId}/invite-links

团队和团队笔记读取模型包括 lastActivityUtc. 公共修剪优先选择最近活动的记录。

团队类别树助手

GET /api/teams/{teamId}/categories/tree/sections 承载者
GET /api/teams/{teamId}/categories/tree/children?parentCategoryId={categoryId} 承载者

这些路线使用与个人工作区树助手相同的部分和子节点形状,但数据保留在选定的团队范围内,并且仍然需要有效的团队成员资格。

使用 DELETE /api/teams/{teamId}/notes/{noteId} 当注释应该离开团队工作空间但继续存在于所有者时,并使用 DELETE /api/teams/{teamId}/notes/{noteId}/delete 当团队注释本身应该被永久删除时。

创建团队

{
  "name": "Beta Testers",
  "title": "Beta Testers",
  "description": "Public beta release gate for Android validation.",
  "externalLinkUrl": "https://example.com/beta-program",
  "externalLinkDescription": "",
  "joinPolicy": "RequestsAllowed",
  "pageVisibility": "Public",
  "defaultNoteVisibility": "Public",
  "contentLanguage": "en-US"
}

创建团队笔记

POST /api/teams/{teamId}/notes 承载者
{
  "categoryId": "68cb4c9b-d9bd-4bde-8c6a-a03a4c70b283",
  "title": "Shared dock inspection",
  "body": "Visible to the team until we publish it.",
  "contentLanguage": "en-US",
  "externalLinkUrl": "https://example.com/shared-briefing",
  "externalLinkDescription": "",
  "latitude": 41.8818,
  "longitude": -87.6231,
  "visibility": "Private",
  "commentPolicy": "TeamMembers"
}

团队 GPX 航路点切换

GET /api/teams/{teamId}/notes/gpx 承载者
POST /api/teams/{teamId}/notes/gpx 承载者

GET /api/teams/{teamId}/notes/gpx 和 POST /api/teams/{teamId}/notes/gpx 在所选团队范围内应用相同的 GPX 规则。重复和覆盖检查仅与该团队的笔记进行比较。

curl "https://www.locationnotes.com/api/teams/{teamId}/notes/gpx" \
  -H "Authorization: Bearer <access token>"
curl -X POST "https://www.locationnotes.com/api/teams/{teamId}/notes/gpx" \
  -H "Authorization: Bearer <access token>" \
  -F "file=@team-waypoints.gpx;type=application/gpx+xml" \
  -F "visibility=Public" \
  -F "contentLanguage=en-US"

会员及邀请操作

  • POST /api/teams/{teamId}/memberships/request
  • POST /api/teams/{teamId}/memberships/invite
  • POST /api/teams/{teamId}/memberships/{membershipId}/accept
  • POST /api/teams/{teamId}/memberships/{membershipId}/refuse
  • POST /api/teams/{teamId}/memberships/{membershipId}/approve
  • POST /api/teams/{teamId}/memberships/{membershipId}/deny
  • POST /api/teams/{teamId}/memberships/{membershipId}/promote-admin
  • DELETE /api/teams/{teamId}/memberships/{membershipId}
  • POST /api/teams/invite-links/{teamSlug}/{inviteCode}/join
{
  "isSingleUse": false
}
{
  "inviteLinkId": "9a4726dc-4fb1-4c16-b7b3-5d48ea68fdce",
  "teamId": "0f4ddf5d-f3dc-4417-b96d-8e212d24235e",
  "teamName": "Invite Team",
  "teamSlug": "invite-team",
  "code": "8K4V9T",
  "createdByDisplayName": "invite-admin",
  "createdByCurrentUser": true,
  "inviterIsCurrentlyAdmin": true,
  "isSingleUse": false,
  "createdUtc": "2026-03-18T21:15:00Z"
}
{
  "teamSlug": "invite-team",
  "membershipStatus": "RequestingMembership"
}

可追踪端点

Trackables 支持公共代码浏览、密码或仅扫描 QR 访问、创建过程中的一次性秘密显示、浏览器端活动会话、评论和分组库存工作流程。 秘密短代码和仅扫描 QR URLs 仅从下面的创建端点返回。它们再也不会从阅读、查找、评论或详细路由中返回。

重要的可追踪规则:
  • 公共代码是简短的公共令牌,在所有可追踪对象中保持全局唯一。
  • 公共代码和短秘密代码彼此之间不会发生冲突,因此一个短代码不能同时表示这两种情况。
  • 短密码和仅扫描 QR URLs 是基于占有的访问凭证。
  • 将可跟踪项和可跟踪组视为“一旦访问即可可见”或“所有人始终可见”。登录的秘密访问可以保存到帐户中以供以后的设备使用。
  • 网站注释附件表格一次接受一个可跟踪代码,并且仅从现有的短密码匹配中附加。
  • 如果尚未注册外部代码,请先创建可跟踪代码。手动注释附件输入不会自动注册新的第三方代码。
  • 激活是从 OwnerUserId 推断出来的;没有单独的持久激活标志。
  • 未激活的可跟踪项无法附加到注释,也无法接受评论。
  • 可追踪对象一次只能属于一个组,更改组需要先分离,然后重新附加。

标识符格式和示例

格式 示例 查找规则
公共代码令牌 LN-7K4V9T 全球唯一的短公共代币。对于公共查找和公共链接来说是安全的。
公众进入路线 GET /trackable/LN-7K4V9T 做空公开股票URL。相同的基本路由用于公共代码、短秘密代码和长仅扫描 QR 令牌。
本地化的公共可追踪页面 GET /en-US/trackables/LN-7K4V9T 共享 URL 解析代码后到达特定语言呈现的公共页面。
秘密进入路线 GET /trackable/LN4C8R2Z 持有该物品的人的简短基于占有的条目URL。它使用与公共和长扫描表单相同的<code>/trackable/{code}</code>基本路线。
系统短密码 LN4C8R2Z 在所有可追踪对象中具有全球唯一性,并且针对公共代码也是唯一的。用于手动基于占有的输入。
备用系统前缀 GT8M2Q7V 在使用 <code>GT</code> 前缀的姐妹部署上生成相同的短秘密模式。
带上你自己的密码 ITEM42X 高级外部标识符。在所有可跟踪项中必须保持唯一,并且不得以 <code>LN</code> 或 <code>GT</code> 开头。
私人扫描路线 https://locationnotes.com/trackable/AB4D5QW2...<100 chars total>... 在所有可追踪项中都是唯一的,旨在通过 QR 扫描而不是手动输入。

生成的公共代码令牌和生成的短秘密主体使用相同的防污字符系列。类型化查找将 O 视为 0,将 I 或 L 视为 1,将 S 视为 5,将 U 视为 V。对于系统短密代码,该规范化适用于文字前缀之后生成的正文。公共代码使用相同的配置前缀,并在生成的正文之前带有破折号,因此它们在视觉上与短秘密代码不同。

列表和详细阅读

公共列表的读取次数受到网站公共数据暴露限制的限制,目前默认为 500。

可跟踪和可跟踪组读取模型包括 lastActivityUtc,因此仪表板和 API 客户端可以明确显示最近的活动。

  • GET /api/trackables/public
  • GET /api/trackables/mine
  • GET /api/trackables/{trackableId}
  • POST /api/trackables/{trackableId}/watch
  • DELETE /api/trackables/{trackableId}/watch
  • GET /api/trackables/{trackableId}/journey
  • POST /api/trackables/{trackableId}/journey-stops
  • DELETE /api/trackables/{trackableId}/journey-stops/{journeyStopId}

GET /api/trackables/public 和网站的公共可追踪浏览页面保持多语言状态,因此公共旅程和物流数据不会被路线语言隐藏。

当您想要围绕相同的公共可跟踪数据进行本地化 Chrome 时,请切换网站语言。

创建一个可追踪的

POST /api/trackables 承载者
{
  "name": "Promo coin",
  "description": "Launch event inventory item",
  "externalLinkUrl": "https://example.com/promo-coin",
  "externalLinkDescription": "",
  "teamId": null,
  "visibility": "AlwaysVisibleToEveryone",
  "activateImmediately": false,
  "secretCode": ""
}
{
  "trackableId": "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31",
  "heading": "Unactivated Trackable",
  "description": "Please activate this trackable item",
  "items": [
    {
      "trackableId": "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31",
      "name": "Unactivated Trackable",
      "publicCode": "LN-7K4V9T",
      "secretCode": "LN4C8R2Z",
      "scanUrl": "https://locationnotes.com/trackable/ABCD...<100 characters total>...",
      "qrPayload": "ABCD...<100 characters total>..."
    }
  ]
}

带上你自己的密码

{
  "name": "Marketing token",
  "description": "Bring-your-own identifier",
  "teamId": null,
  "visibility": "VisibleOnceAccessed",
  "activateImmediately": true,
  "secretCode": "TAG42"
}

服务器接受调用者提供的密码,这些密码不以 LN、GT 或 GC 开头,并且与任何现有的密码或公共代码不匹配。返回的公共代码仍然是系统生成的。

创建一个群组

POST /api/trackables/groups 承载者
{
  "name": "Gnomes in this hunt",
  "description": "Seasonal hunt inventory",
  "defaultTrackableTitle": "",
  "defaultTrackableDescription": "",
  "defaultExternalLinkUrl": "https://example.com/hunt-rules",
  "defaultExternalLinkDescription": "",
  "trackableCount": 12,
  "teamId": null,
  "visibility": "AlwaysVisibleToEveryone",
  "activateImmediately": false,
  "watchGroupActivityWhenCreated": true
}

群组限制为 100 个可追踪对象。未激活的项目将回退到组默认值,直到激活。一旦激活,他们必须使用自己的标题和描述。

当未激活的批次应在创建者的监视列表上启动时,可跟踪组创建也可以接受 watchGroupActivityWhenCreated。

查找和活动会话

  • POST /api/trackables/lookup 在规范化上面列出的常见污迹字符替换后,匹配公共代码令牌或短密码。
  • GET /trackable/{code} 是向用户和 API 客户端显示的简短网站入口路径。它接受公共代码、短密码或长 QR 令牌,然后路由到正确的流。
  • GET /api/trackables/active 列出客户端当前活动的密码会话(如果存在)。
  • GET /api/trackables/active/{trackableId} 返回活动着陆有效负载,包括激活要求和分组项目(如果可用)。
  • POST /api/trackables/active/{trackableId}/message 更新记住的状态文本。
  • DELETE /api/trackables/active/{trackableId} 结束该客户端上记住的密码会话。

秘密代码查找和仅扫描 QR 访问创建活动客户端会话,而不是返回秘密值。该活动会话允许稍后的注释流附加可跟踪项,而无需重新输入代码。

当调用者经过身份验证时,相同的“访问一次可见”查找还将可跟踪链接到该帐户,以便以后登录的设备可以重新打开可跟踪、其组页面和正常的后续路由,而无需重新输入密码。

该网站特意对所有三种形式使用相同的直接输入基本路线:/trackable/{publicCode}、/trackable/{secretCode} 和 /trackable/{qrToken}。

本地化的/{lang}/trackable/{code}路线是自动选择语言后渲染的单项落地,但仍然不应该显示为可共享或打印的URL。

公共代码查找解析后,呈现的公共页面位于 /{lang}/trackable/{publicCode}。

即使配置的短代码长度稍后发生变化,共享入口路由仍然有效,因为服务器解析代码值而不是依赖于硬编码的网站路径变化。

所有者范围的网站可跟踪路线故意不属于公共 URL 系统的一部分。

这种区别也适用于笔记页面:公共代码用于打开公共可跟踪页面,而笔记附件则需要现有的短秘密代码或已经处于活动状态的浏览器会话。

GET /api/trackables/lookup?code=LN4C8R2Z
{
  "found": true,
  "trackableId": "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31",
  "isPublicCodeMatch": false,
  "usesSecretAccess": true,
  "redirectUrl": "/en-US/trackables/active/f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31"
}
GET /trackable/LN-7K4V9T
GET /en-US/trackables/LN-7K4V9T
GET /trackable/ABCD...<100 characters total>...

为自己或团队激活

POST /api/trackables/{trackableId}/activate 承载者
{
  "name": "",
  "description": "",
  "useGroupDefaultTitle": true,
  "useGroupDefaultDescription": true,
  "externalLinkUrl": "",
  "externalLinkDescription": "",
  "useGroupDefaultExternalLink": true,
  "teamId": "optional-team-guid"
}

如果提供 teamId,则可跟踪对象将成为团队所有,团队管理员可以管理它,并且激活成员在留在该团队时保持控制。如果没有 teamId,可追踪设备将变为个人所有。

当激活分组项目时,所有者可以保存明确的项目标题和描述,也可以有意将组的当前默认标题和描述复制到项目中。

分离和重新附加组

  • DELETE /api/trackables/{trackableId}/group 删除当前组关联。
  • POST /api/trackables/{trackableId}/group{ "trackableGroupId": "..." } 将分离的可跟踪对象与新组关联起来。
  • POST /api/trackables/groups/{trackableGroupId}/watch 开始监视该组的可见成员。来自同一组的现有成员项目监视仍然可以折叠到组监视中,并且每个用户都会对所有者或监视重叠进行重复数据删除。
  • DELETE /api/trackables/groups/{trackableGroupId}/watch 停止监视该组。

可追踪对象一次只能属于一个组。服务器强制执行分离优先规则。只有原始激活者可以重新附加分离的可跟踪对象,并且目标组还必须由该用户或符合条件的团队管理员控制。

{
  "trackableGroupId": "4bdffcab-bb51-4fd8-8c15-59f7b2d72c3f"
}

可追踪的评论

  • GET /api/trackables/{trackableId}/comments
  • POST /api/trackables/{trackableId}/comments
  • PUT /api/trackables/{trackableId}/comments/{commentId}
  • DELETE /api/trackables/{trackableId}/comments/{commentId}

未激活的可追踪项无法接收评论或旅程停靠点。

经过身份验证的用户可以直接发表评论。匿名调用者也可以发帖,但每个匿名写入都必须来自该浏览器的活动可跟踪会话,或者重新发送该特定可跟踪的确切的短密码或私有 QR 令牌。

只有登录的评论作者才能编辑自己的评论。可追踪的所有者和当前团队管理员可以删除评论或旅程停靠点,但他们仍然无法重写其他人的话。

{
  "body": "Starting the route now.",
  "accessCode": "LN4C8R2Z"
}

直达旅程站点

行程提要现在是不可变的停靠历史记录。注释支持的停靠点会在附加注释时对位置进行快照,并且可以保存直接地图报告,而无需先创建注释。

如果链接的注释后来移动到不同的坐标,可追踪的旅程仍会保留原始的快照停止点,因此物流历史不会默默地重写自己。

匿名直接报告遵循与匿名评论相同的规则:调用者必须使用该浏览器的活动可跟踪会话或在写入请求上重新发送短密码或私有 QR 令牌。

{
  "latitude": 41.8819,
  "longitude": -87.6278,
  "accessCode": "LN4C8R2Z"
}

GET /api/trackables/{trackableId}/journey 返回标签第一位置的事实。每个点都带有 coordinateId、locationLabel 和 currentNotesAtCoordinate,因此客户端可以在该坐标处显示当前可见的注释,而无需将停靠点视为拥有一个已保存的注释。

旅程响应不再将外出合同拆分为城市、stateOrProvince 和国家/地区字段。改为读取 locationLabel 加上坐标。

[
  {
    "journeyStopId": "8a274ad6-5dd4-45c4-969a-c13cc1b8d92c",
    "coordinateId": "565c42dd-2e12-49b4-a16b-c89ff4502b8e",
    "latitude": 41.8819,
    "longitude": -87.6278,
    "associatedUtc": "2026-04-05T18:30:00Z",
    "isLocationOnly": false,
    "isAnonymous": false,
    "canDelete": false,
    "canConvertToNote": false,
    "locationLabel": "Chicago, Illinois, United States",
    "creatorDisplayText": "Jordan",
    "creatorProfileUserName": "jordan",
    "currentNotesAtCoordinate": [
      {
        "noteId": "4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3",
        "title": "Lobby drop",
        "contentLanguage": "en-US",
        "thumbnailUrl": "/api/images/notes/4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3/thumbnail"
      }
    ]
  }
]

可见性和行程披露

即使某些底层注释是私人的,可追踪的旅程页面也可能会显示地图位置。在这些情况下,未经授权的查看者可以接收位置点,但无法接收受保护的笔记内容。

授权查看者直接从预加载的旅程有效负载和地图图钉弹出窗口接收注释标题、描述和注释链接。

删除和保留

删除一个帐户不会自动删除该帐户曾经接触过的每个可追踪项。可以保留共享的或团队拥有的可跟踪项,同时仅删除已删除用户的可移除个人活动。

查看“删除数据”页面和帐户删除 API 部分以了解当前保留边界。

可追踪的流程指南

可追踪的 API 具有完整的登录所有权工作流程和更轻的匿名秘密支持报告工作流程。 当您需要有序调用序列、决策点和复制粘贴示例而不是路由目录时,请使用下面的专用页面。

已验证的流量

从找到的项目查找到浏览器秘密访问、登录、激活、注释链接、直接旅程记录、审核和导出/deletion注意事项。

打开经过身份验证的可追踪API流程指南

匿名流量

对于不会登录但拥有确切密码或私人 QR 令牌并需要安全发布直接位置报告或评论的呼叫者。

打开匿名可追踪API流程指南

错误查找

可跟踪的问题详细信息响应现在包括稳定的机器可读代码字段。使用错误参考页面将故障映射到可能的原因和修复方法。

打开可跟踪的 API 错误参考

图像端点

图像可见性始终跟随父项。如果呼叫者可以打开连接的个人资料、注释、团队、可跟踪或可跟踪组页面,则呼叫者也可以打开其图像。如果父项目不可访问,则图像列表读取不返回任何项目,并且直接图像下载返回 404。

客户端还应该记住,上传的内容在保存之前会经过筛选,不会保留原始文件,并且服务器仅存储调整大小的 JPEG 变体。网站和 Android 应用程序都使用相同的 API 合约和文件路由。

按父级列出图像

GET /api/images/profiles/{userId} 匿名或不记名
GET /api/images/notes/{noteId} 匿名或不记名
GET /api/images/teams/{teamId} 匿名或不记名
GET /api/images/trackables/{trackableId} 匿名或不记名
GET /api/images/trackable-groups/{trackableGroupId} 匿名或不记名

使用这些读物来填充画廊。每个项目包括图像 GUID、原始尺寸以及缩略图、小、中和大存储副本的相对 URLs。

originalWidth和originalHeight描述上传的源图像以供参考。实际的可下载文件仍然是由thumbnailUrl、smallUrl、mediumUrl和largeUrl链接的调整大小的存储变体。

curl "https://www.locationnotes.com/api/images/notes/4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3"
[
  {
    "contentImageId": "f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1",
    "targetType": 1,
    "noteId": "4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3",
    "originalWidth": 1600,
    "originalHeight": 1200,
    "createdUtc": "2026-03-18T21:15:00Z",
    "thumbnailUrl": "/Images/Thumbnail/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-64.jpg",
    "smallUrl": "/Images/Small/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-306.jpg",
    "mediumUrl": "/Images/Medium/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-612.jpg",
    "largeUrl": "/Images/Large/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-1024.jpg"
  }
]

下载存储的字节

GET /api/images/{contentImageId}/{variant} 匿名或不记名

有效的变体值为缩略图、小、中和大。响应返回图像/jpeg.

/Images/{Variant}/{guid}-{size}.jpg 下的网站文件 URLs 在提供图像字节之前强制执行相同的父级可见性规则,因此直接图像链接仍受连接的配置文件、注释、团队、可跟踪或可跟踪组权限的保护。

curl -L "https://www.locationnotes.com/api/images/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1/large" --output note-large.jpg

上传图片

POST /api/images/profiles 承载者
POST /api/images/notes/{noteId} 承载者
POST /api/images/teams/{teamId} 承载者
POST /api/images/trackables/{trackableId} 承载者
POST /api/images/trackable-groups/{trackableGroupId} 承载者

发送一个名为 file. 的多部分文件字段。调用者必须已经拥有目标的父管理权限,这意味着团队页面的团队管理员访问权限以及其他父类型的正常编辑/management权限。上传的内容在保存之前会经过筛选,然后仅存储为调整大小的 JPEG 副本。

curl -X POST "https://www.locationnotes.com/api/images/trackables/721f5205-ed2c-43e8-8ecd-1502d5bb7b56" \
  -H "Authorization: Bearer <access token>" \
  -F "file=@tracker.jpg"
{
  "image": {
    "contentImageId": "f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1",
    "targetType": 3,
    "trackableId": "721f5205-ed2c-43e8-8ecd-1502d5bb7b56",
    "originalWidth": 1600,
    "originalHeight": 1200,
    "createdUtc": "2026-03-18T21:15:00Z",
    "thumbnailUrl": "/Images/Thumbnail/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-64.jpg",
    "smallUrl": "/Images/Small/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-306.jpg",
    "mediumUrl": "/Images/Medium/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-612.jpg",
    "largeUrl": "/Images/Large/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-1024.jpg"
  }
}

删除图像

DELETE /api/images/{contentImageId} 承载者

删除需要与上传相同的家长管理权限。删除成功后,内容图像行和所有存储的调整大小的变体将一起删除。

API 客户端必须在此处发送 HTTP DELETE 谓词。直接在浏览器地址栏中打开此 URL 会发送 GET,这会返回 405 Method Not allowed,因为此路由不是下载页面。

网站删除按钮使用 /{culture}/images/{contentImageId}/delete 处的本地化网站表单路由,因此浏览器图库删除可保持防伪保护。

curl -X DELETE "https://www.locationnotes.com/api/images/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1" \
  -H "Authorization: Bearer <access token>"

什么是图像? 解释了这些路由背后的可见性、审核、报告、调整大小、导出和删除规则。

合规报告

使用这些路由来报告不当内容、跟踪系统错误以及支持网站支持请求流程的相同支持票证记录。 匿名呼叫者可以提交报告,但只有登录的报告者可以稍后通过 API 跟踪状态更新和超级管理员解决方案。

提交报告

POST /api/compliance/reports 匿名或不记名

如果调用者通过网站 cookie 或不记名令牌进行身份验证,则创建的报告将附加到该帐户,因此它会显示在 GET /api/compliance/reports/mine. 下

{
  "pageType": 2,
  "contentType": 5,
  "pageTitle": "Reported note title",
  "pageUrl": "/en-US/Note/2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a#note-page-title",
  "pageReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a",
  "contentLabel": "Note Page title and content",
  "contentReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a:page-content",
  "contentPreview": "Title: Reported note title\n\nContent: Reported note body",
  "reportTitle": "Needs review",
  "reportExplanation": "This title is not appropriate for a public note."
}

跟踪 API 票证或报告应用程序错误

POST /api/compliance/errors 匿名或不记名

如果 API 路由已失败并出现意外的 500,并在问题详细信息 JSON 中返回 ticketNumber,请在此处发布该票证,而不是创建第二个错误日志行。当呼叫者想要超级管理员跟进时,包括userExplanation并设置trackInSupportTickets。

{
  "ticketNumber": "ERR-1M7Q4D9K2X5R8V6N",
  "userExplanation": "Android app hit this right after I tapped refresh twice.",
  "trackInSupportTickets": true,
  "clientContext": {
    "platform": "Android",
    "screen": "My Journeys",
    "appVersion": "1.0.0-beta.20260318.1"
  }
}

当故障仅发生在 Android 应用程序内部且尚无服务器票证时,请创建一个新的错误票证,其中包含描述应用程序所在位置的标记。

{
  "pageMarkerType": "Android screen",
  "pageMarker": "My Journeys",
  "requestCulture": "en-US",
  "requestUrl": "https://locationnotes.com/api/trackables/active/721f5205-ed2c-43e8-8ecd-1502d5bb7b56?includeHistory=true",
  "httpMethod": "GET",
  "responseStatusCode": 503,
  "exceptionType": "Java.Lang.IllegalStateException",
  "exceptionMessage": "Journey list render failed.",
  "stackTrace": "at com.locationnotes.trackables.MyJourneysFragment.render(MyJourneysFragment.kt:42)",
  "userExplanation": "This happened right after scanning a QR code.",
  "trackInSupportTickets": true,
  "clientContext": {
    "platform": "Android",
    "deviceModel": "Pixel 9",
    "osVersion": "Android 17",
    "appVersion": "1.0.0-beta.20260318.1"
  }
}
{
  "ticketNumber": "ERR-1M7Q4D9K2X5R8V6N",
  "usedExistingTicket": false,
  "explanationSaved": true,
  "trackedInSupportTickets": true,
  "trackedContentReportId": "d91f6e1c-b8e2-4e38-9e96-f2de0cc4f0e2"
}

使用 pageMarkerType 值,例如 URL、Android 屏幕或 Android 后台任务。对于服务器生成的票证,请保留原始的 URL 标记并将返回的 ticketNumber 发送回此处,以便记录的 API URL 保持附加到同一张票证。

记者状态读取

GET /api/compliance/reports/mine 承载者
GET /api/compliance/reports/{contentReportId} 承载者

这些路由仅返回调用者自己的报告,除非调用者是超级管理员。使用它们来显示“已报告”、“正在审阅”或“已解决”以及内容报告和跟踪的系统错误的任何最终解决说明。

{
  "contentReportId": "3ab419ab-4b71-4d43-b52c-303d6039f01f",
  "reporterUserId": "6d650c55-b235-4370-8572-e4b772cd1aea",
  "pageType": 2,
  "pageTypeLabel": "Note Page",
  "contentType": 5,
  "contentTypeLabel": "Title and content",
  "status": 2,
  "statusLabel": "Resolved",
  "pageTitle": "Reported note title",
  "pageUrl": "/en-US/Note/2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a#note-page-title",
  "pageReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a",
  "contentLabel": "Note Page title and content",
  "contentReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a:page-content",
  "contentPreview": "Title: Reported note title\n\nContent: Reported note body",
  "reportTitle": "Needs review",
  "reportExplanation": "This title is not appropriate for a public note.",
  "resolutionText": "Reviewed and recorded for moderation follow-up.",
  "reporterDisplayName": "site-compliance-reporter",
  "reviewerDisplayName": "site-compliance-admin",
  "createdUtc": "2026-03-18T18:00:00Z",
  "reviewedUtc": "2026-03-18T18:10:00Z"
}

超级管理员审核

GET /api/compliance/reports 承载+超级管理员
PUT /api/compliance/reports/{contentReportId} 承载+超级管理员

管理列表包括报告链接、页面元数据、违规内容元数据、报告者身份(如果可用)以及任何先前的审核注释。更新写入当前审阅状态和可见分辨率文本。

{
  "status": 1,
  "resolutionText": "Review opened and queued for follow-up."
}

将状态设置为 2,并在关闭已解决的报告时包含非空 resolutionText。

枚举值

  • pageType: 0 个人资料页, 1 团队页面, 2 注释页, 3 可追踪页面, 4 可追踪的群组页面, 5 系统错误, 6 支持页面
  • contentType: 0 标题, 1 描述, 2 评论, 3 身体, 4 生物, 5 标题和内容, 6 错误详情, 7 图像, 8 支持请求
  • status: 0 报道, 1 审查, 2 已解决

网站页面级报告现在使用 5 个,因此一个报告按钮可以同时覆盖可见标题和可见描述 /body。评论级报告仍然使用特定于评论的内容类型。

网站一般支持请求通过同一 COMPLIANCE.ContentReports 存储创建支持页面和支持请求票证,即使浏览器表单使用支持页面而不是此原始 API 路由。

跟踪的网站、API 和 Android 应用程序错误存储在 LOG.Errors 中。启用 trackInSupportTickets 后,链接的支持票证也会出现在 COMPLIANCE.ContentReports 中,因此超级管理员审核和报告者状态遵循相同的工作流程。

系统和测试版元数据

GET /api/system/status 匿名

将此用于运行状况检查、Android 兼容性门控、当前 beta 页面 URL 以及当前请求的已解析映射 /privacy 状态。

GET /api/system/beta-android 匿名

返回暂存的 Android beta 元数据,包括显示版本、版本代码、最低兼容版本和发行说明。

GET /api/system/ip-location 匿名

返回当前请求的尽力而为的基于 IP 的位置,以进行地图居中和故障排除。 当客户端 IP 是私有、本地或其他不受信任的 IP 时,响应保持 HTTP 200 并解释失败 failureReason 而不是抛出传输错误。

GET /api/system/coordinate-locality 匿名

将纬度 /longitude 对反向地理编码为城市、州 /province 和国家/地区标签,以用于停止规划器和地图选择流程。 无效坐标返回非抛出有效负载 resolved=falsefailureReason=invalid-coordinates.

  • requestedExperienceMode 与 effectiveExperienceMode 对比可告诉您登录首选项是在请求时隐私规则中幸存下来还是被迫降至 no_3rd_parties。
  • requestedMapSource、preferredMapSource 和 fallbackMapSource 告诉您用户请求哪个提供程序、服务器要首先尝试哪个提供程序以及如果首选源失败,接下来应该加载哪个提供程序。
  • thirdPartyBrowserCallsAllowed、googleMapsAllowed 和 openStreetMapAllowed 告诉您此请求是否可以调用浏览器端提供程序。
  • hostedMapsForcedByPrivacy 加上 hostedMapTileUrlTemplate 告诉您请求何时被强制发送到同源托管图块,当前通过该图块进行渲染 /maps/tiles/{z}/{x}/{y}.png.

专用网络、本地网络和其他未解析的 IP 请求有意采用更严格的路径,因此即使登录首选项不同,本地主机或办公室网络测试也可以合法地显示 no_3rd_parties 和 hosted_maps。

curl "https://www.locationnotes.com/api/system/status"
{
  "status": "online",
  "utcNow": "2026-03-13T21:15:00Z",
  "androidMinimumCompatibleDisplayVersion": "1.0.0-beta.20260313.2",
  "androidMinimumCompatibleVersionCode": "2026031302",
  "androidCompatibilityMessage": "The API changed after older beta builds were published. Update to the latest beta before syncing or using live team management.",
  "androidBetaPageUrl": "https://www.locationnotes.com/zh-SG/account/beta",
  "requestedExperienceMode": "latest_and_greatest",
  "effectiveExperienceMode": "no_3rd_parties",
  "usesSavedExperienceModePreference": false,
  "usesVisitorExperienceModePreferenceCookie": false,
  "thirdPartyBrowserCallsAllowed": false,
  "requestedMapSource": "google_maps",
  "preferredMapSource": "hosted_maps",
  "fallbackMapSource": "hosted_maps",
  "usesSavedMapPreference": false,
  "usesVisitorMapPreferenceCookie": false,
  "googleMapsAllowed": false,
  "googleMapsConfigured": false,
  "openStreetMapAllowed": false,
  "openStreetMapConfigured": true,
  "hostedMapsConfigured": true,
  "hostedMapsForcedByPrivacy": true,
  "hostedMapTileUrlTemplate": "/maps/tiles/{z}/{x}/{y}.png"
}
curl "https://www.locationnotes.com/api/system/ip-location"
{
  "resolved": true,
  "clientIpAddress": "50.77.187.28",
  "lookupIpAddress": "50.77.187.28",
  "usedDevelopmentFallbackIp": false,
  "sourceKind": "IpAddress",
  "coordinateSourceProvider": "IpInfoDb",
  "localitySourceProvider": "IpInfoDb",
  "latitude": 41.8758,
  "longitude": -87.6206,
  "city": "Chicago",
  "stateOrProvince": "Illinois",
  "country": "United States of America",
  "isApproximate": true,
  "accuracyRadiusKm": null,
  "failureReason": ""
}
curl "https://www.locationnotes.com/api/system/coordinate-locality?latitude=41.8818&longitude=-87.6231"
{
  "resolved": true,
  "sourceKind": "Coordinates",
  "coordinateSourceProvider": "StopPlanner",
  "localitySourceProvider": "HostedMapPostGIS",
  "latitude": 41.8818,
  "longitude": -87.6231,
  "city": "Chicago",
  "stateOrProvince": "Illinois",
  "country": "United States",
  "isApproximate": false,
  "accuracyRadiusKm": null,
  "failureReason": ""
}

完整的航线库存

本节是当前 LocationNotes API 表面的详尽动词和路径清单,包括 /api/auth. 下框架管理的身份路由。上面的详细部分解释了主要工作流程;该清单是路由级别的事实来源,应与实时端点表保持一致。

身份认证与账户安全

  • POST /api/auth/register 匿名
  • POST /api/auth/login 匿名
  • POST /api/auth/refresh 匿名
  • GET /api/auth/confirmEmail 匿名
  • POST /api/auth/resendConfirmationEmail 匿名
  • POST /api/auth/forgotPassword 匿名
  • POST /api/auth/resetPassword 匿名
  • GET /api/auth/manage/info 承载者
  • POST /api/auth/manage/info 承载者
  • POST /api/auth/manage/2fa 承载者

帐户、系统、同步和外部链接

  • DELETE /api/account 承载者
  • GET /api/system/status 匿名
  • GET /api/system/beta-android 匿名
  • GET /api/system/ip-location 匿名
  • GET /api/system/coordinate-locality 匿名
  • POST /api/sync/push 承载者
  • POST /api/sync/pull 承载者
  • POST /api/external-links/verify 承载者

注释和公共注释页面

  • GET /api/notes/public/bounds 匿名
  • GET /api/notes/public/nearby 匿名
  • GET /api/notes/mine 承载者
  • POST /api/notes/mine 承载者
  • GET /api/notes/mine/gpx 承载者
  • POST /api/notes/mine/gpx 承载者
  • POST /api/notes/mine/{noteId}/move 承载者
  • DELETE /api/notes/mine/{noteId} 承载者
  • GET /api/public/profiles/{userName}/notes/nearby 匿名或不记名
  • GET /api/public/teams/{teamName}/notes/nearby 匿名或不记名
  • GET /api/public/notes/{noteId} 匿名或不记名
  • GET /api/public/notes/{noteId}/comments 匿名或不记名
  • POST /api/public/notes/{noteId}/comments 承载者
  • GET /api/public/notes/{noteId}/trackables 匿名或不记名
  • POST /api/public/notes/{noteId}/trackables 承载者

类别和工作区树

  • GET /api/categories/mine 承载者
  • GET /api/categories/mine/tree 承载者
  • GET /api/categories/mine/tree/sections 承载者
  • GET /api/categories/mine/tree/children 承载者
  • POST /api/categories/mine 承载者
  • POST /api/categories/mine/{categoryId}/move 承载者
  • DELETE /api/categories/mine/{categoryId} 承载者

团队、会员资格和邀请链接

  • GET /api/teams 承载者
  • POST /api/teams 承载者
  • PUT /api/teams/{teamId}/settings 承载者
  • GET /api/teams/{teamId}/notes 承载者
  • GET /api/teams/{teamId}/notes/gpx 承载者
  • DELETE /api/teams/{teamId}/notes/{noteId} 承载者
  • POST /api/teams/{teamId}/notes 承载者
  • POST /api/teams/{teamId}/notes/gpx 承载者
  • POST /api/teams/{teamId}/notes/{noteId}/move 承载者
  • DELETE /api/teams/{teamId}/notes/{noteId}/delete 承载者
  • GET /api/teams/{teamId}/categories 承载者
  • GET /api/teams/{teamId}/categories/tree 承载者
  • GET /api/teams/{teamId}/categories/tree/sections 承载者
  • GET /api/teams/{teamId}/categories/tree/children 承载者
  • POST /api/teams/{teamId}/categories 承载者
  • POST /api/teams/{teamId}/categories/{categoryId}/move 承载者
  • DELETE /api/teams/{teamId}/categories/{categoryId} 承载者
  • POST /api/teams/{teamId}/memberships/request 承载者
  • POST /api/teams/{teamId}/memberships/invite 承载者
  • POST /api/teams/{teamId}/memberships/{membershipId}/accept 承载者
  • POST /api/teams/{teamId}/memberships/{membershipId}/refuse 承载者
  • POST /api/teams/{teamId}/memberships/{membershipId}/approve 承载者
  • POST /api/teams/{teamId}/memberships/{membershipId}/deny 承载者
  • POST /api/teams/{teamId}/memberships/{membershipId}/promote-admin 承载者
  • DELETE /api/teams/{teamId}/memberships/{membershipId} 承载者
  • GET /api/teams/{teamId}/invite-links 承载者
  • POST /api/teams/{teamId}/invite-links 承载者
  • DELETE /api/teams/{teamId}/invite-links/{inviteLinkId} 承载者
  • POST /api/teams/invite-links/{teamSlug}/{inviteCode}/join 承载者
  • DELETE /api/teams/{teamId} 承载者

可追踪和活跃的秘密支持会话

  • GET /api/trackables/public 匿名或不记名
  • GET /api/trackables/mine 承载者
  • GET /api/trackables/{trackableId} 匿名或不记名
  • GET /api/trackables/{trackableId}/journey 匿名或不记名
  • POST /api/trackables 承载者
  • POST /api/trackables/groups 承载者
  • POST /api/trackables/{trackableId}/activate 承载者
  • POST /api/trackables/{trackableId}/watch 承载者
  • DELETE /api/trackables/{trackableId}/watch 承载者
  • DELETE /api/trackables/{trackableId}/group 承载者
  • POST /api/trackables/{trackableId}/group 承载者
  • POST /api/trackables/groups/{trackableGroupId}/watch 承载者
  • DELETE /api/trackables/groups/{trackableGroupId}/watch 承载者
  • GET /api/trackables/lookup 匿名
  • POST /api/trackables/lookup 匿名
  • GET /api/trackables/active 匿名
  • GET /api/trackables/active/{trackableId} 匿名
  • POST /api/trackables/active/{trackableId}/message 匿名
  • DELETE /api/trackables/active/{trackableId} 匿名
  • GET /api/trackables/{trackableId}/comments 匿名或不记名
  • POST /api/trackables/{trackableId}/comments 匿名或不记名
  • PUT /api/trackables/{trackableId}/comments/{commentId} 承载者
  • DELETE /api/trackables/{trackableId}/comments/{commentId} 承载者
  • POST /api/trackables/{trackableId}/journey-stops 匿名或不记名
  • DELETE /api/trackables/{trackableId}/journey-stops/{journeyStopId} 承载者

图像和合规性

  • GET /api/images/profiles/{userId} 匿名或不记名
  • GET /api/images/notes/{noteId} 匿名或不记名
  • GET /api/images/teams/{teamId} 匿名或不记名
  • GET /api/images/trackables/{trackableId} 匿名或不记名
  • GET /api/images/trackable-groups/{trackableGroupId} 匿名或不记名
  • GET /api/images/{contentImageId}/{variant} 匿名或不记名
  • POST /api/images/profiles 承载者
  • POST /api/images/notes/{noteId} 承载者
  • POST /api/images/teams/{teamId} 承载者
  • POST /api/images/trackables/{trackableId} 承载者
  • POST /api/images/trackable-groups/{trackableGroupId} 承载者
  • DELETE /api/images/{contentImageId} 承载者
  • POST /api/compliance/reports 匿名或不记名
  • POST /api/compliance/errors 匿名或不记名
  • GET /api/compliance/reports/mine 承载者
  • GET /api/compliance/reports/{contentReportId} 承载者
  • GET /api/compliance/reports 承载+超级管理员
  • PUT /api/compliance/reports/{contentReportId} 承载+超级管理员

从 API 中删除帐户

经过身份验证的客户端可以通过API永久删除当前帐户和同步的个人数据。阅读 删除数据 如果您需要团队拥有的数据和导出的完整保留规则,请先查看页面。

可追踪的清理并不是全有或全无。服务器会尽可能删除已删除用户的个人可追踪活动,但不会仅仅因为一个帐户被删除而删除共享可追踪、团队拥有的可追踪或其他用户的历史记录。 如果团队拥有的可追踪对象对团队仍然很重要,那么它仍然属于该团队。如果另一个人的活动仍附加到可追踪项,则该可追踪项将保留在系统中。

DELETE /api/account 承载者
curl -X DELETE "https://www.locationnotes.com/api/account" \
  -H "Authorization: Bearer <access token>"
{
  "deletedAccount": true,
  "notesDeleted": 14,
  "categoriesDeleted": 6,
  "linkedProvidersDeleted": 2
}

错误和问题详细信息

验证、权限和查找失败返回标准 HTTP 状态代码。许多工作区路由返回 RFC 7807 样式的问题详细信息 JSON,其中包含标题、详细信息和状态。

{
  "title": "Forbidden",
  "code": "trackable_access_code_required",
  "detail": "Sign in, keep this trackable active on this browser, or provide this trackable's secret code or QR access code before posting comments or location reports.",
  "status": 403
}
  • 400 用于验证或业务规则拒绝
  • 401 缺少或无效的身份验证
  • 403 对于没有访问权限的经过身份验证的用户
  • 404 缺少注释、类别、团队、会员资格或邀请链接

可跟踪的写入路由还添加了稳定的代码属性,因此 API 客户端可以区分以下情况 trackable_access_code_required, trackable_access_code_invalid, trackable_activation_required, 和 trackable_already_activated 无需解析英文文本。完整的映射记录在 可跟踪错误参考页面.