{"endpoints":["GET  /wechat              \u5fae\u4fe1\u670d\u52a1\u5668\u9a8c\u8bc1","POST /wechat              \u5fae\u4fe1\u6d88\u606f\u56de\u8c03","GET  /api/wechat/rider-bind-redirect  \u9a91\u624b\u7ed1\u5b9a\u8df3\u8f6c\u9875 (\u516c\u5f00, ?token=<UUID>)","GET  /o/<token>                      \u5ba2\u6237\u8ba2\u5355\u5730\u56fe H5 (\u516c\u5f00, token \u5373\u51ed\u8bc1)","GET  /o/<token>/data                 \u5ba2\u6237\u8ba2\u5355\u5730\u56fe\u8f6e\u8be2\u6570\u636e (\u516c\u5f00, \u53ea\u56de payload)","POST /api/v1/customer/order-snapshot   \u63a5\u6536 AD \u63a8\u9001\u7684\u5ba2\u6237\u8ba2\u5355\u5feb\u7167 (Bearer)","POST /api/v1/customer/order-snapshots  \u6279\u91cf\u63a5\u6536 (Bearer, body: {snapshots: [...]})","POST /api/v1/courier/_bind_init     PC/admin \u89e6\u53d1\u9a91\u624b\u521b\u5efa + \u751f\u6210\u7ed1\u5b9a\u7801 (Bearer, body: {name, phone, openid?})","POST /api/v1/courier/_bind_regen/<rider_id>  \u91cd\u65b0\u751f\u6210\u7ed1\u5b9a\u7801 (Bearer)","GET  /api/v1/courier/_pending_binds       \u62c9\u53d6\u5f85\u7ed1\u5b9a\u8bf7\u6c42 (Bearer, \u79df\u6237 PC \u8f6e\u8be2)","POST /api/v1/courier/_pending_binds/<id>/claim \u79df\u6237 PC claim \u5f85\u7ed1\u5b9a (Bearer, body: {name, phone})","POST /api/v1/courier/bind-wechat-url-pc  PC \u672c\u5730\u7f16\u53f7\u2192\u6b63\u5f0f\u7ed1\u5b9a\u94fe\u63a5 (Bearer, \u61d2\u521b\u5efa)","POST /api/v1/courier/notify-dispatch   \u6d3e\u5355\u6210\u529f\u2192\u670d\u52a1\u5668\u53d1\u9a91\u624b\u6a21\u677f\u6d88\u606f (Bearer, 2026-09-06)","POST /api/v1/courier/<rider_id>/bind-wechat-url  \u751f\u6210\u9a91\u624b\u5fae\u4fe1\u7ed1\u5b9a\u94fe\u63a5 (Bearer)","POST /api/v1/courier/<rider_id>/unbind-wechat    \u89e3\u7ed1\u9a91\u624b\u5fae\u4fe1 (Bearer)","GET  /api/wechat/rider/bind             \u516c\u4f17\u53f7\u7f51\u9875\u6388\u6743\u56de\u8c03 (\u516c\u5f00, code\u2192openid)","GET  /api/v1/health        \u5065\u5eb7\u68c0\u67e5 (\u516c\u5f00, \u65e0\u9274\u6743)","POST /api/v1/tenant/apply           \u63d0\u4ea4\u5165\u9a7b\u7533\u8bf7 (\u516c\u5f00)","GET  /api/v1/tenant/lookup/<no>    tenant_no \u2192 id \u67e5\u8be2 (\u516c\u5f00, \u9650\u6d41 60/min/IP, ADR-013)","POST /api/v1/tenant/claim-credentials \u5ba1\u6279\u540e\u9886\u53d6\u7801\u6362 api_key (\u516c\u5f00, \u9650\u6d41 10/h/IP, 2026-09-06)","POST /api/v1/tenant/<no>/credentials \u8f6e\u6362 API \u51ed\u8bc1 (Bearer)","POST /api/v1/recharge/submit        \u63d0\u4ea4\u5145\u503c\u5355 (Bearer)","GET  /api/v1/recharge/status/<id>   \u5145\u503c\u5355\u72b6\u6001 (Bearer)","GET  /api/v1/recharge/history       \u5145\u503c\u5386\u53f2 (Bearer)","GET  /api/v1/notification/unread    \u672a\u8bfb\u901a\u77e5 (Bearer, \u54cd\u5e94\u5934 X-Unread-Count)","POST /api/v1/notification/read      \u6807\u8bb0\u5df2\u8bfb (Bearer, body: {ids}|{all:true})","GET  /api/v1/notification/history   \u5386\u53f2\u901a\u77e5 (Bearer)","GET  /api/v1/courier                \u914d\u9001\u5458\u5217\u8868 (Bearer)","POST /api/v1/courier                \u65b0\u589e\u914d\u9001\u5458 (Bearer, body: {openid,name,phone?})","GET  /api/v1/courier/<id>           \u914d\u9001\u5458\u8be6\u60c5 (Bearer)","PATCH /api/v1/courier/<id>          \u6539\u914d\u9001\u5458 (Bearer)","DELETE /api/v1/courier/<id>         \u8f6f\u5220\u914d\u9001\u5458 (Bearer)","GET  /api/v1/orders/stream          SSE \u63a8\u6a21\u5f0f (?api_key=xxx, text/event-stream)","POST /api/v1/ocr/recognize        OCR \u8bc6\u522b (Bearer + X-Signature + X-Timestamp)","POST /api/v1/map/geocode         \u5730\u5740 \u2192 lat,lng (Bearer + X-Signature + X-Timestamp)","GET  /admin/login                   \u8fd0\u8425\u540e\u53f0\u767b\u5f55","POST /admin/login                   \u8fd0\u8425\u540e\u53f0\u767b\u5f55\u63d0\u4ea4","GET  /admin/                        \u8fd0\u8425\u540e\u53f0\u9996\u9875","GET  /admin/applications            \u7533\u8bf7\u5217\u8868","GET  /admin/tenants                 \u79df\u6237\u5217\u8868","GET  /admin/api/tenant/applications           \u7533\u8bf7\u5217\u8868 JSON","GET  /admin/api/tenant/applications/<id>      \u7533\u8bf7\u8be6\u60c5 JSON","POST /admin/api/tenant/applications/<id>/approve \u6279\u51c6","POST /admin/api/tenant/applications/<id>/reject  \u9a73\u56de","GET  /admin/api/tenants                      \u79df\u6237\u5217\u8868 JSON","GET  /admin/api/tenants/<id>                 \u79df\u6237\u8be6\u60c5 JSON","GET  /admin/recharges                       \u5145\u503c\u5355\u5217\u8868 HTML","GET  /admin/recharges/<id>                  \u5145\u503c\u5355\u8be6\u60c5 HTML","GET  /admin/api/recharge                    \u5145\u503c\u5355\u5217\u8868 JSON","GET  /admin/api/recharge/<id>               \u5145\u503c\u5355\u8be6\u60c5 JSON","POST /admin/api/recharge/<id>/approve       \u6279\u51c6\u5145\u503c (body: {months, quota_delta})","POST /admin/api/recharge/<id>/reject        \u9a73\u56de\u5145\u503c (body: {reason})","GET  /admin/riders?tenant_id=<id>          \u9a91\u624b\u7ba1\u7406 HTML","GET  /admin/riders/<rider_id>              \u9a91\u624b\u8be6\u60c5 HTML","GET  /admin/api/tenants/<id>/riders        \u9a91\u624b\u5217\u8868 JSON","POST /admin/api/tenants/<id>/riders        \u65b0\u5efa\u9a91\u624b + \u751f\u6210\u7ed1\u5b9a\u7801","GET  /admin/api/riders/<rider_id>          \u9a91\u624b\u8be6\u60c5 JSON","POST /admin/api/riders/<rider_id>/regen    \u91cd\u65b0\u751f\u6210\u7ed1\u5b9a\u7801","POST /admin/api/riders/<rider_id>/revoke   \u64a4\u9500\u9a91\u624b","GET  /admin/api/riders/pending            \u9a91\u624b\u4e3b\u52a8\u53d1\u8d77\u5f85\u5904\u7406\u5217\u8868 (JSON)","POST /admin/api/riders/pending/<id>       \u786e\u8ba4\u5e76\u521b\u5efa\u9a91\u624b (body: {tenant_id, name, phone})","POST /api/v1/installation/bootstrap         M3a \u533f\u540d\u9996\u6b21\u5165\u573a (\u516c\u5f00, \u8bbe\u5907\u6307\u7eb9 + \u5e42\u7b49\u952e)","POST /api/v1/installation/bootstrap/ack     M3a \u786e\u8ba4\u51ed\u636e\u5df2\u6536\u5230 (Bearer credential)","POST /api/v1/account/claim-identity          M3a \u8ba4\u9886\u7a33\u5b9a\u8eab\u4efd + \u7b7e\u53d1\u9996\u679a\u6062\u590d\u7801 (Bearer + Idempotency-Key)","POST /api/v1/account/claim-identity/ack      M3a \u786e\u8ba4\u6062\u590d\u7801\u5df2\u843d\u76d8 (Bearer credential)","POST /api/v1/account/otp                     M3a \u53d1\u7801\u5165\u53e3 \u2014 \u751f\u6210\u5e76\u6295\u9012 phone_otp \u9a8c\u8bc1\u7801 (\u516c\u5f00, \u4e09\u5c42\u9650\u6d41, \u54cd\u5e94\u6052\u5b9a)","POST /api/v1/account/otp/verify              M3a \u6362\u7aef \u2014 \u9a8c\u7801\u540e\u7b7e\u53d1\u4e00\u6b21\u6027\u6362\u7aef\u7968\u636e (\u516c\u5f00, \u4e0e /recovery/verify \u5171\u7528\u9650\u6d41\u6876, no-store)","POST /api/v1/recovery/verify                 M3a \u7edf\u4e00 RecoveryProof \u2192 RecoverySession (\u516c\u5f00, \u9650\u6d41; proof \u4e24\u4e2a\u8f7d\u4f53: \u9a8c\u8bc1\u7801 \u6216 \u6362\u7aef\u7968\u636e)","GET  /api/v1/recovery/installations          M3a-6 \u53ef\u6362\u673a\u5019\u9009\u5217\u8868 (Bearer recovery_session, \u53ea\u8bfb)","POST /api/v1/recovery/replacement-ticket     M3a-6 \u4e3a\u9009\u5b9a\u8bbe\u5907\u7b7e\u53d1\u77ed\u671f\u5355\u6b21\u7968\u636e (Bearer recovery_session)","POST /api/v1/installation/replace            M3a-6 \u516b\u6b65\u6362\u673a\u4e8b\u52a1 (Bearer recovery_session + Idempotency-Key, no-store)","POST /api/v1/installation/replace/ack        M3a-6 \u786e\u8ba4\u65b0\u51ed\u636e\u5df2\u843d\u76d8 (Bearer credential)","POST /api/v1/license/activate                M3a \u6fc0\u6d3b\u7801\u9996\u6b21\u7ed1\u5b9a (Bearer credential, body: {license_key})","POST /api/v1/license/validation              M3a \u6838\u5bf9\u7ed1\u5b9a\u5e76\u8fd4\u56de\u4e2d\u5fc3\u4e8b\u5b9e + tier_config (Bearer credential, body: {license_key}, no-store)","POST /api/v1/trial/sync                      M3a Trial \u4e8b\u5b9e + tier_config (Bearer credential, no-store)","POST /api/v1/trial/quota/consume             M3a \u5206\u53d1\u524d\u539f\u5b50\u6d88\u8d39\u8bd5\u7528\u914d\u989d (Bearer credential, body: {capability, idempotency_key}, no-store)","POST /api/v1/offline-license/report          M12 \u767b\u8bb0\u79bb\u7ebf\u51ed\u8bc1 (Bearer credential, \u6241\u5e73\u54cd\u5e94 {known,revoked,expired}, no-store)","POST /api/v1/trial-requests                  \u5b98\u7f51\u7533\u8bf7\u8bd5\u7528\u7ebf\u7d22\u63d0\u4ea4 (\u516c\u5f00, \u9650\u6d41 10/h/IP + \u871c\u7f50, 2026-09-16)","GET  /admin/trial-leads                      \u5b98\u7f51\u8bd5\u7528\u7533\u8bf7\u7ebf\u7d22\u9875 (2026-09-16)","POST /admin/api/trial-leads/{id}/contacted   \u6807\u8bb0\u7ebf\u7d22\u5df2\u8054\u7cfb (admin/super_admin, \u540c\u6e90)","GET  /admin/offline-registration            \u79bb\u7ebf\u6ce8\u518c\u786e\u8ba4\u9875 (super_admin/license_signer, 2026-09-30)","POST /admin/api/offline-registration/confirm \u4eba\u5de5\u786e\u8ba4\u79df\u6237\u5df2\u79bb\u7ebf\u6ce8\u518c (\u540c\u6e90)","GET  /admin/license-issuance                 [\u5df2\u505c\u7528\u2192410] M3a \u7b7e\u53d1\u9875 \u2014 \u9009\u62e9\u79df\u6237/SKU/\u6709\u6548\u671f (super_admin)","POST /admin/license-issuance/confirm         M3a \u7b7e\u53d1\u786e\u8ba4\u9875 \u2014 \u6743\u5a01\u6821\u9a8c\u53c2\u6570\u5e76\u94f8\u51fa\u7b7e\u540d\u4ee4\u724c (super_admin, \u540c\u6e90)","POST /admin/api/step-up                      \u7ba1\u7406\u654f\u611f\u64cd\u4f5c step-up (admin session, \u540c\u6e90, body: {password})","POST /admin/api/license-issuance             M3a \u7b7e\u53d1 \u2014 \u9a8c\u4ee4\u724c\u540e\u5efa License+NULL Binding+\u53f0\u8d26 (super_admin/license_signer, \u540c\u6e90 + step-up, no-store)","POST /api/v1/admin/licenses/{id}/revoke      M3a-7 \u540a\u9500 License (super_admin session, \u540c\u6e90 + step-up, body: {expected_state_version, reason})","GET  /admin/license-ops                      \u4eba\u5de5\u540a\u9500\u5165\u53e3 \u2014 \u6309 tenant_no/license_id \u67e5\u8bc1\u5e76\u540a\u9500 (super_admin, 2026-09-20)","GET  /admin/api/licenses                     \u540c\u4e0a\u4e8b\u5b9e\u7684 JSON \u7248 (super_admin, \u53ea\u8bfb)","POST /api/v1/admin/licenses/{id}/unrevoke    M3a-7 \u89e3\u9664\u540a\u9500 (super_admin session, \u540c\u6e90 + step-up)","POST /api/v1/admin/licenses/{id}/unbind      M3a-7 \u663e\u5f0f\u89e3\u7ed1 \u2014 \u7ed1\u5b9a\u7f6e NULL (super_admin session, \u540c\u6e90 + step-up)","POST /api/v1/admin/licenses/{id}/upgrade-sku M3a-7 SKU \u5347\u7ea7 PC\u2192PC_SERVICE, \u671f\u9650\u4e0d\u53d8 (super_admin session, \u540c\u6e90 + step-up)","POST /api/v1/admin/trial-reviews/{id}/approve  M3a-7 \u6279\u51c6\u8bd5\u7528\u5de5\u5355 \u2192 \u5efa\u552f\u4e00 AccountTrial (super_admin session, \u540c\u6e90)","POST /api/v1/admin/trial-reviews/{id}/reject   M3a-7 \u9a73\u56de\u8bd5\u7528\u5de5\u5355, \u7ec8\u6001 (super_admin session, \u540c\u6e90)","POST /api/v1/admin/trial-reviews/{id}/resubmit M3a-7 \u91cd\u63d0\u88ab\u9a73\u56de\u5de5\u5355 \u2192 \u65b0 pending \u8bb0\u5f55 (super_admin session, \u540c\u6e90)","GET  /admin/trial-reviews                   M3a-7 \u8bd5\u7528\u98ce\u63a7\u5de5\u5355\u5ba1\u6279\u9875 (super_admin)"],"service":"AquaDash Backend","status":"running","version":"0.2.0 (multi-tenant ready)"}
